1、pcl::registration::ConvergenceCriteria
ConvergenceCriteria表示配准中使用的不同收敛标准的抽象基类。这应该作为迭代最近点(ICP)方法的一部分,以验证算法是否已经达到收敛。
通常来说有如下标准表示配准结束:
- 已达到最大迭代次数;
- 变换(R, t)不能进一步更新(当前与之前的差异小于一个阈值)
- 当前对应关系与前一对应关系之间的均方误差(MSE)小于某一阈值
类中包含一个纯虚函数hasConverged(),检查是否已经达到收敛。
使用方法:virtual bool pcl::registration::ConvergenceCriteria::hasConverged ( )
2、pcl::IterativeClosestPoint< PointSource, PointTarget, Scalar >
这个类确定了ICP算法的基本实现。
该算法具有多个终止条件:
- 迭代次数已达到用户施加的最大迭代次数(通过setMaximumIterations)
- 先前转换与当前估计的转换之间的ε(差异)小于用户施加的值(通过setTransformationEpsilon)
- 欧几里德平方误差的总和小于用户定义的阈值(通过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();
几个成员函数:
-
inline void setInputSource (constPointCloudSourceConstPtr &cloud)
:需要匹配的点云; -
inline void setInputTarget (constPointCloudTargetConstPtr &cloud)
:基准点云,也就是从Source到Target的匹配。 -
inline void setSearchMethodTarget(const KdTreePtr &tree)
:kdtree加速搜索,还有一个Target的函数,用法与之一致。 -
inline void setMaxCorrespondenceDistance (doubledistance_threshold)
:忽略在此距离之外的点,如果两个点云距离较大,这个值要设的大一些(PCL默认距离单位是m) -
inline void setMaximumIterations (intnr_iterations)
第1个约束,迭代次数,几十上百都可能出现。 -
inline void setTransformationEpsilon (doubleepsilon)
第2个约束,这个值一般设为1e-6或者更小。 -
inline void setEuclideanFitnessEpsilon (doubleepsilon)
第3个约束,前后两次迭代误差的差值。 -
inline void align (PointCloudSource &output)
:输出配准后点云。 -
inline Matrix4 getFinalTransformation ()
:获取最终的转换矩阵。
3、pcl::Registration
Registration表示通用的基本配准类。
-
void pcl::Registration< PointSource, PointTarget, Scalar >::align ( PointCloudSource & output )
调用配准算法,该算法估计转换并返回转换后的源(输入)作为输出。 - 重载函数:
void pcl::Registration< PointSource, PointTarget, Scalar >::align ( PointCloudSource & output, const Matrix4 & guess )
,输入为变换的初始总估计,输出为旋转平移后的点云集。 -
virtual void pcl::Registration< PointSource, PointTarget, Scalar >::computeTransformation ( PointCloudSource & output, const Matrix4 & guess )
:抽象类,变换计算方法与初步猜测。输入为变换矩阵,输出为点云集。 -
void pcl::Registration< PointSource, PointTarget, Scalar >::setTransformationRotationEpsilon ( double epsilon )
:设置变换旋转(两个连续变换之间的最大允许旋转差),使优化被认为已收敛到最终解。输入为使优化被认为收敛于最终解的变换旋转(是轴角表示中的cos(角))。