このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
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
を定義し、シナリオを通じてそれらのモデルを駆動して、シミュレートしたセンサー データを収集できます。プラットフォームに fixedwing
、quadrotor
、cuboid
などの各種メッシュを関連付けることができます。メッシュを頂点と面で表して定義することにより、カスタム メッシュを定義できます。プラットフォームの運動を表すための基準座標系を指定します。
飛行データをワークスペースに読み込み、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]))
insSensor
、gpsSensor
、gnssMeasurementGenerator
、または 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 ベースのマッピングと位置推定アルゴリズムをテストできます。
ライン プロット traj
と scatterPlot
を事前に割り当ててから、プロット固有のデータ ソースを指定します。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