SLAM--最小化重投影误差

一、相机模型

设相机坐标系下的左边点 [ X , Y , Z ] T [X,Y,Z]^T [X,Y,Z]T,相机物理成像的其次坐标为 [ X ′ , Y ′ , 1 ] [X',Y',1] [X,Y,1],成像焦距为 f f f,由相似三角形的关系可以得到:
X ′ = f X Z   Y ′ = f Y Z (1) X'=f\frac X Z\\ ~\\ Y'=f\frac Y Z \tag{1} X=fZX Y=fZY(1)
设像素坐标为 [ u , v ] T [u,v]^T [u,v]T,如果像素在u轴上缩放 α \alpha α倍,在v轴上缩放 β \beta β倍,则:
{ u = α X ′ + c x v = β Y ′ + c y (2) \left \{ \begin{aligned} u=\alpha X'+c_x\\ v= \beta Y'+c_y \end{aligned} \right.\tag{2} {u=αX+cxv=βY+cy(2)
α f \alpha f αf合并成 f x f_x fx β X ′ \beta X' βX合并成 f y f_y fy:
{ u = f x X Z + c x v = f y Y Z + c x (3) \left \{ \begin{aligned} u=f_x \frac X Z+c_x\\ v= f_y\frac Y Z+c_x \end{aligned} \right.\tag{3} u=fxZX+cxv=fyZY+cx(3)
所以有:
Z [ u   v   1 ] = [ f x 0 c x   0 f y c y   0 0 1 ] [ X   Y   Z ] (4) Z\begin{bmatrix} u \\ ~\\v\\~\\1 \end{bmatrix}=\begin{bmatrix} f_x&0&c_x \\ ~\\0&f_y&c_y \\ ~\\0&0&1 \end{bmatrix}\begin{bmatrix} X\\~\\ Y \\~\\ Z \end{bmatrix}\tag{4} Zu v 1=fx 0 00fy0cxcy1X Y Z(4)
即:
Z P u v = Z [ u   v   1 ] = K P = K T P w (5) Z\bm P_{uv}=Z\begin{bmatrix} u \\ ~\\v\\~\\1 \end{bmatrix}=\bm{KP}=\bm{KTP}_w\tag{5} ZPuv=Zu v 1=KP=KTPw(5)
 
 

二、最小化重投影误差

2.1 优化位姿

若空间中的点为 P i = [ X i , Y i , Z i ] T \bm P_i=[X_i,Y_i,Z_i]^T Pi=[Xi,Yi,Zi]T,其投影的像素坐标为 u i = [ u i , v i ] T \bm u_i=[u_i,v_i]^T ui=[ui,vi]T,相机的位姿为 T \bm T T,所以投影关系为:
u i = 1 s i K T P i (6) \bm u_i=\frac 1 {s_i}\bm{KTP}_i\tag{6} ui=si1KTPi(6)
由于观测点的噪声,所以就存在误差,所以为了找到一个最优的位姿,我们根据误差构造一个最小二乘问题:
arg ⁡ min ⁡ T 1 2 ∑ i = 1 n ∥ u i − 1 s i K T P i ∥ 2 2 (7) \mathop {\arg\min}\limits_T\frac 1 2 \sum_{i=1}^n \left\| \bm u_i-\frac 1 {s_i}\bm{KTP}_i \right\|_2^2\tag{7} Targmin21i=1nuisi1KTPi22(7)
面对这个最小二乘法,我们一般利用高斯牛顿法或者列文伯格-马夸尔特方法进行求解,我们令:
e = u i − 1 s i K T P i   e ( ξ ) = u i − 1 s i K exp ⁡ ( ξ ∧ ) P i (8) \bm e=\bm u_i-\frac 1 {s_i}\bm{KTP}_i \\ ~\\ \bm e(\xi)= \bm u_i-\frac 1 {s_i}\bm{K} \exp{(\xi^\land)} \bm P_i \tag{8} e=uisi1KTPi e(ξ)=uisi1Kexp(ξ)Pi(8)
参考我的博文:SLAM–线性化求解估计位姿

e ( Δ ξ ⊕ ξ ) = u i − 1 s i K exp ⁡ ( Δ ξ ∧ ) exp ⁡ ( ξ ∧ ) P i (9) \bm e(\Delta \xi \oplus \xi) =\bm u_i-\frac 1 {s_i}\bm{K} \exp{(\Delta\xi^\land)} \exp{(\xi^\land)} \bm P_i \tag{9} e(Δξξ)=uisi1Kexp(Δξ)exp(ξ)Pi(9)

所以对误差函数线性化可得:
e ( Δ ξ ⊕ ξ ) = e ( J l − 1 Δ ξ + ξ ) ≈ e ( ξ ) + J δ ξ Δ ξ 6 × 1   → e ( Δ ξ ⊕ ξ ) ≈ e ( ξ ) + J δ ξ Δ ξ 6 × 1 (10) \small \bm e(\Delta \xi \oplus \xi) =\bm e(\bm J_l^{-1}\Delta \xi+\xi) \approx \bm e(\xi)+\bm J_{\delta \xi} \Delta \xi_{6\times1} \\ ~\\ \\ \rightarrow \bm e(\Delta \xi \oplus \xi) \approx \bm e(\xi)+\bm J_{\delta \xi} \Delta \xi_{6\times1} \tag{10} e(Δξξ)=e(Jl1Δξ+ξ)e(ξ)+JδξΔξ6×1 e(Δξξ)e(ξ)+JδξΔξ6×1(10)
其中:
J δ ξ = ∂ e ( ξ ) ∂ δ ξ   = − ∂ ( 1 s i K exp ⁡ ( ξ ∧ ) P i ) ∂ δ ξ   = − ∂ u ∂ δ ξ (11) \small \begin{aligned} \bm J_{\delta \xi}&=\frac {\partial{\bm e(\xi) }} {\partial \delta \xi}\\ ~\\ \\&=-\frac{\partial({\frac 1 {s_i}\bm{K} \exp{(\xi^\land)} \bm P_i})}{\partial \delta \xi}\\ ~\\ &=-\frac{\partial \bm u}{\partial \delta \xi} \end{aligned} \tag{11} Jδξ  =δξe(ξ)=δξ(si1Kexp(ξ)Pi)=δξu(11)
我们不使用像素坐标的其次坐标,所以:
u = [ u   v ] = [ f x X Z + c x   f y Y Z + c x ] , P ′ = [ X ′   Y ′   Z ′ ] (12) \bm u = \begin{bmatrix} u \\ ~\\v\\ \end{bmatrix}= \begin{bmatrix} f_x \frac X Z+c_x\\ ~\\ f_y\frac Y Z+c_x \end{bmatrix},\bm P'=\begin{bmatrix} X'\\ ~\\Y'\\~\\ Z' \end{bmatrix}\tag{12} u=u v=fxZX+cx fyZY+cx,P=X Y Z(12)
由链式求导法则可得:
J δ ξ = − ∂ u ∂ δ ξ = − ∂ u ∂ P ′ ⋅ ∂ P ′ ∂ δ ξ (13) J_{\delta \xi}=-\frac{\partial \bm u}{\partial \delta \xi}=-\frac{\partial \bm u}{\partial \bm P'}\cdot \frac{\partial \bm P'}{\partial \delta \xi}\tag{13} Jδξ=δξu=PuδξP(13)
这样我们就可以求出第一个导数:
∂ u ∂ P ′ = [ ∂ u ∂ X ′ ∂ u ∂ Y ′ ∂ u ∂ Z ′   ∂ v ∂ X ′ ∂ v ∂ Y ′ ∂ v ∂ Z ′ ] = [ f x Z ′ 0 − f x X ′ Z ′ 2   0 f y Z ′ − f y Y ′ Z ′ 2 ] \frac{\partial \bm u}{\partial \bm P'}=\begin{bmatrix} \frac{\partial \bm u}{\partial \bm X'} &\frac{\partial \bm u}{\partial \bm Y'}&\frac{\partial \bm u}{\partial \bm Z'}\\ ~\\\frac{\partial \bm v}{\partial \bm X'} & \frac{\partial \bm v}{\partial \bm Y'} &\frac{\partial \bm v}{\partial \bm Z'}\\ \end{bmatrix}= \begin{bmatrix} \frac {f_x}{Z'}&0&-\frac{f_xX'}{Z'^2} \\ ~\\0&\frac{f_y}{Z'}&-\frac{f_yY'}{Z'^2}\\ \end{bmatrix} Pu=Xu XvYuYvZuZv=Zfx 00ZfyZ2fxXZ2fyY
求第二个导数:
∂ P ′ ∂ δ ξ = ∂ ( T P ˉ ) 1 : 3 ∂ δ ξ = [ ( T P ˉ ) ⊙ ] 1 : 3   = [ I 3 × 3 − ( T P ˉ ) 1 : 3 ∧ ] 3 × 6 \small \frac{\partial \bm P'}{\partial \delta \xi}=\frac{\partial \bm {(T\bar P)}_{1:3}}{\partial \delta \xi}=[(\bm T\bar \bm P)^\odot]_{1:3}\\ ~\\= {\begin{bmatrix}\bm I_{3\times3} &-(\bm T\bar \bm P)_{1 :3}^\land \\ \end{bmatrix} }_{3\times6} δξP=δξ(TPˉ)1:3=[(TPˉ)]1:3 =[I3×3(TPˉ)1:3]3×6
所以有:
J δ ξ = − [ f x Z ′ 0 − f x X ′ Z ′ 2   0 f y Z ′ − f y Y ′ Z ′ 2 ] ⋅ [ I 3 × 3 − ( T P ˉ ) 1 : 3 ∧ ] 3 × 6   = − [ f x Z ′ 0 − f x X ′ Z ′ 2 − f x X ′ Y ′ Z ′ 2 f x + f x X ′ 2 Z ′ 2 − f x Y ′ Z ′   0 f y Z ′ − f y Y ′ Z ′ 2 − f y − f y Y ′ 2 Z ′ 2 f y Y ′ X ′ Z ′ 2 f y X ′ Z ′ ] \begin{aligned} J_{\delta \xi}&=-\begin{bmatrix} \frac {f_x}{Z'}&0&-\frac{f_xX'}{Z'^2} \\ ~\\0&\frac{f_y}{Z'}&-\frac{f_yY'}{Z'^2}\\ \end{bmatrix}\cdot {\begin{bmatrix}\bm I_{3\times3} &-(\bm T\bar P)_{1 :3}^\land \\ \end{bmatrix} }_{3\times6}\\ ~\\ &= -\begin{bmatrix} \frac {f_x}{Z'} & 0 &-\frac{f_xX'}{Z'^2} &-\frac{f_xX'Y'}{Z'^2} &f_x+ \frac{f_xX'^2}{Z'^2} & -\frac{f_xY'}{Z'} & \\ ~\\ 0&\frac{f_y}{Z'}&-\frac{f_yY'}{Z'^2} & -f_y-\frac{f_yY'^2}{Z'^2} & \frac{f_yY'X'}{Z'^2} & \frac{f_yX'}{Z'} & \\ \end{bmatrix} \end{aligned} Jδξ =Zfx 00ZfyZ2fxXZ2fyY[I3×3(TPˉ)1:3]3×6=Zfx 00ZfyZ2fxXZ2fyYZ2fxXYfyZ2fyY2fx+Z2fxX2Z2fyYXZfxYZfyX
这样我们就可以求出 Δ ξ \Delta \xi Δξ:
Δ ξ = − ( J δ ξ T ⋅ J δ ξ ) − 1 ( J δ ξ T ⋅ e ( ξ ) ) \small \Delta \xi= -(J_{\delta \xi}^T\cdot J_{\delta \xi})^{-1}(J_{\delta \xi}^T\cdot \bm e(\xi)) Δξ=(JδξTJδξ)1(JδξTe(ξ))
利用高斯迭代法,对于第K+1次更新位姿:
T ( ξ k + 1 ) = exp ⁡ ( Δ x ∧ ) ⋅ T ( ξ 0 ) = exp ⁡ ( Δ ξ ∧ ) ⋅ T ( ξ 0 ) \small T(\xi_{k+1}) = \exp(\Delta x^\land)\cdot T(\xi_0)=\exp (\Delta \xi^\land)\cdot T(\xi_0) T(ξk+1)=exp(Δx)T(ξ0)=exp(Δξ)T(ξ0)
 
 

2.2 优化路标

同样写出相关函数:
e = u i − 1 s i K T P i   e ( P i ) = u i − 1 s i K exp ⁡ ( ξ ∧ ) P i ( ) \bm e=\bm u_i-\frac 1 {s_i}\bm{KTP}_i \\ ~\\ \bm e(\bm P_i)= \bm u_i-\frac 1 {s_i}\bm{K} \exp{(\xi^\land)} \bm P_i \tag{} e=uisi1KTPi e(Pi)=uisi1Kexp(ξ)Pi()
利用链式求导法则:
∂ e ( P ) ∂ P = ∂ e ( P ) ∂ P ′ ∂ P ′ ∂ P \frac {\partial \bm e(\small{\bm P})}{\partial \bm P}=\frac {\partial \bm e(\small{\bm P})}{\partial \bm P'}\frac {\partial \bm P'}{\partial \bm P} Pe(P)=Pe(P)PP
第一个导数我们已经求出:
∂ e ( P ) ∂ P ′ = − ∂ u ∂ P ′ = − [ ∂ u ∂ X ′ ∂ u ∂ Y ′ ∂ u ∂ Z ′   ∂ v ∂ X ′ ∂ v ∂ Y ′ ∂ v ∂ Z ′ ] \frac {\partial \bm e(\small{\bm P})}{\partial \bm P'}=-\frac{\partial \bm u}{\partial \bm P'}=-\begin{bmatrix} \frac{\partial \bm u}{\partial \bm X'} &\frac{\partial \bm u}{\partial \bm Y'}&\frac{\partial \bm u}{\partial \bm Z'}\\ ~\\\frac{\partial \bm v}{\partial \bm X'} & \frac{\partial \bm v}{\partial \bm Y'} &\frac{\partial \bm v}{\partial \bm Z'}\\ \end{bmatrix} Pe(P)=Pu=Xu XvYuYvZuZv
对于第二个导数有 P ′ = ( T P ˉ ) 1 : 3 = R P + t \bm P'=\bm {(T\bar P)}_{1:3}=\bm{RP+t} P=(TPˉ)1:3=RP+t,所以:
∂ P ′ ∂ P = R \frac {\partial \bm P'}{\partial \bm P}=\bm R PP=R
于是有:
∂ e ( P ) ∂ P = − [ f x Z ′ 0 − f x X ′ Z ′ 2   0 f y Z ′ − f y Y ′ Z ′ 2 ] ⋅ R \frac {\partial \bm e(\small{\bm P})}{\partial \bm P}=-\begin{bmatrix} \frac {f_x}{Z'}&0&-\frac{f_xX'}{Z'^2} \\ ~\\0&\frac{f_y}{Z'}&-\frac{f_yY'}{Z'^2}\\ \end{bmatrix}\cdot \bm R Pe(P)=Zfx 00ZfyZ2fxXZ2fyYR
由泰勒展开式:
e ( Δ P + P ) ≈ e ( P ) + J e ⋅ Δ P \small \bm e(\Delta\bm P+\bm P)\approx \bm e(\bm P)+\bm J_{e}\cdot \Delta \bm P e(ΔP+P)e(P)+JeΔP

( Δ P ) = − ( J e T ⋅ J e ) − 1 ( J e T ⋅ e ( P ) ) \small (\Delta \bm P) = -(\bm J_{e}^T\cdot \bm J_{e})^{-1}(\bm J_{e}^T\cdot \bm e(\bm P)) (ΔP)=(JeTJe)1(JeTe(P))

对于第K+1次更新位姿:
P k + 1 = Δ P k + P k \small \bm P_{k+1}=\Delta \bm P_{k}+\bm P_{k} Pk+1=ΔPk+Pk
至此重投影误差求解推导完成。

  • 9
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值