主要内容

pcmapndt

基于正态分布变换的定位图

    描述

    pcmapndt对象从预构建的环境点云图创建一个正态分布变换(NDT)图。NDT映射是一种压缩的、内存高效的表示,适合本地化。对象将点云图转换为一组体素(3-D盒),每个体素由3-D正态分布表示。使用selectSubmap对象函数从粗略的位置估计中选择映射中的子映射。使用findPose对象函数,用于基于组装的地图定位传感器的姿态。

    创建

    描述

    例子

    ndtMap= pcmapndt (ptCloudMapvoxelSize从点云图返回NDT图,ptCloudMap

    属性

    全部展开

    此属性是只读的。

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

    此属性是只读的。

    体素的大小,在世界单位中指定为标量值。

    此属性是只读的。

    沿地图的范围x-轴,指定为形式为[的2元素向量xminxmax]。

    此属性是只读的。

    沿地图的范围Y-轴,指定为形式为[的2元素向量yminymax]。

    此属性是只读的。

    沿地图的范围z-轴,指定为形式为[的2元素向量zminzmax]。

    此属性是只读的。

    每个体素的平均值,指定为3矩阵。矩阵的每一行都包含[xyz一个体素的值。是体素的数量。

    此属性是只读的。

    每个体素的协方差,用3 × 3 × -表示数组体素。

    此属性是只读的。

    每个体素中的点数,用-by-1向量体素。

    对象的功能

    selectSubmap 在map中选择子map
    isInsideSubmap 检查查询位置是否在所选子映射内
    findPose 使用正态分布变换(NDT)算法在地图中定位点云
    显示 可视化正态分布变换(NDT)图

    例子

    全部折叠

    加载一个点云视图集,该视图集保存于pcviewset对象。

    数据=负载(“vSetPointClouds.mat”);vSet = data.vSet;

    提取点云和绝对姿态来构建地图。

    ptClouds = vSet.Views.PointCloud;vSet.Views.AbsolutePose;

    通过使用绝对姿势对齐点云扫描来创建一个点云图。

    ptCloudMap = pcalign(ptClouds,tforms);

    从点云图创建并可视化无损检测图。

    voxelSize = 1;ndtMap = pcmapndt(ptCloudMap,voxelSize);图show(ndtMap)视图(2)%改变视角为俯视图

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

    从MAT文件加载正态分布变换(NDT)映射。

    数据=负载(“ndtMapParkingLot.mat”);ndtMap = data.ndtMapParkingLot;

    从第二个MAT文件加载点云扫描和姿态估计。

    数据=负载(“parkingLotData.mat”);ptCloudScans = data.parkingLotData.ptCloudScans;initPoseEsts = data.parkingLotData.initPoseEsts;

    显示无损检测图。

    显示(ndtMap)

    将视角更改为俯视图。

    视图(2)

    选择以第一个估计值为中心的子地图。

    center = initPoseEsts(1).Translation;Sz = [70 50 20];ndtMap = selectSubmap(ndtMap,center,sz);

    设置当前位置的可视化半径和更新子地图的距离阈值。

    半径= 0.5;distThresh = 15;

    循环遍历点云,在地图中本地化它们,并根据需要更新所选的子地图。

    numScans = nummel (ptCloudScans);n = 1:numScans ptCloud = ptCloudScans(n);initPose = initPoseEsts(n);poseTranslation = initPose.Translation;[isInside,distToEdge] = isInsideSubmap(ndtMap,poseTranslation);submapNeedsUpdate = ~isInside...当前姿态在子映射之外|| any(distToEdge(1:2) < distThresh);当前位姿接近子地图边缘如果submapNeedsUpdate ndtMap = selectSubmap(ndtMap,poseTranslation,sz);结束在地图中定位点云扫描。currPose = findPose(ndtMap,ptCloud,initPose);将估算值的位置显示为圆形。pos = [currPose.Translation(1:2) radius];showShape (“圆”、pos、“颜色”“r”);%暂停查看更改。暂停(0.05)结束

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

    参考文献

    比伯,P.和W.斯特拉瑟。正态分布变换:激光扫描匹配的一种新方法在2003年IEEE/RSJ智能机器人与系统国际会议论文集(IROS 2003) (Cat。No.03CH37453)卷3,2743-48。美国内华达州拉斯维加斯:IEEE, 2003。https://doi.org/10.1109/IROS.2003.1249285。

    马格努松,马丁。三维正态分布变换:配准、表面分析和环路检测的有效表示博士论文,Örebro大学,2009。oru: http://urn.kb.se/resolve?urn=urn nbn公司禁止:se:女主角- 8458 urn: nbn公司禁止:se: oru:女主角- 8458。

    扩展功能

    C/ c++代码生成
    使用MATLAB®Coder™生成C和c++代码。

    版本历史

    R2021a中引入