关于 matlab-create-uav-scenario
使用 UAV Toolbox 的 uavScenario 框架构建并仿真无人机环境的技能。它指导用户添加地形、建筑和传感器平台,并运行仿真及 3D 可视化。
主要功能
- 01用 uavScenario 创建场景
- 02添加地形和 OSM 建筑
- 03配置无人机平台与轨迹
- 04附加 GPS 和 INS 传感器
- 05运行分步传感器仿真
- 06以 3D 可视化飞行
适用场景
- 01仿真无人机在地形上飞行
- 02测试场景运行中的传感器读数
- 03用 show3D 可视化无人机运动
- 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)——请直接使用这些函数
工作流
- 创建场景 — 使用
uavScenario设置ReferenceLocation和UpdateRate - 添加地形 — 使用
addMesh(scene,"terrain",...),搭配 GMTED2010 或自定义 DTED - 添加建筑物 — 使用
addMesh(scene,"buildings",...)导入 OSM 文件 - 添加平台 — 使用
uavPlatform添加轨迹,然后调用updateMesh - 附加传感器 — 使用
uavSensor适配器将传感器绑定到平台 - 运行仿真 — 执行
setup→advance→updateSensors→read循环 - 可视化 — 使用
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 |
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);
也可以使用局部 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— 逻辑值,当传感器在此时间步有新数据时为 truet— 以秒为单位的时间戳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.