第一章:李群与李代数基础
各位同学好,我是这门课的主讲。今天咱们来聊聊视觉SLAM里最绕不开的一个数学工具——李群与李代数。
说实话,我第一次接触这东西的时候,也是一头雾水。什么SO(3)、SE(3),什么指数映射、对数映射,感觉像是在学天书。但后来在实际项目中踩过几次坑,才真正体会到:不懂李群李代数,你根本没法优雅地处理旋转和位姿优化。
1.1 为什么需要李群与李代数?
先问大家一个问题:在三维空间中,我们怎么表示一个旋转?
最常见的做法是用旋转矩阵R。R是3x3的矩阵,满足RTR = I,且det(R)=1。所有这样的R构成了一个集合,这个集合在数学上就叫特殊正交群SO(3)。
那平移呢?加上平移,我们就得到了特殊欧氏群SE(3),也就是我们常说的位姿变换矩阵。
但问题来了——
- 旋转矩阵有9个参数,但自由度只有3个。冗余!
- 优化时,你没法直接对R做加法。R + ΔR 大概率不再是旋转矩阵。
- 插值、求导、更新……这些在流形上操作都很麻烦。
所以,我们需要一个更优雅的表示方式。这就是李代数登场的原因。
核心思想:李群是流形,李代数是它的切空间。我们在切空间里做优化,再映射回流形上更新。这样既保证了约束,又方便求导。
1.2 SO(3)与SE(3)的定义
先看SO(3):
SO(3) = { R ∈ ℝ³ˣ³ | RᵀR = I, det(R) = 1 }
说白了,就是所有合法的旋转矩阵组成的群。群运算就是矩阵乘法。
再看SE(3):
SE(3) = { T = [R t; 0 1] ∈ ℝ⁴ˣ⁴ | R ∈ SO(3), t ∈ ℝ³ }
这个更常见,就是我们的位姿变换矩阵。注意右下角那个1,这是齐次坐标的写法。
我记得有一次做多传感器标定,需要融合IMU和相机的位姿。如果直接用旋转矩阵做优化,每次迭代都要重新正交化,麻烦得要命。后来换成李代数表示,整个流程清爽多了。
1.3 指数映射与对数映射
这是李群和李代数之间的桥梁。
对于SO(3),它的李代数是so(3),其实就是三维向量φ ∈ ℝ³。这个向量对应一个反对称矩阵:
φ^ = [0 -φ₃ φ₂;
φ₃ 0 -φ₁;
-φ₂ φ₁ 0 ]
指数映射:从李代数到李群。说白了就是:给定一个旋转向量φ,怎么得到旋转矩阵R?
公式就是罗德里格斯公式:
R = exp(φ^) = I + sinθ/θ * φ^ + (1-cosθ)/θ² * (φ^)²
其中θ = ||φ||,是旋转角度。
对数映射:反过来,从旋转矩阵R提取旋转向量φ。
θ = arccos((tr(R)-1)/2)
φ = θ/(2sinθ) * (R - Rᵀ)∨
这里∨表示从反对称矩阵恢复成向量。
我的经验:实际编程时,千万别自己手写这些公式。直接用Sophus或Eigen库,它们已经封装好了。我早期犯过傻,自己实现指数映射,结果角度接近π时数值不稳定,调试了一整天。
对于SE(3),它的李代数是se(3),是一个六维向量ξ = [ρ, φ]ᵀ。指数映射稍微复杂一点,但原理一样:
exp(ξ^) = [exp(φ^) Vρ;
0 1]
其中V是一个3x3的矩阵,跟φ有关。具体公式我就不写了,大家记住有这个东西就行。
1.4 BCH近似公式
这个知识点,说白了就是回答一个问题:两个李代数相加,对应的李群是什么?
你可能会想:exp(φ₁) * exp(φ₂) = exp(φ₁ + φ₂) 吗?
答案是:不成立。因为矩阵乘法不满足交换律。
那怎么办?用Baker-Campbell-Hausdorff公式,简称BCH公式。
完整形式很复杂,我们一般用它的近似:
ln(exp(φ₁) * exp(φ₂)) ≈ φ₁ + φ₂ + ½[φ₁, φ₂] + ...
其中[φ₁, φ₂] = φ₁^ φ₂^ - φ₂^ φ₁^,是李括号。
在实际SLAM中,我们更常用的是左乘扰动模型下的BCH近似:
exp(φ + Δφ) ≈ exp(φ) * exp(Jₗ(φ)⁻¹ * Δφ)
或者反过来:
exp(Δφ) * exp(φ) ≈ exp(φ + Jᵣ(φ)⁻¹ * Δφ)
这里的Jₗ和Jᵣ分别是左、右雅可比矩阵。公式看起来吓人,但实际用的时候,很多库已经帮你算好了。
注意:BCH近似只在Δφ很小的时候成立。如果你做迭代优化,每次步长太大,近似就会失效。我曾在一次VIO项目中,因为初始值太差,导致BCH近似发散,最后不得不改用LM算法加阻尼。
1.5 扰动模型
终于到了最实用的部分。在SLAM后端优化中,我们需要对位姿求导。怎么求?
有两种主流方式:
- 直接求导:对R本身求导,但R有约束,不好处理。
- 扰动模型:给R左乘或右乘一个微小扰动,对扰动求导。
我个人更推荐左乘扰动模型。为什么?因为它形式简单,而且跟实际物理意义更吻合。
具体来说:
∂(Rp) / ∂φ = - (Rp)^
这个公式的意思是:旋转矩阵R作用在点p上,对旋转向量φ的导数,等于-Rp的反对称矩阵。
是不是很简洁?
对于SE(3)的扰动模型,稍微复杂一点:
∂(Tp) / ∂ξ = [I, - (Rp + t)^;
0, 0]
这个雅可比矩阵在BA(Bundle Adjustment)中会频繁出现。你写优化代码时,大部分时间就是在算这个矩阵。
避坑指南:我曾经在写g2o的边时,把左乘和右乘搞混了。结果优化一直不收敛,检查了三天才发现是雅可比符号反了。所以,一定要明确你的扰动是左乘还是右乘,并在代码里保持一致。
1.6 知识体系总览
下面这张图总结了本章的核心逻辑:
1.7 本章小结
好了,我们来捋一捋今天的内容:
- SO(3)和SE(3):旋转和位姿的群表示,有约束,不好直接优化。
- 指数/对数映射:在流形和切空间之间来回切换,是优化的基础。
- BCH近似:处理两个李代数相加的问题,注意近似条件。
- 扰动模型:求导利器,左乘扰动是主流做法。
说实话,这些数学工具第一次看确实有点抽象。但别急,后面几章我们会把它们用到实际的视觉里程计代码中。到时候你回头看,会发现——嗯,原来就这么回事。
我的建议:初学者可以先跳过BCH公式的推导,直接记住结论和用法。等后面做优化遇到问题了,再回来啃细节。学习要讲究节奏,别一开始就钻牛角尖。
公众号:蓝海资料掘金营,微信deep3321