刚体运动学基础:坐标系、旋转矩阵、欧拉角、四元数
各位同学,咱们今天聊点硬核的——刚体运动学。你想想看,不管是做机器人、无人机还是卫星仿真,第一步都是搞清楚“这个东西在空间里到底怎么动”。说白了,就是描述一个刚体在三维空间里的位置和姿态。
我个人习惯把运动学拆成两部分:位置和姿态。位置好办,三个坐标就搞定。姿态嘛……嗯,这里面的门道可就多了。今天咱们就把旋转矩阵、欧拉角、四元数这几个老朋友请出来,好好捋一捋。
1. 坐标系:一切运动的起点
没有坐标系,你连“往哪走”都说不清楚。我在做无人机飞控时,最头疼的就是坐标系搞混——机体系、导航系、地心地固系……一旦弄错,飞机直接翻跟头。
常用的坐标系就这几类:
| 坐标系 | 符号 | 原点 | 特点 |
|---|---|---|---|
| 惯性系 | {I} | 固定点(如地心) | 牛顿定律成立的地方 |
| 导航系 | {N} | 载体位置 | 北东地或东北天 |
| 机体系 | {B} | 刚体质心 | 前右下,跟着刚体转 |
我的小习惯:所有传感器数据进控制器之前,先统一到同一个坐标系。我曾经因为忘记转换IMU的机体系数据,让电机反向转了半秒钟……嗯,那次炸机了。
2. 旋转矩阵:最直观,但最“重”
旋转矩阵 R 是一个 3×3 的正交矩阵,行列式为 +1。它的作用就是把一个向量从一个坐标系转到另一个坐标系。
比如,从机体系到导航系的旋转:
v_N = R_B^N * v_B
旋转矩阵有几个重要性质:
- 正交性:R^T = R^{-1},逆矩阵就是转置
- 组合性:连续旋转可以矩阵相乘
- 无奇异性:所有姿态都能表示
但缺点也很明显——9个参数,冗余。你想想看,每次更新姿态都要算9个数,计算量不小。而且数值漂移后还得重新正交化,麻烦。
核心公式:绕X轴旋转θ角的旋转矩阵为
R_x(θ) = [[1, 0, 0], [0, cosθ, -sinθ], [0, sinθ, cosθ]]
R_x(θ) = [[1, 0, 0], [0, cosθ, -sinθ], [0, sinθ, cosθ]]
3. 欧拉角:直观但“有坑”
欧拉角用三个角度描述姿态:横滚(φ)、俯仰(θ)、偏航(ψ)。说白了就是“先转哪个轴,再转哪个轴”。
常见的旋转顺序有:
- ZYX:航空航天标准,先偏航再俯仰最后横滚
- ZYZ:机器人学常用
- XYZ:某些工业应用
从欧拉角到旋转矩阵的转换(ZYX顺序):
R = R_z(ψ) * R_y(θ) * R_x(φ)
避坑指南:我曾经在卫星姿态仿真里用了欧拉角,结果在俯仰角接近±90°时,横滚和偏航突然“锁死”了——这就是著名的万向锁问题。从那以后,只要涉及大角度机动,我坚决不用欧拉角。
欧拉角的优缺点很明显:
| 优点 | 缺点 |
|---|---|
| 直观,三个数就能看懂 | 有万向锁(奇异性) |
| 适合小角度近似 | 旋转顺序依赖性强 |
| 工程上常用 | 插值不自然 |
4. 四元数:低调的“全能选手”
四元数 q = [w, x, y, z],其中 w 是标量部分,(x,y,z) 是矢量部分。它用4个数表示旋转,没有奇异性,插值平滑,计算效率高。
为什么四元数这么好用?
- 无万向锁:所有姿态都能平滑表示
- 计算量小:乘法比矩阵快
- 插值自然:球面线性插值(SLERP)让旋转过渡平滑
四元数乘法(表示连续旋转):
q_result = q2 * q1
注意顺序!先转q1再转q2,结果是q2 * q1,不是q1 * q2。我刚开始学的时候经常搞反,仿真出来的姿态乱飞。
我的经验:在嵌入式系统里,我几乎只用四元数做姿态解算。欧拉角只用来做可视化显示——毕竟人眼看着三个角度比看四个数舒服多了。
5. 三种表示方法的对比
| 特性 | 旋转矩阵 | 欧拉角 | 四元数 |
|---|---|---|---|
| 参数数量 | 9 | 3 | 4 |
| 奇异性 | 无 | 有(万向锁) | 无 |
| 计算效率 | 低 | 中 | 高 |
| 直观性 | 差 | 好 | 中 |
| 插值 | 困难 | 不自然 | 平滑 |
| 工程应用 | 理论分析 | 可视化、小角度 | 实时控制、仿真 |
6. 知识体系总览
下面这张图把本章的核心逻辑串起来了。你仔细看看,坐标系是基础,三种表示方法各有优劣,实际项目中要根据场景灵活选择。
7. 实际项目中的选择建议
说了这么多,到底该用哪个?我个人的经验是这样的:
- 做理论推导和证明:用旋转矩阵,数学性质好
- 做可视化界面:用欧拉角,人看着舒服
- 做实时控制和仿真:用四元数,稳定高效
一句话总结:四元数做“里子”,欧拉角做“面子”,旋转矩阵做“本子”。