【附优化方法的ICP源码】ICP与NDT匹配算法精度对比,以及手动实现的ICP和基于优化方法的ICP精度对比

补充内容(2021年3月31号)

很多朋友给我留言想要源代码,但是最近实在太忙不能一一回复,实在是抱歉!

由于,这个项目的代码有别的用处,所以不能全部公开给大家,但是我把关于ICP的部分整理出来了,上传在github上了,你可以去下载,里面是我通过优化的方法实现的ICP算法,其迭代方法是高斯牛顿。

代码我上传了github上了,如需下载请点这里:源码在此(记得给我点Star哈,哈哈)

关于优化方法的ICP具体推导过程,我就不在此展示了,给出一个推导结果,大家直接对照代码看,很容易理解。

公式推导如下:
f = m i n E ( R , t ) = m i n 1 N y ∑ ∥ R y i + t − x i ∥ (0) f = min E(R,t) = min\frac{1}{N_y} \sum\|Ry_i +t -x_i \| \tag0 f=minE(R,t)=minNy1Ryi+txi(0)
其中:

  • i i i为通过最近邻搜索匹配上的点对, x i x_i xi y i y_i yi分别为目标点云和待匹配点云中的点
  • R R R t t t分别为两个点云之间的旋转和平移变换

将(0)式分别对Rt求导,关于 R R R的求导使用的是扰动模型,求导结果如下:
∂ f ∂ t = I \frac{\partial f}{\partial t} = I tf=I ∂ f ∂ R = − ( R ∗ x i ) ∧ \frac{\partial f}{\partial R} = -(R*x_i)^{\wedge} Rf=(Rxi)

雅克比矩阵为 J = [ ∂ f ∂ t , ∂ f ∂ R ] J = [\frac{\partial f}{\partial t}, \frac{\partial f}{\partial R}] J=[tf,Rf]
则,海森矩阵为 H = J T J H = J^TJ H=JTJ

求出雅克比矩阵之后,剩下的就很简单了,套用高斯牛顿的优化方法进行迭代就能获得最终的结果了。具体流程参考代码:快速直达

=============================== 我是分割线 ===============================

1.主要内容

本篇博客主要对比Iterative Closest Point(ICP)和Normal Distribution Transform(NDT)两种匹配算法的精度。分别依赖ICP和NDT作为匹配方法,生成前端里程计,没有回环检测,没有优化。

2.实验条件

①. 所用数据集: KITTI 00数据

②. 计算机平台

  • 处理器:Intel® Core™ i7-10510U CPU @ 1.80GHz × 8
  • 内存:8G

③. ICP和NDT算法来自PCL 1.8库

④. 精度评估工具evo

⑤. 算法所用参数

  • ICP
    icp_ptr_->setTransformationEpsilon(0.01);
    icp_ptr_->setMaximumIterations(30);
    icp_ptr_->setEuclideanFitnessEpsilon(0.01);
    icp_ptr_->setMaxCorrespondenceDistance(1)
  • NDT
    ndt_ptr_->setResolution(1.0);
    ndt_ptr_->setStepSize(0.1);
    ndt_ptr_->setTransformationEpsilon(0.01);
    ndt_ptr_->setMaximumIterations(30);

3. 实验结果

依赖ICP匹配的里程计
在这里插入图片描述
依赖NDT的里程计
在这里插入图片描述

这里我就不展示相对轨迹误差和绝对轨迹误差相关的结果,图上的结果很明显!

4.结论

对于SLAM的里程计而言,NDT的匹配精度明显优于ICP。此结论只对里程计有效,对于一些别的应用场景下的点云匹配,该结果尚未验证!另外,请谨慎使用pcl的icp算法,似乎它的精度并不高

补充(2020年12月1日)

根据icp的论文,我自己手动实现了一个icp算法,发现无论是速度和精度上都明显高于pcl的icp算法,我试图去看pcl的源码找到这其中的原因,但是我并没有花太多时间,所以也没有找到原因。(如果你知道为什么,麻烦给我留言,感激不尽!)

另外icp的论文对于残差函数选择的是推导,然后使用svd分解。我尝试过对残差函数进行直接求导,然后通过高斯牛顿的迭代方法求解,发现这种优化的方法精度更加高,但是计算资源和时间会明显高于svd分解方式的icp。

以下两张图是手动实现的icp算法,一张是通过svd分解的icp,一张是通过优化的方法实现的icp,将它们加入到没有回环检测的前端,获得的效果如下:

推导公式方式实现的icp
在这里插入图片描述

基于icp残差公式,采用高斯牛顿方法优化的icp
在这里插入图片描述

如果需要代码和数据集,请给我留言!

Hello World

评论 51
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值