BA求解
B
A
BA
BA求解时对目标函数做线性化处理:
1
2
∣
∣
f
(
x
+
Δ
x
)
∣
∣
2
≈
1
2
∑
i
=
1
m
∑
j
=
1
n
∣
∣
e
i
j
+
F
i
j
Δ
ξ
i
+
E
i
j
Δ
p
j
∣
∣
2
(1)
\frac{1}{2}||f(x+\Delta x)||^2\approx\frac{1}{2}\sum^m_{i=1}\sum^n_{j=1}||e_{ij}+F_{ij}\Delta\xi_i+E_{ij}\Delta p_j||^2\tag 1
21∣∣f(x+Δx)∣∣2≈21i=1∑mj=1∑n∣∣eij+FijΔξi+EijΔpj∣∣2(1)
F
i
j
F_{ij}
Fij表示在当前状态下对相机姿态的偏导数,
E
i
j
E_{ij}
Eij表示该函数对路标点位置的偏导。
将相机为自变量和空间点变量放在一起可将上式简化为:
1
2
∣
∣
f
(
x
+
Δ
x
)
∣
∣
2
=
1
2
∣
∣
e
+
F
Δ
x
c
+
E
Δ
x
p
∣
∣
2
(2)
\frac{1}{2}||f(x+\Delta x)||^2 = \frac{1}{2}||e+F \Delta x_c+E\Delta x_p||^2\tag 2
21∣∣f(x+Δx)∣∣2=21∣∣e+FΔxc+EΔxp∣∣2(2)
由于把变量归类成了位姿和空间点两种,所以雅克比矩阵可以分块为
J
=
[
F
E
]
(3)
J=\begin{bmatrix}F&E\end{bmatrix}\tag 3
J=[FE](3)
以高斯牛顿法为例,
H
H
H矩阵为:
H
=
J
T
J
=
[
F
T
F
F
T
E
E
T
F
E
T
E
]
(4)
H=J^TJ=\begin{bmatrix}F^TF&F^TE\\\\E^TF&E^TE\end{bmatrix}\tag 4
H=JTJ=⎣⎡FTFETFFTEETE⎦⎤(4)
因为考虑了所有的优化变量,所以这个线性方程的维度非常大,如果直接对
H
H
H求逆来计算增量方程将会非常消耗计算资源。
稀疏性
以上得到的
H
H
H矩阵具有稀疏结构的特点,该结构可以自然、显式地用地图优化来表示。
H
H
H矩阵的稀疏性是由雅克比矩阵
J
(
x
)
J(x)
J(x)引起的,因为部分误差项与其他路标和轨迹无关,这使得
H
H
H中存在很多零块。对于具有这种稀疏结构的
H
H
H,线性方程
H
Δ
x
=
g
H\Delta x=g
HΔx=g的求解可以用若干种加速计算的方法。其中
S
c
h
u
r
Schur
Schur消元是SLAM中最常用的手段,也被成为
M
a
r
g
i
n
a
l
i
z
a
t
i
o
n
Marginalization
Marginalization。
边缘化
H
H
H矩阵可以分成
4
4
4个块。左上角为对角块矩阵,每个对角块元素的维度与相机位姿的维度相同,且是一个对角块矩阵。右下角也是对角块矩阵,每个对角块的维度是路标的维度。这
4
4
4个区域正好对应了
(
4
)
(4)
(4)式中的
4
4
4个矩阵块。将这个四个块记为
B
,
E
,
E
T
,
C
B,E,E^T,C
B,E,ET,C。
于是对应的线性方程组也可以由
H
Δ
x
=
g
H\Delta x=g
HΔx=g变为如下形式:
[
B
E
E
T
C
]
[
Δ
x
c
Δ
x
p
]
=
[
v
w
]
\begin{bmatrix}B&E\\\\E^T&C\end{bmatrix}\begin{bmatrix}\Delta x_c\\\\\Delta x_p\end{bmatrix}=\begin{bmatrix}v\\\\w\end{bmatrix}
⎣⎡BETEC⎦⎤⎣⎡ΔxcΔxp⎦⎤=⎣⎡vw⎦⎤
其中
B
B
B是对角块矩阵,每个对角块的维度和相机参数的维度相同,对角块的个数是相机变量的个数。由于路标数量会远远大于相机变量个数,所以
C
C
C往往也远大于
B
B
B。三维空间中每个路标点为三维,于是
C
C
C矩阵为对角块矩阵,每个块为
3
×
3
3\times3
3×3矩阵。
对角块矩阵求逆的难度远小于对一般矩阵的求逆难度,因为只需要对那些对角线矩阵块分别求逆即可。考虑到这个特性,对线性方程组进行高斯消元,目标是消去右上角的非对角部分
E
E
E,得
[
I
−
E
C
−
1
0
I
]
[
B
E
E
T
C
]
[
Δ
x
c
Δ
x
p
]
=
[
I
−
E
C
−
1
0
I
]
[
v
w
]
\begin{bmatrix}I&-EC^{-1}\\\\0&I\end{bmatrix}\begin{bmatrix}B&E\\\\E^T&C\end{bmatrix}\begin{bmatrix}\Delta x_c\\\\\Delta x_p\end{bmatrix}=\begin{bmatrix}I&-EC^{-1}\\\\0&I\end{bmatrix}\begin{bmatrix}v\\\\w\end{bmatrix}
⎣⎡I0−EC−1I⎦⎤⎣⎡BETEC⎦⎤⎣⎡ΔxcΔxp⎦⎤=⎣⎡I0−EC−1I⎦⎤⎣⎡vw⎦⎤
整理得
[
B
−
E
C
−
1
E
T
0
E
T
C
]
[
Δ
x
c
Δ
x
p
]
=
[
v
−
E
C
−
1
w
w
]
\begin{bmatrix}B-EC^{-1}E^T&0\\\\E^T&C\end{bmatrix}\begin{bmatrix}\Delta x_c\\\\\Delta x_p\end{bmatrix}=\begin{bmatrix}v-EC^{-1}w\\\\w\end{bmatrix}
⎣⎡B−EC−1ETET0C⎦⎤⎣⎡ΔxcΔxp⎦⎤=⎣⎡v−EC−1ww⎦⎤
消元后,方程组第一行变成了和
Δ
x
p
\Delta x_p
Δxp无关的项。单独拿出来后可以得到关于位姿部分的增量方程:
[
B
−
E
C
−
1
E
T
]
Δ
x
c
=
v
−
E
C
−
1
w
\begin{bmatrix}B-EC^{-1}E^T\end{bmatrix}\Delta x_c=v-EC^{-1}w
[B−EC−1ET]Δxc=v−EC−1w
先求解这个方程,然后把解得的
Δ
x
c
\Delta x_c
Δxc代入原方程,求解
Δ
x
p
\Delta x_p
Δxp。这个过程成为Marginalization,或者Schur消元。
优势
相比于直接解线性方程的做法,优势在于:
- 在消元过程中,由于 C C C为对角块,所以 C − 1 C^{-1} C−1容易解出。
- 求解了 Δ x c \Delta x_c Δxc之后,路标部分的增量方程由 Δ x p = C − 1 ( w − E T Δ x c ) \Delta x_p=C^{-1}(w-E^T\Delta x_c) Δxp=C−1(w−ETΔxc)给出。依然用到了 C − 1 C^{-1} C−1易于求解的特性。