这个例子演示了如何实现同步定位和映射(大满贯)算法对激光雷达扫描获得使用姿势图模拟环境的优化。这个例子需要仿真软件®3 d动画™和导航工具金宝app箱™。
这个例子的目的是建立一个使用激光雷达扫描的地图环境和检索机器人的轨迹,机器人模拟器的循环。
大满贯的基础算法中可以找到实现同步定位和映射(大满贯)与激光雷达扫描的例子。
机器人轨迹路径点给机器人移动的模拟环境。对于这个示例,机器人轨迹是为你提供的。
负载slamRobotTrajectory.mat
机器人的平面图和近似路径提供用于演示目的。这张图片显示了环境映射和机器人的近似轨迹。
这个例子使用一个虚拟场景与两辆车和四面墙障碍和机器人配备了激光雷达扫描模型的3 d动画观众所示。金宝app你可以在一个虚拟场景使用导航菜单栏,工具栏,导航面板,鼠标,键盘。关键特性的观众了飞机操纵使用空间鼠标MATLAB®对象(金宝app模型3 d动画)的例子。
创建和打开vrworld
对象。
w = vrworld (“slamSimulatedWorld.x3d”);打开(w)
创建一个图显示了虚拟场景
多联机= vrfigure (w)
多联机= vrfigure对象:1×1微分轮式机器人激光雷达传感器
虚拟场景表示为VRML文件的层次结构模型所使用的3 d动画。金宝app子对象的位置和姿态是相对于父对象。机器人vrnode
用于操纵机器人的位置和姿态的虚拟场景。
访问VRML节点,一个合适的vrnode
必须创建对象。节点是被它的名字和它属于的世界。
创建vrnode
处理机器人的虚拟环境。
robotVRNode = vrnode (w,“机器人”);
设置初始位置的机器人轨迹第一点并设置初始0 rad绕y轴旋转。
robotVRNode.children。翻译=[轨迹(1,1)0轨迹(1、2)];robotVRNode.children。旋转= [0 1 0 0];
创建处理机器人通过创建vrnode激光雷达传感器。
lidarVRNode = vrnode (w,“LIDAR_Sensor”);
模拟激光雷达利用总240激光线,这些线的夹角为1.5度。
角= 180:-1.5:-178.5;角函数=(角度)”;
等待更新和初始化虚拟场景
暂停(1)
创建一个lidarSLAM
对象和设置地图的分辨率和马克斯激光雷达范围。这个例子使用一个模拟的虚拟环境。机器人在这vrworld
有一个激光雷达传感器范围从0到10米。设置最大激光雷达范围(8美元)小于最大扫描范围内,随着激光读数不准确附近最大范围。将网格地图的分辨率设置为每米20个细胞,使一个5厘米精度。在使用这两个参数的例子。
maxLidarRange = 8;mapResolution = 20;slamAlg = lidarSLAM (mapResolution maxLidarRange);
关闭循环参数设置的经验。使用更高的闭合循环阈值有助于拒绝关闭循环识别过程中假阳性。记住,高分匹配可能仍然是一个糟糕的比赛。例如,扫描收集在一个有相似或重复特性的环境更容易产生假阳性。使用更高的循环关闭搜索允许算法搜索半径更大范围的地图的当前姿态估计循环闭包。
slamAlg。LoopClosureThreshold = 200;slamAlg。LoopClosureSearchRadius = 3;controlRate = rateControl (10);
创建一个循环,通过虚拟场景导航机器人。机器人的位置更新循环的轨迹点。扫描得到的机器人作为机器人的导航功能环境。
循环闭包是在机器人移动的自动检测。构成图优化检测到循环关闭时执行。这可以检查使用输出optimizationInfo.IsPerformed
值addScan
。
快照来演示的扫描和姿势当第一个循环关闭视觉识别和验证结果。这个图显示覆盖扫描和优化构成图的第一循环关闭。
最后建立地图将所有扫描后进行收集和处理。
情节不断更新是机器人导航通过虚拟场景
firstLoopClosure = false;扫描=细胞(长度(轨迹),1);图为i = 1:长度(轨迹)%使用翻译属性来移动机器人。robotVRNode.children。翻译=[轨迹(我,1)0轨迹(我,2)];vrdrawnow;%读取读数范围从激光雷达传感器获得的机器人。范围= lidarVRNode.pickedRange;%模拟激光雷达数据将给1的值对象%的范围内。让所有这些价值大于% maxLidarRange。范围(范围= = 1)= maxLidarRange + 2;%的创建一个lidarScan对象范围和角度。我扫描{}= lidarScan(范围、角度);[isScanAccepted, loopClosureInfo optimizationInfo] = addScan (slamAlg扫描{我});如果isScanAccepted%可视化扫描图和姿势是如何更新机器人导航%通过虚拟场景显示(slamAlg);%可视化首次检测到循环关闭% firstLoopClosure国旗是用来捕捉第一个循环关闭事件如果optimizationInfo.IsPerformed&& ~firstLoopClosure firstLoopClosure = true; show(slamAlg,“姿势”,“关闭”);持有在;显示(slamAlg.PoseGraph);持有从;标题(“第一循环关闭”);snapnow结束结束等待(controlRate);结束
情节最后建毕竟扫描被添加到地图slamAlg
对象。
显示(slamAlg“姿势”,“关闭”);持有在显示(slamAlg.PoseGraph);持有从标题({最后建立环境地图的,机器人的轨迹});
优化的扫描和姿势可以用来生成一个occupancyMap
代表作为概率占用网格环境。
[扫描,optimizedPoses] = scansAndPoses (slamAlg);地图= buildMap(扫描,optimizedPoses、mapResolution maxLidarRange);
可视化占用网格地图的激光扫描和优化构成图。
图;显示(地图);持有在显示(slamAlg.PoseGraph“id”,“关闭”);持有从标题(“占用网格地图使用激光雷达大满贯”);
关闭虚拟场景。
关闭(多联机);关闭(w);删除(w);