メインコンテンツ

このページは機械翻訳を使用して翻訳されました。最新版の英語を参照するには、ここをクリックします。

シミュレーションと実際の飛行データの重ね合わせ

この例では、アニメーション オブジェクト (Aero.Animation) を使用して、シミュレートされた飛行軌道と実際の飛行軌道を視覚化する方法を示し、同時にアニメーション オブジェクトの機能の一部を示します。この例では、Aero.Animation オブジェクトを使用してアニメーション オブジェクトを作成および構成し、そのオブジェクトを使用して飛行軌道のボディを作成、視覚化、および操作できます。

アニメーションオブジェクトを作成する

Aero.Animation オブジェクトのインスタンスを作成します。

h = Aero.Animation;

アニメーションオブジェクトのプロパティを設定する

1秒あたりのフレーム数を設定します。これは、図ウィンドウにフレームが表示される速度を制御します。

h.FramesPerSecond = 10;

アニメーション データの秒数を 1 秒あたりの時間スケーリングで設定します。このプロパティと 'FramesPerSecond' プロパティによって、シミュレーションの時間ステップが決まります。この例の設定では、時間ステップは約 0.5 秒になります。方程式は (1/FramesPerSecond)*TimeScaling であり、1 秒未満の精度を処理するためのいくつかの追加項が加わります。

h.TimeScaling = 5;

ボディの作成とロード

アニメーション オブジェクト hcreateBody を使用してボディをロードします。この例では、これらのボディを使用して、シミュレートされた飛行軌道と実際の飛行軌道を操作および表示します。最初のボディはオレンジ色で、シミュレートされたデータを表します。2 番目のボディは青色で、実際の飛行データを表します。

idx1 = h.createBody('pa24-250_orange.ac','Ac3d');
idx2 = h.createBody('pa24-250_blue.ac','Ac3d');

飛行軌跡の記録データを読み込む

このコードは、前のコードのボディを使用して、次のファイルに飛行軌跡のシミュレーション データと実際の記録データを提供します。

  • simdata ファイルには、記録されたシミュレートされたデータが含まれています。simdata は、デフォルトのデータ形式の 1 つである 6DoF 配列として設定されています。

  • fltdata ファイルには実際の飛行テスト データが含まれています。この例では、fltdata がカスタム形式で設定されています。この例では、カスタム読み取り関数を作成し、'TimeSeriesSourceType' パラメータを 'Custom' に設定する必要があります。

simdata および fltdata ファイルをロードするには:

load('simdata.mat','simdata')
load('fltdata.mat','fltdata')

カスタム飛行テスト データを使用するために、このコードは 2 番目のボディ 'TimeSeriesReadFcn' を設定します。カスタム読み取り関数は次の場所にあります: matlabroot/toolbox/aero/animation/CustomReadBodyTSData.m

h.Bodies{2}.TimeSeriesReadFcn = @CustomReadBodyTSData;

ボディの時系列データを設定します。

h.Bodies{1}.TimeSeriesSource = simdata;
h.Bodies{2}.TimeSeriesSource = fltdata;
h.Bodies{2}.TimeSeriesSourceType = 'Custom';

カメラ操作

このコードは、2 つのボディのカメラを操作する方法を示しています。

カメラ オブジェクトの 'PositionFcn' プロパティは、アニメーション内のボディに対するカメラの位置を制御します。デフォルトのカメラ 'PositionFcn' は、一次追跡車両のパスを追跡します。したがって、カメラが追跡平面の位置に正しく配置されるには、いくつかの手順が必要です。デフォルトの 'PositionFcn' は次の場所にあります: matlabroot/toolbox/aero/animation/doFirstOrderChaseCameraDynamics.m

'PositionFcn' を設定する。

h.Camera.PositionFcn = @doFirstOrderChaseCameraDynamics;

図にボディジオメトリを表示

show メソッドを使用して、アニメーション オブジェクトの図グラフィック オブジェクトを作成します。

h.show();

アニメーションオブジェクトを使用して飛行軌跡を再生する

play メソッドを使用して、時系列データの継続時間にわたってボディをアニメーション化します。この方法を使用すると、シミュレーション データと飛行データ間のわずかな違いが示されます。

h.play();
h.updateCamera(5);

待機

オブジェクトのプロパティを編集する前に、アニメーションが終了するまで待ちます。

h.wait();

コードでは、ボディの位置に基づいた静的な位置 (つまり、ダイナミクスなし) であるカスタムの簡略化された 'PositionFcn' を使用することもできます。簡略化された 'PositionFcn' は次の場所にあります: matlabroot/toolbox/aero/animation/staticCameraPosition.m

新しい 'PositionFcn' を設定します。

h.Camera.PositionFcn = @staticCameraPosition;

