PCL(6):PCL官网中配准模块的类

1、pcl::registration::ConvergenceCriteria

ConvergenceCriteria表示配准中使用的不同收敛标准的抽象基类。这应该作为迭代最近点(ICP)方法的一部分,以验证算法是否已经达到收敛。
通常来说有如下标准表示配准结束:

  1. 已达到最大迭代次数;
  2. 变换(R, t)不能进一步更新(当前与之前的差异小于一个阈值)
  3. 当前对应关系与前一对应关系之间的均方误差(MSE)小于某一阈值

类中包含一个纯虚函数hasConverged(),检查是否已经达到收敛。
使用方法:
virtual bool pcl::registration::ConvergenceCriteria::hasConverged ( )

2、pcl::IterativeClosestPoint< PointSource, PointTarget, Scalar >

这个类确定了ICP算法的基本实现。
该算法具有多个终止条件:

  1. 迭代次数已达到用户施加的最大迭代次数(通过setMaximumIterations)
  2. 先前转换与当前估计的转换之间的ε(差异)小于用户施加的值(通过setTransformationEpsilon)
  3. 欧几里德平方误差的总和小于用户定义的阈值(通过setEuclideanFitnessEpsilon)

用法示例

IterativeClosestPoint <PointXYZ,PointXYZ> icp;
//设置输入源和目标
icp.setInputCloud(cloud_source);
icp.setInputTarget(cloud_target);
 
//将最大对应距离设置为5cm(例如
距离将被忽略)icp.setMaxCorrespondenceDistance(0.05);
//设置最大迭代次数(条件1)
icp.setMaximumIterations(50);
//设置转换epsilon(标准2)
icp.setTransformationEpsilon(1e-8);
//设置欧几里得距离差epsilon(准则3)
icp.setEuclideanFitnessEpsilon(1);
 
//执行对齐
icp.align(cloud_source_registered);
 
//获得将cloud_source对齐到cloud_source_registered的转换
Eigen :: Matrix4f转换= icp.getFinalTransformation();

几个成员函数:

  1. inline void setInputSource (constPointCloudSourceConstPtr &cloud) :需要匹配的点云;

  2. inline void setInputTarget (constPointCloudTargetConstPtr &cloud) :基准点云,也就是从Source到Target的匹配。

  3. inline void setSearchMethodTarget(const KdTreePtr &tree) :kdtree加速搜索,还有一个Target的函数,用法与之一致。

  4. inline void setMaxCorrespondenceDistance (doubledistance_threshold):忽略在此距离之外的点,如果两个点云距离较大,这个值要设的大一些(PCL默认距离单位是m)

  5. inline void setMaximumIterations (intnr_iterations)第1个约束,迭代次数,几十上百都可能出现。

  6. inline void setTransformationEpsilon (doubleepsilon)第2个约束,这个值一般设为1e-6或者更小。

  7. inline void setEuclideanFitnessEpsilon (doubleepsilon)第3个约束,前后两次迭代误差的差值。

  8. inline void align (PointCloudSource &output):输出配准后点云。

  9. inline Matrix4 getFinalTransformation ():获取最终的转换矩阵。

3、pcl::Registration

Registration表示通用的基本配准类。

  1. void pcl::Registration< PointSource, PointTarget, Scalar >::align ( PointCloudSource & output ) 调用配准算法,该算法估计转换并返回转换后的源(输入)作为输出。
  2. 重载函数:void pcl::Registration< PointSource, PointTarget, Scalar >::align ( PointCloudSource & output, const Matrix4 & guess ) ,输入为变换的初始总估计,输出为旋转平移后的点云集。
  3. virtual void pcl::Registration< PointSource, PointTarget, Scalar >::computeTransformation ( PointCloudSource & output, const Matrix4 & guess ) :抽象类,变换计算方法与初步猜测。输入为变换矩阵,输出为点云集。
  4. void pcl::Registration< PointSource, PointTarget, Scalar >::setTransformationRotationEpsilon ( double epsilon ) :设置变换旋转(两个连续变换之间的最大允许旋转差),使优化被认为已收敛到最终解。输入为使优化被认为收敛于最终解的变换旋转(是轴角表示中的cos(角))。
上一篇:头条搜索提交站点属性申请


下一篇:ARM 代码烧录方案与原理详解 --- SWD/JTAG + Bootloader + OTA (ICP + ISP + IAP)