主要内容

lidarSLAM

使用激光雷达扫描进行定位和映射

描述

lidarSLAMclass为激光雷达扫描传感器输入执行同步定位和映射(SLAM)。SLAM算法接受激光雷达扫描,并将其附加到底层姿态图中的节点上。然后,该算法使用扫描匹配来关联扫描。它还搜索循环闭包,其中扫描重叠先前映射的区域,并优化姿态图中的节点姿态。

创建

描述

slamObj= lidarSLAM创建一个激光雷达SLAM对象。默认占用图大小为每米20个单元格。每次激光雷达扫描的最大范围是8米。

例子

slamObj= lidarSLAM (mapResolutionmaxLidarRange创建一个激光雷达SLAM对象并设置MapResolutionMaxLidarRange属性。

slamObj= lidarSLAM (mapResolutionmaxLidarRangemaxNumScans)指定生成代码时允许接受的扫描次数的上限。maxNumScans为正整数。只有在生成代码时才需要此扫描限制。

属性

全部展开

连接扫描的底层姿态图,指定为poseGraph对象。添加扫描lidarSLAM更新此姿态图。当发现环路闭包时,使用OptimizationFcn

占用网格图的分辨率,指定为每米单元格的正整数。在构造时指定映射分辨率。

激光雷达传感器的最大范围,指定为以米为单位的正标量。指定构造时的最大范围。

姿态图优化函数,指定为函数句柄。缺省情况下,算法调用optimizePoseGraph函数。为了指定你自己的优化方法,类要求函数签名为:

[updatedPose,stat] = myOptimizationFcn(poseGraph)
poseGraph是一个poseGraph对象。updatedPose是一个n-by-3向量的[x y theta]按节点ID顺序列出的姿势。统计结构是否包含ResidualError场作为正标量。使用统计结构以包含与优化相关的其他信息。

扫描匹配算法中接受循环闭包的分数的阈值,指定为正标量。更高的阈值对应更好的匹配,但分数会根据传感器数据而有所不同。

循环闭合检测的搜索半径,指定为正标量。增加这个半径会增加搜索时间,从而影响性能。根据您的环境和预期的车辆轨迹调整这个距离。

尝试查找循环闭包的次数,指定为正整数。增加尝试次数会增加搜索时间,从而影响性能。

允许自动回滚添加的循环闭包,指定为真正的。对象返回的残余错误OptimizationFcn。如果它检测到残留误差的突然变化,此属性为真正的,它拒绝(回滚)循环闭包。

为触发优化而接受的循环闭包数量,指定为正整数。默认情况下,PoseGraph每次都被优化lidarSLAM添加一个循环闭包。

处理扫描所需的最小姿势变化,指定为(翻译旋转)向量。新添加的扫描的相对位姿变化计算为[x y theta]。如果翻译成xy-位置或旋转θ超过这些阈值,则lidarSLAM对象接受扫描并将一个姿态添加到PoseGraph

扫描配准方法,指定为字符向量。

请注意

使用相位相关方法需要图像处理工具箱™。

对象的功能

addScan 增加扫描到激光雷达SLAM地图
复制 复制激光雷达SLAM对象
removeLoopClosures 从姿态图中移除循环闭包
scansAndPoses 提取扫描和相应的姿势
显示 绘图扫描和机器人姿势

例子

全部折叠

使用一个lidarSLAM对象迭代添加和比较激光雷达扫描,并构建机器人轨迹的优化姿态图。要从相关的姿势和扫描中获取占用图,请使用buildMap函数。

加载数据并设置SLAM算法

的单元格数组lidarScan对象。激光雷达扫描是由ClearPath Robotics公司的Husky®机器人在停车场收集的。通常情况下,激光雷达的扫描频率很高,而且SLAM不需要每次扫描。因此,通过只选择每40次扫描来对扫描进行采样。

负载garage_fl1_southend.mat扫描扫描=扫描(1:40:结束);

为了建立SLAM算法,需要指定激光雷达的范围、地图分辨率、环路闭合阈值和搜索半径。针对特定的机器人和环境调整这些参数。创建lidarSLAM对象使用这些参数。

maxRange = 19.2;%米分辨率= 10;每米细胞百分比slamObj = lidarSLAM(分辨率,maxRange);slamObj。LoopClosureThreshold = 360;slamObj。LoopClosureSearchRadius = 8;

迭代添加扫描

使用一个循环,添加扫描到SLAM对象。对象使用扫描匹配将每个添加的扫描与之前添加的扫描进行比较。为了改进映射,对象会在检测到循环闭包时优化姿态图。每10次扫描,显示存储的姿势和扫描。

i = 1:数字(扫描)addScan(slamObj,扫描{i});如果rem(i,10) == 0 show(slamObj);结束结束

图中包含一个轴。坐标轴包含121个line类型的对象。

查看占用率图

将所有扫描添加到SLAM对象后,构建一个occupancyMap通过调用映射buildMap扫描和摆姿势。使用与SLAM对象相同的映射分辨率和最大范围。

[scansSLAM,pose] = scansandpose (slamObj);occMap = buildMap(扫描slam,姿势,分辨率,maxRange);图显示(occMap)“车库占用图”

图中包含一个轴。标题为Occupancy Map of Garage的轴包含一个image类型的对象。

更多关于

全部展开

参考文献

赫斯、沃尔夫冈、达蒙·科勒、霍尔格·拉普和丹尼尔·安多尔。“二维激光雷达SLAM中的实时环路闭合。”2016 IEEE机器人与自动化国际会议(ICRA)。2016.

扩展功能

R2019b引入