3. 旋转表示方法(上):旋转矩阵、欧拉角(RPY)、旋转向量(轴角表示法)

做多传感器融合,绕不开的一个话题就是——旋转怎么表示。

我记得刚入行那会儿,第一次做激光雷达和相机的联合标定,满脑子都是「旋转矩阵怎么乘来着?」、「欧拉角会不会死锁?」。说实话,这些概念如果只是背公式,很容易搞混。但如果你真正理解了它们背后的几何意义,就会发现——其实每种表示方法都有自己的脾气。

这一节,我们先聊三种最基础的旋转表示:旋转矩阵、欧拉角(RPY)、旋转向量(轴角表示法)。它们各有优劣,也各有坑。

3.1 旋转矩阵:最笨但最可靠

旋转矩阵,说白了就是一个 3x3 的正交矩阵,行列式为 +1。它描述了一个坐标系相对于另一个坐标系的朝向。

为什么说它「笨」?因为它用了 9 个数字去表达 3 个自由度,冗余度很大。但为什么又说它「可靠」?因为它的数学性质非常干净——组合旋转就是矩阵乘法,逆旋转就是矩阵转置,没有任何歧义。

核心性质:

  • 正交性:RTR = I
  • 行列式:det(R) = +1
  • 逆 = 转置:R-1 = RT

我在项目中遇到过一个问题:两个 IMU 的安装角度标定,直接用旋转矩阵做优化。结果发现,优化出来的矩阵不满足正交性了——因为你在数值上直接更新 9 个元素,很容易跑偏。后来我改用李代数做扰动模型,才解决了这个问题。嗯,这里先埋个伏笔,后面会细讲。

旋转矩阵的另一个好处是——它可以直接作用于向量。比如你把一个三维点 p 从相机坐标系转到世界坐标系:

p_world = R * p_camera

就这么简单。没有奇点,没有歧义。代价就是——9 个参数,内存和计算量都大。

3.2 欧拉角(RPY):直观但危险

欧拉角,大家应该都很熟悉了。Roll(横滚)、Pitch(俯仰)、Yaw(偏航),分别绕 X、Y、Z 轴旋转。你想想看,在无人机、机器人、自动驾驶里,这个表示法几乎无处不在。

但我要说一句:欧拉角是个美丽的陷阱。

为什么?因为它有两大问题:

  1. 万向锁(Gimbal Lock):当 Pitch 接近 ±90° 时,Roll 和 Yaw 的旋转轴会重合,丢失一个自由度。这时候你没法唯一确定姿态。
  2. 不唯一性:同一个旋转,可以用多组欧拉角表示。比如 (Roll, Pitch, Yaw) 和 (Roll+180°, 180°-Pitch, Yaw+180°) 可能对应同一个姿态。

避坑指南:

我曾经在标定一个云台相机时,直接用欧拉角做插值。结果云台转到某个角度时,画面突然翻转了——就是万向锁搞的鬼。从那以后,我只要涉及连续旋转或插值,一律用四元数或旋转矩阵,绝不用欧拉角。

欧拉角的定义顺序也很重要。常见的顺序有 ZYX(即先 Yaw、再 Pitch、最后 Roll),这也是 ROS 和很多机器人框架的默认顺序。如果你和别人交换数据,一定要先确认顺序,否则结果会完全不对。

顺序 含义 常见场景
ZYX 先绕 Z 轴转 Yaw,再绕 Y 轴转 Pitch,最后绕 X 轴转 Roll 无人机、机器人、ROS
ZYZ 先绕 Z 轴,再绕 Y 轴,再绕 Z 轴 机械臂运动学
XYZ 固定轴顺序,绕世界坐标系旋转 某些视觉标定工具

我个人习惯:在标定结果展示或调试时,用欧拉角方便人理解。但在算法内部,一律用旋转矩阵或四元数。说白了,欧拉角只适合「看」,不适合「算」。

3.3 旋转向量(轴角表示法):紧凑且直观

旋转向量,也叫轴角表示法。它用一个单位向量 u 表示旋转轴,用一个标量 θ 表示旋转角度。合起来就是一个三维向量:v = θ * u。

这个表示法的好处是——紧凑。3 个参数,没有冗余。而且几何意义非常直观:绕哪个轴转多少度。

但它也有缺点:

  • 当 θ 接近 0 时,旋转向量趋于零向量,方向变得不确定。
  • 当 θ 接近 2π 时,存在周期性歧义(转一圈和没转一样)。
  • 组合旋转不方便——两个旋转向量不能直接相加。

旋转向量和旋转矩阵之间可以互相转换。这个转换公式叫 Rodrigues 公式:

R = I + sin(θ) * [u]× + (1 - cos(θ)) * [u]ײ

其中 [u]× 是 u 的反对称矩阵。反过来,从旋转矩阵提取旋转向量,需要计算角度和轴:

θ = arccos((trace(R) - 1) / 2)
u = (1 / (2 * sin(θ))) * [R(3,2)-R(2,3), R(1,3)-R(3,1), R(2,1)-R(1,2)]^T

小技巧:

我在做 VIO 初始化时,经常用旋转向量来表示两帧之间的相对旋转。因为它参数少,做优化时不容易过拟合。而且用李代数(so(3))做扰动模型时,本质上就是在用旋转向量做增量更新。

3.4 三种表示方法的对比

好了,三种方法都聊完了。我们来做个对比总结:

表示方法 参数数量 优点 缺点 适用场景
旋转矩阵 9 无奇点、组合方便、数学性质好 冗余、计算量大 算法内部、坐标变换
欧拉角(RPY) 3 直观、易理解 万向锁、不唯一 人机交互、调试显示
旋转向量 3 紧凑、几何意义明确 有奇点、组合不便 优化、李代数基础

我个人建议:

  • 如果你在做标定或融合算法,内部计算用旋转矩阵或四元数。
  • 如果你要展示结果给客户或同事看,用欧拉角。
  • 如果你在做优化或滤波,用旋转向量(李代数)做增量。

下面这张图,是我自己整理的一个知识结构图,帮你理清这三种表示方法之间的关系:

旋转表示方法知识结构图 旋转矩阵 (3x3) 欧拉角 (RPY) 旋转向量 (轴角) 属性 • 9参数,正交矩阵 • 无奇点 • 组合用乘法 属性 • 3参数,直观 • 有万向锁 • 顺序依赖 属性 • 3参数,紧凑 • θ=0时奇异 • 几何意义明确 Rodrigues公式 ↔ 旋转矩阵 ↔ 欧拉角转换 三种表示方法各有优劣,实际工程中常混合使用

好了,这一节的内容就到这儿。旋转矩阵、欧拉角、旋转向量,这三种表示方法,是后续所有标定算法的基础。你想想看,不管是手眼标定、激光-相机标定,还是多 IMU 融合,本质上都是在求解这些旋转参数。

下一节,我们会继续聊四元数和李代数——这两种更「高级」的表示方法。它们能帮你避开欧拉角的坑,也能让你的优化更稳定。

一句话总结:

旋转矩阵可靠但冗余,欧拉角直观但危险,旋转向量紧凑但有奇点。工程中,我建议你「显示用欧拉角,计算用旋转矩阵,优化用旋转向量」。

可可精品资料库