VSLAM学习(四) Bundle Adjustment

目录
VSLAM学习(一) 三维运动、相机模型、SLAM模型
VSLAM学习(二) 非线性优化
VSLAM学习(三) 单目相机位姿估计
VSLAM学习(四) Bundle Adjustment

一、重投影误差

1.1 误差项

前面学过了,对于任意第i帧相机像素与空间点坐标的关系:

s i x i = K T P i 或 x i = 1 s i K T P i s_i\boldsymbol x_i=\boldsymbol K\boldsymbol T\boldsymbol P_i \quad\quad或\quad\quad \boldsymbol x_i=\frac{1}{s_i}\boldsymbol K\boldsymbol T\boldsymbol P_i sixi=KTPixi=si1KTPi

但是有噪声的存在,所以这个等式并不严格相等
我们记误差

e i = x i − 1 s i K T P i \boldsymbol e_i=\boldsymbol x_i-\frac{1}{s_i}\boldsymbol K\boldsymbol T\boldsymbol P_i ei=xisi1KTPi

该误差项称为重投影误差
因为 1 s i K T P i \frac{1}{s_i}\boldsymbol K\boldsymbol T\boldsymbol P_i si1KTPi相当于是将世界坐标 P i \boldsymbol P_i Pi再重新投影到相机中来的

1.2 误差优化

对于一个重投影误差项
e ( x ) = x − 1 s K T P \boldsymbol e(\boldsymbol x)=\boldsymbol x-\frac{1}{s}\boldsymbol K\boldsymbol T\boldsymbol P e(x)=xs1KTP

我们记

P ′ = ( T P ) 1 : 3 = R P + t = ( X ′ , Y ′ , Z ′ ) T \boldsymbol P'= (\boldsymbol T\boldsymbol P)_{1:3}= \boldsymbol R\boldsymbol P+\boldsymbol t= (X',Y',Z')^{\mathrm T} P=(TP)1:3=RP+t=(X,Y,Z)T

再记
x r = 1 s K P ′ \boldsymbol x_r=\frac{1}{s}\boldsymbol K\boldsymbol P' xr=s1KP

s x r = K P ′ s\boldsymbol x_r=\boldsymbol K\boldsymbol P' sxr=KP展开:

( s u r s v r s ) = ( f x 0 c x 0 f y c y 0 0 1 ) ( X ′ Y ′ Z ′ ) \begin{pmatrix} su_r \\ sv_r \\ s \end{pmatrix}= \begin{pmatrix} f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{pmatrix} \begin{pmatrix} X' \\ Y' \\ Z' \end{pmatrix} sursvrs=fx000fy0cxcy1XYZ

消去s得

