视觉SLAM前端——ICP

当我们知道空间点在两个坐标系下的位置时,可以通过ICP来求解其相对位姿。ICP最初常用在激光SLAM中,因为激光可以获得3D位置,而不像视觉还需要经过相机的投影变换,但是从激光雷达获得的三维点云中,我们很难对两帧点云进行匹配,通常是寻找距离最近的点作为匹配点,所以称为迭代最近法(ICP)。当我们已知相机的位姿后,可以把相机坐标系下的特征点 P i c P_i^c Pic转换到世界坐标系下,这与世界坐标系下对应的特征点 P i w P_i^w Piw存在误差,即:
e i = P i w − ( R w c P i c + t w c ) e_i=P_i^w-(R_{wc}P_i^c+t_{wc}) ei=Piw(RwcPic+twc)
考虑所有特征点的误差,我们定义总误差为:
J ( R , t ) = 1 2 ∑ i = 1 n ∥ e i ∥ 2 2 J(R,t) =\frac 1 2\sum_{i=1}^n\|e_i\|_2^2 J(R,t)=21i=1nei22
我们的目标是寻找一个最优的 R R R t t t,使得总误差 J J J最小,即:
T ∗ = arg min ⁡ R . t J ( R , t ) T^*=\argmin_{R.t}J(R,t) T=R.targminJ(R,t)
这是一个非线性最小二乘问题,通常可以用非线性优化的方法进行求解,但对于ICP来说,我们还可以使用SVD分解的方式求出解析解。

SVD方法

