3、刚体变换与李群李代数:旋转矩阵、四元数、欧拉角、SE(3)与so(3)

各位同学,欢迎来到第三讲。

说实话,这一章是整个外参标定里最「劝退」的部分。很多工程师一看到旋转矩阵、四元数就头大。但我可以负责任地告诉你——搞不懂李群李代数,你连标定代码都看不懂。

我自己刚入行时,也在这上面栽过跟头。有一次做激光雷达和相机的联合标定,明明算法流程都对,结果跑出来的外参就是不对。折腾了两天,最后发现是欧拉角万向锁导致雅可比矩阵奇异。嗯,从那以后,我再也不敢只用欧拉角做优化了。

核心认知:刚体变换描述的是「一个坐标系下的点,如何映射到另一个坐标系」。而李群李代数,则是我们用来「优雅地优化」这个变换的数学工具。

3.1 旋转的三种表达方式

我们先从最基础的旋转说起。一个刚体在三维空间中的旋转,有三种主流表达方式。我个人的建议是:理解上靠欧拉角,计算上靠旋转矩阵,存储和插值上靠四元数。

3.1.1 旋转矩阵

旋转矩阵是一个 3x3 的正交矩阵,行列式为 +1。它属于特殊正交群 SO(3)。

说白了,旋转矩阵就是一组基向量在另一个坐标系下的投影。你想想看,一个坐标系绕 x 轴转 θ 角,对应的旋转矩阵长这样:

R_x(θ) = [1      0       0   ]
         [0   cosθ   -sinθ  ]
         [0   sinθ    cosθ  ]

我在项目中遇到过一个问题:直接用旋转矩阵做优化时,9 个参数有 6 个约束(正交+行列式为1),优化器很容易跑飞。这就是为什么我们需要引入李代数。

3.1.2 欧拉角

欧拉角用三个角度表示旋转,直观但坑多。最常见的坑就是万向锁——当中间轴旋转到 ±90° 时,会丢失一个自由度。

避坑指南:我曾经在无人机姿态估计中,直接用欧拉角做 EKF 更新。结果飞机做大机动时,俯仰角接近 90°,航向角和滚转角突然耦合,姿态直接发散。后来全部换成四元数才解决。

欧拉角的另一个问题是:旋转顺序很重要。ZYX、ZYZ、XYZ 等不同顺序,对应的旋转矩阵完全不同。做标定时,一定要确认你的传感器手册用的是哪种顺序。

3.1.3 四元数

四元数是我个人最喜欢的旋转表达方式。它没有万向锁,插值平滑,而且只需要 4 个参数。

一个单位四元数 q = [w, x, y, z]ᵀ,满足 w² + x² + y² + z² = 1。它对应的旋转矩阵是:

R = [1-2(y²+z²)   2(xy-wz)     2(xz+wy)   ]
    [2(xy+wz)     1-2(x²+z²)   2(yz-wx)   ]
    [2(xz-wy)     2(yz+wx)     1-2(x²+y²) ]

注意:四元数有「双覆盖」特性——q 和 -q 表示同一个旋转。这在优化时会导致歧义,需要小心处理。

表达方式 参数数量 优点 缺点
旋转矩阵 9 直接、易组合 冗余约束、优化困难
欧拉角 3 直观、物理意义明确 万向锁、顺序依赖
四元数 4 无奇点、易插值 单位约束、双覆盖

3.2 李群与李代数

好,现在进入正题。为什么我们需要李群李代数?

原因很简单:旋转矩阵和变换矩阵所在的流形不是欧氏空间,你不能直接做加法。

举个例子:两个旋转矩阵 R₁ 和 R₂,它们的乘积 R₁R₂ 仍然是旋转矩阵。但 R₁ + R₂ 呢?大概率不是。这意味着你不能用常规的梯度下降法去优化旋转矩阵——你加一个步长,结果就跑出流形了。

3.2.1 SO(3) 与 so(3)

SO(3) 是特殊正交群,也就是所有旋转矩阵的集合。它的李代数 so(3) 对应的是三维旋转向量(或者说反对称矩阵)。

从 so(3) 到 SO(3) 的映射是指数映射:

R = exp(φ^)  其中 φ 是旋转向量,φ^ 是它的反对称矩阵

反过来,从 SO(3) 到 so(3) 是对数映射:

φ = log(R)^∨

我在项目中习惯用李代数做优化。为什么呢?因为李代数是一个三维向量,没有约束,可以直接用高斯牛顿法。优化完再映射回 SO(3) 就行。

实用技巧:在 Ceres Solver 或 g2o 中,你不需要手动实现指数映射。它们都内置了 SO(3) 的局部参数化。你只需要告诉优化器「我要优化的是旋转」,剩下的交给库。

3.2.2 SE(3) 与 se(3)

SE(3) 是特殊欧氏群,包含旋转和平移。一个 SE(3) 元素可以写成 4x4 的变换矩阵:

T = [R  t]
    [0  1]

它的李代数 se(3) 是一个六维向量:前三维是平移,后三维是旋转(或者反过来,取决于你的定义)。

这里有个容易混淆的点:se(3) 的指数映射不是简单的「平移部分取指数,旋转部分取指数」。平移部分会受到旋转的影响,公式比较复杂。不过别担心,实际工程中我们很少手写这个映射。

3.3 核心知识体系

下面这张图是我自己总结的,希望能帮你理清思路:

刚体变换与李群李代数知识体系 刚体变换 旋转 SO(3) 平移 t 变换 SE(3) 旋转矩阵 / 四元数 / 欧拉角 三维向量 4×4 矩阵 so(3) se(3) 指数映射 exp(φ^) 指数映射 exp(ξ^) 核心:在流形上做优化 分解 多种表达 李代数 映射关系

3.4 实践中的选择

讲了这么多理论,最后说说实际工程中怎么选。

场景一:做标定优化

我建议用李代数。把旋转表示成 so(3) 的三维向量,平移就是三维向量,拼起来就是 se(3) 的六维向量。优化时没有任何约束,收敛快且稳定。

场景二:做传感器融合(如 EKF)

用四元数。EKF 的状态向量里放四元数,但误差状态用三维旋转向量。这是目前最主流的做法,IMU 预积分也是基于这个思路。

场景三:做可视化或手动调试

用欧拉角。但记得加一个保护逻辑——当俯仰角接近 ±90° 时,切换到四元数表示。

一句话总结:旋转矩阵是「是什么」,李代数是「怎么优化」。搞懂这两者的关系,你的标定代码就成功了一半。

好了,这一讲的内容就到这里。下一讲我们会把这些数学工具真正用到外参标定中,到时候你会感谢今天认真啃理论的自己。

可可精品资料库