主要内容

pcregisterndt

采用无损检测算法对两个点云进行配准

描述

例子

tform= pcregisterndt (移动固定gridStep返回将移动点云注册为固定点云的刚性转换。固定的点云被体素化成大小的立方体gridStep

配准算法基于正态分布变换(NDT)算法[1][2].这个迭代过程的最佳性能需要调整数据的属性。为了提高配准的准确性和效率,可以考虑对移动点云进行下采样pcdownsample使用前pcregisterndt

tformmovingReg= pcregisterndt(___还返回与固定点云对齐的转换后的点云。

tformmovingRegrmse= pcregisterndt(___还返回对齐点云之间的欧几里得距离的均方根误差。

___= pcregisterndt(___名称=值使用一个或多个名称-值参数以及以前语法中的参数组合指定选项。例如,MaxIterations = 20在20次迭代后停止NDT算法。

例子

全部折叠

加载点云数据。

Ld =负载(“livingRoom.mat”);moving = ld.livingRoomData{1};fixed = ld.livingRoomData{2};图pcshowpair(移动、固定VerticalAxis =“Y”VerticalAxisDir =“下来”

为了提高无损检测配准算法的效率和精度,对移动点云进行了下采样。

movingdownsamples = pcdownsample(移动,“gridAverage”, 0.1);

将点云体素化为边长为0.5的立方体。应用NDT算法进行刚性配准。

gridStep = 0.5;tform = pcregisterndt(movingdownsampling,fixed,gridStep);

可视化对齐。

movingReg = pctransform(移动,tform);图pcshowpair (movingReg、固定VerticalAxis =“Y”VerticalAxisDir =“下来”

构造一个velodyneFileReader对象。

veloReader = velodyneFileReader(“lidarData_ConstructionRoad.pcap”“HDL32E”);

阅读和可视化两个激光雷达点云。

frameNumber = 1;skipFrame = 5;fixed = readFrame(veloReader,frameNumber);移动= readFrame(veloReader,frameNumber + skipFrame);

分割地平面并将其从定点云中移除。

groundPtsIdxFixed = segmentGroundFromLidarData(固定);fixedSeg = select(fixed,~groundPtsIdxFixed,OutputSize=“全部”);

分割地平面并将其从移动点云中移除。

groundPtsIdxMoving = segmentGroundFromLidarData(移动);movingSeg = select(移动,~groundPtsIdxMoving,OutputSize=“全部”);

对移动点云进行下采样,以提高处理点的准确性和效率。

movingdownsampling = pcdownsample(movingSeg,gridAverage=0.2);

注册移动点云相对于固定点云。

gridStep = 5;tform = pcregisterndt(movingDownsampled,fixedSeg,gridStep);

使用估计的刚性变换对移动点云进行变换。

movingReg = pctransform(移动,tform);

可视化点云的排列。

图pcshowpair (movingReg、固定)

输入参数

全部折叠

移动点云,指定为apointCloud对象。

定点云,指定为apointCloud对象。

将固定点云体素化的3-D立方体的大小,指定为正标量。

数据类型:|

名称-值参数

指定可选参数对为Name1 = Value1,…,以=家,在那里的名字参数名称和价值对应的值。名称-值参数必须出现在其他参数之后,但对的顺序无关紧要。

例子:MaxIterations = 20在20次迭代后停止NDT算法。

初始刚变换,用a表示rigidtform3d对象。将初始转换设置为粗略估计。如果不提供过程或初始估计,则函数使用rigidtform3d对象,该对象包含将移动点的中心移动到固定点的中心的转换。

相对于正态分布的期望异常值百分比,指定为范围[0,1]中的标量。NDT算法假设一个点是由内值的正态分布和异常值的均匀分布的混合生成的。更大的值OutlierRatio减少异常值的影响。

数据类型:|

NDT停止前的最大迭代次数,指定为正整数。

数据类型:|

连续NDT迭代之间的公差,指定为具有非负值的2元素向量。向量,[TdiffRdiff],表示连续NDT迭代估计平移和旋转绝对差值的容差。Tdiff测量两个平移向量之间的欧氏距离。Rdiff以度为单位测量角差。当最近连续迭代中估计的刚性变换之间的差值低于指定的公差值时,算法停止。

数据类型:|

显示以数字或逻辑形式指定的进度信息0)或1真正的).显示进度信息,可设置详细的真正的

输出参数

全部折叠

刚性变换,返回为arigidtform3d对象。tform描述了登记移动点云的刚性三维变换,移动,到定点云,固定

转换后的点云,返回为apointCloud对象。变换后的点云与不动点云对齐,固定

均方根误差,作为正数返回。rmse为对齐点云之间的欧氏距离。一个低rmseValue表示更准确的注册。

数据类型:|

算法

全部折叠

提示

  • 对于地面车辆点云,可以通过移除地面使用来提高性能和精度pcfitplanesegmentGroundFromLidarData之前注册。有关如何做到这一点的详细信息,请参阅helper函数,helperProcessPointCloud从激光雷达数据构建地图(自动驾驶工具箱)的例子。

  • 要合并两个以上的点云,可以使用pccat函数,而不是pcmerge函数。

  • 在注册之前pcregisterndt函数使用指定的对象对定点云进行体素化gridStep.减小网格步长以捕获点云内的不同结构。然而,降低这个值会导致传感器的局部噪声效应的增加。使用pcdownsample函数使用此语法确定体素化的效果:

    pcdownsample(固定,“gridAverage”gridStep)

NDT注册概述

NDT配准是基于正态分布,而不是其他类型的配准,匹配点或线,以找到两个点云之间的转换。NDT方法使用带有三维盒子(称为体素)的统计模型。

为了配准两个点云,一个移动点云和一个固定点云,使用NDT方法,算法执行以下操作:

  1. 计算固定点云的正态分布,方法是将点云扫描所覆盖的区域划分为恒定大小的3-D盒子,称为“体素”。每个体素包含一组点。该算法计算每个体素中点的均值和协方差矩阵。

  2. 从变换的初始猜测开始,算法将移动的点云对齐到固定的点云。然后,它根据固定点云的正态分布,找到每个对齐点位于围绕点(在移动点云中)的体素中的统计似然和。

  3. 为了改进配准,该算法使移动点云在固定点云正态分布上的概率得分最大化。这是通过迭代优化角度和平移估计来完成的。

  4. 使用上一步的新转换重复移动点云与固定点云的对齐,然后重复优化。

  5. 一旦达到最大迭代次数或公差参数,算法就会停止。公差是一个度量角度和平动估计从一个迭代到另一个迭代的变化量。

参考文献

[1] Biber, P.和W. Straßer。正态分布变换:激光扫描匹配的一种新方法IEEE/RSJ智能机器人与系统国际会议论文集.拉斯维加斯,NV卷3,2003年11月,第2743-2748页。

[2] Magnusson, M.《三维正态分布变换——配准、表面分析和环路检测的有效表示》。博士论文。Örebro大学,Örebro,瑞典,2013。

扩展功能

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

GPU代码生成
使用GPU Coder™为NVIDIA®GPU生成CUDA®代码。

版本历史

在R2018a中引入

全部展开