刚体运动学基础:坐标系、旋转矩阵、欧拉角、四元数

各位同学,咱们今天聊点硬核的——刚体运动学。你想想看,不管是做机器人、无人机还是卫星仿真,第一步都是搞清楚“这个东西在空间里到底怎么动”。说白了,就是描述一个刚体在三维空间里的位置和姿态。

我个人习惯把运动学拆成两部分:位置和姿态。位置好办,三个坐标就搞定。姿态嘛……嗯,这里面的门道可就多了。今天咱们就把旋转矩阵、欧拉角、四元数这几个老朋友请出来,好好捋一捋。

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θ]]

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. 知识体系总览

下面这张图把本章的核心逻辑串起来了。你仔细看看,坐标系是基础,三种表示方法各有优劣,实际项目中要根据场景灵活选择。

刚体运动学知识体系 刚体姿态描述 旋转矩阵 (3×3) 欧拉角 (φ,θ,ψ) 四元数 (w,x,y,z) 9参数,无奇异性 计算量大,需正交化 适合理论分析 3参数,直观易懂 有万向锁问题 适合小角度场景 4参数,无奇异性 计算效率高 适合实时控制 实际工程中: 四元数做解算 → 欧拉角做显示 → 矩阵做理论推导

7. 实际项目中的选择建议

说了这么多,到底该用哪个?我个人的经验是这样的:

  • 做理论推导和证明:用旋转矩阵,数学性质好
  • 做可视化界面:用欧拉角,人看着舒服
  • 做实时控制和仿真:用四元数,稳定高效
一句话总结:四元数做“里子”,欧拉角做“面子”,旋转矩阵做“本子”。