基于高斯牛顿的点-点,点-线,点到面ICP过程推导

基于高斯牛顿的点-点,点-线,点到面ICP过程推导

简介

最近在学习深蓝学院的<<多传感器融合定位>>这一课程,本身也是个半路出家的SLAM小白,也挺感兴趣的,就尝试一下了,目前做了两章作业,其中第一章有道题需要自己手写ICP或者NDT的匹配,因为PCL_ICP默认是使用SVD分解的,所以这里尝试使用高斯牛顿的迭代法来求解点-点的ICP匹配,同时结合之前看的LIVOX-LOAM里面的匹配,有个用点到面,点到线的匹配,在这里做个总结。
自己也是个小白,如果这里有什么地方错误的还请大家指教,请轻喷,我及时改正!再有就是要感谢高翔博士,贺一家博士的VIO课程,对后端优化讲解的很清楚,再就是<<多传感器融合定位>>课程的任乾任大佬的开源分享。
更新不易,如需转载,请著名出处,谢谢。

1 回顾

1.1 优化问题

对于一个多维的最小二乘优化问题,我们希望寻找一个 x \pmb x xxx,能够使得目标函数达到最小,即:
arg min ⁡ x F ( x ) = arg min ⁡ x ( Σ i = 1 n 1 2 ∣ ∣ f i ( x ) ∣ ∣ 2 ) (1) {\underset {\pmb x}{\operatorname {arg\,min} }}\pmb F(\pmb x) ={\underset {\pmb x}{\operatorname {arg\,min} }}(\Sigma_{i=1}^n \frac{1}{2}||f_i(\pmb x)||^2) \tag{1} xxxargminFFF(xxx)=xxxargmin(Σi=1n21fi(xxx)2)(1)
传统的求解最小化问题就是对(1)其求导,将其泰勒展开可以得到:
F ( x + Δ x ) = F ( x ) + ∂ F ( x ) ∂ x Δ x + Δ x T ∂ F 2 ( x ) 2 ! ∂ x 2 Δ x + O ( ( Δ x ) 3 ) (2) F(x+\Delta x) = F(x) + \frac{\partial F(x)}{\partial x}\Delta x + \Delta x^T\frac{\partial F^2(x)}{2!\partial x^2}\Delta x + O((\Delta x)^3)\quad \quad \quad \tag{2} F(x+Δx)=F(x)+xF(x)Δx+ΔxT2!x2F2(x)Δx+O((Δx)3)(2)
将(2)求关于 Δ x \Delta x Δx的导数令其为0,忽略高阶项,可以得到:
g ( x ) + H ( x ) Δ x = 0 , 其 中 g ( x ) = ( ∂ F ( x ) ∂ x ) T , H ( x ) = ∂ F 2 ( x ) ∂ x 2 (3) g(x) + H(x)\Delta x = 0,其中g(x) =(\frac{\partial F(x)}{\partial x})^T,H(x) =\frac{\partial F^2(x)}{\partial x^2}\quad \quad \tag{3} g(x)+H(x)Δx=0g(x)=(xF(x))TH(x)=x2F2(x)(3)
根据公式(3)可以得到迭代值,如此循环迭代,直到达到收敛条件(收敛次数,收敛精度)就退出
Δ x = − H − 1 ( x ) ∗ g ( x ) (4) \Delta x = -H^{-1}(x)*g(x) \tag{4} Δx=H1(x)g(x)(4)

1.2 高斯牛顿法

