mcpField
M
matlab-create-uav-scenario

matlab-create-uav-scenario

github.com/matlabその他1.2k64 回インストール2 日前に更新
リポジトリ

matlab-create-uav-scenario について

UAV Toolbox の uavScenario フレームワークで UAV 環境を構築・シミュレーションするスキルです。地形や建物、センサー搭載プラットフォームの設定から、実行と 3D 表示までを案内します。

主な機能

  1. 01uavScenario によるシナリオ作成
  2. 02地形と OSM 建物の追加
  3. 03UAV プラットフォームと軌道の設定
  4. 04GPS と INS センサーの接続
  5. 05時間刻みのセンサーシミュレーション
  6. 06飛行の 3D 表示

活用シーン

  1. 01地形上の UAV 飛行をシミュレーション
  2. 02シナリオ中のセンサー値を検証
  3. 03show3D で UAV の動きを可視化
  4. 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)— これらを直接使用してください

ワークフロー

  1. シナリオを作成 — ReferenceLocation と UpdateRate を指定して uavScenario を使用します
  2. 地形を追加 — GMTED2010 またはカスタム DTED を使用して addMesh(scene,"terrain",...) を実行します
  3. 建物を追加 — OSM ファイルから addMesh(scene,"buildings",...) を実行します
  4. プラットフォームを追加 — 軌道を指定して uavPlatform を使用し、その後 updateMesh を実行します
  5. センサーを取り付け — センサーをプラットフォームにバインドする uavSensor アダプターを使用します
  6. シミュレーションを実行 — setup → advance → updateSensors → read のループを実行します
  7. 可視化 — アニメーションには 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
show3D3D ビジュアライゼーションUAV Toolbox
waypointTrajectoryウェイポイントから飛行経路を定義しますNavigation Toolbox
gpsSensorGPS ノイズモデルNavigation Toolbox
insSensorINS/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.

コメント