第1章:坐标系与姿态表示
各位同学好,我是老张。搞了十几年固定翼飞控,今天咱们聊聊最基础、也最容易踩坑的东西——坐标系和姿态表示。
说实话,我见过太多新手一上来就写代码,结果飞机在天上乱翻跟头。为什么?坐标系搞混了。你想想看,地面站显示的是北东地,飞控算的是前右下,传感器给的是右前上……不乱才怪。
1.1 地球坐标系
地球坐标系,说白了就是给飞机一个“绝对位置”的参考。常用的有两种:
- NED坐标系:北东地。X轴指向北,Y轴指向东,Z轴指向地心。我习惯用这个,因为直观。
- ENU坐标系:东北天。X轴指向东,Y轴指向北,Z轴指向天。GPS原始数据通常是这个。
注意:我曾经在项目里把NED和ENU搞反了,结果飞机一解锁就往地下钻。嗯,那次炸机让我记住了——GPS转NED时,Z轴要取反。
实际工程中,我们通常用经纬高(LLA)来表示位置,但飞控内部计算必须转成NED。为什么?因为NED是平面直角坐标系,算距离、算速度都方便。
1.2 机体坐标系
机体坐标系是固定在飞机上的。我习惯这么定义:
- X轴:指向机头(前进方向)
- Y轴:指向右翼
- Z轴:指向机腹(向下)
这个定义和大多数飞控一致。但要注意,有些开源飞控(比如PX4)的机体坐标系是X前、Y左、Z上。如果你混用,姿态解算会直接崩掉。
我的习惯:拿到一个新飞控,第一件事就是看它的机体坐标系定义。别信文档,直接看源码里的旋转矩阵。
1.3 欧拉角
欧拉角是描述姿态最直观的方式。三个角度:
| 角度 | 符号 | 范围 | 说明 |
|---|---|---|---|
| 滚转角 | φ (phi) | -180° ~ 180° | 绕X轴旋转 |
| 俯仰角 | θ (theta) | -90° ~ 90° | 绕Y轴旋转 |
| 偏航角 | ψ (psi) | -180° ~ 180° | 绕Z轴旋转 |
欧拉角有个致命问题——万向锁。当俯仰角接近±90°时,滚转和偏航会耦合,丢失一个自由度。我在做垂直起降固定翼时遇到过这个问题,飞机在过渡阶段俯仰角接近90°,欧拉角直接炸了。
核心结论:欧拉角只适合做显示和简单控制,不适合做姿态解算和导航融合。
1.4 四元数
四元数是个数学工具,用来避免万向锁。形式很简单:
q = [w, x, y, z]
其中:
w = cos(θ/2)
x = sin(θ/2) * cos(α)
y = sin(θ/2) * cos(β)
z = sin(θ/2) * cos(γ)
嗯,看着有点抽象。我换个说法:四元数就是用四个数表示一个旋转。它没有奇点,计算效率高,适合做姿态融合。
我个人习惯在飞控里全程用四元数。只有输出给地面站显示时,才转成欧拉角。
避坑指南:四元数必须归一化!我曾经因为忘记归一化,导致姿态漂移了20度。检查了三天才发现是这个问题。
1.5 旋转矩阵
旋转矩阵是连接不同坐标系的桥梁。从机体坐标系到NED坐标系的旋转矩阵是:
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θ ]
这个矩阵我建议你手推一遍。我在做传感器融合时,每次都要确认旋转矩阵的方向——是从机体到NED,还是从NED到机体?搞反了,加速度计数据就全错了。
1.6 知识体系总览
下面这张图是我自己画的,把本章的核心逻辑串起来了:
1.7 工程实践建议
最后,我总结几条实战经验:
- 统一坐标系:整个飞控系统只用一种坐标系定义。我推荐NED + 机体X前Y右Z下。
- 姿态用四元数:内部计算全程四元数,只在显示时转欧拉角。
- 旋转矩阵写死:把旋转矩阵写成常量,不要每次计算。省CPU,也省心。
- 加断言检查:在关键位置检查四元数模长是否为1,旋转矩阵行列式是否为1。
记住:坐标系和姿态是飞控的“语言”。语言不通,飞机就乱飞。我见过太多炸机案例,根源都是坐标系搞错了。
好了,这一章就到这儿。下一章咱们聊传感器模型——IMU、GPS、空速管,这些东西怎么建模,怎么融合。