主要内容

pcmapsegmatch

用于定位和环路闭合检测的段和特征图

描述

pcmapsegmatch对象创建段和特征的映射,并使用段匹配(SegMatch[1])的位置识别算法。这种分段匹配方法对动态障碍物具有较强的鲁棒性,对大规模环境也具有较好的可靠性。对象存储特性、段以及它们对应的视图id。使用视图id将功能链接到点云视图集对象中的视图,pcviewset,用于制作地图。

创建

描述

例子

sMap= pcmapsegmatch返回一个默认pcmapsegmatch对象。使用addView对象函数,用于向地图添加视图及其相应的段和特性。

sMap= pcmapsegmatch (CentroidDistance,距离)另外,还指定了在地图中添加段及其相应特征时段心之间的最小距离。质心比指定距离更近的部分经销,不添加到地图中。经销指定为一个正标量,其默认值为0.1

属性

全部展开

此属性是只读的。

视图标识符,指定为-元素整数向量,其中添加的浏览量是多少pcmapsegmatch

此属性是只读的。

特征向量,指定为N元向量的eigenFeature对象,N是特征的数量。

使用addView对象函数,用于向映射中添加唯一段的特性。属性更新地图时updateMap对象函数中,与重复段对应的特性将从映射中删除,如果它们位于CentroidDistance

此属性是只读的。

点云段,指定为N元向量的pointCloud对象,N为点云段的个数。

一个是一组紧挨在一起的三维点,它们代表一个部分或完整的物体。

此属性是只读的。

当前选定的子地图,指定为表单的6元素向量[xminxmaxyminymaxzminzmax,以描述子映射沿每个轴的范围。向量的元素描述了子映射所表示的感兴趣的区域。

此属性是只读的。

沿着地图的范围x-轴,指定为形式为[xminxmax]。

此属性是只读的。

沿着地图的范围Y-轴,指定为形式为[yminymax]。

此属性是只读的。

沿着地图的范围z-轴,指定为形式为[zminzmax]。

此属性是只读的。

段质心之间的最小距离,指定为正标量。对象在将段和相应的特征作为唯一的段和特征添加到地图时使用最小距离。

对象的功能

addView 添加视图到映射
deleteView 从地图中删除视图
findView 检索特征和段索引对应的地图视图
hasView 检查视图是否在地图中
deleteSegments 删除地图中的所有片段
findPose 在地图中找到对段匹配的绝对姿势
updateMap 更新地图中的质心和点云段位置
selectSubmap 选择映射中的子映射
isInsideSubmap 检查查询位置是否在选定的子映射内
显示 在地图上可视化点云段

例子

全部折叠

从MAT文件加载片段和特征的地图。地图中的点云数据是使用模拟3 d激光雷达(无人机工具箱)块。

data =负载(“segmatchMapFullParkingLot.mat”);sMap = data.segmatchMapFullParkingLot;

从MAT文件加载点云扫描。

data =负载(“fullParkingLotData.mat”);ptCloudScans = data.fullParkingLotData;

显示区段的地图。

ax =显示(sMap);

将视角改为俯视图。

视图(2)暂停(0.2)

设置选择圆柱形邻域的半径。

outerCylinderRadius = 20;innerCylinderRadius = 3;

设置分割的阈值参数。

distThreshold = 0.5;angleThreshold = 180;

设置所选子映射的大小和子映射阈值参数

Sz = [65 30 20];submapThreshold = 10;

为可视化设置半径参数。

半径= 0.5;

对每个点云进行分割,通过寻找分段匹配进行定位。

n = 1:numel(ptCloudScans) ptCloud = ptCloudScans(n);%切割并拆除接地面。groundPtsIdx = segmentGroundFromLidarData (ptCloud,“ElevationAngleDelta”11);ptCloud =选择(ptCloud ~ groundPtsIdx,“OutputSize”“全部”);%选择圆柱形邻域。dist =√ptCloud.Location(:,: 1)。^ 2 + ptCloud.Location (:: 2) ^ 2);drawtext_fix (): drawtext_fix () = dist <= dist;ptCloud =选择(ptCloud cylinderIdx,“OutputSize”“全部”);%分割点云。标签= segmentLidarData (ptCloud distThreshold angleThreshold,“NumClusterPoints”[5000]);%从点云中提取特征。(特性、段)= extractEigenFeatures (ptCloud、标签);%定位,找到地图中的绝对姿势,以对齐段匹配。[absPoseMap, ~, inlierFeatures inlierSegments] = findPose (sMap,特性,段);如果isempty (absPoseMap)继续结束%在地图上显示估计的位置。poseTranslation = absPoseMap.Translation;pos = [poseTranslation(1:2) radius];showShape (“圆”、pos、“颜色”“r”“父”、ax);暂停(0.2)%确定所选的子映射是否需要更新。[isInside, distToEdge] = isInsideSubmap (sMap, poseTranslation);needSelectSubmap = ~ isInside...当前姿势在子映射之外|| any(distToEdge(1:2) < submapThreshold)...当前姿势接近子地图边缘|| n == 1;%第一次使用整个地图进行本地化%选择一个新的子映射。如果needSelectSubmap sMap = selectSubmap(sMap,poseTranslation,sz);结束结束

图中包含一个轴对象。axis对象包含一个散点类型的对象。

%可视化最后匹配的段。图;pcshowMatchedFeatures (inlierSegments (: 1) inlierSegments (:, 2), inlierFeatures (: 1), inlierFeatures (:, 2))

图中包含一个轴对象。轴对象包含5个类型为散点,线的对象。

参考文献

Dube, Renaud, Daniel Dugas, Elena Stumm, Juan Nieto, Roland Siegwart和Cesar Cadena。“分割匹配:基于分割的三维点云位置识别”。在2017 IEEE机器人与自动化国际会议(ICRA), 5266 - 72。新加坡,新加坡:IEEE, 2017。https://doi.org/10.1109/ICRA.2017.7989618。

介绍了R2021a