Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

UAV シナリオのチュートリアル

一連の建物の間を飛行する無人航空機 (UAV) のシミュレーションを実行するためのシナリオを作成します。この例では、開ループ シミュレーションでの UAV の姿勢を更新しています。この UAV シナリオを使用して UAV の飛行を可視化し、シミュレートした点群センサーの読み取り値を生成します。

はじめに

自律アルゴリズムをテストするために、UAV シナリオではテスト ケースの生成と環境からのセンサー データの生成ができます。ワークスペースでの障害物の指定、グローバル座標での UAV の軌跡の指定、座標系間のデータ変換ができます。この UAV シナリオでは、この情報を環境の基準座標系で可視化できます。

建物のポリゴン メッシュを含むシナリオの作成

uavScenario オブジェクトは、一連の固定障害物と、プラットフォームと呼ばれる移動可能なオブジェクトで構成されるモデルです。uavPlatform オブジェクトを使用して、固定翼 UAV、マルチローター、その他のシナリオ内のオブジェクトをモデル化します。この例では、地面と、突き出たポリゴンによる 11 棟の建物で構成されるシナリオを作成します。建物のポリゴン データを読み込み、ポリゴン メッシュの追加に使用します。

% Create the UAV scenario.
scene = uavScenario(UpdateRate=2,ReferenceLocation=[75 -46 0]);

% Add a ground plane.
color.Gray = 0.651*ones(1,3);
color.Green = [0.3922 0.8314 0.0745];
color.Red = [1 0 0];
addMesh(scene,"polygon",{[-250 -150; 200 -150; 200 180; -250 180],[-4 0]},color.Gray)

% Load building polygons.
load("buildingData.mat");

% Add sets of polygons as extruded meshes with varying heights from 10-30.
addMesh(scene,"polygon",{buildingData{1}(1:4,:),[0 30]},color.Green)
addMesh(scene,"polygon",{buildingData{2}(2:5,:),[0 30]},color.Green)
addMesh(scene,"polygon",{buildingData{3}(2:10,:),[0 30]},color.Green)
addMesh(scene,"polygon",{buildingData{4}(2:9,:),[0 30]},color.Green)
addMesh(scene,"polygon",{buildingData{5}(1:end-1,:),[0 30]},color.Green)
addMesh(scene,"polygon",{buildingData{6}(1:end-1,:),[0 15]},color.Green)
addMesh(scene,"polygon",{buildingData{7}(1:end-1,:),[0 30]},color.Green)
addMesh(scene,"polygon",{buildingData{8}(2:end-1,:),[0 10]},color.Green)
addMesh(scene,"polygon",{buildingData{9}(1:end-1,:),[0 15]},color.Green)
addMesh(scene,"polygon",{buildingData{10}(1:end-1,:),[0 30]},color.Green)
addMesh(scene,"polygon",{buildingData{11}(1:end-2,:),[0 30]},color.Green)

% Show the scenario.
show3D(scene);
xlim([-250 200])
ylim([-150 180])
zlim([0 50])

Figure contains an axes object. The axes object with xlabel East (m), ylabel North (m) contains 12 objects of type patch.

UAV プラットフォームの定義とセンサーの取り付け

シナリオ内にセンサー モデルのキャリアとして uavPlatform を定義し、シナリオを通じてそれらのモデルを駆動して、シミュレートしたセンサー データを収集できます。プラットフォームに fixedwingquadrotorcuboid などの各種メッシュを関連付けることができます。メッシュを頂点と面で表して定義することにより、カスタム メッシュを定義できます。プラットフォームの運動を表すための基準座標系を指定します。

飛行データをワークスペースに読み込み、NED 基準座標系を使用してクワッドローター プラットフォームを作成します。読み込んだフライト ログ データに基づいて、初期の位置と向きを指定します。UAV ボディ座標系の構成では、前が "x" 軸の正方向、右が "y" 軸の正方向、下が "z" 軸の正方向です。

load("flightData.mat")

