2. 坐标系与姿态表示:地球坐标系、机体坐标系、欧拉角、旋转矩阵、四元数
好,咱们正式开始聊飞控里最基础、也最容易翻车的一块内容——坐标系与姿态表示。
说实话,我刚开始做飞控那会儿,觉得坐标系嘛,不就是几个箭头嘛,有啥好学的?结果第一次调参,飞机在天上乱转,我盯着日志看了三天,才发现是坐标系搞反了。嗯,从那以后,我再也不敢小看这一章了。
2.1 地球坐标系:我们到底在哪儿?
地球坐标系,说白了就是给飞机一个“绝对位置”的参考。你想想看,飞机在天上飞,总得知道自己在哪儿吧?
常用的地球坐标系有两种:
- NED坐标系(北-东-地):X轴指向北,Y轴指向东,Z轴指向地心。我个人习惯用这个,因为直观,符合直觉。
- ENU坐标系(东-北-天):X轴指向东,Y轴指向北,Z轴指向天。GPS数据通常给的是这个。
我在项目中遇到过一个问题:GPS模块输出的经纬度是ENU,但飞控内部用的是NED。一开始没注意,直接拿来用,结果飞机往北飞,它往东偏。你说气不气人?
2.2 机体坐标系:飞机自己的视角
机体坐标系是固定在飞机上的。不管飞机怎么转,这个坐标系跟着飞机走。
标准定义是这样的:
- X轴:指向机头方向(前进方向)
- Y轴:指向飞机右侧(右翼方向)
- Z轴:指向飞机下方(符合右手定则)
为什么这么定义?因为方便啊。你想想看,油门推大,飞机沿X轴加速;副翼右偏,飞机绕X轴旋转。多直观。
我记得有一次调试,一个实习生把机体坐标系的Y轴定义反了。结果飞机横滚的时候,往左打杆它往右翻。嗯,还好是在仿真里发现的。
2.3 欧拉角:最直观的姿态表示
欧拉角就是三个角度:横滚角(Roll)、俯仰角(Pitch)、偏航角(Yaw)。
说白了,就是飞机绕三个轴转了多少度。
- Roll(φ):绕X轴旋转,范围 ±180°
- Pitch(θ):绕Y轴旋转,范围 ±90°
- Yaw(ψ):绕Z轴旋转,范围 ±180°
欧拉角的好处是直观,看一眼就知道飞机姿态。但坏处也很明显——万向锁(Gimbal Lock)。
所以,欧拉角只适合做人机交互(比如地面站显示),不适合做姿态解算。
2.4 旋转矩阵:数学上最严谨的方式
旋转矩阵是一个 3×3 的矩阵,用来描述从一个坐标系到另一个坐标系的旋转关系。
从机体坐标系到地球坐标系的旋转矩阵长这样:
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θ ]
看着挺吓人,对吧?其实你不用背,知道怎么用就行。
旋转矩阵的好处是:
- 没有奇点(不会出现万向锁)
- 可以连续旋转(矩阵乘法)
- 数学性质好(正交矩阵,逆等于转置)
但坏处是:计算量大。每次更新姿态都要做 9 个元素的矩阵乘法,在嵌入式上有点吃不消。
2.5 四元数:飞控工程师的终极武器
四元数,说白了就是一个“带约束的复数”。它用四个数表示旋转:
q = w + xi + yj + zk
其中 w 是实部,x、y、z 是虚部。约束条件是:w² + x² + y² + z² = 1。
为什么飞控都用四元数?三个原因:
- 没有万向锁——这是最大的优势
- 计算量小——只有 4 个元素,比旋转矩阵的 9 个少多了
- 插值平滑——可以做球面线性插值(SLERP),姿态过渡很自然
四元数转欧拉角的公式:
roll = atan2(2*(w*x + y*z), 1 - 2*(x² + y²))
pitch = asin(2*(w*y - z*x))
yaw = atan2(2*(w*z + x*y), 1 - 2*(y² + z²))
嗯,这个公式我每次写代码都要翻笔记。记不住没关系,知道去哪儿查就行。
2.6 实际项目中的选择建议
说了这么多,到底用哪个?我个人的经验是这样的:
| 场景 | 推荐表示 | 原因 |
|---|---|---|
| 姿态解算(IMU融合) | 四元数 | 无奇点、计算快 |
| 地面站显示 | 欧拉角 | 直观、人看得懂 |
| 控制律计算 | 旋转矩阵 | 方便做向量旋转 |
| 数据存储/传输 | 四元数 | 占用空间小、精度高 |
我曾经在一个项目里,为了省事,全程用欧拉角做姿态解算。结果飞机做大机动时直接失控。嗯,那次之后,我再也不敢在核心算法里用欧拉角了。
好了,坐标系与姿态表示就聊到这儿。下一章我们讲传感器——IMU、GPS、磁力计,这些东西怎么读数据、怎么处理噪声。到时候你会发现,坐标系的知识全用得上。