SLAM前端:ICP(Iterative Closest Point)

ICP算法是点云配准算法,给出两组点云,可以计算出两组点云的位姿关系R、t。问题数学表达为:

已知两组点云:

                                                          X(x_1,x_2,x_3,...,x_n) ,Y(y_1,y_2,y_3,...,y_n)

求R、t使下式最小:

                                                                       min E(R,t)= min \frac{1}{n}\sum^{n}_{i=1}\left \| x_i - (Ry_i+t) \right \|^2                       (0-1)

1 如果两组点云中的点一一对应,则求解方法很简单。

(1)求解两组点云的质心:

                                                                           \\ x_c = \frac{1}{n}\sum_{i=1}^n\left \| x_i \right \|^2\\ y_c = \frac{1}{n}\sum_{i=1}^n\left \| y_i \right \|^2

(2)求两组点云去质心坐标:

                                                 \\ X(x_1,x_2,x_3,...,x_n)-x_c = X^{'}(x_1^{'},x_2^{'},x_3^{'}...x_n^{'}) \\ Y(y_1,y_2,y_3,...,y_n)-y_c = Y^{'}(y_1^{'},y_2^{'},y_3^{'}...y_n^{'})

(3)每点组成矩阵求均值、SVD求解:

                                                          \frac{1}{n}\sum_{i=1}^n(x_i^{'}\cdot y_i^{'T})=U\cdot diag(\sigma _1,\sigma_2,\sigma_3)\cdot V^T

(4)R、t结果如下:

                                                                        R = VU^T,t = x_c - Ry_c

2 一般的情况是点云不相匹配,如何求解R、t。

(1)对X中的每个店,在Y中找到距离X最近的点,一一对应

(2)筛选距离最近的若干点

(3)代入公式(0-1)最优化求解得到R、t

(4)利用求解得到的R、t,重新在Y中找距离X最近的点,重复(1)-(4)直到\frac{1}{n}\sum^{n}_{i=1}(x_i - (Ry_i+t))小于一定阈值。

 

ICP求解很耗时

3 公式证明

最小化方程转化:

                                          \\ E(R,t)= \frac{1}{n}\sum^{n}_{i=1}\left \| x_i - (Ry_i+t) \right \|^2= \frac{1}{n}\sum^{n}_{i=1}\left \| x_i - (Ry_i+t) +x_c -x_c + Ry_c-Ry_c\right \|^2\\ = \frac{1}{n}\sum^{n}_{i=1}\left \| x_i - x_c -R(y_i-y_c) +x_c-Ry_c-t\right \|^2\\

开平方化简得到:

                                                    E(R,t)= \frac{1}{n}\sum^{n}_{i=1}\left \| x_i - x_c -R(y_i-y_c) \right \|^2+\left \| x_c-Ry_c-t \right \|^2

可以分为两部分,前半部分\frac{1}{n}\sum^{n}_{i=1}\left \| x_i - x_c -R(y_i-y_c) \right \|^2仅与R有关,求解min E(R,t)可以求解min\frac{1}{n}\sum^{n}_{i=1}\left \| x_i - x_c -R(y_i-y_c) \right \|^2,得到R后根据后半部分x_c-Ry_c-t=0求解得到t。因此得到:

                                                      E^{'}(R,t)= \frac{1}{n}\sum^{n}_{i=1}\left \| x_i - x_c -R(y_i-y_c) \right \|^2

开平方得到:

                                 E^{'}(R,t)= \frac{1}{n}\sum^{n}_{i=1}\left \| x_i^{'} -Ry_i^{'} \right \|^2=\frac{1}{n}\sum^{n}_{i=1} (x_i^{'T}x_i^{'}+p_i^{'T}R^TRp_i^{'}-2x_i^{'T}Rp_i^{'})

第一项与R无关,第二项由于R^TR=I与R无关,因此求minE^{'}(R,t)即求min\frac{1}{n}\sum^{n}_{i=1} (-2x_i^{'T}Rp_i^{'}) \rightarrow max\frac{1}{n}\sum^{n}_{i=1} (x_i^{'T}Rp_i^{'})

                                                                     \frac{1}{n}\sum^{n}_{i=1} (x_i^{'T}Rp_i^{'}) = tr(\frac{1}{n}\sum^{n}_{i=1} (Rx_i^{'}p_i^{T}))

H= tr(\frac{1}{n}\sum^{n}_{i=1} (Rx_i^{'}p_i^{T})),即求tr(RH)的最大值。由于:假设矩阵A为正定对称矩阵,则对于任意的正交矩阵B,都有:tr(A)>=tr(B)tr(A)>=tr(B)tr(A)>=tr(B),则:

因此,tr(RH)取最大值时

                                                                                             R = VU^T

则:

                                                                                           t = x_c - Ry_c

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值