{ u r = f x X ′ Z ′ + c x v r = f y Y ′ Z ′ + c y \left\{ \begin{aligned} u_r&=f_x\frac{X'}{Z'}+c_x \\ v_r&=f_y\frac{Y'}{Z'}+c_y \end{aligned} \right. urvr=fxZX+cx=fyZY+cy

下面我们开始对误差函数优化
对误差函数做一阶泰勒展开
e ( x + Δ x ) ≈ e ( x ) + J Δ x \boldsymbol e(\boldsymbol x+\Delta\boldsymbol x)≈\boldsymbol e(\boldsymbol x)+\boldsymbol J\Delta\boldsymbol x e(x+Δx)e(x)+JΔx

也就是考虑Jacobian矩阵 J \boldsymbol J J的形态

求出 J \boldsymbol J J的形态之后,便可以使用牛顿法或者LM方法求解极值即可。

1.2.1 优化位姿

现在我们的目标是优化 R , t \boldsymbol R,\boldsymbol t R,t,也就是优化 ξ \boldsymbol\xi ξ
根据扰动模型有

∂ e ∂ ξ = lim ⁡ δ ξ → 0 e ( δ ξ ⊕ ξ ) − e ( ξ ) δ ξ = ∂ e ∂ P ′ ∂ P ′ ∂ ξ \begin{aligned} \frac{\partial\boldsymbol e}{\partial\boldsymbol\xi}&= \lim\limits_{\delta\boldsymbol\xi\rightarrow 0} \frac{\boldsymbol e(\delta\boldsymbol\xi\oplus\boldsymbol\xi)-e(\boldsymbol\xi)}{\delta\boldsymbol\xi} \\ &=\frac{\partial\boldsymbol e}{\partial\boldsymbol P'} \frac{\partial\boldsymbol P'}{\partial\boldsymbol\xi} \end{aligned} ξe=δξ0limδξe(δξξ)e(ξ)=PeξP

分别计算一下 ∂ e ∂ P ′ \displaystyle{\frac{\partial\boldsymbol e}{\partial\boldsymbol P'}} Pe ∂ P ′ ∂ ξ \displaystyle{\frac{\partial\boldsymbol P'}{\partial\boldsymbol\xi}} ξP

先来求第一项 ∂ e ∂ P ′ \displaystyle{\frac{\partial\boldsymbol e}{\partial\boldsymbol P'}} Pe
我们知道
e ( x ) = x − x r \boldsymbol e(\boldsymbol x)=\boldsymbol x-\boldsymbol x_r e(x)=xxr

其中 x \boldsymbol x x是从图像上读出来的像素(常数), x r \boldsymbol x_r xr是需要优化的量
故而

∂ e ∂ P ′ = − ∂ x r ∂ P ′ = − ( ∂ u r ∂ X ′ ∂ u r ∂ Y ′ ∂ u r ∂ Z ′ ∂ v r ∂ X ′ ∂ v r ∂ Y ′ ∂ v r ∂ Z ′ ) = − ( f x Z ′ 0 − f x X ′ Z ′ 2 0 f y Z ′ − f y Y ′ Z ′ 2 ) \frac{\partial\boldsymbol e}{\partial\boldsymbol P'}= -\frac{\partial\boldsymbol x_r}{\partial\boldsymbol P'}=- \begin{pmatrix} \displaystyle{\frac{\partial u_r}{\partial X'}} & \displaystyle{\frac{\partial u_r}{\partial Y'}} & \displaystyle{\frac{\partial u_r}{\partial Z'}} \\ \displaystyle{\frac{\partial v_r}{\partial X'}} & \displaystyle{\frac{\partial v_r}{\partial Y'}} & \displaystyle{\frac{\partial v_r}{\partial Z'}} \end{pmatrix}=- \begin{pmatrix} \displaystyle{\frac{f_x}{Z'}} & 0 & \displaystyle{-\frac{f_xX'}{Z'^2}} \\ 0 & \displaystyle{\frac{f_y}{Z'}} & \displaystyle{-\frac{f_yY'}{Z'^2}} \end{pmatrix} Pe=Pxr=XurXvrYurYvrZurZvr=Zfx00ZfyZ2fxXZ2fyY

对于第二项 ∂ P ′ ∂ ξ \displaystyle{\frac{\partial\boldsymbol P'}{\partial\boldsymbol\xi}} ξP,根据李代数扰动模型可知:

∂ P ′ ∂ ξ = ∂ ( T P ) 1 : 3 ∂ ξ = ( T P ) 1 : 3 ⊙ = ( I − P ′ ∧ 0 T 0 T ) 1 : 3 = ( I , − P ′ ∧ ) \frac{\partial\boldsymbol P'}{\partial\boldsymbol\xi}= \frac{\partial(\boldsymbol T\boldsymbol P)_{1:3}}{\partial\boldsymbol\xi}= (\boldsymbol T\boldsymbol P)_{1:3}^{\odot}= \begin{pmatrix} \boldsymbol I & -\boldsymbol P'^{\land} \\ \boldsymbol 0^{\mathrm T} & \boldsymbol 0^{\mathrm T} \end{pmatrix}_{1:3} =\big(\boldsymbol I, -\boldsymbol P'^{\land}\big) ξP=ξ(TP)1:3=(TP)1:3=(I0TP0T)1:3=(I,P)

所以最终计算得
∂ e ∂ ξ = − ( 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 X ′ Y ′ Z ′ 2 f y X ′ Z ′ ) \frac{\partial\boldsymbol e}{\partial\boldsymbol\xi}=- \begin{pmatrix} \displaystyle{\frac{f_x}{Z'}} & 0 & \displaystyle{-\frac{f_xX'}{Z'^2}} & \displaystyle{-\frac{f_xX'Y'}{Z'^2}} & \displaystyle{f_x+\frac{f_xX'^2}{Z'^2}} & \displaystyle{-\frac{f_xY'}{Z'}} \\ 0 & \displaystyle{\frac{f_y}{Z'}} & \displaystyle{-\frac{f_yY'}{Z'^2}} & \displaystyle{-f_y-\frac{f_yY'^2}{Z'^2}} & \displaystyle{\frac{f_yX'Y'}{Z'^2}} & \displaystyle{\frac{f_yX'}{Z'}} \end{pmatrix} ξe=Zfx00ZfyZ2fxXZ2fyYZ2fxXYfyZ2fyY2fx+Z2fxX2Z2fyXYZfxYZfyX
即为 J \boldsymbol J J的形态

1.2.2 优化空间点路标

现在我们的目标是优化空间点 P \boldsymbol P P
那么我就这里对 P \boldsymbol P P求导

∂ e ∂ P = ∂ e ∂ P ′ ∂ P ′ ∂ P \frac{\partial\boldsymbol e}{\partial\boldsymbol P}= \frac{\partial\boldsymbol e}{\partial\boldsymbol P'} \frac{\partial\boldsymbol P'}{\partial\boldsymbol P} Pe=PePP

由于
P ′ = R P + t \boldsymbol P'=\boldsymbol R\boldsymbol P+\boldsymbol t P=RP+t
所以
∂ P ′ ∂ P = R \frac{\partial\boldsymbol P'}{\partial\boldsymbol P}=\boldsymbol R PP=R

故而
∂ e ∂ P = − ( f x Z ′ 0 − f x X ′ Z ′ 2 0 f y Z ′ − f y Y ′ Z ′ 2 ) R \frac{\partial\boldsymbol e}{\partial\boldsymbol P}=- \begin{pmatrix} \displaystyle{\frac{f_x}{Z'}} & 0 & \displaystyle{-\frac{f_xX'}{Z'^2}} \\ 0 & \displaystyle{\frac{f_y}{Z'}} & \displaystyle{-\frac{f_yY'}{Z'^2}} \end{pmatrix} \boldsymbol R Pe=Zfx00ZfyZ2fxXZ2fyYR
即为 J \boldsymbol J J的形态

二、光束平差法(Bundle Adjustment)批量优化

2.1 一阶梯度的表示

回忆之前的SLAM模型
我们主要对观测方程进行优化:

z i j = h ( ξ i , p j ) + v i j \boldsymbol z_{ij}=h(\boldsymbol \xi_i,\boldsymbol p_j)+\boldsymbol v_{ij} zij=h(ξi,pj)+vij

其中 z i j \boldsymbol z_{ij} zij 是指 i i i时刻对第 j j j个路标点的观测值,即拍摄图片上读出的像素坐标
   ξ i \boldsymbol \xi_i ξi 是指 i i i时刻的相机位姿
   p j \boldsymbol p_j pj 表示第 j j j个路标点坐标
   v i j \boldsymbol v_{ij} vij 表示 i i i时刻第 j j j个路标点的观测噪声

那么可以定义误差:

e i j = z i j − h ( ξ i , p j ) \boldsymbol e_{ij}=\boldsymbol z_{ij}-h(\boldsymbol \xi_i,\boldsymbol p_j) eij=zijh(ξi,pj)

那么代价函数就可以定义为:

1 2 ∑ i ∑ j ∥ e i j ∥ 2 = 1 2 ∑ i ∑ j ∥ z i j − h ( ξ i , p j ) ∥ 2 \frac{1}{2}\sum_i\sum_j\|\boldsymbol e_{ij}\|^2= \frac{1}{2}\sum_i\sum_j\|\boldsymbol z_{ij}-h(\boldsymbol \xi_i,\boldsymbol p_j)\|^2 21ijeij2=21ijzijh(ξi,pj)2

为了计算最小值,我们可以将相机位姿 ξ \boldsymbol \xi ξ和路标 p \boldsymbol p p整合到一起

x = ( ξ 1 , ⋅ ⋅ ⋅ , ξ m , p 1 , ⋅ ⋅ ⋅ , p n ) T \boldsymbol x = (\boldsymbol \xi_1,···,\boldsymbol \xi_m,\boldsymbol p_1,···,\boldsymbol p_n)^{\mathrm T} x=(ξ1,,ξm,p1,,pn)T

那么误差函数 z i j − h ( ξ i , p j ) \boldsymbol z_{ij}-h(\boldsymbol \xi_i,\boldsymbol p_j) zijh(ξi,pj)就可以写成 f ( x ) f(\boldsymbol x) f(x)

f ( x + Δ x ) ≈ ∑ i = 1 m ∑ j = 1 n ( e i j + ∑ k = 1 m ∂ e i j ∂ ξ k Δ ξ k + ∑ l = 1 n ∂ e i j ∂ p l Δ p l ) f(\boldsymbol x+\Delta\boldsymbol x)≈ \sum_{i=1}^m\sum_{j=1}^n(\boldsymbol e_{ij}+\sum_{k=1}^m\frac{\partial\boldsymbol e_{ij}}{\partial\boldsymbol\xi_k}\Delta\boldsymbol\xi_k+\sum_{l=1}^n\frac{\partial\boldsymbol e_{ij}}{\partial\boldsymbol p_l}\Delta\boldsymbol p_l) f(x+Δx)i=1mj=1n(eij+k=1mξkeijΔξk+l=1npleijΔpl)

其中 ∂ e i j ∂ ξ i , ∂ e i j ∂ p j \displaystyle{\frac{\partial\boldsymbol e_{ij}}{\partial\boldsymbol\xi_i}, \frac{\partial\boldsymbol e_{ij}}{\partial\boldsymbol p_j}} ξieij,pjeij的具体形式上面§1.2已经讨论过。

下面来推导

f ( x + Δ x ) ≈ f ( x ) + J Δ x f(\boldsymbol x+\Delta\boldsymbol x)≈ f(\boldsymbol x)+\boldsymbol J\Delta\boldsymbol x f(x+Δx)f(x)+JΔx

之中的 J \boldsymbol J J的形式

过程略繁琐,我稍微写得详细点

x c = ( ξ 1 , ⋅ ⋅ ⋅ , ξ m ) T ∈ R 6 m x p = ( p 1 , ⋅ ⋅ ⋅ , p n ) T ∈ R 3 n F i j = ( ∂ e i j ∂ ξ 1 , ∂ e i j ∂ ξ 2 , ⋅ ⋅ ⋅ , ∂ e i j ∂ ξ m ) ∈ R 2 × 6 m E i j = ( ∂ e i j ∂ p 1 , ∂ e i j ∂ p 2 , ⋅ ⋅ ⋅ , ∂ e i j ∂ p n ) ∈ R 2 × 3 n \boldsymbol x_c = (\boldsymbol \xi_1,···,\boldsymbol \xi_m)^{\mathrm T} \in \mathbb R^{6m} \\ \boldsymbol x_p = (\boldsymbol p_1,···,\boldsymbol p_n)^{\mathrm T} \in \mathbb R^{3n} \\ \boldsymbol F_{ij}=(\frac{\partial\boldsymbol e_{ij}}{\partial\boldsymbol\xi_1},\frac{\partial\boldsymbol e_{ij}}{\partial\boldsymbol\xi_2},···,\frac{\partial\boldsymbol e_{ij}}{\partial\boldsymbol\xi_m}) \in\mathbb{R}^{2\times 6m} \\ \boldsymbol E_{ij}=(\frac{\partial\boldsymbol e_{ij}}{\partial\boldsymbol p_1},\frac{\partial\boldsymbol e_{ij}}{\partial\boldsymbol p_2},···,\frac{\partial\boldsymbol e_{ij}}{\partial\boldsymbol p_n}) \in\mathbb{R}^{2\times 3n} xc=(ξ1,,ξm)TR6mxp=(p1,,pn)TR3nFij=(ξ1eij,ξ2eij,,ξmeij)R2×6mEij=(p1eij,p2eij,,pneij)R2×3n

那么有

∑ k = 1 m ∂ e i j ∂ ξ k Δ ξ k = F i j Δ x c ∑ l = 1 n ∂ e i j ∂ p l Δ p l = E i j Δ x p \sum_{k=1}^m\frac{\partial\boldsymbol e_{ij}}{\partial\boldsymbol\xi_k}\Delta\boldsymbol\xi_k= \boldsymbol F_{ij}\Delta\boldsymbol x_c \\ \sum_{l=1}^n\frac{\partial\boldsymbol e_{ij}}{\partial\boldsymbol p_l}\Delta\boldsymbol p_l= \boldsymbol E_{ij}\Delta\boldsymbol x_p k=1mξkeijΔξk=FijΔxcl=1npleijΔpl=EijΔxp

再记
J i j = ( F i j , E i j ) ∈ R 2 × ( 6 m + 3 n ) \boldsymbol J_{ij}=(\boldsymbol F_{ij},\boldsymbol E_{ij}) \in\mathbb{R}^{2\times (6m+3n)} Jij=(Fij,Eij)R2×(6m+3n)

则有

F i j Δ x c + E i j Δ x p = J i j Δ x \boldsymbol F_{ij}\Delta\boldsymbol x_c+\boldsymbol E_{ij}\Delta\boldsymbol x_p= \boldsymbol J_{ij}\Delta\boldsymbol x FijΔxc+EijΔxp=JijΔx

继续记

J = ( J 11 ⋮ J 1 n ⋮ J m 1 ⋮ J m n ) ∈ R 2 m n × ( 6 m + 3 n ) \boldsymbol J= \begin{pmatrix} \boldsymbol J_{11} \\ \vdots \\ \boldsymbol J_{1n} \\ \vdots \\ \boldsymbol J_{m1} \\ \vdots \\ \boldsymbol J_{mn} \end{pmatrix} \in\mathbb{R}^{2mn\times (6m+3n)} J=J11J1nJm1JmnR2mn×(6m+3n)

那么

∑ i = 1 m ∑ j = 1 n J i j Δ x = J Δ x \sum_{i=1}^m\sum_{j=1}^n\boldsymbol J_{ij}\Delta\boldsymbol x=\boldsymbol J\Delta\boldsymbol x i=1mj=1nJijΔx=JΔx

这也就是整合过后的一阶雅克比 J \boldsymbol J J的形式

2.2 稀疏性与边缘化

在优化过程中,不论是使用高斯-牛顿法,还是使用LM方法,都会涉及到计算 J T J \boldsymbol J^{\mathrm T}\boldsymbol J JTJ的值
下面对 J \boldsymbol J J进行分析,看是否还能简化。

注意矩阵 J i j \boldsymbol J_{ij} Jij的实际意义,实际是在相机位姿 i i i查看路标 j j j所产生的整体误差

但不是所有的位姿 i i i中都会看见路标 j j j
如下图所示

VSLAM学习(四) Bundle Adjustment_第1张图片

两个相机位姿与4个路标点
其中相机 C 1 C_1 C1没有看到路标 p 4 p_4 p4,相机 C 2 C_2 C2没有看到路标 p 1 p_1 p1
所以

J 14 = J 21 = 0 \boldsymbol J_{14}=\boldsymbol J_{21}=\boldsymbol 0 J14=J21=0

故而整合的 J \boldsymbol J J可以省去这两项,直接写成
J = ( J 11 J 12 J 13 J 22 J 23 J 24 ) \boldsymbol J= \begin{pmatrix} \boldsymbol J_{11} \\ \boldsymbol J_{12} \\ \boldsymbol J_{13} \\ \boldsymbol J_{22} \\ \boldsymbol J_{23} \\ \boldsymbol J_{24} \end{pmatrix} J=J11J12J13J22J23J24

不会影响 J Δ x \boldsymbol J\Delta\boldsymbol x JΔx J T J \boldsymbol J^{\mathrm T}\boldsymbol J JTJ的值

下面再来看看剩下不是 0 \boldsymbol 0 0 J i j = ( F i j , E i j ) \boldsymbol J_{ij}=(\boldsymbol F_{ij},\boldsymbol E_{ij}) Jij=(Fij,Eij)长什么样
其中

F i j = ( ∂ e i j ∂ ξ 1 , ⋅ ⋅ ⋅ , ∂ e i j ∂ ξ i , ⋅ ⋅ ⋅ , ∂ e i j ∂ ξ m ) \boldsymbol F_{ij}=(\frac{\partial\boldsymbol e_{ij}}{\partial\boldsymbol\xi_1},···,\frac{\partial\boldsymbol e_{ij}}{\partial\boldsymbol\xi_i},···,\frac{\partial\boldsymbol e_{ij}}{\partial\boldsymbol\xi_m}) Fij=(ξ1eij,,ξieij,,ξmeij)

表示的是位姿 i i i和路标 j j j的误差,对所有位姿的导数
而实际上这个误差只对位姿 i i i有影响,对其他位姿的误差为 0 \boldsymbol 0 0
∂ e i j ∂ ξ k ∣ k ≠ i = 0 \displaystyle{\frac{\partial\boldsymbol e_{ij}}{\partial\boldsymbol\xi_k}\Big|_{k≠i}=\boldsymbol 0} ξkeijk=i=0,也就是

F i j = ( 0 2 × 6 , ⋅ ⋅ ⋅ , 0 2 × 6 , ∂ e i j ∂ ξ i , 0 2 × 6 , ⋅ ⋅ ⋅ , 0 2 × 6 ) \boldsymbol F_{ij}=(\boldsymbol 0_{2\times 6},···,\boldsymbol 0_{2\times 6},\frac{\partial\boldsymbol e_{ij}}{\partial\boldsymbol\xi_i},\boldsymbol 0_{2\times 6},···,\boldsymbol 0_{2\times 6}) Fij=(02×6,,02×6,ξieij,02×6,,02×6)

同理,对于路标的误差也有
E i j = ( 0 2 × 3 , ⋅ ⋅ ⋅ , 0 2 × 3 , ∂ e i j ∂ p j , 0 2 × 3 , ⋅ ⋅ ⋅ , 0 2 × 3 ) \boldsymbol E_{ij}=(\boldsymbol 0_{2\times 3},···,\boldsymbol 0_{2\times 3},\frac{\partial\boldsymbol e_{ij}}{\partial\boldsymbol p_j},\boldsymbol 0_{2\times 3},···,\boldsymbol 0_{2\times 3}) Eij=(02×3,,02×3,pjeij,02×3,,02×3)

所以整个 J i j \boldsymbol J_{ij} Jij就只会有两个地方不是0

所以在使用高斯-牛顿法时的 J i j T J i j ∈ R ( 6 m + 3 n ) × ( 6 m + 3 n ) \boldsymbol J_{ij}^{\mathrm T}\boldsymbol J_{ij} \in\mathbb{R}^{(6m+3n)\times (6m+3n)} JijTJijR(6m+3n)×(6m+3n),其实只有4个小块矩阵的位置有值,其余全为0

VSLAM学习(四) Bundle Adjustment_第2张图片

所以这个 H \boldsymbol H H矩阵

H = J T J = ∑ i = 1 m ∑ j = 1 n J i j T J i j = ( F T F F T E E T F E T E ) \boldsymbol H=\boldsymbol J^{\mathrm T}\boldsymbol J=\sum_{i=1}^m\sum_{j=1}^n\boldsymbol J_{ij}^{\mathrm T}\boldsymbol J_{ij}= \begin{pmatrix} \boldsymbol F^{\mathrm T}\boldsymbol F & \boldsymbol F^{\mathrm T}\boldsymbol E \\ \boldsymbol E^{\mathrm T}\boldsymbol F & \boldsymbol E^{\mathrm T}\boldsymbol E \end{pmatrix} H=JTJ=i=1mj=1nJijTJij=(FTFETFFTEETE)

是个稀疏矩阵,大致形式如下(一般相机位姿少,特征点、路标点较多)

VSLAM学习(四) Bundle Adjustment_第3张图片

我们将矩阵 H \boldsymbol H H分块
显然 B , C \boldsymbol B,\boldsymbol C B,C都是对角矩阵
所以,以高斯牛顿法为例,求解方程 H Δ x = g \boldsymbol H\Delta\boldsymbol x=\boldsymbol g HΔx=g就变成

( B A A T C ) ( Δ x c Δ x p ) = ( v w ) \begin{pmatrix} \boldsymbol B & \boldsymbol A \\ \boldsymbol A^{\mathrm T} & \boldsymbol C \end{pmatrix} \begin{pmatrix} \Delta\boldsymbol x_c \\ \Delta\boldsymbol x_p \end{pmatrix}= \begin{pmatrix} \boldsymbol v \\ \boldsymbol w \end{pmatrix} (BATAC)(ΔxcΔxp)=(vw)

下面使用Schur Elimination(Schur消元)法
将矩阵右上角的 A \boldsymbol A A消掉,即左乘矩阵 ( I − A C − 1 0 I ) \begin{pmatrix} \boldsymbol I & -\boldsymbol A\boldsymbol C^{-1} \\ \boldsymbol 0 & \boldsymbol I \end{pmatrix} (I0AC1I)
(消去左下角的 A T \boldsymbol A^{\mathrm T} AT去求 Δ x p \Delta\boldsymbol x_p Δxp也行)
得:

( I − A C − 1 0 I ) ( B A A T C ) ( Δ x c Δ x p ) = ( I − A C − 1 0 I ) ( v w ) \begin{pmatrix} \boldsymbol I & -\boldsymbol A\boldsymbol C^{-1} \\ \boldsymbol 0 & \boldsymbol I \end{pmatrix} \begin{pmatrix} \boldsymbol B & \boldsymbol A \\ \boldsymbol A^{\mathrm T} & \boldsymbol C \end{pmatrix} \begin{pmatrix} \Delta\boldsymbol x_c \\ \Delta\boldsymbol x_p \end{pmatrix}= \begin{pmatrix} \boldsymbol I & -\boldsymbol A\boldsymbol C^{-1} \\ \boldsymbol 0 & \boldsymbol I \end{pmatrix} \begin{pmatrix} \boldsymbol v \\ \boldsymbol w \end{pmatrix} \\ (I0AC1I)(BATAC)(ΔxcΔxp)=(I0AC1I)(vw)

( B − A C − 1 A T 0 A T C ) ( Δ x c Δ x p ) = ( v − A C − 1 w w ) \begin{pmatrix} \boldsymbol B-\boldsymbol A\boldsymbol C^{-1}\boldsymbol A^{\mathrm T} & \boldsymbol 0 \\ \boldsymbol A^{\mathrm T} & \boldsymbol C \end{pmatrix} \begin{pmatrix} \Delta\boldsymbol x_c \\ \Delta\boldsymbol x_p \end{pmatrix}= \begin{pmatrix} \boldsymbol v-\boldsymbol A\boldsymbol C^{-1}\boldsymbol w \\ \boldsymbol w \end{pmatrix} (BAC1ATAT0C)(ΔxcΔxp)=(vAC1ww)

所以

( B − A C − 1 A T ) Δ x c = v − A C − 1 w \Big(\boldsymbol B-\boldsymbol A\boldsymbol C^{-1}\boldsymbol A^{\mathrm T}\Big)\Delta\boldsymbol x_c=\boldsymbol v-\boldsymbol A\boldsymbol C^{-1}\boldsymbol w (BAC1AT)Δxc=vAC1w

便可求出 Δ x c \Delta\boldsymbol x_c Δxc,继而求出 Δ x p \Delta\boldsymbol x_p Δxp

这样处理求解的原因是因为对角矩阵 C \boldsymbol C C的逆可以直接写出,不需要复杂的计算。

至此就算出了一次迭代中的下降路线 Δ x \Delta\boldsymbol x Δx,之后便可以根据高斯牛顿或LM的原理继续往下走了,从而完成优化。

你可能感兴趣的:(#,VSLAM,三维场景,算法,slam,计算机视觉)