目录
VSLAM学习(一) 三维运动、相机模型、SLAM模型
VSLAM学习(二) 非线性优化
VSLAM学习(三) 单目相机位姿估计
VSLAM学习(四) Bundle Adjustment
前面学过了,对于任意第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=KTPi或xi=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=xi−si1KTPi
该误差项称为重投影误差
因为 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再重新投影到相机中来的
对于一个重投影误差项
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)=x−s1KTP
我们记
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⎠⎞=⎝⎛fx000fy0cxcy1⎠⎞⎝⎛X′Y′Z′⎠⎞
消去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=fxZ′X′+cx=fyZ′Y′+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方法求解极值即可。
现在我们的目标是优化 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(ξ)=∂P′∂e∂ξ∂P′
分别计算一下 ∂ e ∂ P ′ \displaystyle{\frac{\partial\boldsymbol e}{\partial\boldsymbol P'}} ∂P′∂e和 ∂ P ′ ∂ ξ \displaystyle{\frac{\partial\boldsymbol P'}{\partial\boldsymbol\xi}} ∂ξ∂P′
先来求第一项 ∂ e ∂ P ′ \displaystyle{\frac{\partial\boldsymbol e}{\partial\boldsymbol P'}} ∂P′∂e
我们知道
e ( x ) = x − x r \boldsymbol e(\boldsymbol x)=\boldsymbol x-\boldsymbol x_r e(x)=x−xr
其中 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} ∂P′∂e=−∂P′∂xr=−⎝⎜⎛∂X′∂ur∂X′∂vr∂Y′∂ur∂Y′∂vr∂Z′∂ur∂Z′∂vr⎠⎟⎞=−⎝⎜⎛Z′fx00Z′fy−Z′2fxX′−Z′2fyY′⎠⎟⎞
对于第二项 ∂ 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⊙=(I0T−P′∧0T)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=−⎝⎜⎛Z′fx00Z′fy−Z′2fxX′−Z′2fyY′−Z′2fxX′Y′−fy−Z′2fyY′2fx+Z′2fxX′2Z′2fyX′Y′−Z′fxY′Z′fyX′⎠⎟⎞
即为 J \boldsymbol J J的形态
现在我们的目标是优化空间点 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} ∂P∂e=∂P′∂e∂P∂P′
由于
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 ∂P∂P′=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 ∂P∂e=−⎝⎜⎛Z′fx00Z′fy−Z′2fxX′−Z′2fyY′⎠⎟⎞R
即为 J \boldsymbol J J的形态
回忆之前的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=zij−h(ξ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 21i∑j∑∥eij∥2=21i∑j∑∥zij−h(ξ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) zij−h(ξ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=1∑mj=1∑n(eij+k=1∑m∂ξk∂eijΔξk+l=1∑n∂pl∂eijΔ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}} ∂ξi∂eij,∂pj∂eij的具体形式上面§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)T∈R6mxp=(p1,⋅⋅⋅,pn)T∈R3nFij=(∂ξ1∂eij,∂ξ2∂eij,⋅⋅⋅,∂ξm∂eij)∈R2×6mEij=(∂p1∂eij,∂p2∂eij,⋅⋅⋅,∂pn∂eij)∈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=1∑m∂ξk∂eijΔξk=FijΔxcl=1∑n∂pl∂eijΔ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=⎝⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎛J11⋮J1n⋮Jm1⋮Jmn⎠⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎞∈R2mn×(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=1∑mj=1∑nJijΔx=JΔx
这也就是整合过后的一阶雅克比 J \boldsymbol J J的形式
在优化过程中,不论是使用高斯-牛顿法,还是使用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
如下图所示
两个相机位姿与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=(∂ξ1∂eij,⋅⋅⋅,∂ξi∂eij,⋅⋅⋅,∂ξm∂eij)
表示的是位姿 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} ∂ξk∂eij∣∣∣k=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,∂ξi∂eij,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,∂pj∂eij,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)} JijTJij∈R(6m+3n)×(6m+3n),其实只有4个小块矩阵的位置有值,其余全为0
所以这个 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=1∑mj=1∑nJijTJij=(FTFETFFTEETE)
是个稀疏矩阵,大致形式如下(一般相机位姿少,特征点、路标点较多)
我们将矩阵 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} (I0−AC−1I)
(消去左下角的 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} \\ (I0−AC−1I)(BATAC)(ΔxcΔxp)=(I0−AC−1I)(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} (B−AC−1ATAT0C)(ΔxcΔxp)=(v−AC−1ww)
所以
( 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 (B−AC−1AT)Δxc=v−AC−1w
便可求出 Δ x c \Delta\boldsymbol x_c Δxc,继而求出 Δ x p \Delta\boldsymbol x_p Δxp
这样处理求解的原因是因为对角矩阵 C \boldsymbol C C的逆可以直接写出,不需要复杂的计算。
至此就算出了一次迭代中的下降路线 Δ x \Delta\boldsymbol x Δx,之后便可以根据高斯牛顿或LM的原理继续往下走了,从而完成优化。