主要内容

设计LIDAR SLAM算法使用虚幻引擎仿真环境

此示例显示了如何从3D仿真环境记录合成的LIDAR传感器数据,并使用记录的数据开发同时定位和映射(SLAM)算法。仿真环境通过EpicGames®使用UnreaM引擎®。

介绍

自动化驾驶工具箱™在Simulink®中集成了一个虚幻发动机仿真环境。金宝app金宝app可以在此仿真环境相关的Simulink块Drivingsim3d.图书馆。这些块提供了以下能力:

  • 在3D模拟环境中选择不同的场景

  • 放置和移动车辆在现场

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

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

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

在此示例中,您可以使用从模拟环境生成的合成雷达数据评估LIDAR感知算法。该示例通过以下步骤来浏览以下步骤:

  • 从仿真环境记录和可视化合成激光雷达传感器数据。

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

在仿真环境中设置场景

首先,在仿真环境中设置可用于测试感知算法的仿真环境中的场景。使用场景描绘典型的城市块,其中单个车辆是正在测试的车辆。您可以使用此场景来测试城市道路设置中算法的性能。

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

录制驱动段的%负载参考路径xdata = load('refposex.mat');ydata = load('refposey.mat');yawdata = load('重复.mat');%设置模型使用的工作区变量refposex = xdata.refposex;recposey = ydata.refpossy;重复= yawdata.refposest;%显示路径在场景图像上场景='USCityBlock';HSCENE =数字;求助者抄本(场景);抓住散射(refposex(:,2),重新发作(:,2),7,'填充'%调整轴限制XLIM([ -  150 100])ylim([ -  125 75])

Lidarslamin3DSimulation.金宝appSimulink模型配置了美国城市街区场景使用仿真3D场景配置堵塞。该模型使用的车辆在现场上使用模拟3D带地面的车辆堵塞。LIDAR传感器使用使用的车辆附着在车辆上仿真3D LIDAR.堵塞。在“块”对话框中,使用安装标签调整传感器的放置。使用参数选项卡配置传感器的属性以模拟不同的LIDAR传感器。在该示例中,激光雷达安装在屋顶的中心。LIDAR传感器配置为模拟典型的Velodyne®HDL-32E传感器。

关闭(HSCENE)如果〜ispc错误([“只有微软支持3D模拟”金宝app,char(174),'Windows',char(174),'。']);结尾%打开模型modelName ='lidarslamin3dsimulation';Open_System(ModelName);snapnow;

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

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

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

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

  3. 可视化内置地图的结果。

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

记录和可视化子系统使用a将合成的LIDAR数据记录到工作区到工作区(金宝appSimulink)堵塞。这可视化点云Matlab功能块使用一个PCPlayer.对象可视化流点云。这可视化ins路径MATLAB功能块可视化流INS数据。

模拟模型。流点云显示屏显示了合成的LIDAR传感器数据。场景显示显示了合成INS传感器数据。一旦模型完成了模拟,就会simVariable保存一个结构,其中的变量被写入工作空间。这螺旋派托克劳德功能将传感器数据提取到数组中pointcloud.对象。这pointcloud.对象是用于持有LIDAR数据的基本数据结构并在MATLAB中执行点云处理。此外,ins数据从垫文件加载,后来将用于开发感知算法。使用该数据进行数据担任者对象。INS数据已经过处理,以包含世界坐标下的[x, y, θ]姿态。

当参考路径完成时,更新仿真停止时间结束simstoptime = trefposex(结束,1);set_param(gcs,'停止',num2str(simstoptime));%加载来自垫文件的数据data = load('insmeasurement.mat');insdata = data.insmeasurement.signals.values;%运行模拟simout = sim(modelname);%从录制的数据创建PointCloud阵列ptcloudarr = helpergetpointcloud(simout);

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

合成激光雷达传感器数据可用于开发、实验和验证不同场景下的感知算法。本例使用一种算法从流激光雷达数据构建环境的3D地图。这种算法是本地化等应用程序的构建块。它还可以用于创建地理区域的高清地图,然后用于在线本地化。地图构建算法封装在HelperlidarmapBuilder.班级。此类使用MATLAB中的点云和LIDAR处理功能。有关更多详细信息,请参阅点云处理

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

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

  2. 注册点云:使用正态分布变换(NDT)注册算法将传入点云注册到最后点云。这pcregisterndt函数执行注册。提高注册的准确性和效率,pcdownsample.用于在注册之前缩小点云。初始变换估计可以大大提高注册性能。在该示例中,使用INS测量来实现这一点。

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

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

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

这种算法易于漂移,同时累积长序列的地图。为了减少漂移,典型的检测循环闭环并使用图表校正漂移。看使用SLAM构建来自LIDAR数据的地图详细治疗的例子。这configureloopdetector.方法的方法HelperlidarmapBuilder.类配置循环闭合检测。配置后,每次发生循环闭合检测UpdateMap.使用以下函数和类调用:

  • PCViewSet.:管理与点云测定值,如点云,姿势和连接相关联的数据。

  • scancontextdescriptor.:从点云中提取扫描上下文描述符。扫描上下文是用于循环闭合检测的2D全局特征描述符。

  • Scancontextdists:计算扫描上下文描述符之间的距离。

  • 辅助食物练习师:辅助类存储计算的功能描述符并搜索最近的功能匹配。最近的特征匹配是循环关闭候选。使用特征距离使用Scancontextdists

  • HelperloopClosuredetector:检测循环闭合。通过计算每个传入点云的扫描上下文功能并找到最近的特征匹配,通过计算循环闭合候选。然后,点云注册用于接受或拒绝循环关闭候选。

%设置随机种子,例如再现性RNG(0);%创建一个激光雷达地图制造商MapBuilder = HelperlidarmapBuilder('downsamplepercent',0.25,......''stedionGridstep',3.5,'verbose', 真的);%配置Map Builder以检测循环闭合configureloopdetector(MapBuilder,......'loopconfirmationrmse',2.8,......“MatchThreshold”,0.15,......'distancethreshold', 0.15);%循环通过点云阵列,逐步构建地图skipframes = 5;numframes = numel(ptcloudarr);ExitLoop = false;previnsmeas = insdata(1,:);为了n = 1:skipframes:numframes insmeas = insdata(n,:);使用INS估计初始转换inittform = HelperestimaterEthativetransformationFromins(insmeas,previnsmeas);%更新映射与新的激光框架UpdateMap(MapBuilder,PtCloudARR(N),Inittform);%更新顶部视图显示Isdisplayopen = UpdateDisplay(MapBuilder,ExitLoop);如果需要,%检查并退出ExitLoop =〜IsDisplayopen;previnsmeas = insmeas;结尾snapnow;%关闭显示cliftisplay = true;updatedisplay(mapbuilder,cliftisplay);
Loop closure candidate found between view Id 210 and 2 with RMSE 1.176767…使用RMSE 2.901281在视图Id 211和3之间找到接受的循环闭包候选…拒绝了

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

一旦检测到足够的环形封闭,可以使用姿势图优化校正累积漂移。这是通过的优化emappose.方法的方法HelperlidarmapBuilder.班级,使用createposepraph..创建姿势图和优化术照片.优化姿势图。

在姿态图被优化后,使用更新的姿态重建地图。这是通过的重建的方法HelperlidarmapBuilder.使用pcalign.

采用优化emappose.重建纠正漂移并重建地图。可视化姿态图优化之前和之后的视图。

姿态图优化之前%可视化视图hfigviewset =图;hg = plot(mapbuilder.viewset);查看(HG.Parent,2);标题(“Viewset显示”%优化姿势图和重建地图OptimizeMapposes(MapBuilder);RebuildMap(MapBuilder);姿态图优化后%覆盖视图持有(hg.parent,'在');plot(mapbuilder.viewset);持有(hg.parent,'离开');传奇(hg.parent,'前''后'
优化姿势图......完成重建地图......完成

可视化使用录制的数据计算的累计点云映射。

关闭(hfigviewset)hfigmap = figure;pcshow(mapbuilder.map)%自定义轴标签和标题Xlabel('x(m)')ylabel('y(m)')Zlabel('z(m)') 标题('点云映射')HelpermakeFigurepublishfriency(HFigMap);

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

%关闭窗口关闭(hfigmap)close_system(modelname)

金宝app支持功能

螺旋派托克劳德提取一个数组pointcloud.对象。

功能ptcloudarr = helpergetpointcloud(simout)%提取信号ptclouddata = simout.ptclouddata.signals.values;%创建PointCloud阵列ptcloudarr = pointcloud(ptclouddata(:::::,1));为了n = 2:尺寸(ptclouddata,4)ptcloudarr(end + 1)= pointcloud(ptclouddata(:,:,:,n));%#OK 结尾结尾

HelpermakeFigurepublish友谊调整图形以便发布捕获的屏幕截图是正确的。

功能HelpermakeFigurepublishFriendly(HFIG)如果〜Isempty(HFIG)&& IsValid(HFig)HFig.HandLevisibility ='打回来';结尾结尾

下面包含在示例中使用的金宝app其他支持功能或类。

HelperlidarmapBuilder.使用点云扫描逐步构建激光雷达地图。处理每个点云以移除接地平面和自动转车,并注册到前一云。然后通过对齐和合并点云来逐步构建点云图。

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

辅助食物练习师创建一个可用于搜索最近特征匹配的对象。

HelperloopClosuredetector创建一个可用于使用扫描上下文功能描述符检测循环闭环的对象。

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

Helperupdatepolyline.更新与助手HeNeImage一起使用的折线位置。

也可以看看

功能

对象

相关话题