主要内容

pcmapndt

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

    描述

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

    创建

    描述

    例子

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

    属性

    全部展开

    此属性是只读的。

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

    此属性是只读的。

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

    此属性是只读的。

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

    此属性是只读的。

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

    此属性是只读的。

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

    此属性是只读的。

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

    此属性是只读的。

    每个体素的协方差,指定为一个3 × 3 × -数组体素。

    此属性是只读的。

    每个体素中点的数量,指定为1的向量为体素。

    对象的功能

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

    例子

    全部折叠

    加载点云视图集,它是从pcviewset对象。

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

    提取点云和绝对姿态来建立一个地图。

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

    创建一个点云地图,通过使用绝对姿势对准点云扫描。

    ptCloudMap = pcalign (ptClouds tforms);

    从点云图创建和可视化NDT图。

    voxelSize = 1;ndtMap = pcmapndt (ptCloudMap voxelSize);图显示(ndtMap)视图(2)%将视角改为俯视图

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

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

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

    加载点云扫描并从第二个MAT文件提出估计。

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

    显示NDT地图。

    显示(ndtMap)

    将视角改为俯视图。

    视图(2)

    选择以第一次估算为中心的子地图。

    中心= initPoseEsts (1) .Translation;Sz = [70 50 20];ndtMap = selectSubmap (ndtMap,中心、深圳);

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

    半径= 0.5;distThresh = 15;

    在点云上循环,在地图中定位它们,并根据需要更新选定的子地图。

    numScans =元素个数(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 = [currpos . translation (1:2) radius];showShape (“圆”、pos、“颜色”“r”);%暂停以查看更改。暂停(0.05)结束

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

    参考文献

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

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

    扩展功能

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

    介绍了R2021a