由于海森矩阵 H H H的求解不方便,有些函数很难去求解二次导数,所以,可以用一种新的迭代方式求解 Δ x \Delta x Δx,即对子函数 f ( x ) f(x) f(x)进行一阶泰勒展开,原函数转化为:
arg min ⁡ x ( Σ i = 1 n 1 2 ∣ ∣ f i ( x + Δ x ) ∣ ∣ 2 ) = arg min ⁡ x Σ i = 1 n ( f i ( x ) + J i ( x ) Δ x ) ) 2 = arg min ⁡ x Σ i = 1 n ( f i T ( x ) ∗ f ( x ) + 2 ∗ f i T ( x ) J ( x ) Δ x + Δ x T J T ( x ) ∗ J ( x ) Δ x ) 设 G ( Δ x ) = Σ i = 1 n ( f i T ( x ) ∗ f ( x ) + 2 ∗ f i T ( x ) J ( x ) Δ x + Δ x T J T ( x ) ∗ J ( x ) Δ x ) g i ( Δ x ) = f i T ( x ) ∗ f ( x ) + 2 ∗ f i T ( x ) J ( x ) Δ x + Δ x T J T ( x ) ∗ J ( x ) Δ x (5) {\underset {\pmb x}{\operatorname {arg\,min} }}(\Sigma_{i=1}^n \frac{1}{2}||f_i(\pmb x +\Delta x)||^2) \\ = {\underset {\pmb x}{\operatorname {arg\,min} }}\Sigma_{i=1}^n (f_i(x)+J_i(x)\Delta x))^2 \\ = {\underset {\pmb x}{\operatorname {arg\,min} }}\Sigma_{i=1}^n (f_i^T(x)*f(x)+2*f_i^T(x)J(x)\Delta x + \Delta x^TJ^T(x)*J(x)\Delta x) \\ 设G(\Delta x) = \Sigma_{i=1}^n(f_i^T(x)*f(x)+2*f_i^T(x)J(x)\Delta x + \Delta x^TJ^T(x)*J(x)\Delta x) \\ g_i(\Delta x) = f_i^T(x)*f(x)+2*f_i^T(x)J(x)\Delta x + \Delta x^TJ^T(x)*J(x)\Delta x \\ \quad \quad \tag{5} xxxargmin(Σi=1n21fi(xxx+Δx)2)=xxxargminΣi=1n(fi(x)+Ji(x)Δx))2=xxxargminΣi=1n(fiT(x)f(x)+2fiT(x)J(x)Δx+ΔxTJT(x)J(x)Δx)G(Δx)=Σi=1n(fiT(x)f(x)+2fiT(x)J(x)Δx+ΔxTJT(x)J(x)Δx)gi(Δx)=fiT(x)f(x)+2fiT(x)J(x)Δx+ΔxTJT(x)J(x)Δx(5)
g i ( Δ x ) g_i(\Delta x) gi(Δx)关于 Δ x \Delta x Δx的导数令其为0:
∂ g i ( x ) ∂ Δ x = 2 ∗ J T ( x ) f ( x ) + 2 ∗ J T ( x ) J ( x ) ∗ Δ x = 0 所 以 有 : Δ x = − ( J T ( x ) J ( x ) ) − 1 ∗ ( J T ( x ) ∗ f ( x ) ) (6) \frac{\partial g_i(x)}{\partial \Delta x} = 2*J^T(x)f(x)+2*J^T(x)J(x)*\Delta x = 0 \\ 所以有: \Delta x = -(J^T(x)J(x))^{-1}*(J^T(x)*f(x)) \tag{6} Δxgi(x)=2JT(x)f(x)+2JT(x)J(x)Δx=0:Δx=(JT(x)J(x))1(JT(x)f(x))(6)

1.3 点云匹配问题

​ 点云匹配是为了找到两组点云 P = { p 1 , p 2 , . . . , p n } P = {\{p_1,p_2,...,p_n\}} P={p1,p2,...,pn} Q = { q 1 , q 2 , . . . , q m } Q={\{q_1,q_2,...,q_m\}} Q={q1,q2,...,qm}之间的关系,一种是对应点之间的匹配,即在 Q Q Q里的每一个点都已知和 P P P中的某个点匹配,在视觉里面,根据特征点可以这样匹配,还有一种是不对应点的匹配,就是不知道 P P P Q Q Q的对应关系,这里讨论不知道对应关系的情况,因为在雷达中,都不知道点与点的对应关系。
匹配的目的是为了最小化点与点,点与线,点与面的距离:

1.3.1 点到点的模型:

arg min ⁡ R , t = 1 2 Σ i = 1 n ∣ ∣ R ∗ q i + t − p c l o s e t ∣ ∣ 2 (7) {\underset {R,\pmb t}{\operatorname {arg\,min} }} = \frac{1}{2}\Sigma_{i=1}^n||R*\pmb q_i+\pmb t - \pmb p_{closet}||^2 \quad \quad \tag{7} R,tttargmin=21Σi=1nRqqqi+tttpppcloset2(7)