新しい 'PositionFcn' を使用してアニメーションを実行します。

h.play();

待機

オブジェクトのプロパティを編集する前に、アニメーションが終了するまで待ちます。

h.wait();

体を動かす

ボディを開始位置に移動し(時系列データに基づいて)、新しい 'PositionFcn' に従ってカメラの位置を更新します。このコードでは updateBodiesupdateCamera を使用します。

t = 0;
h.updateBodies(t);
h.updateCamera(t);

ボディの位置を変更する

まず現在のボディの位置を取得し、次にボディを分離して、ボディの位置を変更します。

ボディ オブジェクトから現在のボディの位置と回転を取得します。

pos1 = h.Bodies{1}.Position;
rot1 = h.Bodies{1}.Rotation;
pos2 = h.Bodies{2}.Position;
rot2 = h.Bodies{2}.Rotation;

moveBody を使用してボディを分離します。このコードは、2 つのボディを分離して再配置します。

h.moveBody(1,pos1 + [0 0 -3],rot1);
h.moveBody(2,pos1 + [0 0  0],rot2);

最初のボディに透明性を生み出す

最初のボディに透明度を作成します。このコードは、'PatchHandles' を介してボディ パッチのプロパティを変更することでこれを実行します。(MATLAB ® のパッチの詳細については、MATLAB ドキュメントの patch オブジェクトの紹介 セクションを参照してください。)

メモ: ソフトウェア OpenGL® レンダリングを利用する一部のプラットフォームでは、透明度によりアニメーションの速度が低下する可能性があります。

MATLAB の OpenGL の詳細については、 opengl のドキュメントを参照してください。

透明度を作成するには、コードは最初のボディのパッチ ハンドルを取得します。

patchHandles2 = h.Bodies{1}.PatchHandles;

希望する面とエッジのアルファ値を設定します。

desiredFaceTransparency = .3;
desiredEdgeTransparency = 1;

現在の面とエッジのアルファ データを取得し、すべての値を目的のアルファ値に変更します。図では、最初のボディが透明になっていることに注目してください。

for k = 1:size(patchHandles2,1)
    tempFaceAlpha = get(patchHandles2(k),'FaceVertexAlphaData');
    tempEdgeAlpha = get(patchHandles2(k),'EdgeAlpha');
	set(patchHandles2(k),...
        'FaceVertexAlphaData',repmat(desiredFaceTransparency,size(tempFaceAlpha)));
    set(patchHandles2(k),...
        'EdgeAlpha',repmat(desiredEdgeTransparency,size(tempEdgeAlpha)));  
end

2番目のボディの色を変更する

2番目のボディのボディカラーを変更します。このコードは、'PatchHandles' を介してボディ パッチのプロパティを変更することでこれを実行します。

patchHandles3 = h.Bodies{2}.PatchHandles;

希望するパッチの色(赤)を設定します。

desiredColor = [1 0 0];

コードは、現在の面の色データを取得し、すべての値を目的の色の値に変更できるようになりました。コードでは次の点に注意してください。

  • if 条件により、ウィンドウに色が表示されなくなります。

  • 名前プロパティは、ボディ (h.Bodies{2}.Geometry.FaceVertexColorData(k).name) のジオメトリ データに保存されます。

  • このコードは、patchHandles3 内のインデックスを、ボディ ジオメトリ データ内のウィンドウ以外の対応するインデックスとのみ変更します。

name プロパティは、車両のさまざまな部分を特定するために常に使用できるとは限りません。このような場合は、選択的な色付けに代わるアプローチを使用します。

for k = 1:size(patchHandles3,1)
    tempFaceColor = get(patchHandles3(k),'FaceVertexCData');
    tempName = h.Bodies{2}.Geometry.FaceVertexColorData(k).name;
    if ~contains(tempName,'Windshield') &&...
       ~contains(tempName,'front-windows') &&...
       ~contains(tempName,'rear-windows')
    set(patchHandles3(k),...
        'FaceVertexCData',repmat(desiredColor,[size(tempFaceColor,1),1]));
    end
end

2番目のボディの着陸装置をオフにする

2番目のボディの着陸装置をオフにします。これを実現するために、コードは着陸装置に関連付けられたすべての車両パーツの可視性をオフにします。patchHandles3 ベクトルのインデックスは、ジオメトリ データの名前プロパティから決定されたことに注意してください。他のデータ ソースではこの情報が利用できない可能性があります。このような場合、どのインデックスがジオメトリの特定の部分に対応するかを知る必要があります。

for k = [1:8,11:14,52:57]
    set(patchHandles3(k),'Visible','off')
end

アニメーションオブジェクトを閉じて削除する

閉じて削除します。

h.delete();
%#ok<*REPMAT>

参考

| |

トピック