matlab-create-uav-scenario について
UAV Toolbox の uavScenario フレームワークで UAV 環境を構築・シミュレーションするスキルです。地形や建物、センサー搭載プラットフォームの設定から、実行と 3D 表示までを案内します。
主な機能
- 01uavScenario によるシナリオ作成
- 02地形と OSM 建物の追加
- 03UAV プラットフォームと軌道の設定
- 04GPS と INS センサーの接続
- 05時間刻みのセンサーシミュレーション
- 06飛行の 3D 表示
活用シーン
- 01地形上の UAV 飛行をシミュレーション
- 02シナリオ中のセンサー値を検証
- 03show3D で UAV の動きを可視化
- 04OSM 建物を使った環境の構築
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ matlab/ matlab-agentic-toolkit --skill matlab-create-uav-scenarioインストール後、Claude Code で/matlab-create-uav-scenarioを入力して読み込まれたか確認します。
同梱ファイルmanifest.yaml
詳細
UAV シナリオの作成
UAV Toolbox の uavScenario フレームワークを使用して、地形、建物、センサー搭載プラットフォーム、および 3D ビジュアライゼーションを備えた UAV シナリオを構築してシミュレーションします。
使用する場面
- 現実世界の地形や建物を含む UAV シミュレーション環境を作成する場合
- センサー(GPS、IMU、ライダー)を搭載した UAV プラットフォームをシナリオに追加する場合
- センサー読み取り値を取得しながら、時間刻みのシミュレーションループを実行する場合
show3Dを使って UAV の飛行を 3D で可視化する場合
使用しない場面
- 飛行軌道(ウェイポイント設計、min-snap)の生成 — 軌道スキルを使用してください
- Simulink ベースの UAV シミュレーション(UAV Toolbox の Simulink ブロック)
- 経路計画および障害物回避アルゴリズム
- 座標変換のみ(
ned2lla、lla2ned)— これらを直接使用してください
ワークフロー
- シナリオを作成 —
ReferenceLocationとUpdateRateを指定してuavScenarioを使用します - 地形を追加 — GMTED2010 またはカスタム DTED を使用して
addMesh(scene,"terrain",...)を実行します - 建物を追加 — OSM ファイルから
addMesh(scene,"buildings",...)を実行します - プラットフォームを追加 — 軌道を指定して
uavPlatformを使用し、その後updateMeshを実行します - センサーを取り付け — センサーをプラットフォームにバインドする
uavSensorアダプターを使用します - シミュレーションを実行 —
setup→advance→updateSensors→readのループを実行します - 可視化 — アニメーションには
FastUpdateを指定してshow3Dを使用します
主な関数
| 関数 | 目的 | ツールボックス |
|---|---|---|
uavScenario | シミュレーションシナリオを作成します | UAV Toolbox |
addMesh | 地形、建物、またはカスタムメッシュを追加します | UAV Toolbox |
uavPlatform | シナリオに UAV プラットフォームを追加します | UAV Toolbox |
updateMesh | プラットフォームのボディメッシュを設定します | UAV Toolbox |
uavSensor | センサーをプラットフォームに取り付けます | UAV Toolbox |
setup | シミュレーション用にシナリオを初期化します | UAV Toolbox |
advance | シミュレーションを 1 タイムステップ進めます | UAV Toolbox |
updateSensors | 現在時刻のすべてのセンサーを更新します | UAV Toolbox |
show3D | 3D ビジュアライゼーション | UAV Toolbox |
waypointTrajectory | ウェイポイントから飛行経路を定義します | Navigation Toolbox |
gpsSensor | GPS ノイズモデル | Navigation Toolbox |
insSensor | INS/IMU ノイズモデル | Navigation Toolbox |
パターン
参照位置を指定してシナリオを作成
scene = uavScenario( ...
"UpdateRate", 10, ...
"StopTime", 60, ...
"ReferenceLocation", [42.355 -71.066 0]);
ReferenceLocation は、度とメートルで指定する [lat lon alt] です。すべてのローカル座標はこの原点を基準とします。メッシュやプラットフォームを追加する前に設定してください。
地形を追加(GMTED2010)
UseLatLon=true を指定して地理座標を使用します。
latLim = [42.350 42.360];
lonLim = [-71.072 -71.060];
addMesh(scene, "terrain", {"gmted2010", latLim, lonLim}, [0.3 0.6 0.2], ...
UseLatLon=true);
または、UseLatLon を指定せずにローカル ENU 座標(メートル)を使用します。
xLim = [-500 500];
yLim = [-500 500];
addMesh(scene, "terrain", {"gmted2010", xLim, yLim}, [0.3 0.6 0.2]);
地形のジオメトリセルは 3 要素です:{"gmted2010", xOrLatLim, yOrLonLim}。
color 引数は必須です。省略できません。
ユーザーが addCustomTerrain を使って地形名を指定し DTED ファイルをインポートしている場合、この地形は gmted2010 と併用できます。
addCustomTerrain("myterrain", "myterrain.dt1");
xLim = [-500 500];
yLim = [-500 500];
addMesh(scene, "terrain", {"myterrain", xLim, yLim}, [0.3 0.6 0.2]);
建物を追加(OSM ファイル)
osmFile = "boston_common.osm";
latLim = [42.350 42.360];
lonLim = [-71.072 -71.060];
addMesh(scene, "buildings", {osmFile, latLim, lonLim, 'auto'}, ...
[0.6 0.6 0.6], UseLatLon=true);
または、UseLatLon を指定せずにローカル ENU 座標(メートル)を使用します。
xLim = [-500 500];
yLim = [-500 500];
addMesh(scene, "buildings", {osmFile, xLim, yLim, 'auto'}, [0.3 0.6 0.2]);
建物のジオメトリセルは 4 要素です:{osmFile, latOrXLim, lonOrYLim, height}。height には 'auto' または数値スカラーを指定できます。auto を指定すると、地形が利用可能な場合、建物の高さを地形に合わせます。
color 引数は必須です。省略できません。
メッシュ付きプラットフォームを追加
traj = waypointTrajectory( ...
"Waypoints", [0 0 -50; 200 0 -50; 200 200 -50; 0 0 -50], ...
"TimeOfArrival", [0 20 40 60], ...
"ReferenceFrame", "NED");
plat = uavPlatform("UAV1", scene, "Trajectory", traj);
updateMesh(plat, "quadrotor", {1}, [0 0.4 0.8], [0 0 0], [0 1 0 0]);
updateMesh ではすべての引数が必要です:(platform, type, geometries, color, position, orientation)。
geometries—"quadrotor"/"fixedwing"では 1 要素のセル{scaleFactor}、"cuboid"では{[L W H]}を指定しますcolor— RGB の 3 要素ベクトル(必須、省略不可)position—[x y z]オフセット。デフォルトには[0 0 0]を使用しますorientation— クォータニオン[w x y z]。NED シナリオでは、z が下向きのボディフレームを正立させるため、[0 1 0 0](180 度のロール)を使用します
有効なメッシュタイプは "fixedwing"、"quadrotor"、"cuboid"、"custom" です。
"multirotor" タイプはありません。マルチローター UAV には "quadrotor" を使用してください。
センサーのアタッチ(uavSensor アダプターパターン)
センサーをプラットフォームにバインドする場合は、必ず uavSensor を使用してください。 センサーモデルを手動で入力しないでください。
% Create sensor model
gps = gpsSensor("SampleRate", 10, "ReferenceFrame", "NED");
% Bind to platform via uavSensor adaptor
gpsSensorObj = uavSensor("GPS", plat, gps, "UpdateRate", 10);
INS の場合:
ins = insSensor;
insSensorObj = uavSensor("INS", plat, ins, "UpdateRate", 10);
センサーの UpdateRate は、シナリオの UpdateRate で割り切れる必要があります。たとえば、10 Hz のシナリオでは、センサーのレートは 1、2、5、または 10 Hz がサポートされます。100 Hz はサポートされません。
シミュレーションループ
setup(scene);
while advance(scene)
updateSensors(scene);
% Read sensor data (3 outputs: isUpdated, timestamp, readings)
[isUpdated, t, position, velocity, groundspeed, course] = read(gpsSensorObj);
if isUpdated
% position is 1x3 [lat lon alt] for gpsSensor
gpsLLA = position;
end
% Read platform state directly
[motion, lla] = read(plat);
% motion: 1x16 vector [pos(3) orient(4) vel(3) acc(3) angvel(3)]
% lla: [lat lon alt]
end
read(sensor) は可変個数の出力を返します:
isUpdated— logical。センサーにこの時間ステップの新しいデータがある場合は true ですt— 秒単位のタイムスタンプsensorReadings1からsensorReadingsN— センサー固有の出力(gpsSensorの場合はposition, velocity, groundspeed, course)
read(plat) は正確に 2 つの出力を返します:
motion— 16 要素のベクトル:位置(1:3)、姿勢クォータニオン(4:7)、速度(8:10)、加速度(11:13)、角速度(14:16)lla— 3 要素のベクトル:[緯度、経度、高度]
show3D による可視化
setup(scene);
ax = show3D(scene);
while advance(scene)
updateSensors(scene);
show3D(scene, "FastUpdate", true, "Parent", ax);
drawnow limitrate
end
効率よくアニメーションを表示するには、最初の呼び出し後に "FastUpdate", true を使用してください。
軌跡トレイル(飛行経路ライン)
show3D は UAV を現在位置にのみ描画し、飛行経路は描画しません。軌跡トレイルを表示するには、ラインオブジェクトを一度作成し、各ステップでそのデータを更新します:
setup(scene);
[ax, plottedFrames] = show3D(scene);
hold(ax, "on");
% Draw trajectory in the platform's reference frame
trajLine = plot3(plottedFrames.(plat.ReferenceFrame), NaN, NaN, NaN, "r-", "LineWidth", 1.5);
hold(ax, "off");
% acceptable for short loops; pre-allocate for long simulations
xHist = []; yHist = []; zHist = [];
while advance(scene)
show3D(scene, "FastUpdate", true, "Parent", ax);
[motion, ~] = read(plat);
xHist(end+1) = motion(1);
yHist(end+1) = motion(2);
zHist(end+1) = motion(3);
set(trajLine, "XData", xHist, "YData", yHist, "ZData", zHist);
drawnow limitrate
end
ループ内で plot3 を呼び出さないでください。各ステップで新しいグラフィックスオブジェクトが作成され、パフォーマンスが低下します。
機体座標系マーカー(大規模シーンでの視認性)
シーンが 500m 以上にわたる場合、スケール係数にかかわらずプラットフォームのメッシュは見えなくなります。メッシュを歪ませるスケールの拡大は避け、プラットフォームの機体座標系にマーカーを親として設定してください。そうすることで、どのズームレベルでも追従します:
setup(scene);
[ax, plottedFrames] = show3D(scene);
hold(ax, "on");
bodyFrame = plottedFrames.UAV1.BodyFrame;
plot3(ax, 0, 0, 0, "r^", "MarkerSize", 15, "MarkerFaceColor", "r", ...
"Parent", bodyFrame);
hold(ax, "off");
while advance(scene)
show3D(scene, "FastUpdate", true, "Parent", ax);
drawnow limitrate
end
UAV1 は実際のプラットフォーム名に置き換えてください。親トランスフォームにより、マーカーは UAV と自動的に一緒に移動します。
注意点
| 間違い | 結果 | 修正方法 |
|---|---|---|
UseLatLon=true を指定せずに addMesh(...,latLim,lonLim) を使用する | インポートされる建物が 0 件になり、地形の位置も間違います | 地理座標を渡す場合は UseLatLon=true を追加します |
updateMesh(plat,"multirotor",...) | エラー — 無効なメッシュタイプです | "quadrotor" を使用します |
NED シナリオで [1 0 0 0](単位クォータニオン)を指定して updateMesh を使用する | メッシュが反転するか、見えなくなります。機体座標系は z 軸が下向きです | メッシュを正立させるには [0 1 0 0](180 度のロール)を使用します |
[pos, orient, vel] = read(plat) | エラー — 出力が多すぎます | [motion, lla] = read(plat)(出力 2 つ)を使用します |
[isUpdated, data] = read(sensor) | 読み取り値ではなくタイムスタンプが取得されます | [isUpdated, t, sensorReadings] = read(sensor)(出力 3 つ)を使用します |
各ステップで gpsSensor に手動でデータを入力する | 動作しますが、シナリオフレームワークを迂回します | uavSensor アダプターと updateSensors(scene) を使用します |
addMesh の color 引数がない | エラー — 入力引数が足りません | 4 番目の引数として RGB トリプレットを必ず指定します |
NED プラットフォームで ENU の waypointTrajectory を使用する | エラー — 参照座標系が一致しません | 軌跡に "ReferenceFrame","NED" を設定します |
ループ前に setup(scene) を呼び出し忘れる | センサーが初期化されず、読み取り値がありません | advance の前に必ず setup(scene) を呼び出します |
センサーの UpdateRate がシナリオの UpdateRate より大きい | エラー — レートは割り切れる必要があります | センサーのレートはシナリオのレート以下で、かつシナリオのレートで割り切れる必要があります |
規約
- NED 座標系は
uavPlatformのデフォルトです。すべての軌跡とセンサーを NED に合わせてください。 ReferenceLocationはシナリオの作成時に設定する必要があります。構築後は読み取り専用です。- シナリオの
UpdateRateはシミュレーションの時間ステップを制御します。センサーのUpdateRateは異なっていてもかまいません(センサーは処理時刻でないステップをスキップします)。 - OSM ファイルは別途ダウンロードする必要があります(例:Overpass API 経由、または openstreetmap.org からエクスポート)。
addMesh("buildings",...)には URL ではなくファイルパスを指定します。 - GMTED2010 の解像度が不十分な場合は、DTED ファイルに対して
addCustomTerrainを使用します。
Copyright 2026 The MathWorks, Inc.