视觉SLAM总结——后端总结
视觉SLAM总结——后端总结
什么叫温故而知新,最近一直在复习SLAM相关的基础知识,每重新复习到一个点总感觉能有新的收获,今天周末正好没有别的安排,就计划花一天的时间把视觉SLAM的后端再好好总结一下,这篇文章主要是参考《视觉SLAM十四讲》,另外加入了一些我的个人理解
(1)扰动模型
《视觉SLAM十四讲》前六章主要讲了视觉SLAM中所用到一些基础知识,其中第四讲主要介绍的李群李代数基础主要就是为后端的推导服务的,李群和李代数的关系通过书中下面这张图就能看明白了
这里简单解释下,对于三维旋转:
对数映射操作看上去是先对旋转矩阵取对数,然后加以
∨
{\vee}
∨符号,实际上
s
o
(
3
)
\mathfrak{s o}(3)
so(3)就是旋转向量
θ
a
\theta a
θa所组成的空间,其中
θ
\theta
θ就是旋转向量的旋转角,求解方法就按照
θ
=
arccos
tr
(
R
)
−
1
2
\theta=\arccos \frac{\operatorname{tr}(R)-1}{2}
θ=arccos2tr(R)−1获得,
a
a
a其实就是旋转向量的旋转轴(是一个单位向量),旋转轴上的向量不发生改变,因此有
R
a
=
a
R a=a
Ra=a,所以转轴
a
a
a其实就是旋转矩阵
R
R
R特征值1对应的特征向量,再归一化就得到旋转轴
指数映射操作看上去是先对李代数加以
∧
{\wedge}
∧符号,然后取指数,实际上指数映射的公式其实就是从旋转向量到旋转矩阵的罗德里格斯公式。
对于三维变换,对数映射中我们求得 θ \theta θ和 a a a,然后在计算矩阵 J J J,最后从 t = J ρ t=J \rho t=Jρ解得 ρ \rho ρ。指数映射直接套公式。
李代数存在的目的是什么?——方便求导进行优化
下面我们就来分析下李代数是如何方便求导的,我们从三维旋转直观来看,李代数求导按照对于空间点
p
p
p定义应该如下进行推导:
∂
(
exp
(
ϕ
∧
)
p
)
∂
ϕ
=
lim
δ
ϕ
→
0
exp
(
(
ϕ
+
δ
ϕ
)
∧
)
p
−
exp
(
ϕ
∧
)
p
δ
ϕ
=
lim
δ
ϕ
→
0
exp
(
(
J
l
δ
ϕ
)
∧
)
exp
(
ϕ
∧
)
p
−
exp
(
ϕ
∧
)
p
δ
ϕ
≈
lim
δ
ϕ
→
0
(
I
+
(
J
l
δ
ϕ
)
∧
)
exp
(
ϕ
∧
)
p
−
exp
(
ϕ
∧
)
p
δ
ϕ
=
lim
δ
ϕ
→
0
(
J
l
δ
ϕ
)
∧
exp
(
ϕ
∧
)
p
δ
ϕ
=
lim
δ
ϕ
→
0
−
(
exp
(
ϕ
∧
)
p
)
∧
J
l
δ
ϕ
δ
ϕ
=
−
(
R
p
)
∧
J
l
\begin{aligned} \frac{\partial\left(\exp \left(\phi^{\wedge}\right) p\right)}{\partial \phi} &=\lim _{\delta \phi \rightarrow 0} \frac{\exp \left((\phi+\delta \phi)^{\wedge}\right) p-\exp \left(\phi^{\wedge}\right) p}{\delta \phi} \\ &=\lim _{\delta \phi \rightarrow 0} \frac{\exp \left(\left(J_{l} \delta \phi\right)^{\wedge}\right) \exp \left(\phi^{\wedge}\right) p-\exp \left(\phi^{\wedge}\right) p}{\delta \phi} \\ & \approx \lim _{\delta \phi \rightarrow 0} \frac{\left(I+\left(J_{l} \delta \phi\right)^{\wedge}\right) \exp \left(\phi^{\wedge}\right) p-\exp \left(\phi^{\wedge}\right) p}{\delta \phi} \\ &=\lim _{\delta \phi \rightarrow 0} \frac{\left(J_{l} \delta \phi\right)^{\wedge} \exp \left(\phi^{\wedge}\right) p}{\delta \phi} \\ & =\lim _{\delta \phi \rightarrow 0} \frac{-\left(\exp \left(\phi^{\wedge}\right) \boldsymbol{p}\right)^{\wedge} \boldsymbol{J}_{l} \delta \phi}{\delta \boldsymbol{\phi}} =-(\boldsymbol{R} \boldsymbol{p})^{\wedge} \boldsymbol{J}_{l}\end {aligned}
∂ϕ∂(exp(ϕ∧)p)=δϕ→0limδϕexp((ϕ+δϕ)∧)p−exp(ϕ∧)p=δϕ→0limδϕexp((Jlδϕ)∧)exp(ϕ∧)p−exp(ϕ∧)p≈δϕ→0limδϕ(I+(Jlδϕ)∧)exp(ϕ∧)p−exp(ϕ∧)p=δϕ→0limδϕ(Jlδϕ)∧exp(ϕ∧)p=δϕ→0limδϕ−(exp(ϕ∧)p)∧Jlδϕ=−(Rp)∧Jl上面的推到中,第一行很简单,就是定义而已,第三行很简单,就是指数的泰勒展开,第四行、第五行也很简单,消元化简而已,唯独第二行,怎么来的呢?这里就需要引入一个概念叫Baker-Campbell-Hausdorff 公式(BCH公式),如下:
ln
(
exp
(
A
)
exp
(
B
)
)
=
A
+
B
+
1
2
[
A
,
B
]
+
1
12
[
A
,
[
A
,
B
]
]
−
1
12
[
B
,
[
A
,
B
]
]
+
.
.
.
\ln (\exp (\boldsymbol{A}) \exp (\boldsymbol{B}))=\boldsymbol{A}+\boldsymbol{B}+\frac{1}{2}[\boldsymbol{A}, \boldsymbol{B}]+\frac{1}{12}[\boldsymbol{A},[\boldsymbol{A}, \boldsymbol{B}]]-\frac{1}{12}[\boldsymbol{B},[\boldsymbol{A}, \boldsymbol{B}]]+...
ln(exp(A)exp(B))=A+B+21[A,B]+121[A,[A,B]]−121[B,[A,B]]+...其中 [] 为李括号。 BCH 公式告诉我们,当处理两个矩阵指数之积时,它们会产生一些由李括号组成的余项,特别地,考虑 SO(3) 上的李代数
ln
(
exp
(
ϕ
1
∧
)
exp
(
ϕ
2
∧
)
)
∨
\ln \left(\exp \left(\phi_{1}^{\wedge}\right) \exp \left(\phi_{2}^{\wedge}\right)\right)^{\vee}
ln(exp(ϕ1∧)exp(ϕ2∧))∨,当
ϕ
1
\phi_{1}
ϕ1或
ϕ
2
\phi_{2}
ϕ2为小量时,小量二次以上的项都可以被忽略掉。此时, BCH 拥有线性近似表达
ln
(
exp
(
ϕ
1
∧
)
exp
(
ϕ
2
∧
)
)
∨
≈
{
J
l
(
ϕ
2
)
−
1
ϕ
1
+
ϕ
2
if
ϕ
1
is small,
J
r
(
ϕ
1
)
−
1
ϕ
2
+
ϕ
1
if
ϕ
2
is small.
\ln \left(\exp \left(\phi_{1}^{\wedge}\right) \exp \left(\phi_{2}^{\wedge}\right)\right)^{\vee} \approx \left\{\begin{array}{ll}{J_{l}\left(\phi_{2}\right)^{-1} \phi_{1}+\phi_{2}} & {\text { if } \phi_{1} \text { is small, }} \\ {J_{r}\left(\phi_{1}\right)^{-1} \phi_{2}+\phi_{1}} & {\text { if } \phi_{2} \text { is small. }}\end{array}\right.
ln(exp(ϕ1∧)exp(ϕ2∧))∨≈{Jl(ϕ2)−1ϕ1+ϕ2Jr(ϕ1)−1ϕ2+ϕ1 if ϕ1 is small, if ϕ2 is small. 当对一个旋转矩阵
R
2
R_2
R2(李代数为
ϕ
2
\phi_{2}
ϕ2)左乘一个微小旋转矩阵
R
1
R_1
R1(李代数为
ϕ
1
\phi_{1}
ϕ1)时,可以近似地看作,在原有的李代数
ϕ
2
\phi_{2}
ϕ2上,加上了一项
J
l
(
ϕ
2
)
−
1
ϕ
1
J_{l}\left(\phi_{2}\right)^{-1} \phi_{1}
Jl(ϕ2)−1ϕ1(上面给出BCH公式的这一小段是书中的原话),其中左雅克比矩阵
J
l
J_l
Jl(注意这里是分左右的)的计算公式为:
J
l
=
J
=
sin
θ
θ
I
+
(
1
−
sin
θ
θ
)
a
a
T
+
1
−
cos
θ
θ
a
∧
J_{l}=J=\frac{\sin \theta}{\theta} I+\left(1-\frac{\sin \theta}{\theta}\right) a a^{T}+\frac{1-\cos \theta}{\theta} a^{\wedge}
Jl=J=θsinθI+(1−θsinθ)aaT+θ1−cosθa∧上面的BCH线性近似表达式我们可以写为
exp
(
Δ
ϕ
∧
)
exp
(
ϕ
∧
)
=
exp
(
(
ϕ
+
J
l
−
1
(
ϕ
)
Δ
ϕ
)
∧
)
\exp \left(\Delta \phi^{\wedge}\right) \exp \left(\phi^{\wedge}\right)=\exp \left(\left(\phi+J_{l}^{-1}(\phi) \Delta \phi\right)^{\wedge}\right)
exp(Δϕ∧)exp(ϕ∧)=exp((ϕ+Jl−1(ϕ)Δϕ)∧)因此,我们就可以获得上面第二行的推导公式:
exp
(
(
ϕ
+
Δ
ϕ
)
∧
)
=
exp
(
(
J
l
Δ
ϕ
)
∧
)
exp
(
ϕ
∧
)
\exp \left((\phi+\Delta \phi)^{\wedge}\right)=\exp \left(\left(J_{l} \Delta \phi\right)^{\wedge}\right) \exp \left(\phi^{\wedge}\right)
exp((ϕ+Δϕ)∧)=exp((JlΔϕ)∧)exp(ϕ∧)好了,这是第一种求导方式,可以看到求导结果中有个左雅克比矩阵
J
l
J_l
Jl,是个六维的矩阵,这个是比较烦人的,因此就引入了第二种求导方式,也就是这一节的小标题——扰动模型。
扰动模型和上面的的BCH线性近似表达式一样,也分为左乘和右乘两种情况,以左乘为例,对
R
R
R左乘一个小扰动
Δ
R
\Delta R
ΔR(其李代数定义为
ϕ
\phi
ϕ):
∂
(
R
p
)
∂
φ
=
lim
φ
→
0
exp
(
φ
∧
)
exp
(
ϕ
∧
)
p
−
exp
(
ϕ
∧
)
p
φ
\frac{\partial(\boldsymbol{R} \boldsymbol{p})}{\partial \varphi}=\lim _{\varphi \rightarrow 0} \frac{\exp \left(\varphi^{\wedge}\right) \exp \left(\phi^{\wedge}\right) \boldsymbol{p}-\exp \left(\phi^{\wedge}\right) \boldsymbol{p}}{\varphi}
∂φ∂(Rp)=φ→0limφexp(φ∧)exp(ϕ∧)p−exp(ϕ∧)p这和第一种求导方式的导数定义就不一样了,现在这种定义求导更为简单,如下:
∂
(
R
p
)
∂
φ
=
lim
φ
→
0
exp
(
φ
∧
)
exp
(
ϕ
∧
)
p
−
exp
(
ϕ
∧
)
p
φ
≈
lim
φ
→
0
(
1
+
φ
∧
)
exp
(
ϕ
∧
)
p
−
exp
(
ϕ
∧
)
p
φ
=
lim
φ
→
0
φ
∧
R
p
φ
=
lim
φ
→
0
−
(
R
p
)
∧
φ
φ
=
−
(
R
p
)
∧
\begin{aligned} \frac{\partial(\boldsymbol{R} p)}{\partial \varphi} &=\lim _{\varphi \rightarrow 0} \frac{\exp \left(\varphi^{\wedge}\right) \exp \left(\phi^{\wedge}\right) \boldsymbol{p}-\exp \left(\phi^{\wedge}\right) \boldsymbol{p}}{\varphi} \\ & \approx \lim _{\varphi \rightarrow 0} \frac{\left(1+\varphi^{\wedge}\right) \exp \left(\phi^{\wedge}\right) \boldsymbol{p}-\exp \left(\phi^{\wedge}\right) \boldsymbol{p}}{\varphi} \\ &=\lim _{\varphi \rightarrow 0} \frac{\varphi^{\wedge} \boldsymbol{R} \boldsymbol{p}}{\varphi}=\lim _{\varphi \rightarrow 0} \frac{-(\boldsymbol{R} p)^{\wedge} \varphi}{\varphi}=-(\boldsymbol{R} \boldsymbol{p})^{\wedge} \end{aligned}
∂φ∂(Rp)=φ→0limφexp(φ∧)exp(ϕ∧)p−exp(ϕ∧)p≈φ→0limφ(1+φ∧)exp(ϕ∧)p−exp(ϕ∧)p=φ→0limφφ∧Rp=φ→0limφ−(Rp)∧φ=−(Rp)∧由结论可以看出,第二种求导方式的结果少了那个烦人的左雅克比矩阵
J
l
J_l
Jl。
上面的推导和结论都是基于三维旋转的,下面给出三维变换的扰动模型
三维旋转中仅仅是对旋转添加了一个扰动,那么三维变换中需要对旋转和平移都添加一个扰动
Δ
T
\Delta T
ΔT才行(其李代数定义为
δ
ξ
=
[
δ
ρ
,
δ
ϕ
]
T
\delta \boldsymbol{\xi}=[\delta \boldsymbol{\rho}, \delta \boldsymbol{\phi}]^{T}
δξ=[δρ,δϕ]T),那么
∂
(
T
p
)
∂
δ
ξ
=
lim
δ
ξ
→
0
exp
(
δ
ξ
∧
)
exp
(
ξ
∧
)
p
−
exp
(
ξ
∧
)
p
δ
ξ
≈
lim
δ
ξ
→
0
(
I
+
δ
ξ
∧
)
exp
(
ξ
∧
)
p
−
exp
(
ξ
∧
)
p
δ
ξ
=
lim
δ
ξ
→
0
δ
ξ
∧
exp
(
ξ
∧
)
p
δ
ξ
=
lim
δ
ξ
→
0
[
δ
ϕ
∧
δ
ρ
0
T
0
]
[
R
p
+
t
1
]
δ
ξ
=
lim
δ
ξ
→
0
[
δ
ϕ
∧
(
R
p
+
t
)
+
δ
ρ
0
]
δ
ξ
=
[
I
−
(
R
p
+
t
)
∧
0
T
0
T
]
≜
(
T
p
)
⊙
\begin{aligned} \frac{\partial(\boldsymbol{T} \boldsymbol{p})}{\partial \delta \boldsymbol{\xi}} &=\lim _{\delta \xi \rightarrow 0} \frac{\exp \left(\delta \boldsymbol{\xi}^{\wedge}\right) \exp \left(\boldsymbol{\xi}^{\wedge}\right) \boldsymbol{p}-\exp \left(\boldsymbol{\xi}^{\wedge}\right) \boldsymbol{p}}{\delta \boldsymbol{\xi}} \\ & \approx \lim _{\delta \xi \rightarrow 0} \frac{\left(\boldsymbol{I}+\delta \boldsymbol{\xi}^{\wedge}\right) \exp \left(\boldsymbol{\xi}^{\wedge}\right) \boldsymbol{p}-\exp \left(\boldsymbol{\xi}^{\wedge}\right) \boldsymbol{p}}{\delta \boldsymbol{\xi}} \\ &=\lim _{\delta \xi \rightarrow 0} \frac{\delta \boldsymbol{\xi}^{\wedge} \exp \left(\boldsymbol{\xi}^{\wedge}\right) \boldsymbol{p}}{\delta \boldsymbol{\xi}} \\&=\lim _{\delta \xi \rightarrow 0} \frac{\left[ \begin{array}{cc}{\delta \phi^{\wedge}} & {\delta \rho} \\ {\mathbf{0}^{T}} & {0}\end{array}\right] \left[ \begin{array}{c}{\boldsymbol{R p}+\boldsymbol{t}} \\ {1}\end{array}\right]}{\delta \xi}\\&=\lim _{\delta \xi \rightarrow 0} \frac{\left[ \begin{array}{c}{\delta \phi^{\wedge}(R p+t)+\delta \rho} \\ {0}\end{array}\right]}{\delta \xi}=\left[ \begin{array}{cc}{I} & {-(R p+t)^{\wedge}} \\ {0^{T}} & {0^{T}}\end{array}\right] \triangleq(\boldsymbol{T} \boldsymbol{p})^{\odot}\end{aligned}
∂δξ∂(Tp)=δξ→0limδξexp(δξ∧)exp(ξ∧)p−exp(ξ∧)p≈δξ→0limδξ(I+δξ∧)exp(ξ∧)p−exp(ξ∧)p=δξ→0limδξδξ∧exp(ξ∧)p=δξ→0limδξ[δϕ∧0Tδρ0][Rp+t1]=δξ→0limδξ[δϕ∧(Rp+t)+δρ0]=[I0T−(Rp+t)∧0T]≜(Tp)⊙
这
个
(
T
p
)
⊙
这个(\boldsymbol{T} \boldsymbol{p})^{\odot}
这个(Tp)⊙是一个运算符,相当于是在一个坐标点对其三维位姿求导的结果,是一个4×6的矩阵。
这里补充一个图加深对扰动模型的理解
对这个图的解释是,首先对于标量,指数空间的加法相当与对数空间的乘法,那么对应到李群李代数空间,我们可以说,李代数空间的加法相当与李群空间的乘法(当然这种说法是错的,上面解释过,因为位姿不是标量,但是我们不严格地可以这么说),那么我们在李代数空间添加扰动的话,公式如下:
∂
(
exp
(
ϕ
∧
)
p
)
∂
ϕ
=
lim
δ
ϕ
→
0
exp
(
(
ϕ
+
δ
ϕ
)
∧
)
p
−
exp
(
ϕ
∧
)
p
δ
ϕ
\frac{\partial\left(\exp \left(\phi^{\wedge}\right) p\right)}{\partial \phi}=\lim _{\delta \phi \rightarrow 0} \frac{\exp \left((\phi+\delta \phi)^{\wedge}\right) p-\exp \left(\phi^{\wedge}\right) p}{\delta \phi}
∂ϕ∂(exp(ϕ∧)p)=δϕ→0limδϕexp((ϕ+δϕ)∧)p−exp(ϕ∧)p这就是第一种求导模型,那么我们在李群空间添加绕动的话,公式如下:
∂
(
R
p
)
∂
φ
=
lim
φ
→
0
exp
(
φ
∧
)
exp
(
ϕ
∧
)
p
−
exp
(
ϕ
∧
)
p
φ
\frac{\partial(\boldsymbol{R} p)}{\partial \varphi}=\lim _{\varphi \rightarrow 0} \frac{\exp \left(\varphi^{\wedge}\right) \exp \left(\phi^{\wedge}\right) \boldsymbol{p}-\exp \left(\phi^{\wedge}\right) \boldsymbol{p}}{\varphi}
∂φ∂(Rp)=φ→0limφexp(φ∧)exp(ϕ∧)p−exp(ϕ∧)p这就是我们第二种求导模型,第二种模型就避免了复杂的雅可比矩阵的求解。
(2)Bundle Adjustment推导及稀疏性分析
Step 1:Bundle Adjustment推导
首先摆出SLAM问题的两个描述方程(现在越来越发现这两个方程的重要性了…):
{
x
k
=
f
(
x
k
−
1
,
u
k
)
+
w
k
z
k
,
j
=
h
(
y
j
,
x
k
)
+
v
k
,
j
\left\{\begin{array}{l}{\boldsymbol{x}_{k}=f\left(\boldsymbol{x}_{k-1}, \boldsymbol{u}_{k}\right)+\boldsymbol{w}_{k}} \\ {\boldsymbol{z}_{k, j}=h\left(\boldsymbol{y}_{j}, \boldsymbol{x}_{k}\right)+\boldsymbol{v}_{k, j}}\end{array}\right.
{xk=f(xk−1,uk)+wkzk,j=h(yj,xk)+vk,j在视觉SLAM的后端问题上,我们没有测量运动的传感器,因此没有
u
k
u_k
uk,或者说我们后端的预测值是又前端提供的,因此我们这里只考虑观测方程,我们假设噪声项
v
k
∼
N
(
0
,
Q
k
,
j
)
\boldsymbol{v}_{k} \sim N\left(0, \boldsymbol{Q}_{k, j}\right)
vk∼N(0,Qk,j),所以观测数据的条件概率表示
P
(
z
j
,
i
∣
ξ
i
,
p
j
)
=
N
(
h
(
p
j
,
ξ
i
)
,
Q
k
,
j
)
P\left(\boldsymbol{z}_{j, i} | \boldsymbol{\xi}_{i}, \boldsymbol{p}_{j}\right)=N\left(h\left(\boldsymbol{p}_{j}, \boldsymbol{\xi}_{i}\right), \boldsymbol{Q}_{k, j}\right)
P(zj,i∣ξi,pj)=N(h(pj,ξi),Qk,j)其仍然是一个高斯分布,其中
ξ
i
\boldsymbol{\xi}_{i}
ξi指的是相机空间位姿(是一个表示三维变换的矩阵),
p
j
\boldsymbol{p}_{j}
pj指的是路标点的空间坐标(是一个表示平移的向量),而状态变量
x
=
{
ξ
1
,
…
,
ξ
m
,
p
1
,
…
,
p
n
}
\boldsymbol{x}=\left\{\boldsymbol{\xi}_{1}, \ldots, \boldsymbol{\xi}_{m}, \boldsymbol{p}_{1}, \ldots, \boldsymbol{p}_{n}\right\}
x={ξ1,…,ξm,p1,…,pn}(状态变量把相机空间位姿放前面和后面的矩阵分析是相关的),好,回到高斯分布,我们要求解的就是使得高斯分布取得最大值的
ξ
i
\boldsymbol{\xi}_{i}
ξi和
p
j
\boldsymbol{p}_{j}
pj,求解的方法是求最小化负对数来求高斯分布的最大似然(固定方法):
P
(
x
)
=
1
(
2
π
)
N
det
(
Σ
)
exp
(
−
1
2
(
x
−
μ
)
T
Σ
−
1
(
x
−
μ
)
)
P(\boldsymbol{x})=\frac{1}{\sqrt{(2 \pi)^{N} \operatorname{det}(\boldsymbol{\Sigma})}} \exp \left(-\frac{1}{2}(\boldsymbol{x}-\boldsymbol{\mu})^{T} \boldsymbol{\Sigma}^{-1}(\boldsymbol{x}-\boldsymbol{\mu})\right)
P(x)=(2π)Ndet(Σ)1exp(−21(x−μ)TΣ−1(x−μ))取负对数得
−
ln
(
P
(
x
)
)
=
1
2
ln
(
(
2
π
)
N
det
(
Σ
)
)
+
1
2
(
x
−
μ
)
T
Σ
−
1
(
x
−
μ
)
-\ln (P(\boldsymbol{x}))=\frac{1}{2} \ln \left((2 \pi)^{N} \operatorname{det}(\boldsymbol{\Sigma})\right)+\frac{1}{2}(\boldsymbol{x}-\boldsymbol{\mu})^{T} \boldsymbol{\Sigma}^{-1}(\boldsymbol{x}-\boldsymbol{\mu})
−ln(P(x))=21ln((2π)Ndet(Σ))+21(x−μ)TΣ−1(x−μ)这里面第一项和状态
x
x
x无关,因此根据第二项,我们可以获得最终的目标函数:
x
∗
=
arg
min
(
(
z
k
,
j
−
h
(
ξ
i
,
p
j
)
)
T
Q
i
,
j
−
1
(
z
k
,
j
−
h
(
ξ
i
,
p
j
)
)
)
=
arg
min
(
1
2
∑
i
=
1
m
∑
j
=
1
n
∥
z
i
j
−
h
(
ξ
i
,
p
j
)
∥
2
)
=
arg
min
(
1
2
∥
f
(
x
)
∥
2
)
\begin{aligned} \boldsymbol{x}^{*} & =\arg \min \left(\left(\boldsymbol{z}_{\boldsymbol{k}, j}-h\left(\boldsymbol{\xi}_{\boldsymbol{i}}, \boldsymbol{p}_{j}\right)\right)^{T} \boldsymbol{Q}_{i, j}^{-1}\left(\boldsymbol{z}_{\boldsymbol{k}, \boldsymbol{j}}-h\left(\boldsymbol{\xi}_{i}, \boldsymbol{p}_{j}\right)\right)\right) \\& =\arg \min(\frac{1}{2} \sum_{i=1}^{m} \sum_{j=1}^{n}\left\|\boldsymbol{z}_{i j}-h\left(\boldsymbol{\xi}_{i}, \boldsymbol{p}_{j}\right)\right\|^{2}) \\& = \arg \min(\frac{1}{2}\|f(\boldsymbol{x})\|^{2}) \end{aligned}
x∗=argmin((zk,j−h(ξi,pj))TQi,j−1(zk,j−h(ξi,pj)))=argmin(21i=1∑mj=1∑n∥∥zij−h(ξi,pj)∥∥2)=argmin(21∥f(x)∥2)可以看出来这其实就是最小化噪声项的平方,当噪声独立是,
Q
k
,
j
−
1
\boldsymbol{Q}_{k, j}^{-1}
Qk,j−1是单位阵,然后就可以推导出整体的代价函数(重投影误差),按照高斯牛顿法的求解方法有
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}\|f(\boldsymbol{x}+\Delta \boldsymbol{x})\|^{2} \approx \frac{1}{2} \sum_{i=1}^{m} \sum_{j=1}^{n}\left\|\boldsymbol{e}_{i j}+\boldsymbol{F}_{i j} \Delta \boldsymbol{\xi}_{i}+\boldsymbol{E}_{i j} \Delta \boldsymbol{p}_{j}\right\|^{2}
21∥f(x+Δx)∥2≈21i=1∑mj=1∑n∥∥eij+FijΔξi+EijΔpj∥∥2其中
F
i
j
\boldsymbol{F}_{i j}
Fij表示整个儿代价函数在当前状态下对相机空间姿态的偏导数,而
E
i
j
\boldsymbol{E}_{i j}
Eij表示该函数对路标点的空间坐标的偏导数,令
x
c
=
[
ξ
1
,
ξ
2
,
…
,
ξ
m
]
T
∈
R
6
m
\boldsymbol{x}_{c}=\left[\boldsymbol{\xi}_{1}, \boldsymbol{\xi}_{2}, \ldots, \boldsymbol{\xi}_{m}\right]^{T} \in \mathbb{R}^{6 m}
xc=[ξ1,ξ2,…,ξm]T∈R6m
x
p
=
[
p
1
,
p
2
,
…
,
p
n
]
T
∈
R
3
n
\boldsymbol{x}_{p}=\left[\boldsymbol{p}_{1}, \boldsymbol{p}_{2}, \ldots, \boldsymbol{p}_{n}\right]^{T} \in \mathbb{R}^{3 n}
xp=[p1,p2,…,pn]T∈R3n则可以进一步简化得
1
2
∥
f
(
x
+
Δ
x
)
∥
2
=
1
2
∥
e
+
F
Δ
x
c
+
E
Δ
x
p
∥
2
\frac{1}{2}\|f(\boldsymbol{x}+\Delta \boldsymbol{x})\|^{2}=\frac{1}{2}\left\|\boldsymbol{e}+\boldsymbol{F} \Delta \boldsymbol{x}_{c}+\boldsymbol{E} \Delta \boldsymbol{x}_{p}\right\|^{2}
21∥f(x+Δx)∥2=21∥e+FΔxc+EΔxp∥2这里的雅可比矩阵
E
\boldsymbol{E}
E和
F
\boldsymbol{F}
F必须是整体目标函数对整体变量的导数,则
J
=
[
F
E
]
\boldsymbol{J}=[\boldsymbol{F} \boldsymbol{E}]
J=[FE],那么最后得到的增量方程式是
H
Δ
x
=
g
\boldsymbol{H} \Delta \boldsymbol{x}=\boldsymbol{g}
HΔx=g其中
H
=
J
T
J
=
[
F
T
F
F
T
E
E
T
F
E
T
E
]
\boldsymbol{H}=\boldsymbol{J}^{T} \boldsymbol{J}=\left[ \begin{array}{cc}{\boldsymbol{F}^{T} \boldsymbol{F}} & {\boldsymbol{F}^{T} \boldsymbol{E}} \\ {\boldsymbol{E}^{T} \boldsymbol{F}} & {\boldsymbol{E}^{T} \boldsymbol{E}}\end{array}\right]
H=JTJ=[FTFETFFTEETE]
Step 2:稀疏性分析
然后就要开始进行矩阵稀疏性分析了,之前实习面试的时候有个面试官问我
H
\boldsymbol{H}
H为什么是稀疏的?书上的回答是
H
\boldsymbol{H}
H矩阵的稀疏性是有雅克比矩阵
J
\boldsymbol{J}
J引起的,怎么理解呢,这里的这个雅克比矩阵
J
\boldsymbol{J}
J是我们的代价函数相对于状态变量的雅克比矩阵,通用的雅克比的计算公式如下
J
=
[
∂
f
1
∂
x
1
⋯
∂
f
1
∂
x
n
⋮
⋱
⋮
∂
f
m
∂
x
1
⋯
∂
f
m
∂
x
n
]
\boldsymbol{J}=\left[ \begin{array}{ccc}{\frac{\partial f_{1}}{\partial x_{1}}} & {\cdots} & {\frac{\partial f_{1}}{\partial x_{n}}} \\ {\vdots} & {\ddots} & {\vdots} \\ {\frac{\partial f_{m}}{\partial x_{1}}} & {\cdots} & {\frac{\partial f_{m}}{\partial x_{n}}}\end{array}\right]
J=⎣⎢⎡∂x1∂f1⋮∂x1∂fm⋯⋱⋯∂xn∂f1⋮∂xn∂fm⎦⎥⎤在视觉SLAM的这个雅克比矩阵里面
∂
f
1
∂
x
1
\frac{\partial f_{1}}{\partial x_{1}}
∂x1∂f1是什么意思呢?假定
x
1
x_1
x1是第一个相机空间位姿
ξ
1
\boldsymbol{\xi}_{1}
ξ1,
∂
f
1
∂
x
1
\frac{\partial f_{1}}{\partial x_{1}}
∂x1∂f1其实就是代价函数中的第一项
e
11
\boldsymbol{e}_{11}
e11(这里是假定
e
11
\boldsymbol{e}_{11}
e11存在)对第一个相机空间位姿
ξ
1
\boldsymbol{\xi}_{1}
ξ1求导,为什么是这样呢?仔细观察推导过程后发现:
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
2
∥
e
+
F
Δ
x
c
+
E
Δ
x
p
∥
2
\frac{1}{2}\|f(\boldsymbol{x}+\Delta \boldsymbol{x})\|^{2} \approx \frac{1}{2} \sum_{i=1}^{m} \sum_{j=1}^{n}\left\|\boldsymbol{e}_{i j}+\boldsymbol{F}_{i j} \Delta \boldsymbol{\xi}_{i}+\boldsymbol{E}_{i j} \Delta \boldsymbol{p}_{j}\right\|^{2}=\frac{1}{2}\left\|\boldsymbol{e}+\boldsymbol{F} \Delta x_{c}+\boldsymbol{E} \Delta x_{p}\right\|^{2}
21∥f(x+Δx)∥2≈21i=1∑mj=1∑n∥∥eij+FijΔξi+EijΔpj∥∥2=21∥e+FΔxc+EΔxp∥2这里的
F
\boldsymbol{F}
F和
E
\boldsymbol{E}
E是分别由
e
i
j
\boldsymbol{e}_{ij}
eij对
ξ
i
\boldsymbol{\xi}_{i }
ξi、
p
j
\boldsymbol{p}_{j}
pj的雅克比矩阵
F
i
j
\boldsymbol{F}_{ij}
Fij、
E
i
j
\boldsymbol{E}_{ij}
Eij“拼凑”起来的,换一种方式理解,现在这里的状态向量
x
=
[
ξ
1
,
…
,
ξ
m
,
p
1
,
…
,
p
n
]
T
\boldsymbol{x}=[\boldsymbol{\xi}_{1}, \ldots, \boldsymbol{\xi}_{m}, \boldsymbol{p}_{1}, \ldots, \boldsymbol{p}_{n}]^T
x=[ξ1,…,ξm,p1,…,pn]T,这是一个向量,那么误差
e
\boldsymbol{e}
e求出来应该也是这样一个向量,例如
[
e
11
,
e
12
,
…
]
[\boldsymbol{e}_{11},\boldsymbol{e}_{12,\ldots}]
[e11,e12,…]这样的形式。因此整个雅克比矩阵
J
\boldsymbol{J}
J可以视为是一个列向量误差向量
e
\boldsymbol{e}
e对状态向量
x
\boldsymbol{x}
x的导数(这里指的向量都是广义的向量),因为
e
i
j
\boldsymbol{e}_{i j}
eij的值指和相机空间位姿
ξ
i
\boldsymbol{\xi}_{i}
ξi和路标点空间坐标
p
j
\boldsymbol{p}_{j}
pj有关,因此雅克比矩阵对应的那一行为:
J
i
j
(
x
)
=
(
0
2
×
6
,
…
0
2
×
6
,
∂
e
i
j
∂
ξ
i
,
0
2
×
6
,
…
0
2
×
3
,
…
0
2
×
3
,
∂
e
i
j
∂
p
j
,
0
2
×
3
,
…
0
2
×
3
)
\boldsymbol{J}_{i j}(\boldsymbol{x})=\left(\mathbf{0}_{2 \times 6}, \ldots \mathbf{0}_{2 \times 6}, \frac{\partial \boldsymbol{e}_{i j}}{\partial \boldsymbol{\xi}_{i}}, \mathbf{0}_{2 \times 6}, \ldots \mathbf{0}_{2 \times 3}, \ldots \mathbf{0}_{2 \times 3}, \frac{\partial \boldsymbol{e}_{i j}}{\partial \boldsymbol{p}_{j}}, \mathbf{0}_{2 \times 3}, \ldots \mathbf{0}_{2 \times 3}\right)
Jij(x)=(02×6,…02×6,∂ξi∂eij,02×6,…02×3,…02×3,∂pj∂eij,02×3,…02×3)这里顺便推导下
∂
e
i
j
∂
ξ
i
\frac{\partial \boldsymbol{e}_{i j}}{\partial \boldsymbol{\xi}_{i}}
∂ξi∂eij和
∂
e
i
j
∂
p
j
\frac{\partial \boldsymbol{e}_{i j}}{\partial \boldsymbol{p}_{j}}
∂pj∂eij的具体形式,有图像像素位置和空间点位置关系如下:
s
i
[
u
v
1
]
=
K
exp
(
ξ
∧
)
[
X
Y
Z
1
]
s_{i} \left[ \begin{array}{c}{u_{}} \\ {v_{}} \\ {1}\end{array}\right]=\boldsymbol{K} \exp \left(\boldsymbol{\xi}^{\wedge}\right) \left[ \begin{array}{c}{X_{}} \\ {Y_{}} \\ {Z_{}} \\ {1}\end{array}\right]
si⎣⎡uv1⎦⎤=Kexp(ξ∧)⎣⎢⎢⎡XYZ1⎦⎥⎥⎤我们把空间点
P
\boldsymbol{P}
P转相机坐标系下为
P
′
\boldsymbol{P'}
P′(取前三项):
P
′
=
(
exp
(
ξ
∧
)
P
)
13
=
[
X
′
,
Y
′
,
Z
′
]
T
\boldsymbol{P}^{\prime}=\left(\exp \left(\xi^{\wedge}\right) P\right)_{13}=\left[X^{\prime}, Y^{\prime}, Z^{\prime}\right]^{T}
P′=(exp(ξ∧)P)13=[X′,Y′,Z′]T又相机坐标系到图像坐标系下有:
s
u
=
K
P
′
s \boldsymbol{u}=\boldsymbol{K} \boldsymbol{P}^{\prime}
su=KP′因此有:
u
=
f
x
X
′
Z
′
+
c
x
,
v
=
f
y
Y
′
Z
′
+
c
y
u=f_{x} \frac{X^{\prime}}{Z^{\prime}}+c_{x}, \quad v=f_{y} \frac{Y^{\prime}}{Z^{\prime}}+c_{y}
u=fxZ′X′+cx,v=fyZ′Y′+cy我们按照第一节里面推导的扰动模型的思路,对误差
e
\boldsymbol{e}
e左乘一个扰动有
∂
e
∂
δ
ξ
=
lim
δ
ξ
→
0
e
(
δ
ξ
⊕
ξ
)
δ
ξ
=
∂
e
∂
P
′
∂
P
′
∂
δ
ξ
\frac{\partial \boldsymbol{e}}{\partial \delta \boldsymbol{\xi}}=\lim _{\delta \xi \rightarrow 0} \frac{e(\delta \boldsymbol{\xi} \oplus \xi)}{\delta \boldsymbol{\xi}}=\frac{\partial \boldsymbol{e}}{\partial \boldsymbol{P}^{\prime}} \frac{\partial \boldsymbol{P}^{\prime}}{\partial \delta \boldsymbol{\xi}}
∂δξ∂e=δξ→0limδξe(δξ⊕ξ)=∂P′∂e∂δξ∂P′易得第一项
∂
e
∂
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 \boldsymbol{e}}{\partial \boldsymbol{P}^{\prime}}=-\left[ \begin{array}{ccc}{\frac{\partial u}{\partial X^{\prime}}} & {\frac{\partial u}{\partial Y^{\prime}}} & {\frac{\partial u}{\partial Z^{\prime}}} \\ {\frac{\partial v}{\partial X^{\prime}}} & {\frac{\partial v}{\partial Y^{\prime}}} & {\frac{\partial v}{\partial Z^{\prime}}}\end{array}\right]=-\left[ \begin{array}{ccc}{\frac{f_{x}}{Z^{\prime}}} & {0} & {-\frac{f_{x} X^{\prime}}{Z^{2}}} \\ {0} & {\frac{f_{y}}{Z^{\prime}}} & {-\frac{f_{y} Y^{\prime}}{Z^{\prime 2}}}\end{array}\right]
∂P′∂e=−[∂X′∂u∂X′∂v∂Y′∂u∂Y′∂v∂Z′∂u∂Z′∂v]=−[Z′fx00Z′fy−Z2fxX′−Z′2fyY′]那么第二项根据扰动模型的结论有
∂
(
T
P
)
∂
δ
ξ
=
(
T
P
)
⊙
=
[
I
−
P
′
∧
0
T
0
T
]
\frac{\partial(\boldsymbol{T} \boldsymbol{P})}{\partial \delta \boldsymbol{\xi}}=(\boldsymbol{T} \boldsymbol{P})^{\odot}=\left[ \begin{array}{cc}{\boldsymbol{I}} & {-\boldsymbol{P}^{\prime \wedge}} \\ {\mathbf{0}^{T}} & {\mathbf{0}^{T}}\end{array}\right]
∂δξ∂(TP)=(TP)⊙=[I0T−P′∧0T]因为
P
′
\boldsymbol{P'}
P′我们指需要取前三项,因此有
∂
P
′
∂
δ
ξ
=
[
I
,
−
P
′
∧
]
=
[
1
0
0
0
Z
′
−
Y
′
0
1
0
Z
′
0
X
′
0
0
1
Y
′
−
X
′
0
]
\frac{\partial \boldsymbol{P}^{\prime}}{\partial \delta \boldsymbol{\xi}}=\left[\boldsymbol{I},-\boldsymbol{P}^{\prime \wedge}\right]=\left[ \begin{array}{ccc}{1} & {0} & {0} & {0} & {Z'} & {-Y'} \\ {0} & {1} & {0} & {Z'} & {0} & {X'} \\ {0} & {0} & {1} & {Y'} & {-X'} & {0}\end{array}\right]
∂δξ∂P′=[I,−P′∧]=⎣⎡1000100010Z′Y′Z′0−X′−Y′X′0⎦⎤因此可以获得对相机空间位姿的导数
∂
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 \delta \boldsymbol{\xi}}=-\left[ \begin{array}{ccccc}{\frac{f_{x}}{Z^{\prime}}} & {0} & {-\frac{f_{x} X^{\prime}}{Z^{\prime 2}}} & {-\frac{f_{x} X^{\prime} Y^{\prime}}{Z^{2}}} & {f_{x}+\frac{f_{x} X^{2}}{Z^{\prime 2}}} & {-\frac{f_{x} Y^{\prime}}{Z^{\prime}}} \\ {0} & {\frac{f_{y}}{Z^{\prime}}} & {-\frac{f_{y} Y^{\prime}}{Z^{\prime 2}}} & {-f_{y}-\frac{f_{y} Y^{\prime 2}}{Z^{2}}} & {\frac{f_{y} X^{\prime} Y^{\prime}}{Z^{\prime 2}}} & {\frac{f_{y} X^{\prime}}{Z^{\prime}}}\end{array}\right]
∂δξ∂e=−[Z′fx00Z′fy−Z′2fxX′−Z′2fyY′−Z2fxX′Y′−fy−Z2fyY′2fx+Z′2fxX2Z′2fyX′Y′−Z′fxY′Z′fyX′]同理我们可以求其对空间点导数
∂
e
∂
P
=
∂
e
∂
P
′
∂
P
′
∂
P
\frac{\partial \boldsymbol{e}}{\partial \boldsymbol{P}}=\frac{\partial \boldsymbol{e}}{\partial \boldsymbol{P}^{\prime}} \frac{\partial \boldsymbol{P}^{\prime}}{\partial \boldsymbol{P}}
∂P∂e=∂P′∂e∂P∂P′已知
P
′
=
exp
(
ξ
∧
)
P
=
R
P
+
t
\boldsymbol{P}^{\prime}=\exp \left(\boldsymbol{\xi}^{\wedge}\right) \boldsymbol{P}=\boldsymbol{R} \boldsymbol{P}+\boldsymbol{t}
P′=exp(ξ∧)P=RP+t则
P
′
\boldsymbol{P'}
P′对求导后有
P
\boldsymbol{P}
P只剩下
R
\boldsymbol{R}
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}}=-\left[ \begin{array}{ccc}{\frac{f_{x}}{Z^{\prime}}} & {0} & {-\frac{f_{x} X^{\prime}}{Z^{\prime 2}}} \\ {0} & {\frac{f_{y}}{Z^{\prime}}} & {-\frac{f_{y} Y^{\prime}}{Z^{\prime 2}}}\end{array}\right] \boldsymbol{R}
∂P∂e=−[Z′fx00Z′fy−Z′2fxX′−Z′2fyY′]R由此我们知道
∂
e
i
j
∂
ξ
i
\frac{\partial \boldsymbol{e}_{i j}}{\partial \boldsymbol{\xi}_{i}}
∂ξi∂eij和
∂
e
i
j
∂
p
j
\frac{\partial \boldsymbol{e}_{i j}}{\partial \boldsymbol{p}_{j}}
∂pj∂eij的维度分别是
2
×
6
2×6
2×6和
2
×
3
2×3
2×3,那么
J
\boldsymbol{J}
J矩阵以及其所构成的
H
\boldsymbol{H}
H矩阵的形状如下:
因为相机空间位姿的数量通常远少于空间点的数量,因此最后
H
\boldsymbol{H}
H矩阵最后的形式如下:
Step 3:矩阵求解
正因为有了矩阵的稀疏性,因此矩阵的快速求解才有可能,我们把需要求解的方程 H Δ x = g \boldsymbol{H} \Delta \boldsymbol{x}=\boldsymbol{g} HΔx=g按照区域变成如下形式: [ B E E T C ] [ Δ x c Δ x p ] = [ v w ] \left[ \begin{array}{cc}{\boldsymbol{B}} & {\boldsymbol{E}} \\ {\boldsymbol{E}^{T}} & {\boldsymbol{C}}\end{array}\right] \left[ \begin{array}{c}{\Delta \boldsymbol{x}_{c}} \\ {\Delta \boldsymbol{x}_{p}}\end{array}\right]=\left[ \begin{array}{c}{\boldsymbol{v}} \\ {\boldsymbol{w}}\end{array}\right] [BETEC][ΔxcΔxp]=[vw]求解方法一共有两种:第一种:Schur消元(也乘Marginalization(边缘化));第二种:稀疏cholesky分解
Schur消元法
进行对线性方程组进行高斯消元,目标是消去右上角的
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
]
\left[ \begin{array}{cc}{I} & {-E C^{-1}} \\ {0} & {I}\end{array}\right] \left[ \begin{array}{cc}{B} & {E} \\ {E^{T}} & {C}\end{array}\right] \left[ \begin{array}{c}{\Delta x_{c}} \\ {\Delta x_{p}}\end{array}\right]=\left[ \begin{array}{cc}{I} & {-E C^{-1}} \\ {0} & {I}\end{array}\right] \left[ \begin{array}{c}{v} \\ {w}\end{array}\right]
[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
]
\left[ \begin{array}{cc}{B-E C^{-1} E^{T}} & {0} \\ {E^{T}} & {C}\end{array}\right] \left[ \begin{array}{c}{\Delta x_{c}} \\ {\Delta x_{p}}\end{array}\right]=\left[ \begin{array}{c}{v-E C^{-1} w} \\ {w}\end{array}\right]
[B−EC−1ETET0C][ΔxcΔxp]=[v−EC−1ww]先求
Δ
x
c
\Delta x_{c}
Δxc再求
Δ
x
p
\Delta x_{p}
Δxp,整个过程之所以简单就是因为
C
C
C矩阵是个对角阵,因此
C
−
1
C^{-1}
C−1很好求。最后一个相对较难求解的部分是
[
B
−
E
C
−
1
E
T
]
Δ
x
c
=
v
−
E
C
−
1
w
\left[\boldsymbol{B}-\boldsymbol{E} \boldsymbol{C}^{-1} \boldsymbol{E}^{T}\right] \Delta \boldsymbol{x}_{c}=\boldsymbol{v}-\boldsymbol{E} \boldsymbol{C}^{-1} \boldsymbol{w}
[B−EC−1ET]Δxc=v−EC−1w这个方程只能通过传统的消元或者分解法进行求解,这个稀疏矩阵我们通常成为
S
S
S矩阵,通过
S
S
S矩阵可以获得相机和空间点之间的关系,如下图
表示相机
C
4
C_4
C4和相机
C
1
C_1
C1 和
C
2
C_2
C2 之间有共同观测的点。而
S
34
S_{34}
S34 为零则表示
C
3
C_3
C3 和
C
4
C_4
C4 之间没有共同观测的路标,另外,不同的SLAM框架这个矩阵的稀疏程度是不一样的,例如ORB_SLAM通过关键帧的选取原则导致这个矩阵是稠密的,而DSO中通过滑动窗口法保证了这个矩阵是稀疏的。
这里还有一点很有意思的解释是,在Schur消元的这个过程中,我们是将求
(
Δ
x
c
,
Δ
x
p
)
\left(\Delta \boldsymbol{x}_{c}, \Delta \boldsymbol{x}_{p}\right)
(Δxc,Δxp)的问题转化为了先求
Δ
x
c
\Delta \boldsymbol{x}_{c}
Δxc,再求
Δ
x
p
\Delta \boldsymbol{x}_{p}
Δxp的过程,这一步相当于条件概率展开:
P
(
x
c
,
x
p
)
=
P
(
x
c
)
⋅
P
(
x
p
∣
x
c
)
P\left(\boldsymbol{x}_{c}, \boldsymbol{x}_{p}\right)=P\left(\boldsymbol{x}_{c}\right) \cdot P\left(\boldsymbol{x}_{p} | \boldsymbol{x}_{c}\right)
P(xc,xp)=P(xc)⋅P(xp∣xc)先求出关于
x
c
x_{c}
xc的边缘分布,这也就是为什么这里的Schur消元又称为边缘化(Marginalization)
稀疏cholesky分解
对线性方程组进行cholesky分解如下:
[
B
E
E
T
C
]
=
[
U
11
U
12
0
U
22
]
[
U
11
0
U
12
T
U
22
]
\left[ \begin{array}{cc}{B} & {E} \\ {E^{T}} & {C}\end{array}\right] =\left[ \begin{array}{cc}{U_{11}} & {U_{12}} \\ {0} & {U_{22}}\end{array}\right] \left[ \begin{array}{ll}{U_{11}} & {0} \\ {U_{12}^{T}} & {U_{22}}\end{array}\right]
[BETEC]=[U110U12U22][U11U12T0U22]带入得
{
C
=
U
22
U
22
T
E
=
U
12
U
22
T
B
=
U
11
U
11
T
+
U
12
U
12
T
\left\{\begin{array}{l}{C=U_{22}U_{22}^T} \\ {E=U_{12}U_{22}^T} \\ {B=U_{11}U_{11}^T+U_{12}U_{12}^T}\end{array}\right.
⎩⎨⎧C=U22U22TE=U12U22TB=U11U11T+U12U12T因为
C
C
C是对角矩阵,因此容易分解;对E进行分解时,因为
U
22
U_{22}
U22是对角阵且已知因此容易分解;对C进行分解时,因为C矩阵较小,也相对容易分解,这种分解方相较Schur消元法要好的地方时,可以直接求
H
H
H矩阵的逆。
(3)Pose Graph推导及分析
Pose Graph就是不关心空间点的位置,仅仅以相机的位姿作为优化节点的一种图优化方法,在ORB SLAM2里面就Covisibility Graph(共视图)就是一种典型的Pose Graph,操作是在有共视关系的位姿节点建立边,然后一起优化的一种图优化方法,Pose Graph的总体优化目标为
min
ξ
1
2
∑
i
,
j
∈
E
e
i
j
T
Σ
i
j
−
1
e
i
j
\min _{\xi} \frac{1}{2} \sum_{i, j \in \mathcal{E}} e_{i j}^{T} \mathbf{\Sigma}_{i j}^{-1} \boldsymbol{e}_{i j}
ξmin21i,j∈E∑eijTΣij−1eij我们首先要确定
e
i
j
e_{ij}
eij怎么定义,第
i
i
i和
j
j
j帧相机的位姿变换的李代数表达方式如下:
Δ
ξ
i
j
=
ln
(
exp
(
(
−
ξ
i
)
∧
)
exp
(
ξ
j
∧
)
)
∨
\Delta \xi_{i j}=\ln \left(\exp \left(\left(-\boldsymbol{\xi}_{i}\right)^{\wedge}\right) \exp \left(\boldsymbol{\xi}_{j}^{\wedge}\right)\right)^{\vee}
Δξij=ln(exp((−ξi)∧)exp(ξj∧))∨
或者李群表达方式:
Δ
T
i
j
=
T
i
−
1
T
j
\Delta T_{i j}=T_{i}^{-1} T_{j}
ΔTij=Ti−1Tj这里
T
i
T_i
Ti和
T
j
T_j
Tj分别是第
i
i
i和
j
j
j帧相机的位姿(不一定是相连的),
Δ
T
i
j
\Delta T_{i j}
ΔTij可以理解为由其他帧推过来的变换位姿,按照图优化的思想我们需要建立一个我们用来优化的误差,如下:
e
i
j
=
ln
(
Δ
T
i
j
−
1
T
i
−
1
T
j
)
∨
=
ln
(
exp
(
(
−
ξ
i
j
)
∧
)
exp
(
(
−
ξ
i
)
∧
)
exp
(
ξ
j
∧
)
)
∨
\begin{aligned} \boldsymbol{e}_{i j} &=\ln \left(\Delta \boldsymbol{T}_{i j}^{-1} \boldsymbol{T}_{i}^{-1} \boldsymbol{T}_{j}\right)^{\vee} \\ &=\ln \left(\exp \left(\left(-\boldsymbol{\xi}_{i j}\right)^{\wedge}\right) \exp \left(\left(-\boldsymbol{\xi}_{i}\right)^{\wedge}\right) \exp \left(\boldsymbol{\xi}_{j}^{\wedge}\right)\right)^{\vee} \end{aligned}
eij=ln(ΔTij−1Ti−1Tj)∨=ln(exp((−ξij)∧)exp((−ξi)∧)exp(ξj∧))∨,按照我们第一节给出的第二种较为简便的求导方式,对
ξ
i
\boldsymbol{\xi}_{i}
ξi和
ξ
i
\boldsymbol{\xi}_{i}
ξi分别乘一个左扰动
δ
ξ
i
\delta \xi_{i}
δξi和
δ
ξ
j
\delta \xi_{j}
δξj得:
e
^
i
j
=
ln
(
T
i
j
−
1
T
i
−
1
exp
(
(
−
δ
ξ
i
)
∧
)
exp
(
δ
ξ
j
∧
)
T
j
)
∨
=
ln
(
exp
(
(
−
ξ
i
j
)
∧
)
exp
(
(
−
ξ
i
)
∧
)
exp
(
(
−
δ
ξ
i
)
∧
)
exp
(
δ
ξ
j
∧
)
exp
(
ξ
j
∧
)
)
∨
\begin{aligned} \hat{e}_{i j} &=\ln \left(\boldsymbol{T}_{i j}^{-1} \boldsymbol{T}_{i}^{-1} \exp \left(\left(-\delta \boldsymbol{\xi}_{i}\right)^{\wedge}\right) \exp \left(\delta \boldsymbol{\xi}_{j}^{\wedge}\right) \boldsymbol{T}_{j}\right)^{\vee}\\&=\ln \left(\exp \left(\left(-\boldsymbol{\xi}_{i j}\right)^{\wedge}\right) \exp \left(\left(-\boldsymbol{\xi}_{i}\right)^{\wedge}\right) \exp \left(\left(-\delta \xi_{i}\right)^{\wedge}\right) \exp \left(\delta \xi_{j}^{\wedge}\right)\exp \left(\boldsymbol{\xi}_{j}^{\wedge}\right)\right)^{\vee}\end{aligned}
e^ij=ln(Tij−1Ti−1exp((−δξi)∧)exp(δξj∧)Tj)∨=ln(exp((−ξij)∧)exp((−ξi)∧)exp((−δξi)∧)exp(δξj∧)exp(ξj∧))∨然后这里需要用一个性质
exp
(
ξ
∧
)
T
=
T
exp
(
(
Ad
(
T
−
1
)
ξ
)
∧
)
\exp \left(\xi^{\wedge}\right) \boldsymbol{T}=\boldsymbol{T} \exp \left(\left(\operatorname{Ad}\left(\boldsymbol{T}^{-1}\right) \boldsymbol{\xi}\right)^{\wedge}\right)
exp(ξ∧)T=Texp((Ad(T−1)ξ)∧)其中
Ad
(
T
)
\operatorname{Ad}\left({T}\right)
Ad(T)是
T
T
T矩阵的伴随,这个性质的作用是移动扰动项至是式子的右侧,带入有
e
^
i
j
=
ln
(
T
i
j
−
1
T
i
−
1
exp
(
(
−
δ
ξ
i
)
∧
)
exp
(
δ
ξ
j
∧
)
T
j
)
∨
=
ln
(
T
i
j
−
1
T
i
−
1
T
j
exp
(
(
−
Ad
(
T
j
−
1
)
δ
ξ
i
)
∧
)
exp
(
(
Ad
(
T
j
−
1
)
δ
ξ
j
)
∧
)
∨
≈
ln
(
exp
(
e
i
j
)
exp
(
(
−
Ad
(
T
j
−
1
)
δ
ξ
i
)
∧
)
exp
(
(
Ad
(
T
j
−
1
)
δ
ξ
j
)
∧
)
∨
\begin{aligned} \hat{e}_{i j} &=\ln \left(T_{i j}^{-1} T_{i}^{-1} \exp \left(\left(-\delta \xi_{i}\right)^{\wedge}\right) \exp \left(\delta \xi_{j}^{\wedge}\right) T_{j}\right)^{\vee} \\ &=\ln \left(T_{i j}^{-1} T_{i}^{-1} T_{j} \exp \left(\left(-\operatorname{Ad}\left(T_{j}^{-1}\right) \delta \xi_{i}\right)^{\wedge}\right) \exp \left(\left(\operatorname{Ad}\left(T_{j}^{-1}\right) \delta \xi_{j}\right)^{\wedge}\right)^{\vee}\right.\\ & \approx \ln \left( \exp \left(e_{ij}\right)\exp \left(\left(-\operatorname{Ad}\left(T_{j}^{-1}\right) \delta \xi_{i}\right)^{\wedge}\right) \exp \left(\left(\operatorname{Ad}\left(T_{j}^{-1}\right) \delta \xi_{j}\right)^{\wedge}\right)^{\vee}\right.\end{aligned}
e^ij=ln(Tij−1Ti−1exp((−δξi)∧)exp(δξj∧)Tj)∨=ln(Tij−1Ti−1Tjexp((−Ad(Tj−1)δξi)∧)exp((Ad(Tj−1)δξj)∧)∨≈ln(exp(eij)exp((−Ad(Tj−1)δξi)∧)exp((Ad(Tj−1)δξj)∧)∨根据BCH的近似公式
exp
(
Δ
ξ
∧
)
exp
(
ξ
∧
)
≈
exp
(
(
J
l
−
1
Δ
ξ
+
ξ
)
∧
)
exp
(
ξ
∧
)
exp
(
Δ
ξ
∧
)
≈
exp
(
(
J
r
−
1
Δ
ξ
+
ξ
)
∧
)
\begin{aligned} \exp \left(\Delta \xi^{\wedge}\right) \exp \left(\xi^{\wedge}\right) & \approx \exp \left(\left(\mathcal{J}_{l}^{-1} \Delta \xi+\xi\right)^{\wedge}\right) \\ \exp \left(\xi^{\wedge}\right) \exp \left(\Delta \xi^{\wedge}\right) & \approx \exp \left(\left(\mathcal{J}_{r}^{-1} \Delta \xi+\xi\right)^{\wedge}\right) \end{aligned}
exp(Δξ∧)exp(ξ∧)exp(ξ∧)exp(Δξ∧)≈exp((Jl−1Δξ+ξ)∧)≈exp((Jr−1Δξ+ξ)∧)有
e
^
i
j
≈
e
i
j
−
J
r
−
1
(
e
i
j
)
Ad
(
T
j
−
1
)
δ
ξ
i
+
J
r
−
1
(
e
i
j
)
Ad
(
T
j
−
1
)
δ
ξ
j
\hat{\boldsymbol{e}}_{i j}\approx \boldsymbol{e}_{i j}-\mathcal{J}_{r}^{-1}\left(\boldsymbol{e}_{i j}\right) \operatorname{Ad}\left(\boldsymbol{T}_{j}^{-1}\right) \delta \xi_{i}+\mathcal{J}_{r}^{-1}\left(\boldsymbol{e}_{i j}\right) \operatorname{Ad}\left(\boldsymbol{T}_{j}^{-1}\right) \delta \xi_{j}
e^ij≈eij−Jr−1(eij)Ad(Tj−1)δξi+Jr−1(eij)Ad(Tj−1)δξj(这里书上并未给出详细的证明,我不太确定我这里理解是不是对的)
J
r
\mathcal{J}_{\boldsymbol{r}}
Jr为一个六阶矩阵,形式较为复杂,我们可以取其近似形式
J
r
−
1
(
e
i
j
)
≈
I
+
1
2
[
ϕ
e
∧
ρ
e
∧
0
ϕ
e
∧
]
\mathcal{J}_{r}^{-1}\left(\boldsymbol{e}_{i j}\right) \approx \boldsymbol{I}+\frac{1}{2} \left[ \begin{array}{cc}{\boldsymbol{\phi}_{\boldsymbol{e}}^{\wedge}} & {\boldsymbol{\rho}_{\boldsymbol{e}}^{\wedge}} \\ {\mathbf{0}} & {\phi_{\boldsymbol{e}}^{\wedge}}\end{array}\right]
Jr−1(eij)≈I+21[ϕe∧0ρe∧ϕe∧]有了误差的雅克比矩阵之后我们就可以开始计算
H
H
H矩阵,然后迭代下降了,Pose Graph的推导是有些模糊的,之后抽时间去对着ORB SLAM2的源码看下具体是怎么实现,这篇总结写得够长了,先到这里。
最近还有看到概率机器人上提到的Graph SLAM,视觉SLAM的BA应该就是基于此发展起来的,有问题欢迎交流~
此外,对SLAM算法感兴趣的同学可以看考我的博客SLAM算法总结——经典SLAM算法框架总结