【UAV】UAV Scenario 仿真教程:无人机飞行与激光雷达点云生成【含matlab代码】

发布时间:2026/7/19 18:37:01
【UAV】UAV Scenario 仿真教程:无人机飞行与激光雷达点云生成【含matlab代码】 UAV Scenario 仿真教程无人机飞行与激光雷达点云生成摘要在无人机自主算法开发中仿真环境是验证算法有效性的重要一环。MATLAB 的 UAV Toolbox 提供了uavScenario对象能够帮助我们快速搭建包含静态障碍物如建筑物和运动平台如无人机的 3D 场景并支持挂载多种传感器如 INS、GPS、激光雷达生成仿真数据。本文将基于官方示例一步步演示如何创建一个城市建筑场景让无人机沿预定轨迹飞行并通过机载激光雷达实时采集点云数据用于后续的建图或定位算法测试。1. 引言无人机仿真场景能够定义静态障碍物建筑、地面等和动态平台无人机支持全局坐标系下的轨迹定义和坐标系转换提供可视化功能便于观察飞行过程集成传感器模型生成逼真的感知数据。本教程将构建一个包含 11 栋建筑物的场景无人机搭载激光雷达沿预设路径飞行并同步采集点云。2. 创建 UAV 场景首先我们创建一个uavScenario对象指定更新频率和参考位置经纬高。% 创建 UAV 场景更新频率 2Hz参考位置 [75 -46 0]sceneuavScenario(UpdateRate2,ReferenceLocation[75-460]);添加一个地面平面颜色设为灰色。% 定义颜色color.Gray0.651*ones(1,3);color.Green[0.39220.83140.0745];color.Red[100];% 添加地面多边形范围 高度范围addMesh(scene,polygon,{[-250-150;200-150;200180;-250180],[-40]},color.Gray);3. 添加建筑物网格我们加载预定义的建筑物多边形数据buildingData.mat该文件包含了 11 组多边形顶点。利用addMesh函数以“多边形拉伸”方式生成三维建筑高度从 10 米到 30 米不等。load(buildingData.mat);% 逐个添加建筑每组多边形和高度范围addMesh(scene,polygon,{buildingData{1}(1:4,:),[030]},color.Green);addMesh(scene,polygon,{buildingData{2}(2:5,:),[030]},color.Green);addMesh(scene,polygon,{buildingData{3}(2:10,:),[030]},color.Green);addMesh(scene,polygon,{buildingData{4}(2:9,:),[030]},color.Green);addMesh(scene,polygon,{buildingData{5}(1:end-1,:),[030]},color.Green);addMesh(scene,polygon,{buildingData{6}(1:end-1,:),[015]},color.Green);addMesh(scene,polygon,{buildingData{7}(1:end-1,:),[030]},color.Green);addMesh(scene,polygon,{buildingData{8}(2:end-1,:),[010]},color.Green);addMesh(scene,polygon,{buildingData{9}(1:end-1,:),[015]},color.Green);addMesh(scene,polygon,{buildingData{10}(1:end-1,:),[030]},color.Green);addMesh(scene,polygon,{buildingData{11}(1:end-2,:),[030]},color.Green);使用show3D显示场景并调整坐标轴范围。show3D(scene);xlim([-250200]);ylim([-150180]);zlim([050]);运行后您将看到一个包含绿色建筑和灰色地面的三维场景。4. 定义无人机平台无人机平台uavPlatform是传感器的载体。我们使用 NED北-东-下参考系初始位置和姿态从飞行日志数据flightData.mat中加载。load(flightData.mat);% 创建平台指定参考系、初始位置和姿态欧拉角转四元数platuavPlatform(UAV,scene,...ReferenceFrameNED,...InitialPositionposition(:,:,1),...InitialOrientationeul2quat(orientation(:,:,1)));% 设置平台外观四旋翼模型红色并旋转180度使方向正确updateMesh(plat,quadrotor,{10},color.Red,[000],eul2quat([00pi]));注意position和orientation是从flightData.mat中读取的三维数组分别表示每个时刻的位置x,y,z和欧拉角roll,pitch,yaw。5. 安装激光雷达传感器在无人机上挂载一个激光雷达点云生成器uavLidarPointCloudGenerator并用uavSensor封装。安装位置相对于无人机机体坐标系为[0,0,-1]即无人机下方 1 米。% 创建激光雷达模型lidarmodeluavLidarPointCloudGenerator(...AzimuthResolution0.3324099,...ElevationLimits[-2020],...ElevationResolution1.25,...MaxRange90,...UpdateRate2,...HasOrganizedOutputtrue);% 挂载到平台lidaruavSensor(Lidar,plat,lidarmodel,MountingLocation[0,0,-1]);6. 沿预定轨迹飞行并采集点云现在我们让无人机按预定义的轨迹运动并在每个激光雷达更新时刻读取点云数据。为了可视化我们预先创建轨迹线图和点云散点图并利用数据源动态刷新。6.1 场景可视化与绘图初始化[ax,plotFrames]show3D(scene);xlim([-250200]);ylim([-150180]);zlim([050]);view([-11030]);axis equal;hold on;创建轨迹线白色和点云散点图青色。注意调整数据源属性以提高绘图效率。% 轨迹线trajplot3(nan,nan,nan,Color[111],LineWidth2);traj.XDataSourceposition(:,2,1:idx1);traj.YDataSourceposition(:,1,1:idx1);traj.ZDataSource-position(:,3,1:idx1);% 点云散点图colormap(jet);ptpointCloud(nan(1,1,3));scatterplotscatter3(nan,nan,nan,1,[0.30200.74510.9333],ParentplotFrames.UAV.Lidar);scatterplot.XDataSourcereshape(pt.Location(:,:,1),[],1);scatterplot.YDataSourcereshape(pt.Location(:,:,2),[],1);scatterplot.ZDataSourcereshape(pt.Location(:,:,3),[],1);scatterplot.CDataSourcereshape(pt.Location(:,:,3),[],1)-min(reshape(pt.Location(:,:,3),[],1));6.2 仿真循环初始化场景然后逐帧推进时间。每次读取激光雷达数据若更新成功则刷新可视化。setup(scene);foridx0:size(position,3)-1% 读取当前激光雷达数据[isupdated,lidarSampleTime,pt]read(lidar);ifisupdated% 快速更新场景视图show3D(scene,Time,lidarSampleTime,FastUpdatetrue,Parentax);% 刷新所有数据源refreshdata;drawnow limitrate;end% 推进仿真时间advance(scene);% 移动平台到下一个位置位置姿态move(plat,[position(:,:,idx1),zeros(1,6),eul2quat(orientation(:,:,idx1)),zeros(1,3)]);% 更新所有传感器updateSensors(scene);endhold off;在此循环中move函数的参数向量包含位置3个、速度3个、角速度3个、四元数4个、加速度3个等此处我们仅指定位置和姿态其余置零。7. 运行结果与可视化仿真过程中您将看到无人机在建筑群间飞行同时激光雷达实时扫描周围环境生成的点云以彩色散点图形式显示在场景中颜色代表高度。轨迹线则记录飞行路径。实际运行时会动态更新8. 总结本教程演示了如何使用 MATLAB UAV Toolbox 构建一个包含建筑障碍物的三维场景让无人机沿预定轨迹飞行并挂载激光雷达采集点云数据。该框架可以轻松扩展至更多传感器如 GPS、IMU和更复杂的轨迹适用于 SLAM、路径规划、避障等算法的快速原型验证。参考资料MATLAB UAV Scenario 文档uavLidarPointCloudGenerator 文档完整代码整合如下您可以复制到 MATLAB 中直接运行% 创建场景sceneuavScenario(UpdateRate2,ReferenceLocation[75-460]);% 添加地面和颜色定义color.Gray0.651*ones(1,3);color.Green[0.39220.83140.0745];color.Red[100];addMesh(scene,polygon,{[-250-150;200-150;200180;-250180],[-40]},color.Gray);% 加载建筑数据load(buildingData.mat);addMesh(scene,polygon,{buildingData{1}(1:4,:),[030]},color.Green);addMesh(scene,polygon,{buildingData{2}(2:5,:),[030]},color.Green);addMesh(scene,polygon,{buildingData{3}(2:10,:),[030]},color.Green);addMesh(scene,polygon,{buildingData{4}(2:9,:),[030]},color.Green);addMesh(scene,polygon,{buildingData{5}(1:end-1,:),[030]},color.Green);addMesh(scene,polygon,{buildingData{6}(1:end-1,:),[015]},color.Green);addMesh(scene,polygon,{buildingData{7}(1:end-1,:),[030]},color.Green);addMesh(scene,polygon,{buildingData{8}(2:end-1,:),[010]},color.Green);addMesh(scene,polygon,{buildingData{9}(1:end-1,:),[015]},color.Green);addMesh(scene,polygon,{buildingData{10}(1:end-1,:),[030]},color.Green);addMesh(scene,polygon,{buildingData{11}(1:end-2,:),[030]},color.Green);% 显示场景show3D(scene);xlim([-250200]);ylim([-150180]);zlim([050]);% 加载飞行数据load(flightData.mat);% 创建无人机平台platuavPlatform(UAV,scene,ReferenceFrameNED,...InitialPositionposition(:,:,1),InitialOrientationeul2quat(orientation(:,:,1)));updateMesh(plat,quadrotor,{10},color.Red,[000],eul2quat([00pi]));% 创建激光雷达传感器lidarmodeluavLidarPointCloudGenerator(AzimuthResolution0.3324099,...ElevationLimits[-2020],ElevationResolution1.25,...MaxRange90,UpdateRate2,HasOrganizedOutputtrue);lidaruavSensor(Lidar,plat,lidarmodel,MountingLocation[0,0,-1]);% 可视化准备[ax,plotFrames]show3D(scene);xlim([-250200]);ylim([-150180]);zlim([050]);view([-11030]);axis equal;hold on;% 轨迹和点云绘图trajplot3(nan,nan,nan,Color[111],LineWidth2);traj.XDataSourceposition(:,2,1:idx1);traj.YDataSourceposition(:,1,1:idx1);traj.ZDataSource-position(:,3,1:idx1);colormap(jet);ptpointCloud(nan(1,1,3));scatterplotscatter3(nan,nan,nan,1,[0.30200.74510.9333],ParentplotFrames.UAV.Lidar);scatterplot.XDataSourcereshape(pt.Location(:,:,1),[],1);scatterplot.YDataSourcereshape(pt.Location(:,:,2),[],1);scatterplot.ZDataSourcereshape(pt.Location(:,:,3),[],1);scatterplot.CDataSourcereshape(pt.Location(:,:,3),[],1)-min(reshape(pt.Location(:,:,3),[],1));% 仿真主循环setup(scene);foridx0:size(position,3)-1[isupdated,lidarSampleTime,pt]read(lidar);ifisupdatedshow3D(scene,Time,lidarSampleTime,FastUpdatetrue,Parentax);refreshdata;drawnow limitrate;endadvance(scene);move(plat,[position(:,:,idx1),zeros(1,6),eul2quat(orientation(:,:,idx1)),zeros(1,3)]);updateSensors(scene);endhold off;本博客基于 MATLAB R2024a 编写不同版本可能略有差异。欢迎交流讨论