一、BA优化
BA(Bundle Adjustment)优化,是指从视觉重建中提炼出最优的 3 D 3D 3D 模型和相机参数(内参数和外参数)。从每一个特征点反射出来的几束光线(bundles of light rays),在我们把相机姿态和特征点空间位置做出最优的调整 (adjustment) 之后,最后收束到相机光心的这个过程。和重投影不同的是,BA优化是对多段相机的位姿和位姿下的路标点的空间坐标进行优化。
我们的误差可以写成:
e
(
ξ
,
p
)
=
z
−
1
s
K
T
P
e(\xi,p)=z-\frac 1 s KTP
e(ξ,p)=z−s1KTP
即:
e
(
ξ
,
p
)
=
z
−
1
s
K
⋅
exp
(
ξ
∧
)
⋅
P
e(\xi,p)=z-\frac 1 s K\cdot\exp(\xi^\land)\cdot P
e(ξ,p)=z−s1K⋅exp(ξ∧)⋅P
根据我之前写的文章:
我们可以得出误差
e
e
e分别对位姿和路标坐标的偏导
J
δ
ξ
J_{\delta \xi}
Jδξ和
J
p
J_p
Jp:
J
δ
ξ
=
∂
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
Y
′
X
′
Z
′
2
f
y
X
′
Z
′
]
J_{\delta \xi} =\frac{\partial \pmb e}{\partial \delta \xi}=-\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}
Jδξ=∂δξ∂eee=−⎣⎢⎡Z′fx 00Z′fy−Z′2fxX′−Z′2fyY′−Z′2fxX′Y′−fy−Z′2fyY′2fx+Z′2fxX′2Z′2fyY′X′−Z′fxY′Z′fyX′⎦⎥⎤
J p = ∂ e ∂ P = − [ f x Z ′ 0 − f x X ′ Z ′ 2 0 f y Z ′ − f y Y ′ Z ′ 2 ] ⋅ R J_p=\frac {\partial \pmb e}{\partial \pmb 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 \pmb R Jp=∂PPP∂eee=−⎣⎢⎡Z′fx 00Z′fy−Z′2fxX′−Z′2fyY′⎦⎥⎤⋅RRR
我们令位姿变量为
ξ
\xi
ξ,特征点空间位置为
p
p
p,对于m个位姿和n个特征点:
x
=
[
ξ
1
ξ
2
.
.
.
ξ
m
∣
p
1
p
2
.
.
.
p
n
]
T
\pmb x=[\xi_1 \quad \xi_2 ...\xi_m| \quad p_1 \quad p_2...p_n]^T
xxx=[ξ1ξ2...ξm∣p1p2...pn]T
优化的目标函数为:
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
\frac 1 2 \left\| f(x+\Delta x) \right\|^2=\frac 1 2\sum_{i=1}^m \sum_{j=1}^n\left\|e_{ij}+F_{ij}\Delta \xi_i+E_{ij}\Delta p_j \right\|^2
21∥f(x+Δx)∥2=21i=1∑mj=1∑n∥eij+FijΔξi+EijΔpj∥2
其中,
F
i
j
F_{ij}
Fij是相对姿态的偏导数,
E
i
j
E_{ij}
Eij是相对与路标点的偏导;
为了简明公式,我们令:
x
c
=
[
ξ
1
ξ
2
.
.
.
ξ
m
]
x
p
=
[
p
1
p
2
.
.
.
p
n
]
x_c=[\xi_1 \quad \xi_2 \space...\space\xi_m]\\ x_p= [p_1 \quad p_2 \space...\space p_n]\\
xc=[ξ1ξ2 ... ξm]xp=[p1p2 ... pn]
我们的目标函数可以写成:
1
2
∥
f
(
x
+
Δ
x
)
∥
2
=
1
2
∥
e
+
F
Δ
x
c
+
E
Δ
x
p
∥
2
\frac 1 2 \left\| f(x+\Delta x) \right\|^2=\frac 1 2\left\|e+F\Delta x_c+E\Delta x_p \right\|^2
21∥f(x+Δx)∥2=21∥e+FΔxc+EΔxp∥2
对于线性增量方程:
H
Δ
x
=
g
H\Delta x=g
HΔx=g,这里
H
=
J
T
J
H=J^TJ
H=JTJ;
我们可以把雅克比矩阵分块:
J
=
[
F
E
]
,
J
T
=
[
F
T
E
T
]
J=[F \quad E],\quad J^T=\begin{bmatrix} F^T \\ \\E^T\end{bmatrix}
J=[FE],JT=⎣⎡FTET⎦⎤
则:
H
=
J
T
J
=
[
F
T
F
F
T
E
E
T
F
E
T
E
]
H=J^TJ=\begin{bmatrix} F^TF &&F^TE \\ \\E^TF && E^TE\end{bmatrix}
H=JTJ=⎣⎡FTFETFFTEETE⎦⎤
二、利用稀疏性求解
J
i
j
J_{ij}
Jij表示在位姿
ξ
i
\xi_i
ξi只观测到
p
j
p_j
pj时的雅克比矩阵,所以其他部分的导数为零。
J
i
j
(
x
)
=
[
0
,
0
,
.
.
.
,
(
∂
e
i
j
∂
δ
ξ
i
)
2
×
6
,
.
.
.
,
0
2
×
6
,
∣
0
2
×
3
,
.
.
.
,
(
∂
e
i
j
∂
p
i
)
2
×
3
]
\large {J_{ij}(x)=\begin{bmatrix}0, &0,...,(\frac{\partial \pmb e_{ij}}{\partial \delta \xi_i}) _{2\times 6},...,0_{2 \times 6},|0_{2\times 3},...,(\frac{\partial \pmb e_{ij}}{\partial p_i}) _{2\times 3} \end{bmatrix}}
Jij(x)=[0,0,...,(∂δξi∂eeeij)2×6,...,02×6,∣02×3,...,(∂pi∂eeeij)2×3]
所以对于整体:
H
=
∑
i
j
J
i
j
T
J
i
j
H=\sum_{ij}J_{ij}^TJ_{ij}
H=ij∑JijTJij
由此可以把所有的
J
i
j
J_{ij}
Jij放到一个
J
J
J表达式里:
J
=
[
J
11
J
12
⋮
J
i
1
J
i
2
⋮
J
i
j
]
J=\begin{bmatrix} J_{11}\\J_{12}\\ \vdots \\J_{i1}\\J_{i2}\\ \vdots\\J_{ij} \end{bmatrix}
J=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡J11J12⋮Ji1Ji2⋮Jij⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤
又有稀疏性和对称性,我们把
H
H
H分块化:
H
=
[
B
E
E
T
C
]
H=\begin{bmatrix} B &E\\E^T &C \end{bmatrix}
H=[BETEC]
由
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]
利用稀疏性进行高斯消元:
[
I
−
E
C
−
1
0
I
]
[
B
E
E
T
C
]
[
Δ
x
c
Δ
x
p
]
=
[
I
−
E
C
−
1
0
I
]
[
v
w
]
⟹
[
B
−
E
C
−
1
E
T
0
E
T
C
]
[
Δ
x
c
Δ
x
p
]
=
[
v
−
E
C
−
1
w
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}\\~\\~ \\ \Longrightarrow \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}
[I0−EC−1I][BETEC][ΔxcΔxp]=[I0−EC−1I][vw] ⟹[B−EC−1ETET0C][ΔxcΔxp]=[v−EC−1ww]
整理得:
(
B
−
E
C
−
1
E
T
)
Δ
x
c
=
v
−
E
C
−
1
w
(B-EC^{-1}E^T)\Delta x_c =v-EC^{-1}w
(B−EC−1ET)Δxc=v−EC−1w
继而可以求出:
∆
x
p
=
C
−
1
(
w
−
E
T
∆
x
c
)
∆x_p = C^{−1} (w − E^T ∆x_c )
∆xp=C−1(w−ET∆xc)