三维刚体运动,旋转矩阵,角轴,欧拉角,四元素,帮我详细的讲解-13
这是一个非常经典且核心的机器人学与计算机视觉话题。三维空间中的刚体运动(Rigid Body Motion)看似简单,但如何用数学优雅、无奇异性(Singularity)地描述旋转,一直是这门学科的难点。
刚体运动由两部分组成:平移(Translation) + 旋转(Rotation)。
- 平移很简单,用一个三维向量 就能搞定。
- 旋转则非常复杂,因为它是非线性的。
为了描述旋转,我们有四种主流的数学工具。下面我将为你详细拆解每一种的原理、优缺点及转换关系。
1. 旋转矩阵 (Rotation Matrix)
这是最基础、最通用的表达方式。
核心概念
我们可以把旋转理解为坐标系的变换。假设有一个坐标系 相对于坐标系 进行了旋转,旋转矩阵 的每一列,其实就是 坐标系的三个主轴单位向量在 坐标系下的投影。
数学表达
它是一个 的矩阵:
重要性质 ( 群)
旋转矩阵必须满足两个严格条件,构成特殊正交群 :
- 正交性: (即 ,逆矩阵等于转置矩阵,计算逆变换非常快)。
- 行列式为 1: (如果不为1,可能包含镜像翻转或缩放)。
-
优点:
-
描述是唯一的。
-
可以直接用于坐标变换计算:。
-
级联旋转就是矩阵相乘。
-
缺点:
-
冗余:用了 9 个数来表达仅有 3 个自由度(DoF)的旋转。
-
数值漂移:在计算机迭代计算中, 可能会逐渐失去正交性,需要经常做“正交化”修正。
2. 旋转向量 / 角轴 (Angle-Axis)
核心概念
欧拉定理告诉我们:任何三维旋转都可以看作是绕着空间中某个轴 旋转了某个角度 。
数学表达
我们用一个向量 来表示:
- 方向:向量的单位方向 就是旋转轴。
- 长度:向量的模长 就是旋转角度(弧度)。
罗德里格斯公式 (Rodrigues' Rotation Formula)
这是连接旋转向量和旋转矩阵的桥梁。给定旋转轴 和角度 ,求矩阵 :
(注: 是向量 对应的反对称矩阵,用于表示叉乘)
-
优点:
-
直观,物理意义明确。
-
紧凑,只用 3 个数。
-
缺点:
-
不方便直接进行旋转合成(不能像矩阵那样直接相乘)。
-
存在奇异性:当旋转角度 时,旋转轴 无法确定。
3. 欧拉角 (Euler Angles)
这是最符合人类直觉的描述方式,常见于航空航天和游戏开发。
核心概念
将一次复杂的旋转分解为三次绕主轴的简单旋转。最常用的顺序是 Z-Y-X 顺序(在航空中对应 Yaw-Pitch-Roll):
- 绕 Z 轴转(偏航,Yaw)
- 绕 Y 轴转(俯仰,Pitch)
- 绕 X 轴转(滚转,Roll)
数学表达
致命弱点:万向锁 (Gimbal Lock)
这是欧拉角最大的坑。
当中间的轴(例如 Pitch 俯仰角)旋转 90 度时,第三个轴(Roll)会和第一个轴(Yaw)重合。
后果:你失去了一个自由度。此时无论怎么调整 Roll 或 Yaw,物体实际上都在绕同一个绝对轴旋转。系统会“锁死”在一个平面运动中,无法覆盖三维空间。
-
优点:
-
非常直观,容易理解(比如“抬头”、“右转”)。
-
这三个参数是解耦的,便于单独调整。
-
缺点:
-
万向锁问题。
-
顺序依赖:先转 X 后转 Y,和先转 Y 后转 X,结果完全不同。需要严格约定旋转顺序(如 ZYX, XYZ 等,共有 12 种定义)。
4. 四元数 (Quaternion)
这是计算机图形学和SLAM(即时定位与地图构建)中的王者。虽然数学上最难理解,但对计算机最友好。
核心概念
四元数是复数的扩展。普通复数有一个实部一个虚部,四元数有一个实部 和三个虚部 。
用于表示旋转的是单位四元数(模长为 1)。
数学表达
其中虚部 满足 。
它与角轴有着紧密的联系:
为什么它最好?
四元数巧妙地解决了所有问题:
- 无万向锁:它不依赖轴的顺序。
- 计算高效:比矩阵乘法快,存储空间小(4个数)。
- 插值平滑:在做动画或路径规划时,四元数的球面线性插值(SLERP)能提供最短路径的平滑旋转,而欧拉角插值会让物体动作看起来很怪异。
-
优点:
-
紧凑、无奇异性、计算快。
-
它是目前处理 3D 旋转的标准工程方法。
-
缺点:
-
非常不直观,人类很难看着这 4 个数字想象出物体是怎么转的。
-
双倍覆盖: 和 表示同一个旋转。
总结与对比
| 特性 | 旋转矩阵 (Matrix) | 欧拉角 (Euler) | 角轴 (Angle-Axis) | 四元数 (Quaternion) |
|---|---|---|---|---|
| 直观性 | ❌ (9个数字) | ✅ (非常直观) | ✅ (较直观) | ❌ (很难理解) |
| 无奇异性 | ✅ | ❌ (万向锁) | ❌ (时) | ✅ |
| 紧凑性 | ❌ (9个数) | ✅ (3个数) | ✅ (3个数) | ✅ (4个数) |
| 计算效率 | 中 | 低 (需三角函数) | 中 | 高 |
| 主要用途 | 最终坐标变换 | 人机交互、面板显示 | 优化算法推导 | 底层运算、插值 |
建议与下一步
如果你正在做SLAM(同时定位与建图)或机器人控制算法开发:
- 底层计算(状态估计、积分):请务必使用四元数。
- 可视化/调试(打印日志):转换为欧拉角给自己看。
- 推导雅可比矩阵(优化):通常会用到李代数(是对旋转矩阵或四元数的微分描述,本质类似于角轴)。
你现在是在具体处理某个算法(比如卡尔曼滤波、SLAM前端),还是在学习基础理论?
如果你需要,我可以为你演示如何用 Python (NumPy/SciPy) 实现这些表示法之间的相互转换。

浙公网安备 33010602011771号