概要
咸鱼了好久,为了个1024徽章还是上传点什么吧…
SLAM知识点很多,李群李代数和BA优化是其中比较重要的点. 本文主要是将<<视觉SLAM14讲>>中的一些相关内容按自己的思路整理了一下.
李群李代数
从实用角度讲,李群李代数主要是讲旋转矩阵或变换矩阵与向量之间的映射关系,只要理解了下面两张图以及扰动方程即可. 以旋转矩阵R为例,它组成了李群SO(3).而旋转矩阵由与三个坐标轴的夹角确定,所以有三个自由度,因此旋转矩阵可由一个三维向量
ϕ
\phi
ϕ表示,此三维向量称为旋转矩阵的旋转向量,此旋转向量组成的空间也就是李群SO(3)对应的李代数小so(3),也就是
R
=
exp
(
ϕ
^
)
R=\exp(\phi\ \hat{ }\ )
R=exp(ϕ ^ ),其中
^
\hat{}
^表示向量的反对称矩阵或称向量的叉乘矩阵,更具体映射关系如下图:
其中:
θ
\theta
θ为
ϕ
\phi
ϕ的向量长度,
a
a
a为
ϕ
\phi
ϕ的方向向量, 同样的由变换矩阵T组成的李群SE(3)与6维向量组成的李代数se(3)的映射关系如下:
李群李代数的出现是为了解决旋转矩阵或变换矩阵的求导问题: 以李群SE(3)为列,假设我们对一个空间点进行旋转和平移,得到了Tp.要计算变换之后的坐标相对于变换矩阵的导数,我们不严谨地记为.
∂
T
p
∂
T
\frac{\partial Tp}{\partial T}
∂T∂Tp
因为变换矩阵T对乘法封闭,对加法不封闭.即变换矩阵乘以变换矩阵还是变换矩阵,但变换矩阵加上变换矩阵不一定还是变换矩阵,所以无法用导数的定义进行求导,因此需要转成李代数(李代数由向量组成,显然对加法封闭),如下:
∂
T
p
∂
T
=
∂
(
e
x
p
(
ξ
^
p
)
)
∂
ξ
\frac{\partial Tp}{\partial T}= \frac{\partial(exp(\xi\ \hat{}p))}{\partial \xi}
∂T∂Tp=∂ξ∂(exp(ξ ^p))
所谓扰动模型是指另一种求导方式,比如左振动模型就是在左乘一个
Δ
T
=
exp
(
δ
ξ
)
\Delta T=\exp(\delta \xi)
ΔT=exp(δξ)如:
∂
T
p
∂
T
=
lim
Δ
T
→
0
Δ
T
⋅
T
p
−
T
p
Δ
T
=
lim
δ
ξ
→
0
exp
(
δ
ξ
^
)
exp
(
ξ
^
)
p
−
exp
(
ξ
^
)
p
δ
ξ
\frac{\partial Tp}{\partial T} =\lim\limits_{\Delta T \rightarrow 0}\frac{\Delta T \cdot Tp-Tp}{\Delta T}\\ =\lim\limits_{\delta \xi \rightarrow 0}\frac{\exp(\delta \xi\ \hat{}\ )\exp(\xi\ \hat{}\ )p -\exp(\xi\ \hat{}\ )p}{\delta \xi}
∂T∂Tp=ΔT→0limΔTΔT⋅Tp−Tp=δξ→0limδξexp(δξ ^ )exp(ξ ^ )p−exp(ξ ^ )p
化简后最终可得:
∂
T
p
∂
T
=
[
I
−
(
R
p
+
t
)
^
0
T
0
T
]
\frac{\partial Tp}{\partial T} = \begin{bmatrix} I & -(Rp+t)\ \hat{ } \\ 0^T & 0^T \\ \end{bmatrix}
∂T∂Tp=[I0T−(Rp+t) ^0T]
实际应用中,变换矩阵的求导都是利用振动方程, 例如BA求解时雅可比矩阵J的计算.
从实际应用了解Bundle Adjustment(BA)
我们直接从实际应用来了解Bundle Adjustment,首先定义一个通用观测方程为:
u
=
h
(
ξ
,
p
)
u=h(\xi,p)
u=h(ξ,p)
其中
ξ
\xi
ξ为变换矩阵T对应的李代数,指代此时相机的位姿, p 为各个路标点的三维点坐标,而观测数据u则是像素坐标。以最小二乘的角度来考虑,那么可以列写关于此次观测的误差:
e
=
u
−
h
(
ξ
,
p
)
e=u-h(\xi,p)
e=u−h(ξ,p)
然后,把其他时刻的观测量也考虑进来:设
u
i
j
u_{ij}
uij为在位姿
ξ
i
\xi_i
ξi 处观察路标
p
j
p_j
pj产生的数据,那么整体的代价函数为:
1
2
∑
i
=
1
m
∑
j
=
1
n
∣
∣
e
i
j
∣
∣
2
2
=
1
2
∑
i
=
1
m
∑
j
=
1
n
∣
∣
u
i
j
−
h
(
ξ
i
,
p
j
)
∣
∣
2
2
(
1
)
\frac{1}{2}\sum_{i=1}^{m}\sum_{j=1}^{n}||e_{ij}||_2^2= \frac{1}{2}\sum_{i=1}^{m}\sum_{j=1}^{n}||u_{ij}-h(\xi_i,p_j)||_2^2 \qquad (1)
21i=1∑mj=1∑n∣∣eij∣∣22=21i=1∑mj=1∑n∣∣uij−h(ξi,pj)∣∣22(1)
对这个最小二乘进行求解,即寻找最好的相机位姿和路标点使误差最小,相当于对位姿和路标同时作了调整,也就是所谓的 BA, 上式的求解在SLAM中属于全局BA, 如果只考虑两帧的时间,这个问题就可以当成PNP问题,也就是局部BA.
BA求解思路
在上面的观测方程中,我们把自变量定义成所有待优化的变量,即令:
x
=
[
ξ
1
,
.
.
.
,
ξ
m
,
p
1
,
.
.
.
,
p
n
]
T
e
=
f
(
x
)
x= [\xi_1,...,\xi_m,p_1,...,p_n]^T\\ e=f(x)\\
x=[ξ1,...,ξm,p1,...,pn]Te=f(x)
则式(1)BA问题可以看成一个基本的最小二乘问题:
x
=
arg
min
x
1
2
∣
∣
f
(
x
)
∣
∣
2
2
x=\arg\min\limits_{x}\frac{1}{2}||f(x)||_2^2
x=argxmin21∣∣f(x)∣∣22
大部分情况下,
f
f
f较为复杂,不方便使用求导法直接求解,而是采取迭代的方法,类似于梯度下降. 这里介绍使用Gauss-Newton方法:
首先将
f
(
x
)
f(x)
f(x)一阶泰勒展开:
f
(
x
+
Δ
x
)
≈
f
(
x
)
+
J
(
x
)
Δ
x
f(x+\Delta x)\approx f(x)+J(x)\Delta x
f(x+Δx)≈f(x)+J(x)Δx
注意这时
f
f
f与
x
x
x都是多元的,因此J(x)实际上是m*n的矩阵,也就是一个雅可比矩阵(一阶偏导数以一定方式排列成的矩阵).
当前的目标是为了寻找下降矢量
Δ
x
\Delta x
Δx,使得
∣
∣
f
(
x
+
Δ
x
)
∣
∣
2
||f(x + \Delta x )||^2
∣∣f(x+Δx)∣∣2 达到最小。为了求 ∆x,我们需要解一个线性的最小二乘问题:
Δ
x
∗
=
arg
min
Δ
x
∣
∣
f
(
x
)
+
J
(
x
)
Δ
x
)
∣
∣
2
2
\Delta x^*=\arg\min\limits_{\Delta x}||f(x) + J(x)\Delta x)||_2^2
Δx∗=argΔxmin∣∣f(x)+J(x)Δx)∣∣22
将上述目标函数
∣
∣
f
(
x
)
+
J
(
x
)
Δ
x
)
∣
∣
2
||f(x) + J(x)\Delta x)||^2
∣∣f(x)+J(x)Δx)∣∣2对
Δ
x
\Delta x
Δx求导,并令导数为零,省略计算过程 ,可得如下方程组:
J
(
x
)
T
J
(
x
)
Δ
x
=
−
J
(
x
)
T
f
(
x
)
J(x)^TJ(x)\Delta x = -J(x)^Tf(x)
J(x)TJ(x)Δx=−J(x)Tf(x)
我们将此方程称为增量方程,通过它可以直接求解
Δ
x
\Delta x
Δx,因此Gauss-Newton 的算法步骤可以写成:
-
给定初始值 x 0 x_0 x0 。
-
对于第 k 次迭代,求出当前的雅可比矩阵 J ( x k ) J (x_k) J(xk)和误差 f ( x k ) f (x_k ) f(xk)。
-
求解增量方程: J ( x k ) T J ( x k ) Δ x k = − J ( x k ) T f ( x k ) J(x_k)^TJ(x_k)\Delta x_k = -J(x_k)^Tf(x_k) J(xk)TJ(xk)Δxk=−J(xk)Tf(xk).
-
若 Δ x k \Delta x_k Δxk足够小,则停止。否则,令 x k + 1 = x k + Δ x k x_{k+1} = x_k + \Delta x_k xk+1=xk+Δxk,返回 2.
因此问题的关键在于求解雅可比矩阵
J
(
x
)
J (x)
J(x), 因为x由各时刻的
ξ
\xi
ξ和p组成, 易得:
∣
∣
f
(
x
+
Δ
x
)
∣
∣
2
2
=
∣
∣
f
(
x
)
+
F
Δ
ξ
+
E
Δ
p
∣
∣
2
2
||f(x+\Delta x)||_2^2=||f(x)+F \Delta \xi +E \Delta p||_2^2
∣∣f(x+Δx)∣∣22=∣∣f(x)+FΔξ+EΔp∣∣22
其中F,E分别为f(x)关于
ξ
\xi
ξ和p的偏导,由分块矩阵, 雅可比矩阵J可由F和E拼凑起来, 即
J
=
[
F
E
]
J=[F E]
J=[FE]. 由相机模型和振动方程可得(视觉SLAM14讲7.73):
F
=
−
[
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
′
]
F=- \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_yX'Y'}{Z'^2}& -\frac{f_yX'}{Z'}\\ \end{bmatrix}
F=−[Z′fx00Z′fy−Z′2fxX′−Z′2fyY′−Z′2fxX′Y′−fy+Z′2fyY2fx+Z′2fxX2Z′2fyX′Y′−Z′fxY′−Z′fyX′]
E = − [ f x Z ′ 0 − f x X ′ Z ′ 2 0 f y Z ′ − f y Y ′ Z ′ 2 ] R E=- \begin{bmatrix} \frac{f_x}{Z'} & 0 & -\frac{f_xX'}{Z'^2} \\ 0 & \frac{f_y}{Z'} & -\frac{f_yY'}{Z'^2} \\ \end{bmatrix}R E=−[Z′fx00Z′fy−Z′2fxX′−Z′2fyY′]R
其中
f
x
,
f
y
f_x,f_y
fx,fy指的是相机内参的参数而不是偏导.R为旋转矩阵,
[
X
′
,
Y
′
,
Z
′
]
[X',Y',Z']
[X′,Y′,Z′]为点P在相机坐标系下的坐标,即
[
X
′
,
Y
′
,
Z
′
]
=
T
P
[X',Y',Z']=TP
[X′,Y′,Z′]=TP
至此, Gauss-Newton 的算法步骤中的每一步都可计算,因此就可以计算出BA的解了. 当然实际求解时,由于雅可比矩阵J过大, 需要利用矩阵的稀疏性和边缘性来加速运算,这时就要用到g2o 和 Ceres 两个库.