前一篇大概介绍了李群李代数的相关性质,这里主要介绍李代数在SLAM中的作用。
BCH公式及其近似形式
李代数在SLAM中的作用主要是进行优化,优化过程就不可避免地需要涉及到求导的过程。
与标量不同,在矩阵中指数的运算法则并不适用,即是说在矩阵中:
l
n
(
e
x
p
(
A
)
e
x
p
(
B
)
)
≠
A
+
B
ln(exp(A)exp(B))\ne A+B
ln(exp(A)exp(B))=A+B
取而代之的时BCH公式:
l
n
(
e
x
p
(
A
)
e
x
p
(
B
)
)
=
A
+
B
+
1
2
[
A
,
B
]
+
1
12
[
A
,
[
A
,
B
]
]
−
1
12
[
B
,
[
A
,
B
]
]
+
.
.
.
ln(exp(A)exp(B))=A+B+\frac{1}{2}[A,B]+\frac{1}{12}[A,[A,B]]-\frac{1}{12}[B,[A,B]]+...
ln(exp(A)exp(B))=A+B+21[A,B]+121[A,[A,B]]−121[B,[A,B]]+...
其中的
“
[
,
]
”
“[,]”
“[,]”为李括号,也就是说,两个矩阵指数之积会由这两个矩阵的和与一系列由李括号组成的余项组成。对于SO(3),当
ϕ
1
\phi_{1}
ϕ1或
ϕ
2
\phi_{2}
ϕ2为小量时,小量二次以上的项都可以被忽略,即是有以下关系:
以第一个近似为例,当对一个旋转向量
R
2
R_{2}
R2(对应的李代数为
ϕ
2
\phi_{2}
ϕ2)左乘一个微小旋转矩阵
R
1
R_{1}
R1,可以近似看作在原有李代数
ϕ
2
\phi_{2}
ϕ2的基础上加上了
J
l
(
ϕ
2
)
−
1
ϕ
1
J_{l}(\phi_{2})^{-1}\phi_{1}
Jl(ϕ2)−1ϕ1(第二个近似同理,但是是右乘)。
李代数在BCH近似下分为左乘和右乘两种,注意区分。
这里的
J
J
J就是在上一篇关于李群李代数里提到的式子:
右乘的话只需要改变自变量的符号即可:
J
r
(
ϕ
)
=
J
l
(
−
ϕ
)
J_{r}(\phi)=J_{l}(-\phi)
Jr(ϕ)=Jl(−ϕ)
现在对于一个旋转
R
R
R(对应李代数为
ϕ
\phi
ϕ),给之左乘一个微小旋转
△
R
\triangle R
△R(对应于
△
ϕ
\triangle \phi
△ϕ),我们就有了如下关系:
反之,当我们在李代数上做加法运算时则有:
对于SE(3),也有类似的关系:
这里的
ȷ
\jmath
ȷ是一个
6
×
6
6\times6
6×6的矩阵。
SO(3)上的李代数的求导
在SLAM中要估计一个相机的位置和位姿,我们是通过SO(3)上的旋转矩阵或者SE(3)上的变换矩阵描述的。举个例子,在某时刻相机位姿为
T
T
T,其观察到世界坐标位于
p
p
p的一点,产生一个观测数据
z
z
z,那么我们就有如下关系:
z
=
T
p
+
ω
z=Tp+\omega
z=Tp+ω其中的
ω
\omega
ω为随机噪音。
由于噪音的存在我们无法获得精准的
z
−
p
z-p
z−p对应关系,所以现在我们就要对这个噪音产生的误差进行计算,即:
e
=
z
−
T
p
e=z-Tp
e=z−Tp
假设一共有
N
N
N个这样的路标点和观察,即是有
N
N
N个上式,我们现在要预计该相机的位姿,就是要求出一组
T
T
T,使整体误差最小化:
min
T
J
(
T
)
=
∑
i
=
1
N
∣
∣
z
i
−
T
p
i
∣
∣
2
2
\min_T J(T)=\sum_{i=1}^{N}||z_{i}-Tp_{i}||_{2}^{2}
TminJ(T)=i=1∑N∣∣zi−Tpi∣∣22
要求解这个问题,就要求
J
J
J对
T
T
T的导数,然而因为群SO(3)和SE(3)没有加法,所以我们一般转而处理它们的李代数(因为李代数是向量的集合,对加法封闭),因此思路一般分为两种:
- 用李代数表示位姿,然后对李代数进行求导;
- 对李群左乘或者右乘微小扰动,然后对这个扰动进行求导,称为左扰动和右扰动模型
第一种对应李代数求导模型,第二种对应扰动模型。
以下分别进行说明。
李代数求导
(其实这部分可不看,因为最后会发现扰动模型更适合)
现在处理SO(3)的情况。假设对空间一点
p
p
p进行旋转,得到
R
p
Rp
Rp,我们要计算旋转后的点坐标相对于旋转的角度,即是:
∂
(
R
p
)
∂
R
\frac{\partial(Rp)}{\partial R}
∂R∂(Rp)
由于SO(3)没有加法,所以我们转而求其对应的李代数,即是:
∂
(
e
x
p
(
ϕ
∧
)
p
)
∂
ϕ
\frac{\partial(exp(\phi^{\land})p)}{\partial \phi}
∂ϕ∂(exp(ϕ∧)p)
根据导数的定义计算:
第二行的近似为BCH近似,第三行为在0附近的泰勒展开舍去高阶项后的近似,第四到第五行将反对称符号看作叉积,交换后变号。于是我们可以得出以下式子:
这里简单解释下反对称矩阵和叉积的关系,也就是上面第四到第五行的变换:
a
=
[
a
1
,
a
2
,
a
3
]
b
=
[
b
1
,
b
2
,
b
3
]
a
×
b
=
[
i
j
k
a
1
a
2
a
3
b
1
b
2
b
3
]
=
[
a
2
b
3
−
a
3
b
2
−
(
a
1
b
3
−
a
3
b
1
)
a
1
b
2
−
a
2
b
1
]
=
[
0
−
a
3
a
2
a
3
0
−
a
1
−
a
2
a
1
0
]
[
b
1
b
2
b
3
]
a=[a_{1},a_{2},a_{3}]\\b=[b_{1},b_{2},b_{3}]\\ a\times b=\begin{bmatrix} i& j& k\\ a_{1}&a_{2}& a_{3}\\ b_{1}& b_{2}& b_{3}\end{bmatrix} \\= \begin{bmatrix} a_{2}b_{3}-a_{3}b_{2} \\ -(a_{1}b_{3}-a_{3}b_{1}) \\ a_{1}b_{2}-a_{2}b_{1}\end{bmatrix} \\ =\begin{bmatrix} 0 & -a_{3} & a_{2} \\ a_{3} & 0 & -a_{1} \\ -a_{2} & a_{1} & 0 \end{bmatrix} \begin{bmatrix} b_{1} \\ b_{2} \\ b_{3} \end{bmatrix}
a=[a1,a2,a3]b=[b1,b2,b3]a×b=⎣⎡ia1b1ja2b2ka3b3⎦⎤=⎣⎡a2b3−a3b2−(a1b3−a3b1)a1b2−a2b1⎦⎤=⎣⎡0a3−a2−a30a1a2−a10⎦⎤⎣⎡b1b2b3⎦⎤
所以,
a
a
a 与
b
b
b的叉乘即是等于
a
a
a的反对称矩阵乘以
b
b
b,同时叉乘满足如下反交换律:
a
×
b
=
−
b
×
a
a\times b=-b\times a
a×b=−b×a
回到原题,在上图中,由于结果式子含有形式比较复杂的
J
l
J_{l}
Jl,不容易计算,所以我们一般不采用上面的方法,而用下面的扰动模型的方法。
扰动模型(左乘)
扰动模型的求导方法是对
R
R
R进行一次扰动
△
R
\triangle R
△R,这个微小扰动可以左乘,也可以右乘,最后结果会有一点微小差异,这里以左乘为例。设左扰动
△
R
\triangle R
△R对应的李代数为
φ
\varphi
φ,然后对
φ
\varphi
φ进行求导:
相比直接对李代数求导,这里省去了一个雅可比
J
l
J_{l}
Jl的计算,更为简便。
SE(3)上的李代数求导
假设空间一点
p
p
p经过一次变换
T
T
T(对应的李代数为
ξ
\xi
ξ),得到
T
p
Tp
Tp(这里的
p
p
p注意用齐次坐标)。现给
T
T
T左乘一个扰动
△
T
=
e
x
p
(
δ
ξ
∧
)
\triangle T=exp(\delta \xi^{\land})
△T=exp(δξ∧),设扰动项的李代数为
δ
ξ
=
[
δ
ρ
,
δ
ϕ
]
T
\delta \xi=[\delta \rho,\delta \phi]^{T}
δξ=[δρ,δϕ]T,可得:
把最后的结果定义成一个算符
⊙
\odot
⊙,它把一个齐次空间坐标变换成一个
4
×
6
4\times 6
4×6的矩阵。
最后这里简单解释下矩阵求导的顺序,设
a
,
b
,
x
,
y
a,b,x,y
a,b,x,y都是列向量,其求导顺序为:
注:本文主要参考自《视觉SLAM十四讲》