主要内容

利用虚拟发动机仿真环境设计激光雷达SLAM算法

该示例演示了如何从三维仿真环境中记录合成激光雷达传感器数据,并使用记录的数据开发同步定位和测绘(SLAM)算法。模拟环境使用Epic Games®的虚幻引擎®。

介绍

在Simulink®中集成了一个虚幻引擎仿真环境。金宝app金宝app与此仿真环境相关的Simulink模块可以在drivingsim3d图书馆。这些块提供了以下能力:

  • 在3D仿真环境中选择不同的场景

  • 放置和移动车辆在现场

  • 在车辆上附加和配置传感器

  • 根据车辆周围环境模拟传感器数据

这种强大的模拟工具可用于在开发,测试和验证自动驾驶算法的性能时补充实际数据,使得可以测试难以在现实世界中复制的场景。

在本例中,使用仿真环境生成的合成激光雷达数据评估激光雷达感知算法。该示例将引导您完成以下步骤:

  • 记录并可视化模拟环境中的合成激光雷达传感器数据。

  • 开发一种感知算法,利用MATLAB®中的SLAM来构建地图。

在仿真环境中设置场景

首先,在模拟环境中设置一个场景,该场景可用于测试perception算法。使用一个场景,描绘一个典型的城市街区,其中有一辆车就是被测车辆。您可以使用该场景在城市道路设置中测试算法的性能。

接下来,选择用于在现场进行车辆的轨迹。这为虚幻引擎模拟选择路径点(自动驾驶工具箱)示例描述如何在场景中交互地选择一系列航点并生成车辆轨迹。此示例使用使用录制的驱动器段使用alcerselectscenewayspoints函数,如路径点选择示例中所述。