首先我们先定义相机坐标系下和世界坐标系下所有3D特征点的质心分别为(注意质心是没有下标的):
P c = 1 n ∑ i = 1 n P i c P^c=\frac 1 n \sum_{i=1}^nP_i^c Pc=n1i=1nPic P w = 1 n ∑ i = 1 n P i w P^w=\frac 1 n \sum_{i=1}^nP_i^w Pw=n1i=1nPiw
考虑第 i i i个误差项:
e i = P i w − ( R w c P i c + t w c ) = P i w − P w + P w − R w c ( P i c − P c + P c ) − t w c = P i w − P w − R w c ( P i c − P c ) + P w − ( R w c P c + t w c ) = P ′ i w − R w c P ′ i c ⏟ e i a + P w − ( R w c P c + t w c ) ⏟ e i b \begin{aligned}e_i &=P_i^w-(R_{wc}P_i^c+t_{wc}) \\ &=P_i^w-P^w+P^w-R_{wc}(P_i^c-P^c+P^c)-t_{wc} \\ &=P_i^w-P^w-R_{wc}(P_i^c-P^c)+P^w-(R_{wc}P^c+t_{wc}) \\&=\underbrace{{P'}_i^w-R_{wc}{P'}_i^c}_{e_{ia}}+\underbrace{P^w-(R_{wc}P^c+t_{wc})}_{e_{ib}} \end{aligned} ei=Piw(RwcPic+twc)=PiwPw+PwRwc(PicPc+Pc)twc=PiwPwRwc(PicPc)+Pw(RwcPc+twc)=eia PiwRwcPic+eib Pw(RwcPc+twc)
其中 P ′ i w = P i w − P w {P'}_i^w=P_i^w-P^w Piw=PiwPw P ′ i c = P i c − P c {P'}_i^c=P_i^c-P^c Pic=PicPc,分别表示特征点在世界和相机坐标系下的去质心坐标。由于:
∑ i = 1 n e i a = ∑ i = 1 n ( P ′ i w − R w c P ′ i c ) = 0 \sum_{i=1}^ne_{ia} =\sum_{i=1}^n({{P'}_i^w-R_{wc}{P'}_i^c})=0 i=1neia=i=1n(PiwRwcPic)=0
那么总误差可以化简为:
J ( R , t ) = 1 2 ∑ i = 1 n ∥ e i ∥ 2 2 = 1 2 ∑ i = 1 n ∥ e i a ∥ 2 2 + 1 2 ∑ i = 1 n ∥ e i b ∥ 2 2 = J a ( R ) + J b ( R , t ) J(R,t) =\frac 1 2\sum_{i=1}^n\|e_i\|_2^2=\frac 1 2\sum_{i=1}^n\|e_{ia}\|_2^2+\frac 1 2\sum_{i=1}^n\|e_{ib}\|_2^2=J_a(R)+J_b(R,t) J(R,t)=21i=1nei22=21i=1neia22+21i=1neib22=Ja(R)+Jb(R,t)
由于 J a J_a Ja只与 R R R有关,与 t t t无关,我们可以先通过优化 J a J_a Ja求得 R R R,再带入 J b ( R , t ) = 0 J_b(R,t)=0 Jb(R,t)=0,求得 t t t J a J_a Ja可进一步展开为:
J a ( R ) = 1 2 ∑ i = 1 n ∥ P ′ i w − R w c P ′ i c ∥ 2 2 = 1 2 ∑ i = 1 n ( P ′ i w T P ′ i w + P ′ i c T R w c T R w c P ′ i c − 2 P ′ i w T R w c P ′ i c ) J_a(R)=\frac 1 2\sum_{i=1}^n\|{P'}_i^w-R_{wc}{P'}_i^c\|_2^2=\frac 1 2\sum_{i=1}^n({{P'}_i^w}^T{P'}_i^w+{{P'}_i^c}^TR_{wc}^TR_{wc}{P'}_i^c-2{{P'}_i^w}^TR_{wc}{P'}_i^c) Ja(R)=21i=1nPiwRwcPic22=21i=1n(PiwTPiw+PicTRwcTRwcPic2PiwTRwcPic)
由于前两项与 R R R无关,所以优化目标可以简化为:
J ′ a ( R ) = − ∑ i = 1 n P ′ i w T R w c P ′ i c = − ∑ i = 1 n t r ( R w c P ′ i c P ′ i w T ) = − t r ( R w c ∑ i = 1 n P ′ i c P ′ i w T ) {J'}_a(R) =-\sum_{i=1}^n {{P'}_i^w}^TR_{wc}{P'}_i^c=-\sum_{i=1}^n tr(R_{wc}{P'}_i^c{{P'}_i^w}^T)=-tr( R_{wc} \sum_{i=1}^n{P'}_i^c{{P'}_i^w}^T) Ja(R)=i=1nPiwTRwcPic=i=1ntr(RwcPicPiwT)=tr(Rwci=1nPicPiwT)
W = ∑ i = 1 n P ′ i c P ′ i w T W=\sum_{i=1}^n{P'}_i^c{{P'}_i^w}^T W=i=1nPicPiwT,对 W W W进行SVD分解,即 W = U Σ V T W=U\Sigma V^T W=UΣVT Σ \Sigma Σ对应的奇异值从大到小排列。 根据最优性证明,当 W W W满秩时,最优的 R = U V T R=UV^T R=UVT,如果 R R R行列式小于0,取负作为最优值。

非线性优化方法

由于ICP存在无穷多解或者唯一解,如果我们使用迭代的方法获取局部最优解,即为全局最优解,因此对于ICP问题,我们可以任意选定初始值并进行迭代。误差的一阶导数即雅克比矩阵为:
∂ e i ∂ R = − ( R w c P i c ) ∧ = ( − P i w ) ∧ , ∂ e i ∂ t = I \frac {\partial e_i} {\partial R}=-(R_{wc}P_i^c)^{\land}=(-P_i^w)^{\land},\frac {\partial e_i} {\partial t}=I Rei=(RwcPic)=(Piw)tei=I

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
激光SLAM前端中的ICP(Iterative Closest Point)是一种常用的点云配准算法,用于估计机器人的运动轨迹。在ICP算法中,首先需要找到两个点云之间最匹配的点对,然后通过迭代的方式更新机器人的位姿来最小化点对之间的距离误差。 ICP算法的基本思想是通过最小化点到点或点到线的距离来寻找最佳的匹配。在激光SLAM中,点云数据表示了机器人周围的环境信息。通过将当前帧的点云与上一帧的点云进行匹配,ICP算法可以估计机器人的位姿变换。 在ICP算法中,通过迭代的方式不断优化位姿估计的准确度。每一次迭代中,都通过计算当前帧中的点在上一帧中的最近邻点,并根据这些点之间的距离来更新位姿估计。通过多次迭代,最终可以得到一个相对准确的位姿估计。 然而,ICP算法也存在一些问题。例如,在优化的ICP中,由于迭代的次数较少,可能导致结果比使用SVD进行配准的结果更差。因此,在使用ICP算法进行激光SLAM前端时,需要进行进一步的检查和优化,以确保得到较为准确的位姿估计结果。同时,还有其他类型的SLAM前端算法,如NDT、SICP和GICP等,可以根据具体应用场景选择合适的算法进行使用。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [激光SLAM前端配准算法](https://blog.csdn.net/weixin_46777885/article/details/124793241)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [激光SLAM前端方法比较](https://blog.csdn.net/weixin_44035919/article/details/125003220)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

考拉AI

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值