数学基础(下):李群与李代数(SO3, SE3)、扰动模型、BCH公式近似

好,咱们接着聊。上一节我们把旋转矩阵、变换矩阵这些基础概念捋了一遍。但说实话,光有这些还不够。为什么?因为你在实际做标定时,要处理的是“优化”问题——比如让重投影误差最小。这就要对旋转求导。可旋转矩阵是正交阵,直接求导?嗯,约束条件太强,不好办。

这时候,李群和李代数就派上用场了。说白了,它们就是给旋转和变换“换了个坐标系”,让求导变得简单。我个人习惯把李群看作“操作本身”,李代数看作“操作的导数”。你想想看,是不是这个理?

核心思想:李群(SO3, SE3)描述刚体运动,李代数(so3, se3)描述其局部微分结构。通过指数映射和对数映射,两者可以互相转换。

1. SO3 与 so3:旋转的“群”与“代数”

先看三维旋转。所有旋转矩阵 R 构成一个群,叫 SO3。它满足:R^T R = I,det(R)=1。这是“群”。那“代数”呢?so3 其实就是三维向量 φ,或者叫旋转向量。每个 φ 对应一个反对称矩阵 φ^。

我在项目中遇到过一个问题:直接用旋转矩阵做优化,迭代几步就发散了。后来换成李代数表示,收敛得稳稳的。为什么?因为 so3 是向量空间,没有约束,梯度下降随便走。

指数映射把 so3 映射到 SO3:

R = exp(φ^)

反过来,对数映射把 SO3 映射回 so3:

φ = ln(R)^∨

这里有个小细节:指数映射的公式就是 Rodrigues 公式。你写代码时可以直接用 OpenCV 的 Rodrigues() 函数,它干的就是这个事。

个人经验:标定程序里,我习惯把旋转存成 so3 向量(3维),而不是 3x3 矩阵。这样参数少,优化快,还不容易出奇异值问题。

2. SE3 与 se3:带上平移的“全套”

旋转搞定了,那旋转加平移呢?这就是 SE3。SE3 里的元素是 4x4 变换矩阵 T:

T = [[R, t],
     [0, 1]]

对应的李代数 se3 是 6 维向量 ξ = (ρ, φ)。其中 φ 是旋转部分,ρ 是平移部分。注意,这里的 ρ 和平移 t 不是一回事,它们之间有个雅可比关系。

指数映射:

T = exp(ξ^)

对数映射:

ξ = ln(T)^∨

嗯,这里要注意:se3 的指数映射比 so3 复杂一点,因为平移部分会耦合旋转。不过别怕,代码里都有现成的实现。我自己写标定程序时,直接调 Sophus 库,几行代码搞定。

名称 维度 元素 指数映射
SO3 3 旋转矩阵 R R = exp(φ^)
so3 3 旋转向量 φ φ = ln(R)^∨
SE3 6 变换矩阵 T T = exp(ξ^)
se3 6 六维向量 ξ ξ = ln(T)^∨

3. BCH 公式近似:两个“小量”怎么合并

好,现在问题来了。优化时,我们经常要更新位姿。比如当前估计是 R,想加一个小扰动 ΔR,得到 R' = R * ΔR。但在李代数上,这对应什么?

答案是:两个李代数相加,不等于合并后的李代数。也就是说:

ln(exp(φ1^) * exp(φ2^))^∨ ≠ φ1 + φ2

那怎么办?用 BCH 公式近似。当 φ1 或 φ2 很小时,可以近似为:

ln(exp(φ1^) * exp(φ2^))^∨ ≈ φ1 + φ2 + 1/2 * φ1 × φ2 + ...

更常用的形式是左乘扰动模型:

ln(exp(φ^) * exp(δφ^))^∨ ≈ φ + J_l^{-1}(φ) * δφ

其中 J_l 是左雅可比。这个公式在优化里太常用了。我每次写 BA(光束法平差)时,都会用到它。

避坑指南:我曾经在标定程序里忘了加 J_l^{-1},结果迭代一直不收敛。查了两天才发现,原来是 BCH 近似没做对。记住:小扰动 δφ 在左乘时,要乘上左雅可比的逆。

4. 扰动模型:对旋转求导的“利器”

有了 BCH 近似,我们就可以对旋转求导了。常用的有两种模型:

  • 左乘扰动模型:在旋转矩阵左边乘一个小扰动 δR,然后对 δφ 求导。
  • 右乘扰动模型:在旋转矩阵右边乘一个小扰动,然后对 δφ 求导。

我个人习惯用左乘扰动模型。为什么?因为直观。你想,一个点 P 经过旋转 R 得到 RP。如果 R 有个小扰动,结果就是 R * exp(δφ^) * P。然后对 δφ 求导,得到:

∂(RP) / ∂δφ = - (RP)^

这个结果很简洁。在代码里,你只需要把 RP 的反对称矩阵算出来就行。

举个例子。假设你要优化相机外参,重投影误差对旋转的雅可比就是:

J = - (R * P)^

嗯,就这么简单。我刚开始学的时候,觉得李代数好抽象。后来写了几次代码,发现其实就是几个矩阵乘法的事。

核心结论:扰动模型把对旋转矩阵的求导,转化成了对李代数的求导。结果是一个简单的反对称矩阵。这是标定、SLAM、BA 等算法的数学基础。

5. 知识体系总览

为了让你看得更清楚,我画了一张图。它把这一章的核心逻辑串起来了:

李群与李代数知识体系 问题:旋转/变换如何求导? 解决方案:引入李群(SO3, SE3)与李代数(so3, se3) 指数/对数映射 R = exp(φ^), φ = ln(R)^∨ BCH公式近似 + 扰动模型 ∂(RP)/∂δφ = -(RP)^ 应用:外参标定、SLAM、BA优化

你看,整个逻辑很清晰:从“怎么对旋转求导”这个问题出发,引出李群和李代数,然后用指数/对数映射做转换,最后用 BCH 近似和扰动模型得到简洁的导数公式。这一套下来,标定里的优化问题就迎刃而解了。

实战建议:刚开始学的时候,别死磕数学推导。先会用,再理解。我建议你写个小程序:随机生成一个旋转矩阵,用对数映射转成 so3,再加个小扰动,用指数映射转回来,看看结果对不对。动手试一次,比看十遍书都管用。

好了,这一章就到这里。数学基础打牢了,后面讲标定流程时,你就能理解每一步在干什么了。

可可精品资料库