1. 姿态描述基础:欧拉角、方向余弦矩阵、四元数、旋转矩阵的定义与关系
做飞控这么多年,我见过不少新手一上来就对着四元数公式发懵。其实姿态描述没那么玄乎,说白了就是回答一个问题:“这个飞行器现在朝哪边?它转了多少?”
今天咱们就把四种最常用的姿态描述方式捋一遍。我会结合自己踩过的坑来讲,希望能帮你少走弯路。
1.1 欧拉角:最直观,但小心“万向锁”
欧拉角是大家最先接触的姿态表示法。它用三个角度来描述旋转:俯仰角(Pitch)、滚转角(Roll)、偏航角(Yaw)。
你可以想象成:飞机先绕自身Z轴转一个偏航角,再绕新的Y轴转一个俯仰角,最后绕新的X轴转一个滚转角。这就是经典的“Z-Y-X”顺序。
核心公式:
从机体坐标系到地理坐标系的旋转矩阵 R = Rz(ψ) · Ry(θ) · Rx(φ)
其中 φ 是滚转角,θ 是俯仰角,ψ 是偏航角。
我个人习惯在调试初期先用欧拉角观察姿态。为什么?因为数值直观啊!看到俯仰角是30度,你脑子里立刻能想象出飞机抬头的样子。
⚠️ 避坑指南:万向锁
我曾经在做一个云台控制项目时,发现当俯仰角接近±90度时,云台突然“卡住”了。这就是典型的万向锁问题——当俯仰角为90度时,滚转轴和偏航轴重合,丢失了一个自由度。
所以记住:欧拉角不适合全姿态描述,尤其是需要大角度机动的情况。
1.2 方向余弦矩阵:数学上完美,但计算量大
方向余弦矩阵(DCM)是一个3×3的矩阵,每个元素代表两个坐标系对应轴之间的夹角余弦值。说白了,它就是旋转矩阵的一种具体形式。
假设我们有两个坐标系:地理坐标系(n系)和机体坐标系(b系)。那么DCM可以写成:
R = [
[cosθ·cosψ, sinφ·sinθ·cosψ - cosφ·sinψ, cosφ·sinθ·cosψ + sinφ·sinψ],
[cosθ·sinψ, sinφ·sinθ·sinψ + cosφ·cosψ, cosφ·sinθ·sinψ - sinφ·cosψ],
[-sinθ, sinφ·cosθ, cosφ·cosθ]
]
嗯,看着就头大对吧?我在实际项目中几乎不用DCM做实时解算,因为9个元素要同时更新,计算量太大了。但DCM有一个好处——它天然是正交矩阵,物理意义非常清晰。
💡 我的经验:
DCM更适合做理论推导和精度验证。比如你要验证一个姿态解算算法的精度,可以用DCM作为“标准答案”来对比。
1.3 四元数:飞控的“心头好”
四元数,这才是飞控领域真正的主角。它用四个数来描述旋转:一个标量部分和三个矢量部分。
形式很简单:q = [q₀, q₁, q₂, q₃]ᵀ,其中 q₀ 是标量部分,q₁, q₂, q₃ 是矢量部分。
为什么飞控都用四元数?三个原因:
- 无万向锁问题——可以全姿态描述
- 计算量小——只有4个参数,更新时只需要做简单的乘法和加法
- 插值平滑——做姿态插值时,四元数的球面线性插值(SLERP)非常自然
核心公式:
四元数乘法:q = q₁ ⊗ q₂
旋转向量 v 用四元数表示:v' = q · v · q*
其中 q* 是 q 的共轭四元数。
我记得第一次在STM32上跑四元数解算时,看到它能在200Hz的频率下稳定运行,心里那个爽啊。相比之下,DCM在同样硬件上只能跑到50Hz。
⚠️ 注意:四元数需要归一化
我曾经犯过一个低级错误——忘记对四元数做归一化。结果飞了不到两分钟,姿态就开始漂移,飞机直接翻了个跟头。从那以后,我每次更新完四元数都会强制做一次归一化:
norm = sqrt(q0*q0 + q1*q1 + q2*q2 + q3*q3);
q0 /= norm; q1 /= norm; q2 /= norm; q3 /= norm;
1.4 旋转矩阵:连接一切的桥梁
旋转矩阵其实就是DCM的另一种叫法。它是一个3×3的正交矩阵,满足 RᵀR = I,且 det(R) = 1。
旋转矩阵最大的价值在于:它是连接欧拉角、四元数和实际坐标变换的桥梁。
举个例子,你要把机体坐标系下的加速度转换到地理坐标系:
a_n = R · a_b
其中 a_b 是机体坐标系下的加速度,a_n 是地理坐标系下的加速度。
反过来,从地理坐标系到机体坐标系:
a_b = Rᵀ · a_n
因为 R 是正交矩阵,所以逆矩阵就是转置矩阵,计算非常方便。
1.5 四种描述方式的关系
这四种方式不是孤立的,它们可以互相转换。我画了一张图来展示它们之间的关系:
从图中可以看出:
- 欧拉角可以转换成DCM和四元数,但要注意万向锁问题
- DCM和旋转矩阵本质上是同一个东西,只是叫法不同
- 四元数可以转换成旋转矩阵,而且计算效率最高
- 旋转矩阵是连接所有描述方式的“枢纽”
1.6 实际工程中的选择建议
说了这么多,到底该用哪种?我给出一个实际的选择策略:
| 应用场景 | 推荐方式 | 原因 |
|---|---|---|
| 调试阶段观察姿态 | 欧拉角 | 数值直观,一眼看懂 |
| 实时姿态解算 | 四元数 | 计算量小,无万向锁 |
| 坐标变换计算 | 旋转矩阵 | 矩阵运算方便,可逆性好 |
| 理论推导和精度验证 | DCM | 物理意义清晰,数学上完美 |
💡 我的工程习惯:
在飞控代码中,我通常用四元数做核心解算,只在需要输出给地面站或做可视化时,才把四元数转换成欧拉角。这样既保证了计算效率,又方便了调试观察。
嗯,关于姿态描述的基础就讲到这里。这四种方式你都要掌握,因为后面的姿态解算算法——不管是互补滤波还是卡尔曼滤波——都离不开它们。
记住一句话:欧拉角给人看,四元数给机器算,旋转矩阵做桥梁。
公众号:蓝海资料掘金营,微信deep3321