1.3.2 点到线的匹配:

基于高斯牛顿的点-点,点-线,点到面ICP过程推导_第1张图片

arg min ⁡ R , t = 1 2 Σ i = 1 n ∣ ∣ n ( R ∗ q i + t − p i n _ l i n e ) ∣ ∣ 2 , (8) {\underset {R,\pmb t}{\operatorname {arg\,min} }} = \frac{1}{2}\Sigma_{i=1}^n||\pmb n(R*\pmb q_i+\pmb t - \pmb p_{in\_line})||^2, \quad \quad \tag{8} R,tttargmin=21Σi=1nnnn(Rqqqi+tttpppin_line)2(8)
n \pmb n nnn 为线的法向量

1.3.3 点到面的匹配:

基于高斯牛顿的点-点,点-线,点到面ICP过程推导_第2张图片
arg min ⁡ R , t = 1 2 Σ i = 1 n ∣ ∣ n ( R ∗ q i + t − p i n _ p l a n n e r ) ∣ ∣ 2 , (9) {\underset {R,\pmb t}{\operatorname {arg\,min} }} = \frac{1}{2}\Sigma_{i=1}^n||\pmb n(R*\pmb q_i+\pmb t - \pmb p_{in\_planner})||^2, \quad \quad \tag{9} R,tttargmin=21Σi=1nnnn(Rqqqi+tttpppin_planner)2(9)
n \pmb n nnn 为面的法向量

2 优化方法的使用

​ 在ICP中,待求解的变量为 R R R t \pmb t ttt,其中 R R R表示姿态,可以用四元数 q q q或者姿态角 ( r o l l , p i t c h , y a w ) (roll,pitch,yaw) (roll,pitch,yaw)来表示, t \pmb t ttt表示平移。

