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])

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