第2章 数学基础(上):三维空间刚体运动

各位同学,欢迎来到数学基础部分。说实话,很多做SLAM的同学一看到数学就头疼,觉得这是拦路虎。我当年刚入行时也一样,看到旋转矩阵就犯晕。但后来我发现,只要把几何意义搞明白,这些数学工具其实挺直观的。

这一章我们聊三维空间里的刚体运动。说白了,就是研究一个物体怎么转、怎么动。你想想看,机器人或者相机在三维空间里移动,无非就是旋转加平移。嗯,就这么简单。

2.1 旋转矩阵

先说说旋转矩阵。它是个3×3的方阵,用来描述一个坐标系相对于另一个坐标系的旋转关系。我习惯把它想象成「坐标转换器」——把一个向量从一个坐标系转到另一个坐标系。

旋转矩阵有两个重要性质:

  • 正交性:RTR = I,也就是说它的逆等于转置
  • 行列式为+1:这保证了它是纯旋转,没有缩放或镜像

我在项目中遇到过一个问题:用旋转矩阵做连续旋转时,由于浮点数误差,矩阵会慢慢失去正交性。嗯,这里要注意,必须定期做正交化处理,否则误差会累积。

核心公式

// 绕x轴旋转θ角
Rx(θ) = [1,    0,     0;
         0, cosθ, -sinθ;
         0, sinθ,  cosθ]

// 绕y轴旋转θ角
Ry(θ) = [cosθ,  0, sinθ;
         0,     1,    0;
         -sinθ, 0, cosθ]

// 绕z轴旋转θ角
Rz(θ) = [cosθ, -sinθ, 0;
         sinθ,  cosθ, 0;
         0,     0,    1]

2.2 旋转向量与欧拉角

旋转矩阵有9个参数,但自由度只有3个。说白了就是冗余。所以就有了更紧凑的表达方式。

旋转向量:用一个三维向量表示旋转,方向是旋转轴,长度是旋转角度。我特别喜欢这种表达,因为它很直观——「绕这个轴转这么多度」。

欧拉角:把旋转分解成绕三个轴的依次旋转。常见的顺序有ZYX、ZYZ等。欧拉角的问题在于万向锁——当第二个旋转角为±90°时,第一个和第三个旋转轴会重合,丢失一个自由度。

避坑指南:我曾经在无人机姿态估计中吃过万向锁的亏。当时用欧拉角做姿态插值,结果在俯仰角接近90°时,航向角突然跳变。后来改用四元数才解决。所以,如果你要做平滑的旋转插值,千万别用欧拉角。

2.3 四元数

四元数是我个人最推荐的旋转表达方式。它没有万向锁问题,插值平滑,计算效率也高。

四元数可以看作复数的推广:q = w + xi + yj + zk,其中i² = j² = k² = -1。单位四元数(模长为1)可以用来表示旋转。

为什么用四元数?三个理由:

  1. 紧凑:4个参数,比旋转矩阵的9个少
  2. 无奇点:不像欧拉角有万向锁
  3. 易插值:球面线性插值(SLERP)非常平滑

实用技巧:四元数乘法不满足交换律,顺序很重要!我习惯记成「先旋转的放在右边」。比如从坐标系A到B的旋转,再转到C,就是qAC = qBC * qAB

2.4 李群与李代数基础

这部分是SLAM优化的核心。你想想看,我们要优化相机位姿,但旋转矩阵有正交约束,直接优化很麻烦。李群和李代数就是来解决这个问题的。

李群SO(3):三维旋转矩阵的集合,构成一个群。它是个流形,也就是说在局部看起来像欧氏空间。

李代数so(3):SO(3)在单位元处的切空间。说白了,就是旋转的「速度」空间。每个so(3)元素是一个三维向量,对应一个反对称矩阵。

它们之间通过指数映射和对数映射相互转换:

// 指数映射:从李代数到李群
R = exp(φ^)  // φ是三维向量,φ^是它的反对称矩阵

// 对数映射:从李群到李代数
φ = log(R)

我在做视觉惯性里程计时,就是用李代数来表示位姿增量。这样在优化时,不需要考虑旋转矩阵的约束,直接做无约束优化就行。方便得很。

为什么用李代数?

  • 旋转矩阵有6个约束(正交+行列式为1),优化困难
  • 李代数是无约束的,可以直接用高斯牛顿法
  • 指数映射保证了结果一定在流形上

2.5 实践中的选择

说了这么多,到底该用哪种?我根据经验给个建议:

场景 推荐表达 原因
坐标变换计算 旋转矩阵 方便组合,效率高
姿态插值 四元数 平滑无奇点
人机交互 欧拉角 直观易理解
优化求解 李代数 无约束优化

嗯,这一章的内容就到这里。说白了,这些数学工具没有谁好谁坏,关键看场景。我建议你先把旋转矩阵和四元数练熟,这两个用得最多。李代数可以先理解概念,等做到后端优化时再深入。

下一章我们继续聊李代数的求导和扰动模型,那是SLAM优化的核心技巧。到时候我会结合具体代码,带你手撕一遍。