mcpField
M
matlab-create-uav-scenario

matlab-create-uav-scenario

github.com/matlab其他1.2k64 次安装1 天前更新
代码仓库

关于 matlab-create-uav-scenario

使用 UAV Toolbox 的 uavScenario 框架构建并仿真无人机环境的技能。它指导用户添加地形、建筑和传感器平台,并运行仿真及 3D 可视化。

主要功能

  1. 01用 uavScenario 创建场景
  2. 02添加地形和 OSM 建筑
  3. 03配置无人机平台与轨迹
  4. 04附加 GPS 和 INS 传感器
  5. 05运行分步传感器仿真
  6. 06以 3D 可视化飞行

适用场景

  1. 01仿真无人机在地形上飞行
  2. 02测试场景运行中的传感器读数
  3. 03用 show3D 可视化无人机运动
  4. 04使用 OSM 建筑构建环境

安装

复制下面的命令,在终端中运行。

$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 在 3D 环境中可视化 UAV 飞行

不适用场景

  • 生成飞行轨迹(航路点设计、min-snap)——请改用轨迹技能
  • 基于 Simulink 的 UAV 仿真(UAV Toolbox Simulink 模块)
  • 路径规划和避障算法
  • 仅进行坐标转换(ned2lla、lla2ned)——请直接使用这些函数

工作流

  1. 创建场景 — 使用 uavScenario 设置 ReferenceLocation 和 UpdateRate
  2. 添加地形 — 使用 addMesh(scene,"terrain",...),搭配 GMTED2010 或自定义 DTED
  3. 添加建筑物 — 使用 addMesh(scene,"buildings",...) 导入 OSM 文件
  4. 添加平台 — 使用 uavPlatform 添加轨迹,然后调用 updateMesh
  5. 附加传感器 — 使用 uavSensor 适配器将传感器绑定到平台
  6. 运行仿真 — 执行 setup → advance → updateSensors → read 循环
  7. 可视化 — 使用 show3D 并设置 FastUpdate 进行动画演示

主要函数

函数用途工具箱
uavScenario创建仿真场景UAV Toolbox
addMesh添加地形、建筑物或自定义网格UAV Toolbox
uavPlatform向场景添加 UAV 平台UAV Toolbox
updateMesh设置平台主体网格UAV Toolbox
uavSensor将传感器附加到平台UAV Toolbox
setup初始化场景以进行仿真UAV Toolbox
advance将仿真向前推进一个时间步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);

也可以使用局部 ENU 坐标(米),不设置 UseLatLon:

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

也可以使用局部 ENU 坐标(米),不设置 UseLatLon:

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 — 1 个元素的单元格:"quadrotor"/"fixedwing" 使用 {scaleFactor},"cuboid" 使用 {[L W H]}
  • color — RGB 三元组(必需,不可省略)
  • position — [x y z] 偏移量;使用 [0 0 0] 表示默认值
  • orientation — 四元数 [w x y z];对于 NED 场景,使用 [0 1 0 0](绕滚转轴旋转 180 度,使 z 轴朝下的机体坐标系正向朝上)

有效的网格类型:"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 — 逻辑值,当传感器在此时间步有新数据时为 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 移动。

注意事项

错误后果修正方法
addMesh(...,latLim,lonLim) 未指定 UseLatLon=true导入 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 参数错误 — 输入参数不足始终将 RGB 三元组作为第 4 个参数传入
将 waypointTrajectory 用于 ENU 坐标系,而平台使用 NED错误 — 参考坐标系不匹配在轨迹中设置 "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。

版权所有 2026 The MathWorks, Inc.

评论

支持 Markdown