直接调用pcl库的icp和ndt算法,对比帧间匹配的效果: (数据帧采用kitti数据集,64线束velo,随便截取了一帧保存为pcd文件,需要pcd文件的,自取git@github.com:qqngwzlb/pcl_registration.git)
粗配准: 在两幅点云之间的变换完全未知的情况下进行配准,主要是为精配准提供较好的变换初值;
精配准: 给定一个初始变换,进一步优化得到更精确的变换。
实验1:目标点云和源点云完全相同
点云效果: 左边ndt,右边icp
同帧匹配,icp精度高,而且快
实验2:源点云是在目标点云的基础上单方向移动0.5m
点云效果:
明显icp匹配的点云(右)已经配准不上了
icp:我就是快,准不准我不管!!!!
缩小icp的esp之后(0.05-->0.001),匹配效果好些:
实验3:源点云是在目标点云的基础上xy方向移动(0.5m ,0.5m)
实验4:源点云是在目标点云的基础上xy方向移动(0.5m ,0.3m),旋转
总结: (偶滴pc很拉胯的,所以时间对比相当明显),测试代码我放在github了。
icp速度很快,点云不是单方向变化(有旋转),匹配效果很拉胯,但它依旧很快,很快,很快(😁😁)。目前我觉得,单纯的icp适合拿来做做SLAM的回环匹配,因为他快啊!!!而且,回环集中在直线上效果也不会那么差。
icp匹配就是算对应点间的最小二乘误差,误差最小化输出最优的变换矩阵。icp算法鲁棒性不够,建议实际,还是使用icp变种算法: 如通常2D激光匹配用PL-ICP算法比较好,3D激光匹配推荐GICP算法等。
ndt较于icp会慢不少,目标点云如果庞大,运算效率更大大下降,稳定性方面是不错的。需要做点云稀疏化。
ndt匹配时,算法内部将目标点云化为很多个cell,计算每个方格的pdf,移动源点云落入每个cell,用之前的pdf计算概率,所有cell概率之和最大时,输出最优的变换矩阵。
参数调节:
1)icp的setMaxCorrespondenceDistance:点对之间的最大距离,只有对应点之间的距离小于该设置值的对应点才作为ICP计算的点对;越大计算的点对越多;icp收敛条件esp一定要设置苛刻一些,比1小于3个数量级;
2)ndt大数据量,匹配速度极其慢(比icp慢十几倍),对目标点云滤波轻一点,对源点云滤波重一点;若目标点云滤波太重,ndt算法无法进行匹配,但是目标点云滤波重一点,对速度提升显著;ndt的setResolution,网格设置大小很重要,体素设置完,设置setTransformationEpsilon,差异值设置越大,速度越快(精度down);
另外: 本次测试没有给初值,帧间匹配若是有良好的初值,匹配效果和效率应该是很好的!提供预测的目前一般是imu或者利用系统运动模型估计,后续应该涉及这方面。