% Set up platform
plat = uavPlatform("UAV",scene,ReferenceFrame="NED", ...
    InitialPosition=position(:,:,1),InitialOrientation=eul2quat(orientation(:,:,1)));

% Set up platform mesh. Add a rotation to orient the mesh to the UAV body frame.
updateMesh(plat,"quadrotor",{10},color.Red,[0 0 0],eul2quat([0 0 pi]))

insSensorgpsSensorgnssMeasurementGenerator、または uavLidarPointCloudGenerator System object など、さまざまなセンサーを選択して UAV に取り付けることができます。LiDAR 点群生成器と、LiDAR センサー モデルを含む uavSensor オブジェクトを取り付けます。UAV ボディ座標系を基準として、センサーの取り付け位置を指定します。

lidarmodel = uavLidarPointCloudGenerator(AzimuthResolution=0.3324099,...
    ElevationLimits=[-20 20],ElevationResolution=1.25,...
    MaxRange=90,UpdateRate=2,HasOrganizedOutput=true);

lidar = uavSensor("Lidar",plat,lidarmodel,MountingLocation=[0,0,-1]);

事前定義済みの軌跡に沿う UAV プラットフォームの飛行および点群センサーの読み取り値の収集

事前定義済みの軌跡に沿って UAV を移動し、その途中で LiDAR センサーの読み取り値を収集します。このデータを使用して、LiDAR ベースのマッピングと位置推定アルゴリズムをテストできます。

ライン プロット trajscatterPlot を事前に割り当ててから、プロット固有のデータ ソースを指定します。uavScenario のシミュレーション中に、シーンから提供された plotFrames の出力を親座標軸として使用し、センサー データを正しい座標系で可視化します。

シーンを可視化します。

[ax,plotFrames] = show3D(scene);

可視化を向上させるために、プロット ビューを更新します。

xlim([-250 200])
ylim([-150 180])
zlim([0 50])
view([-110 30])
axis equal
hold on

軌跡のライン プロットを作成します。まず、plot3 を使用してプロットを作成してから、プロットのデータ ソースのプロパティを手動で変更します。これにより、プロットのパフォーマンスが向上します。

traj = plot3(nan,nan,nan,Color=[1 1 1],LineWidth=2);
traj.XDataSource = "position(:,2,1:idx+1)";
traj.YDataSource = "position(:,1,1:idx+1)";
traj.ZDataSource = "-position(:,3,1:idx+1)";

点群の散布図を作成します。再び、データ ソースのプロパティを更新します。

colormap("jet")
pt = pointCloud(nan(1,1,3));
scatterplot = scatter3(nan,nan,nan,1,[0.3020 0.7451 0.9333],...
    Parent=plotFrames.UAV.Lidar);
scatterplot.XDataSource = "reshape(pt.Location(:,:,1),[],1)";
scatterplot.YDataSource = "reshape(pt.Location(:,:,2),[],1)";
scatterplot.ZDataSource = "reshape(pt.Location(:,:,3),[],1)";
scatterplot.CDataSource = "reshape(pt.Location(:,:,3),[],1) - min(reshape(pt.Location(:,:,3),[],1))";

シミュレーションを設定します。次に、位置を使用して反復し、LiDAR センサーが更新されるたびにシーンを表示します。シーンを進めて UAV プラットフォームを移動し、センサーを更新します。

setup(scene)
for idx = 0:size(position, 3)-1
    [isupdated,lidarSampleTime, pt] = read(lidar);
    if isupdated
        % Use fast update to move platform visualization frames.
        show3D(scene,"Time",lidarSampleTime,FastUpdate=true,Parent=ax);
        % Refresh all plot data and visualize.
        refreshdata
        drawnow limitrate
    end
    % Advance scene simulation time and move platform.
    advance(scene);
    move(plat,[position(:,:,idx+1),zeros(1,6),eul2quat(orientation(:,:,idx+1)),zeros(1,3)])
    % Update all sensors in the scene.
    updateSensors(scene)
end
hold off

Figure contains an axes object. The axes object with xlabel East (m), ylabel North (m) contains 15 objects of type patch, scatter, line.