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 轴旋转。你想想看,在无人机、机器人、自动驾驶里,这个表示法几乎无处不在。
但我要说一句:欧拉角是个美丽的陷阱。
为什么?因为它有两大问题:
- 万向锁(Gimbal Lock):当 Pitch 接近 ±90° 时,Roll 和 Yaw 的旋转轴会重合,丢失一个自由度。这时候你没法唯一确定姿态。
- 不唯一性:同一个旋转,可以用多组欧拉角表示。比如 (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 | 紧凑、几何意义明确 | 有奇点、组合不便 | 优化、李代数基础 |
我个人建议:
- 如果你在做标定或融合算法,内部计算用旋转矩阵或四元数。
- 如果你要展示结果给客户或同事看,用欧拉角。
- 如果你在做优化或滤波,用旋转向量(李代数)做增量。
下面这张图,是我自己整理的一个知识结构图,帮你理清这三种表示方法之间的关系:
好了,这一节的内容就到这儿。旋转矩阵、欧拉角、旋转向量,这三种表示方法,是后续所有标定算法的基础。你想想看,不管是手眼标定、激光-相机标定,还是多 IMU 融合,本质上都是在求解这些旋转参数。
下一节,我们会继续聊四元数和李代数——这两种更「高级」的表示方法。它们能帮你避开欧拉角的坑,也能让你的优化更稳定。
一句话总结:
旋转矩阵可靠但冗余,欧拉角直观但危险,旋转向量紧凑但有奇点。工程中,我建议你「显示用欧拉角,计算用旋转矩阵,优化用旋转向量」。
可可精品资料库