2、姿态控制核心概念:欧拉角与四元数、旋转矩阵、机体坐标系与地理坐标系、姿态表示方法对比
各位同学,欢迎来到姿态控制的核心章节。
说实话,搞飞控这么多年,我见过太多新手一上来就对着四元数公式硬啃,结果越学越懵。其实姿态表示没那么玄乎,说白了就是回答一个问题:飞机现在朝哪边? 今天我就带你把这块硬骨头啃下来。
2.1 两个坐标系:我们得有个参考
先聊坐标系。没有坐标系,你连「朝哪」都说不清楚。
地理坐标系(NED):也叫导航坐标系。N 指北(North),E 指东(East),D 指地(Down)。你可以想象成:站在地面上,面朝北,右手是东,脚底下是地。这个坐标系是固定的,我们用它来描述飞机的期望姿态。
机体坐标系(Body Frame):固定在飞机上的坐标系。X 轴指向机头,Y 轴指向右翼,Z 轴指向机腹。飞机一翻身,这个坐标系也跟着翻。
嗯,这里要注意:姿态控制的核心任务,就是把机体坐标系下的姿态,对齐到地理坐标系下的期望姿态。 我在做第一次无人机试飞时,就是因为搞反了 Y 轴方向,结果飞机一解锁就往反方向猛打舵,差点炸机。从那以后,我每次建坐标系都要反复核对三遍。
2.2 三种姿态表示方法
现在问题来了:怎么描述这个「旋转关系」?主要有三种方法,各有各的脾气。
2.2.1 欧拉角
欧拉角是最直观的。三个角度:滚转角(Roll, φ)、俯仰角(Pitch, θ)、偏航角(Yaw, ψ)。你想想看,飞机先绕 Z 轴转 ψ,再绕 Y 轴转 θ,最后绕 X 轴转 φ,就得到了当前姿态。
优点?一眼就能看懂。我调试时最喜欢看欧拉角,飞机歪没歪,一看便知。
但欧拉角有个致命缺陷——万向锁(Gimbal Lock)。当俯仰角接近 ±90° 时,滚转和偏航会混在一起,丢失一个自由度。我在做特技飞控时遇到过这个问题,飞机翻筋斗到顶点时,姿态解算直接崩了。所以,PX4 内部姿态控制不用欧拉角,只用它做显示和日志记录。
2.2.2 旋转矩阵
旋转矩阵是一个 3×3 的矩阵,记作 R。它能把机体坐标系下的向量,旋转到地理坐标系下。
比如,机体坐标系下的一个向量 v_body,在地理坐标系下就是 v_ned = R · v_body。
旋转矩阵没有万向锁问题,而且组合旋转非常方便——两个旋转矩阵相乘就行。但缺点也很明显:9 个元素,冗余度太高。而且每次更新都要保证它是正交矩阵,否则会引入误差。在嵌入式上跑,计算量偏大。
我个人习惯:旋转矩阵主要用于坐标变换,不直接用于姿态控制。比如把加速度计读数从机体坐标系转到地理坐标系,就用它。
2.2.3 四元数
四元数,这才是 PX4 姿态控制的「亲儿子」。
一个四元数 q = [q0, q1, q2, q3],其中 q0 是标量部分,[q1, q2, q3] 是矢量部分。它本质上描述了一个绕某个轴旋转一定角度的变换。
为什么 PX4 选它?三个原因:
- 无万向锁:随便你怎么转,不会丢自由度。
- 计算量小:只有 4 个元素,乘法比矩阵快得多。
- 插值平滑:做姿态平滑过渡时,四元数球面线性插值(SLERP)非常优雅。
我记得第一次在 STM32F4 上跑四元数姿态解算时,算一次只要几微秒,比矩阵快了一个数量级。嗯,这就是嵌入式开发的现实——每一微秒都得省。
quaternion.to_euler() 方法,方便你直观理解当前姿态。
2.3 三种方法对比
我整理了一张表,方便你对比记忆:
| 特性 | 欧拉角 | 旋转矩阵 | 四元数 |
|---|---|---|---|
| 元素个数 | 3 | 9 | 4 |
| 万向锁 | 有 | 无 | 无 |
| 计算量 | 小 | 大 | 中 |
| 直观性 | 高 | 低 | 中 |
| PX4 用途 | 显示/日志 | 坐标变换 | 姿态控制核心 |
2.4 知识体系总览
下面这张图,是我自己总结的姿态控制核心知识结构。你可以把它当作本章的「地图」:
2.5 我的选择建议
如果你刚开始学姿态控制,我建议你:
- 先用欧拉角建立直觉:理解滚转、俯仰、偏航分别对应什么动作。
- 再学四元数运算:重点掌握乘法、共轭、以及如何用四元数旋转向量。
- 最后理解旋转矩阵:当你需要做复杂的坐标变换时,它是最清晰的工具。
说白了,这三种方法不是互斥的,而是互补的。在 PX4 里,它们各司其职,共同支撑起整个姿态控制系统。你想想看,一个优秀的飞控工程师,应该能在这三种表示之间自由切换,就像说三种语言一样流畅。
公众号:蓝海资料掘金营,微信deep3321