录制驱动段的%负载参考路径扩展数据=负载(“refPosesX.mat”);yData =负载(“refPosesY.mat”);yawData =负载(“refPosesT.mat”);%设置模型使用的工作区变量refPosesX=xData.refPosesX;refPosesY=yData.refPosesY;refPosesT=yawData.refPosesT;%显示路径在场景图像上仙人掌=“USCityBlock”;hScene=图形;helperShowSceneImage(场景名称);保持在…上散射(refPosesX (:, 2), refPosesY (:, 2), 7'填充'%调整轴限制xlim([-150 100])ylim([-125 75])

Lidarslamin3DSimulation.金宝appSimulink模型配置为美国城市街区(自动驾驶工具箱)现场使用模拟三维场景配置(自动驾驶工具箱)块模型使用模拟3D车辆与地面跟踪(自动驾驶工具箱)块。一个激光雷达传感器连接到车辆使用仿真3D LIDAR.(自动驾驶工具箱)块。在“块”对话框中,使用安装标签调整传感器的放置。使用参数选项卡,配置传感器属性,模拟不同的激光雷达传感器。在这个例子中,激光雷达安装在屋顶的中心。激光雷达传感器配置为建模典型的Velodyne®HDL-32E传感器。

关闭(hScene)如果~ispc错误([“只有微软支持3D模拟”金宝app,char(174),'Windows',char(174),'。']);结尾%打开模型modelname =.“LidarSLAMIn3DSimulation”;开放式系统(型号名称);snapnow;

该模型记录和可视化合成激光雷达数据。记录的数据可通过模拟输出,并可用于在MATLAB中原型算法。此外,该模型使用来自工作区(金宝appSimulink)阻止从惯性导航传感器(INS)加载模拟测量。通过使用ANS数据担任者(自动驾驶工具箱)对象,并保存在垫文件中。

本示例的其余部分遵循以下步骤:

  1. 模拟模型以记录传感器生成的合成激光雷达数据并将其保存到工作区。

  2. 使用保存到工作空间的传感器数据在MATLAB中开发感知算法。感知算法使用SLAM构建环境地图。

  3. 可视化生成地图的结果。

记录和可视化合成激光雷达传感器数据

记录并可视化子系统使用a将合成激光雷达数据记录到工作空间到工作区(金宝appSimulink)块。这可视化点云MATLAB功能块使用pcplayer对象可视化流云。这可视化INS路径MATLAB功能块可视化流INS数据。

模拟模型。流点云显示器显示合成激光雷达传感器数据。现场显示器显示合成的INS传感器数据。一旦模型完成了仿真,simVariable保存一个结构,其中的变量被写入工作空间。这helperGetPointCloud函数将传感器数据提取到pointCloud对象。这pointCloud对象是用于持有LIDAR数据的基本数据结构并在MATLAB中执行点云处理。此外,ins数据从垫文件加载,后来将用于开发感知算法。使用该数据进行数据担任者(自动驾驶工具箱)对象。INS数据已经过处理,以包含世界坐标下的[x, y, θ]姿态。

当参考路径完成时,更新仿真停止时间结束simStopTime=refPosesX(结束,1);设置参数(地面军事系统,'停止',num2str(simstoptime));%从MAT文件加载INS数据data = load(“insMeasurement.mat”);insdata = data.insmeasurement.signals.values;%运行模拟simout = sim(modelname);%从记录的数据创建点云阵列ptCloudArr = helperGetPointCloud (simOut);

使用记录的数据开发感知算法

合成的LIDAR传感器数据可用于开发,实验和验证不同场景中的感知算法。此示例使用算法从流式激发器数据构建环境的3D映射。这种算法是用于本地化的应用的构建块。它也可用于为可以用于在线本地化的地理区域创建高清(HD)映射。地图建筑算法封装在其中helperLidarMapBuilder班级。此类使用MATLAB中的点云和LIDAR处理功能。有关更多详细信息,请参阅点云处理

helperLidarMapBuilderClass从LIDAR传感器接收传入点云,并逐步使用以下步骤构建地图:

  1. 预处理点云:预处理每个进入点云以去除地面平面和自助式车辆。

  2. 注册点云:使用正态分布变换(NDT)注册算法将传入点云注册到最后点云。这Pcregisterndt.函数执行注册。为了提高配准的准确性和效率,pcdownsample.用于在注册之前对点云进行下采样。初始变换估计可以显著提高配准性能。在本例中,使用INS测量来实现这一点。

  3. 注册点云:使用从注册中获得的估计变换将传入点云转换为地图的参考框架。

  4. 更新视图集:将传入点云和估计的绝对姿势添加为视图中的视图pcviewset对象。使用它们之间的相对变换添加当前和上一个视图之间的连接。

UpdateMap.的方法helperLidarMapBuilder类完成这些步骤helperestimaterelativetransformationfromins.功能计算从模拟INS传感器读数注册的初始估计。

这种算法易于漂移,同时累积长序列的地图。为了减少漂移,典型的检测循环闭环并使用图表校正漂移。看使用SLAM构建来自LIDAR数据的地图(自动驾驶工具箱)详细治疗的例子。这配置环路检测器的方法helperLidarMapBuilder类配置循环结束检测。一旦配置,每次都会进行循环结束检测UpdateMap.调用时,使用以下函数和类:

  • pcviewset:管理与点云里程计相关联的数据,如点云、姿势和连接。

  • scanContextDescriptor:从每个传入点云提取扫描上下文描述符。扫描上下文是用于循环闭合检测的二维全局功能描述符。

  • scancontextloopdetector.:管理扫描上下文描述符并检测循环闭包。它使用Scancontextdists计算扫描上下文描述符之间的距离并选择最接近的特征匹配。

然后,该示例使用点云注册来接受或拒绝循环关闭候选,并找到环路闭合变换。

%设置随机种子的重现性rng (0);创建一个激光雷达地图生成器mapBuilder=helperLidarMapBuilder('downsamplepercent', 0.25,...''stedionGridstep', 3.5,“详细”,对);%配置Map Builder以检测循环闭合配置LoopDetector(mapBuilder,...'loopconfirmationrmse'2....“搜索半径”, 0.15,...“距离阈值”, 0.15);%循环点云阵列并逐步构建地图skipFrames=5;numFrames=numel(ptCloudArr);exitLoop=false;prevInsMeas=insData(1,:);为了n = 1:skipframes:numframes insmeas = insdata(n,:);%利用INS估计初始变换initTform=HelperEstimaterRelativeTransformationfromINS(insMeas,prevInsMeas);用新的激光雷达帧更新地图updateMap(mapBuilder、ptCloudArr(n)、initTform);%更新顶部视图显示IsDisplayPen=updateDisplay(mapBuilder,exitLoop);%检查并退出,如果需要exitLoop = ~ isDisplayOpen;prevInsMeas = insMeas;结尾斯内普诺;%关闭显示closeDisplay = true;updateDisplay (mapBuilder closeDisplay);
在视图Id 211和4之间找到循环闭合候选项,RMSE 1.019180…已接受

累计漂移随时间逐渐增加,导致无法使用的地图。

一旦检测到足够的闭合环路,累积的漂移可以使用位姿图优化来校正。这是由优化mapposes的方法helperLidarMapBuilder类,它使用createposepraph..创建姿势图和优化术照片(导航工具箱)优化姿势图。

在姿态图被优化后,使用更新的姿态重建地图。这是由重建的方法helperLidarMapBuilder使用pcalign

使用优化mapposes重建修正漂移,重建地图。可视化姿态图优化前后的视图集。

%在姿势图优化之前可视化视图集hfigviewset =图;hg = plot(mapbuilder.viewset);查看(HG.Parent,2);标题(“Viewset显示”%优化姿势图和重建地图优化贴图姿势(mapBuilder);重建贴图(mapBuilder);%姿势图优化后的叠加视图集持有(hG.Parent,'在');绘图(mapBuilder.ViewSet);保持(hG.Parent),“关闭”);传奇(hG。父母,“之前”“后”
优化构成图……完成重建地图……

可视化使用记录的数据计算的累积点云图。

close(hFigViewset) hFigMap =图;pcshow (mapBuilder.Map)%自定义轴标签和标题包含(‘X(m)’)伊拉贝尔(“Y (m)”)Zlabel(‘Z(m)’)标题(“点云地图”) helperMakeFigurePublishFriendly (hFigMap);

通过改变场景,在场景中放置更多的车辆,或更新传感器安装和参数,感知算法可以在不同场景下进行压力测试。这种方法可用于增加在现实世界中难以再现的场景的覆盖率。

%关闭窗户关上(hFigMap) close_system (modelName)

金宝app辅助功能

helperGetPointCloud提取一个数组showPointCloud对象。

作用ptCloudArr=helperGetPointCloud(simOut)%提取信号ptclouddata = simout.ptclouddata.signals.values;%创建PointCloud阵列ptCloudArr=pointCloud(ptCloudData(:,:,:,1));为了n=2:size(ptCloudData,4)ptCloudArr(end+1)=点云(ptCloudData(:,:,:,n));%#OK 结尾结尾

HelpermakeFigurepublish友谊调整数字,使截图发布是正确的。

作用helperMakeFigurePublishFriendly (hFig)如果~是空的(hFig) &&是有效的(hFig)HandleVisibility ='打回来';结尾结尾

下面包括示例中使用的其金宝app他支持函数或类。

helperLidarMapBuilder使用点云扫描逐步构建激光雷达地图。对每个点云进行处理以移除地平面和ego车辆,并根据之前的点云进行注册。然后通过对齐和合并点云逐步构建点云地图。

helperestimaterelativetransformationfromins.估计来自INS数据的相对转换。

救济人员CeneImage.显示虚幻场景的顶部视图图像。

帮助器更新多段线更新与助手HeNeImage一起使用的折线位置。