前言
随手翻了下,这是《视觉slam十四讲》书里最理论的一章了,看完了觉得也挺有趣的!
理论部分
李群与李代数是什么?为什么slam要引入它们?
李群
首先从群说起,群是一种只定义一种运算的集合,需要满足“封结幺逆”四个条件,
可以验证,旋转矩阵(集合)和矩阵乘法(运算)可以满足上述条件,可以构成一种群,其他常见的如整数和加法运算(Z,+)也可以构成一种群
李群是一种光滑连续的群,像(Z,+)就是李群。
李代数
旋转矩阵满足
对时间求导满足
这样矩阵
R
˙
(
t
)
R
(
t
)
T
\dot{R}(t)R(t)^T
R˙(t)R(t)T为反对称矩阵,任意反对称矩阵都有与其对应的向量,设上述矩阵对应向量为
ϕ
(
t
)
\phi(t)
ϕ(t),
设零时刻两个坐标系重合,则此时旋转矩阵为单位阵,则按泰勒展开,R(t)可以写成
详细推导过程参考原书。高博书中给出了下面这句话,让我感觉很困惑,细看一遍这里和
R
R
R对应的
ϕ
\phi
ϕ实际上反映了
R
R
R的导数(所以上式指数括号中还乘了一个t),而下一节讲述李代数
ϕ
\phi
ϕ反映的是R,是有所区别的。
李代数定义如下
二元运算称为李运算。
我们在这里将三维向量(集合),实数域(集合),二元运算(如下)定义为SO(3)空间上的李代数
s
o
(
3
)
\mathfrak{so}(3)
so(3)
SE(3)空间上的李代数
s
e
(
3
)
\mathfrak{se}(3)
se(3)定义如下
可以证明,有下列恒等式成立
等式左边是李代数的
e
e
e指数,而等式右边等价为旋转矩阵(罗德里格斯公式),也即李代数的指数形式(映射)为李群(旋转矩阵)。
如果求取李代数
s
e
(
3
)
\mathfrak{se}(3)
se(3)的指数形式,可以得到
可以看出李代数中的
ρ
\rho
ρ和其指数形式中的
t
t
t不是一致的,而是差了一个系数
J
J
J。
总结起来,李群和李代数的变换关系如下
为什么需要李群和李代数
可以看出,李群和李代数实际上从一个更高的理论层面揭示了旋转矩阵和旋转向量直接的关系,并且将平移参数统一了进来。
李代数的求导
如果我们在
S
O
(
3
)
SO(3)
SO(3)空间做两次连续旋转(及旋转矩阵的两次乘积),下式BCH公式可以近似表示
s
e
(
3
)
\mathfrak{se}(3)
se(3)的等价量
写成增量形式,如下
式4.34可以表示李代数的一次旋转
(
ϕ
+
Δ
ϕ
)
(\phi +\Delta\phi)
(ϕ+Δϕ)在李群上的两次旋转
e
x
p
(
ϕ
−
)
exp(\phi ^{-})
exp(ϕ−)和
e
x
p
(
J
r
,
ϕ
−
)
exp(J_r,\phi ^{-})
exp(Jr,ϕ−)
空间点对李代数求导,使用极限定义的方式
使用扰动模型的方式
这两种方式的结果不一样,书中说这两种方式不一样,第二种更简洁所以更好,我个人认为第一种才符合求导的定义,第二种当扰动为
e
x
p
(
ϕ
)
exp(\phi)
exp(ϕ)时,其里代数变化量不是
ϕ
\phi
ϕ,具体形式可参见BCH公式,这里可以留待后续考虑
实践部分
有了使用Eigen库的经验,使用Sophus库部分较为简单。疑惑有两点:
1、Sophus库为什么不用安装,程序如何找到库的地址
2、为什么示例中引用了Eigen库但是不需要在CMakeLIsts.txt中包含
习题部分
自己参考了《视觉SLAM十四讲》第二版第四讲习题_超详细推导全部推导了一遍,受益匪浅。