2.1 点-点

  1. 初始化Hessian<6,6>=Zero,B<6,1> = Zero,首先,将待匹配点云中的每个点 p i ′ \pmb {p_i^{'}} pipipi利用初始的旋转矩阵 R R R和平移向量 t \pmb t ttt,转换到目标点云中,即 p i ′ = R ∗ p i + t \pmb{p_i^{'}} =\pmb{ R*p_i + t} pipipi=Rpi+tRpi+tRpi+t,利用KD树的算法寻找到最近的一个点 q i ′ \pmb {q_i^{'}} qiqiqi
  2. 计算距离误差 f = p i ′ − q i ′ \pmb{f = p_i^{'} - q_i^{'}} f=piqif=piqif=piqi,如果 ∣ ∣ f ∣ ∣ > t h r e s h o l d ||\pmb f||>threshold fff>threshold,舍弃这组点对,否则执行下面的步骤。
  3. 对找到的每一组点对,计算Jacobian<3,6> , Hessian_i<6,6>, B_i<6,1>.
    对 平 移 求 导 ∂ f ∂ t = I 对 旋 转 求 导 , 采 用 右 导 数 ∂ f ∂ R = − R ∗ p i Λ J a c o b i a n = [ ∂ f ∂ t , ∂ f ∂ R ] H e s s i a n i = J a c o b i a n T J a c o b i a n B i = − J a c o b i a n T f 对平移求导\frac{\partial \pmb f}{ {\partial \pmb t}} =\pmb I \\ 对旋转求导,采用右导数\frac{\partial \pmb f}{ {\partial \pmb R}} =\pmb {-R*p_i^{\Lambda}} \\ Jacobian = [\frac{\partial \pmb f}{ {\partial \pmb t}},\frac{\partial \pmb f}{ {\partial \pmb R}}]\\ Hessian_i = Jacobian^TJacobian \\ B_i = -Jacobian^T\pmb f tttfff=IIIRRRfff=RpiΛRpiΛRpiΛJacobian=[tttfff,RRRfff]Hessiani=JacobianTJacobianBi=JacobianTfff
  4. 对所有点对计算出来的Hessian_iB_i累加,计算增量 δ x \pmb {\delta x} δxδxδx
    H e s s i a n = Σ H e s s i a n i B = Σ B i δ x = H e s s i a n . i n v e r s e ( ) ∗ B Hessian = \Sigma Hessian_i \\ B = \Sigma B_i \\ \pmb {\delta x} = Hessian.inverse()*B Hessian=ΣHessianiB=ΣBiδxδxδx=Hessian.inverse()B
  5. 利用增量 δ x \pmb {\delta x} δxδxδx计算新的 R , t R,t R,t,返回第一步,直到达到收敛条件或者迭代次数。

2.2 点-线

对于点-线的情况:
​ 首先,将待匹配点云中的每个点利用初始的旋转矩阵和平移向量转换到目标点云中,利用KD树的算法寻找到最近的几个点,根据这几个点计算出协方差,将协方差进行奇异值分解,如果最大的奇异值比第二大的奇异值要大得多,则认为找到的这几个点是在同一条直线上。
基于高斯牛顿的点-点,点-线,点到面ICP过程推导_第3张图片
基于高斯牛顿的点-点,点-线,点到面ICP过程推导_第4张图片
目标函数为点到直线的距离,即 ∣ ∣ l d c ∣ ∣ 2 ||l_{dc}||^2 ldc2,对于向量有,这里为了方便,把 l a b \pmb l_{ab} lllab进行了归一化:
l d c = l b c − l b d = l b c − l a b ∗ ( l a b T ∗ l b c ) l b c = p c − p b = R q + t − p b (10) \pmb l_{dc} = \pmb l_{bc} - \pmb l_{bd} = \pmb l_{bc} - \pmb l_{ab}*(\pmb l_{ab}^T*\pmb l_{bc}) \tag{10} \\ \pmb l_{bc} = \pmb p_c - \pmb p_b = R\pmb q + \pmb t - \pmb p_b llldc=lllbclllbd=lllbclllab(lllabTlllbc)lllbc=pppcpppb=Rqqq+tttpppb(10)
将(10)对状态量 R R R t t t求偏导,因为目标函数是 l b c \pmb l_{bc} lllbc是一个3维的变量,而状态量是一个6维的变量,所以 ∂ f ∂ x = M a t r i x 3 ∗ 6 \frac{\partial f}{\partial x} = Matrix_{3*6} xf=Matrix36

2.2.1 公式推导:

求偏导数是为了求R和t相关的变量,所以无关的可以直接忽略,这里对第 i i i个点进行分析:
先求关于 t \pmb t ttt的偏导:
∂ l d c ∂ t = ∂ l b c ∂ t − ∂ l b d ∂ t = I − l a b ∗ l a b T (11) \frac{\partial \pmb l_{dc}}{\partial \pmb t} = \frac{\partial \pmb l_{bc}}{\partial \pmb t} - \frac{\partial \pmb l_{bd}}{\partial \pmb t} \\ =\pmb I - \pmb l_{ab}*\pmb l_{ab}^T \tag{11} tttllldc=tttlllbctttlllbd=IIIlllablllabT(11)
再求关于 R R R的偏导:
∂ l d c ∂ R = ∂ l b c ∂ R − ∂ l b d ∂ R = ∂ R q ∂ R − l a b ∗ ∂ ( l a b T ∗ R q ) ∂ R = lim ⁡ Δ ϕ → 0 R e x p ( Δ ϕ × ) q − R q Δ ϕ − l a b ∗ lim ⁡ Δ ϕ → 0 l a b T ∗ R e x p ( Δ ϕ × ) q − l a b T ∗ R q Δ ϕ = − R q × + l a b ∗ ( l a b T ∗ R q × ) (12) \frac{\partial \pmb l_{dc}}{\partial R} = \frac{\partial \pmb l_{bc}}{\partial R} - \frac{\partial \pmb l_{bd}}{\partial R} \\ = \frac{\partial R\pmb q}{\partial R} - \pmb l_{ab}*\frac{\partial(\pmb l_{ab}^T*R\pmb q)}{\partial R} \\ = \lim_{\Delta \phi\to 0}\frac{Rexp(\Delta \phi ^{\times})\pmb q -R\pmb q}{\Delta \phi} - \pmb l_{ab}*\lim_{\Delta \phi\to 0}\frac{\pmb l_{ab}^T*Rexp(\Delta \phi ^{\times})\pmb q - \pmb l_{ab}^T*R\pmb q}{\Delta \phi} \\ =-R\pmb q^{\times} + \pmb l_{ab}*(\pmb l_{ab}^T*R\pmb q^{\times}) \tag{12} Rllldc=RlllbcRlllbd=RRqqqlllabR(lllabTRqqq)=Δϕ0limΔϕRexp(Δϕ×)qqqRqqqlllabΔϕ0limΔϕlllabTRexp(Δϕ×)qqqlllabTRqqq=Rqqq×+lllab(lllabTRqqq×)(12)
上式中 q × \pmb q^{\times} qqq×表示 q \pmb q qqq的反对称矩阵:
q × = [ 0 − q 2 q 1 q 2 0 − q 0 − q 1 q 0 0 ] \pmb q^{\times} = \left[\begin{matrix} 0 & -q_2 & q_1 \\ q_2 & 0 &-q_0 \\ -q_1 & q_0 & 0\end{matrix}\right] qqq×=0q2q1q20q0q1q00
所以雅克比矩阵可写为:
J i = ( ∂ l d c ∂ t ∂ l d c ∂ R ) = ( I − l a b ∗ l a b T − R q × + l a b ∗ ( l a b T ∗ R q × ) ) (13) J_i = \left(\begin{matrix}\frac{\partial \pmb l_{dc}}{\partial \pmb t} & \frac{\partial \pmb l_{dc}}{\partial R} \end{matrix}\right) \\ = \left(\begin{matrix}\pmb I - \pmb l_{ab}*\pmb l_{ab}^T & -R\pmb q^{\times} + \pmb l_{ab}*(\pmb l_{ab}^T*Rq^{\times}) \end{matrix}\right) \tag{13} Ji=(tttllldcRllldc)=(IIIlllablllabTRqqq×+lllab(lllabTRq×))(13)

所以Hessian矩阵可以表示为 H i = J i T J i H_i = J_i^TJ_i Hi=JiTJi,残差项 b i = − J i T ∗ f = − J i T ∗ l d c \pmb b_i = -J_i^T*f = -J_i^T*\pmb l_{dc} bbbi=JiTf=JiTllldc

从而根据(6)得出:
Σ i = 1 n H i Δ x = Σ i = 1 n b i (14) \Sigma_{i=1}^nH_i\Delta x = \Sigma_{i=1}^n \pmb b_i \tag{14} Σi=1nHiΔx=Σi=1nbbbi(14)

2.2.2 位姿更新

到上面计算出了 Δ x = ( Δ t Δ ϕ ) T \Delta x = (\Delta t \quad \Delta \phi)^T Δx=(ΔtΔϕ)T,将 Δ x \Delta x Δx更新上一次的估计值,完成一次迭代:
需要注意的是平移向量 Δ t \Delta t Δt是可以直接相加的,但是旋转向量则需要利用四元数/李代数的乘法:
t 1 = t 0 + Δ t q 1 = q 0 ∗ [ 1 1 2 Δ ϕ ] 或 者 R 1 = R 0 e x p ( Δ ϕ × ) (15) t_1 = t_0 + \Delta t \\ q_1 = q_0*\left[\begin{matrix} 1 \\ \frac{1}{2}\Delta \phi \end{matrix}\right] \tag{15} 或者R_1=R_0exp(\Delta \phi^{\times}) t1=t0+Δtq1=q0[121Δϕ]R1=R0exp(Δϕ×)(15)

2.3 点-面

对于点-面的情况:
​ 首先,将待匹配点云中的每个点利用初始的旋转矩阵和平移向量转换到目标点云中,利用KD树的算法寻找到最近的几个点,根据这几个点计算出协方差,将协方差进行奇异值分解,如果最小的奇异值比第二小的奇异值要小得多,则认为找到的这几个点是在同一个平面上。
基于高斯牛顿的点-点,点-线,点到面ICP过程推导_第5张图片
基于高斯牛顿的点-点,点-线,点到面ICP过程推导_第6张图片

目标函数为点到面的距离,即 ∣ ∣ l o d ∣ ∣ 2 ||l_{od}||^2 lod2,先求出法向量并进行归一化得到 n = ( l a c × l a b ) . n o r m l i z e ( ) \pmb n = (\pmb l_{ac}\times \pmb l_{ab}).normlize() nnn=(lllac×lllab).normlize()
l o d = n ∗ ( n T ∗ l c d ) l c d = R ∗ q + t − p c (16) \pmb l_{od} =\pmb n* (\pmb n ^T * \pmb l_{cd}) \\ \pmb l_{cd} = R*\pmb q + t - \pmb p_c \tag{16} lllod=nnn(nnnTlllcd)lllcd=Rqqq+tpppc(16)
将(16)对状态量 R R R t t t求偏导,因为目标函数是 l o d \pmb l_{od} lllod是一个3维的变量,而状态量是一个6维的变量,所以 ∂ f ∂ x = M a t r i x 3 ∗ 6 \frac{\partial f}{\partial x} = Matrix_{3*6} xf=Matrix36

2.3.1 公式推导:

和点-线的求导方式一样,求偏导数是为了求R和t相关的变量,所以无关的可以直接忽略,这里对第 i i i个点进行分析:
先求关于 t \pmb t ttt的偏导:
∂ l o d ∂ t = ∂ n ∗ ( n T ∗ ( R ∗ q + t ) ) ∂ t = n ∗ n T (17) \frac{\partial \pmb l_{od}}{\partial \pmb t} = \frac{\partial \pmb n* (\pmb n ^T * (R*\pmb q + t))}{\partial \pmb t} \\=\pmb n *\pmb n^T \tag{17} tttlllod=tttnnn(nnnT(Rqqq+t))=nnnnnnT(17)
再求关于 R R R的偏导:
∂ l o d ∂ R = ∂ n ∗ ( n T ∗ ( R ∗ q + t ) ) ∂ R = n ∗ lim ⁡ Δ ϕ → 0 n T ∗ R e x p ( Δ ϕ × ) q − n ∗ T R q Δ ϕ = − n ∗ ( n T ∗ R q × ) (18) \frac{\partial \pmb l_{od}}{\partial R} = \frac{\partial \pmb n* (\pmb n ^T * (R*\pmb q + t))}{\partial R} \\ = \pmb n*\lim_{\Delta \phi\to 0}\frac{\pmb n ^T*Rexp(\Delta \phi ^{\times})\pmb q - \pmb n ^*TR\pmb q}{\Delta \phi} \\ =-\pmb n*(\pmb n^T*R\pmb q^{\times}) \tag{18} Rlllod=Rnnn(nnnT(Rqqq+t))=nnnΔϕ0limΔϕnnnTRexp(Δϕ×)qqqnnnTRqqq=nnn(nnnTRqqq×)(18)
所以雅克比矩阵可写为:
J i = ( ∂ l o d ∂ t ∂ l o d ∂ R ) = ( n ∗ n T − n ∗ ( n T ∗ R q × ) ) (19) J_i = \left(\begin{matrix}\frac{\partial \pmb l_{od}}{\partial \pmb t} & \frac{\partial \pmb l_{od}}{\partial R} \end{matrix}\right)\\= \left(\begin{matrix}\pmb n *\pmb n^T & -\pmb n*(\pmb n^T*R\pmb q^{\times}) \end{matrix}\right) \tag{19} Ji=(tttlllodRlllod)=(nnnnnnTnnn(nnnTRqqq×))(19)
所以Hessian矩阵可以表示为 H i = J i T J i H_i = J_i^TJ_i Hi=JiTJi,残差项 b i = J i T ∗ f = J i T ∗ l d c \pmb b_i = J_i^T*f = J_i^T*\pmb l_{dc} bbbi=JiTf=JiTllldc
从而根据(6)得出:
Σ i = 1 n H i Δ x = Σ i = 1 n b i (20) \Sigma_{i=1}^nH_i\Delta x = \Sigma_{i=1}^n \pmb b_i \tag{20} Σi=1nHiΔx=Σi=1nbbbi(20)

结果

这里放一张作业的结果图,因为点-点的ICP是基于RTK给的初始值,所以结果还算理想,红色的是激光里程计的,黄色是GPS的
基于高斯牛顿的点-点,点-线,点到面ICP过程推导_第7张图片

参考

[1] 深蓝学院SLAM/VIO课程
[2] 深蓝学院SLAM/多传感器融合定位 课程
[3] 从零开始做激光SLAM
[3] Livox-Loam

你可能感兴趣的:(SLAM/VIO/定位)