SLAM中的李群与李代数【SLAM】

SLAM中为什么要用李代数?

本人从SLAM问题的角度出发得出的结论目前是这样的:在SLAM问题中,为了表示旋转姿态需要旋转矩阵或者四元数,在后端优化过程中为了求解非线性优化问题需要求雅可比矩阵,即求导;在运动学的描述中也需要求导;这两种情况中一般是对位姿求导,这时就产生了一个矛盾:根据导数的定义可知,对某一个变量求导,定义中需要该变量产生微小增量,为了保证物理意义的正确,我们希望该变量对加法是封闭的,而旋转矩阵或者四元数对加法都不封闭,所以引入李代数。李代数对李括号具有封闭性,李代数和李群中的元素通过指数映射和对数映射一一对应(对于 S O ( 3 ) SO(3) SO(3)李群需要规定旋转角在 ± π \pm \pi ±π之间),SLAM中引入的李代数的李括号刚好都是加法,这样我们就可以用李代数进行求导过程。

BCH线性近似解决了什么问题?

BCH线性近似提供了在SLAM中的李代数上做加法李群上做乘法的对应关系。

指数映射与对数映射

每个李群都有与之对应的李代数,李代数描述了李群的局部性质,即单位元的正切空间。

与 S O ( 3 ) SO(3) SO(3)对应的李代数为 s o ( 3 ) \mathfrak{so}(3) so(3):
s o ( 3 ) = { ϕ ∈ R 3 , Φ = ϕ ∧ ∈ R 3 × 3 } \mathfrak{so}(3) = \{ \phi \in \mathbb{R}^{3}, \mathit{\Phi} = \phi^{\wedge} \in \mathbb{R}^{3\times3} \} so(3)={ϕ∈R3,Φ=ϕ∧∈R3×3}

SO(3)上的指数映射

R = e x p ( ϕ ∧ ) = ∑ n = 0 ∞ 1 n ! ( ϕ ∧ ) n R = exp(\phi^{\wedge}) = \sum_{n=0}^{\infty} \frac{1}{n!}(\phi^{\wedge})^{n} R=exp(ϕ∧)=n=0∑∞n!1(ϕ∧)n

如果把 ϕ \phi ϕ写成 θ n \theta \mathbf{n} θn,经过推导会发现:
e x p ( θ n ∧ ) = c o s θ I + ( 1 − c o s θ ) n n T + s i n θ n ∧ exp(\theta \mathbf{n}^{\wedge}) = cos\theta I + (1-cos \theta) \mathbf{n} \mathbf{n}^{T} + sin \theta \mathbf{n}^{\wedge} exp(θn∧)=cosθI+(1−cosθ)nnT+sinθn∧

这与罗德里格斯公式如出一辙。

这说明 s o ( 3 ) \mathfrak{so}(3) so(3)的物理意义是和旋转矩阵 R R R对应的旋转向量。

SO(3)上的对数映射

ϕ = l n ( R ) ∨ = ( ∑ n = 0 ∞ ( − 1 ) n n + 1 ( R − I ) n + 1 ) \phi = ln(R)^{\vee} = \left ( \sum_{n=0}^{\infty} \frac{(-1)^{n}}{n+1}(R-I)^{n+1} \right) ϕ=ln(R)∨=(n=0∑∞n+1(−1)n(R−I)n+1)

一般不用,要求 S O ( 3 ) SO(3) SO(3)的对数映射其实就是求对应的旋转向量,直接求 θ \theta θ和特征值为1的特征向量即可。

BCH线性近似

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]]+\dots ln(exp(A)exp(B))=A+B+21[A,B]+121[A,[A,B]]−121[B,[A,B]]+...

二元运算符 [ , ] [,] [,]为李括号。

线性近似表达:
l n ( e x p ( ϕ 1 ∧ ) e x p ( ϕ 2 ∧ ) ) ∨ ≈ { J l ( ϕ 2 ) − 1 ϕ 1 + ϕ 2 当 ϕ 1 为小量 J r ( ϕ 1 ) − 1 ϕ 2 + ϕ 1 当 ϕ 2 为小量 ln(exp(\phi_{1}^{\wedge})exp(\phi_{2}^{\wedge}))^{\vee} \approx \begin{cases} J_{l}(\phi_{2})^{-1}\phi_{1} + \phi_{2} & \text{ 当 } \phi_{1}\text{为小量} \\ J_{r}(\phi_{1})^{-1}\phi_{2} + \phi_{1} & \text{ 当 } \phi_{2}\text{为小量} \end{cases} ln(exp(ϕ1∧)exp(ϕ2∧))∨≈{Jl(ϕ2)−1ϕ1+ϕ2Jr(ϕ1)−1ϕ2+ϕ1 当 ϕ1为小量 当 ϕ2为小量

对于 ϕ = θ n \phi = \theta \mathbf{n} ϕ=θn:
J l ( ϕ ) = s i n θ θ I + ( 1 − s i n θ θ ) n n T + 1 − c o s θ θ n ∧ J_{l}(\phi) = \frac{sin\theta}{\theta}I + (1 - \frac{sin\theta}{\theta})\mathbf{n}\mathbf{n}^{T} + \frac{1 - cos\theta}{\theta}\mathbf{n}^{\wedge} Jl(ϕ)=θsinθI+(1−θsinθ)nnT+θ1−cosθn∧

J l ( ϕ ) − 1 = θ 2 c o t θ 2 I + ( 1 − θ 2 c o t θ 2 ) n n T − θ 2 n ∧ J_{l}(\phi)^{-1} = \frac{\theta}{2}cot\frac{\theta}{2}I + (1 - \frac{\theta}{2}cot\frac{\theta}{2})\mathbf{n}\mathbf{n}^{T} -\frac{\theta}{2}\mathbf{n}^{\wedge} Jl(ϕ)−1=2θcot2θI+(1−2θcot2θ)nnT−2θn∧

J r ( ϕ ) = J l ( − ϕ ) J_{r}(\phi) = J_{l}(-\phi) Jr(ϕ)=Jl(−ϕ)

相关推荐
yuanbenshidiaos1 小时前
C++----------函数的调用机制
java·c++·算法
唐叔在学习1 小时前
【唐叔学算法】第21天:超越比较-计数排序、桶排序与基数排序的Java实践及性能剖析
数据结构·算法·排序算法
ALISHENGYA1 小时前
全国青少年信息学奥林匹克竞赛(信奥赛)备考实战之分支结构(switch语句)
数据结构·算法
chengooooooo1 小时前
代码随想录训练营第二十七天| 贪心理论基础 455.分发饼干 376. 摆动序列 53. 最大子序和
算法·leetcode·职场和发展
jackiendsc1 小时前
Java的垃圾回收机制介绍、工作原理、算法及分析调优
java·开发语言·算法
游是水里的游3 小时前
【算法day20】回溯:子集与全排列问题
算法
yoyobravery3 小时前
c语言大一期末复习
c语言·开发语言·算法
Jiude3 小时前
算法题题解记录——双变量问题的 “枚举右,维护左”
python·算法·面试
被AI抢饭碗的人3 小时前
算法题(13):异或变换
算法
nuyoah♂4 小时前
DAY36|动态规划Part04|LeetCode:1049. 最后一块石头的重量 II、494. 目标和、474.一和零
算法·leetcode·动态规划