3. 数学基础回顾(下):李群与李代数(SO3, SE3),扰动模型与求导,这在优化中有什么用?

好,咱们接着聊数学基础。上一节讲了三维空间刚体运动的基本表示,这一节要深入一点,聊聊李群和李代数。

说实话,我刚入行那会儿,看到「李群」「李代数」这几个字就头大。心想我一个搞工程的,干嘛要学这么纯的数学?后来在项目里被优化问题折磨得死去活来,才明白这东西有多重要。

你想想看,SLAM 的核心就是状态估计。我们要估计机器人的位姿,还要估计地图点的位置。这本质上是个优化问题。而优化嘛,就得求导。但位姿这东西,它不在普通的欧式空间里,它在一个流形上。在流形上怎么求导?这就是李群和李代数要解决的问题。

3.1 为什么需要李群与李代数?

我们先看一个简单的问题。假设你有一个旋转矩阵 R,它属于 SO(3)。你想对它求导,比如求 R 对时间的导数。但 R 本身有约束:R^T R = I,且 det(R) = 1。你直接对矩阵里的 9 个元素求导,求出来的结果很可能不满足这个约束。这就麻烦了。

我早期做手眼标定的时候就踩过这个坑。直接用矩阵元素做优化,结果迭代出来的矩阵根本不是旋转矩阵,还得再投影回去,精度和效率都很差。

李群和李代数提供了一种优雅的方式:

  • 李群(SO(3), SE(3))是连续的群,它描述了旋转和变换本身。
  • 李代数(so(3), se(3))是李群在单位元处的切空间。说白了,它是一个向量空间,没有那些复杂的约束。

这样一来,我们可以在李代数上做优化(因为它是向量空间,可以随便加减求导),然后通过指数映射回到李群上。这就绕开了约束问题。

核心思想: 优化在李代数上进行,结果映射回李群。

3.2 SO(3) 与 so(3)

咱们先看旋转。SO(3) 是三维旋转群,它的李代数是 so(3)。

so(3) 里的元素是三维向量,记作 φ = (φ1, φ2, φ3)^T。这个向量对应一个反对称矩阵:

φ^ = [  0   -φ3   φ2 ]
     [ φ3    0   -φ1 ]
     [-φ2   φ1    0  ]

指数映射把 so(3) 映射到 SO(3):

R = exp(φ^)

这个公式的物理意义是什么?φ 的方向是旋转轴,它的模长是旋转角度。这就是罗德里格斯公式。

反过来,对数映射把 SO(3) 映射回 so(3):

φ^ = ln(R)

嗯,这里要注意,对数映射不是唯一的,因为旋转角度可以加上 2π 的整数倍。但在实际应用中,我们通常取模长在 [0, π] 范围内的那个解。

3.3 SE(3) 与 se(3)

再看变换。SE(3) 是三维欧式变换群,它的李代数是 se(3)。

se(3) 里的元素是六维向量,记作 ξ = (ρ, φ)^T。其中 ρ 是平移部分,φ 是旋转部分。

se(3) 对应的矩阵形式是:

ξ^ = [ φ^   ρ ]
     [ 0^T  0 ]

指数映射把 se(3) 映射到 SE(3):

T = exp(ξ^) = [ R   t ]
                [ 0^T  1 ]

这里的 Rt 就是变换矩阵的旋转和平移部分。

个人经验: 在实际代码中,我们很少直接调用 exp 和 ln 的完整矩阵运算。Eigen、Sophus、g2o、Ceres 这些库都封装好了。你只需要知道它们背后的含义就行。

3.4 扰动模型与求导

好,重头戏来了。在优化中,我们经常需要求一个函数关于位姿的导数。比如,给定一个空间点 p,经过变换 T 后得到 p' = T p。我们想求 p'T 的导数。

有两种求导方式:

  1. 直接求导:T 矩阵本身求导。但 T 有约束,求导结果不直观。
  2. 扰动模型:T 左乘或右乘一个微小的扰动,然后求导。这个扰动是在李代数上的。

我个人习惯用扰动模型,因为它更简洁,而且避免了复杂的约束处理。

以 SO(3) 为例。假设我们有一个旋转 R,点 p 旋转后得到 p' = R p。我们想求 p'R 的导数。

R 左乘一个微小旋转 ΔR = exp(φ^),其中 φ 是一个小量。那么:

∂(R p) / ∂φ = - (R p)^

这个结果非常简洁。它告诉我们,旋转后的点对旋转扰动的导数,就是该点的反对称矩阵。

对于 SE(3),扰动模型类似。给 T 左乘一个微小变换 ΔT = exp(ξ^),其中 ξ = (δρ, δφ)^T。那么:

∂(T p) / ∂ξ = [ I   - (R p + t)^ ]
                [ 0^T     0^T        ]

这个矩阵就是雅可比矩阵,在优化中会频繁用到。

避坑指南: 我曾经在推导 BA(Bundle Adjustment)的雅可比时,搞混了左扰动和右扰动。左扰动和右扰动的结果差一个符号。一定要根据你的优化库的约定来。比如 g2o 和 Ceres 通常用左扰动。

3.5 在优化中有什么用?

说了这么多,到底有什么用?我举几个实际例子。

1. 点云配准(ICP)

ICP 的核心是迭代最近点。每次迭代,我们要估计一个变换 T,使得源点云和目标点云的对齐误差最小。这个误差函数对 T 的导数,就是用李代数扰动模型来算的。

2. 图优化(Graph SLAM)

在 SLAM 中,我们构建一个图,节点是位姿,边是观测约束。优化这个图,就是调整所有节点的位姿,使得观测误差最小。每个节点的位姿更新,都是在李代数上完成的。

3. 视觉惯性里程计(VIO)

VIO 里要优化 IMU 预积分和视觉重投影误差。IMU 预积分本身就是在李代数上做的,因为旋转的积分需要指数映射。

说白了,只要你的优化变量涉及旋转或变换,你就离不开李群和李代数。它是连接连续优化和离散状态的桥梁。

总结一下:

  • 李群(SO(3), SE(3))描述旋转和变换本身。
  • 李代数(so(3), se(3))是向量空间,方便求导和优化。
  • 指数/对数映射连接两者。
  • 扰动模型是求导的标准方法,简洁且无约束。

嗯,这一节的内容确实有点抽象。但相信我,等你真正开始写优化代码的时候,就会觉得这些推导是顺理成章的。下一节我们会用代码把这些公式实现一遍,到时候你就知道它们有多好用了。

李群与李代数知识体系 核心问题:如何在流形上优化? 李群 SO(3): 旋转矩阵 SE(3): 变换矩阵 李代数 so(3): 三维向量 (旋转轴+角度) se(3): 六维向量 (平移+旋转) 指数映射 对数映射 求导方法:扰动模型(左扰动 / 右扰动) 应用场景:点云配准(ICP) / 图优化(SLAM) / VIO 最终目标:高效、无约束的位姿优化

公众号:蓝海资料掘金营,微信deep3321