第二章:坐标系与姿态表示
各位同学,今天我们来聊聊飞控里最基础、也最容易绕晕的东西——坐标系和姿态表示。
说实话,我刚入行那会儿,觉得这玩意儿不就是几个角度嘛,有啥好学的?结果第一次调飞控,飞机在天上乱转,我才意识到:坐标系搞错了,后面全是白搭。嗯,咱们今天就把这块地基打牢。
2.1 地球坐标系与机体坐标系
先说说两个最常用的坐标系。
地球坐标系,也叫NED坐标系——North、East、Down。说白了,就是北、东、地。原点通常选在起飞点,X轴指向北,Y轴指向东,Z轴指向地心。这个坐标系是固定的,飞机飞到哪里,它都不变。
机体坐标系,是绑在飞机身上的。原点在飞机重心,X轴指向机头,Y轴指向右翼,Z轴指向机腹。飞机一翻身,这个坐标系也跟着翻。
为什么要搞两个坐标系?你想想看,传感器测的是机体上的数据(比如加速度计感受到的是机体坐标系下的加速度),但导航和控制需要的是地球坐标系下的位置和速度。所以,两个坐标系之间必须能互相转换。
核心要点:所有传感器数据最终都要统一到同一个坐标系下处理。我见过不少新手,把加速度计数据直接当成了地球坐标系下的数据去积分,结果位置估计飞到了天上去。
2.2 欧拉角:最直观的姿态表示
欧拉角,就是大家常说的俯仰角、横滚角、偏航角。分别绕机体坐标系的Y轴、X轴、Z轴旋转。
我习惯用Z-Y-X的顺序:先绕Z轴转偏航角(ψ),再绕Y轴转俯仰角(θ),最后绕X轴转横滚角(φ)。这个顺序很重要,顺序不同,结果完全不同。
| 角度 | 符号 | 范围 | 说明 |
|---|---|---|---|
| 横滚角 | φ | -180° ~ 180° | 绕X轴旋转,左右倾斜 |
| 俯仰角 | θ | -90° ~ 90° | 绕Y轴旋转,抬头低头 |
| 偏航角 | ψ | -180° ~ 180° | 绕Z轴旋转,左右转向 |
⚠️ 万向锁问题:当俯仰角接近±90°时,横滚和偏航会失去一个自由度。这就是欧拉角的致命缺陷。我曾经在无人机做倒飞动作时遇到过,姿态解算直接炸了。所以,如果你做的是全姿态飞行(比如特技无人机),千万别只用欧拉角。
2.3 旋转矩阵:数学上的坐标系变换
旋转矩阵,说白了就是把一个向量从一个坐标系转到另一个坐标系。比如,把机体坐标系下的加速度转到地球坐标系下。
单个轴的旋转矩阵很简单:
// 绕X轴旋转角度φ
R_x(φ) = [1, 0, 0;
0, cosφ, -sinφ;
0, sinφ, cosφ]
// 绕Y轴旋转角度θ
R_y(θ) = [cosθ, 0, sinθ;
0, 1, 0;
-sinθ, 0, cosθ]
// 绕Z轴旋转角度ψ
R_z(ψ) = [cosψ, -sinψ, 0;
sinψ, cosψ, 0;
0, 0, 1]
完整的旋转矩阵就是这三个矩阵的乘积。按Z-Y-X顺序:
R = R_z(ψ) * R_y(θ) * R_x(φ)
这个矩阵有9个元素,但只有3个自由度。所以,它是有冗余的。实际工程中,我们很少直接用旋转矩阵做姿态更新,因为计算量大,而且容易产生数值误差。
💡 我的经验:旋转矩阵适合做一次性的坐标变换,比如把GPS的速度从地球坐标系转到机体坐标系。但如果你要持续更新姿态,建议用四元数。
2.4 四元数基础:飞控的标配
四元数,听起来高大上,其实就是一个四维的复数。形式是:q = w + xi + yj + zk,其中w是实部,x、y、z是虚部。
为什么飞控都用四元数?三个原因:
- 无万向锁——随便你怎么转,都不会出现奇异点
- 计算量小——只有4个参数,比旋转矩阵的9个少多了
- 插值平滑——做姿态平滑时,四元数的球面线性插值非常自然
四元数表示旋转的公式:
// 绕单位向量 (nx, ny, nz) 旋转角度 θ
q = cos(θ/2) + (nx * sin(θ/2))i + (ny * sin(θ/2))j + (nz * sin(θ/2))k
两个四元数相乘,就相当于两次旋转的叠加。注意,四元数乘法不满足交换律,顺序很重要。
核心公式:用四元数旋转一个向量v:v' = q * v * q⁻¹。其中q⁻¹是q的共轭四元数。这个公式在姿态解算中天天用。
2.5 三种表示方式的对比
| 表示方式 | 参数数量 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| 欧拉角 | 3 | 直观,容易理解 | 万向锁,插值不自然 | 地面站显示、遥控器输入 |
| 旋转矩阵 | 9 | 数学性质好,容易推导 | 冗余大,计算量高 | 坐标变换、计算机图形学 |
| 四元数 | 4 | 无奇异点,计算高效 | 不够直观 | 姿态解算、控制律、滤波 |
2.6 知识体系结构图
下面这张图,是我自己梳理的本章知识脉络。你看一遍,应该能明白各个概念之间的关系。
2.7 实际工程中的选择建议
说了这么多,到底该用哪个?我直接给结论:
- 传感器原始数据:用欧拉角读出来(比如MPU6050的DMP输出),但别直接用它做积分
- 姿态解算(AHRS/INS):用四元数。卡尔曼滤波、互补滤波,都是基于四元数的
- 控制律计算:用四元数或者旋转矩阵都行。我个人习惯用四元数,因为方便做姿态误差计算
- 地面站显示:转成欧拉角显示给用户看,毕竟人眼能理解的是角度,不是四元数
💡 避坑指南:我曾经在四元数归一化上吃过亏。四元数必须保持单位模长,否则姿态会慢慢漂移。每次更新完四元数,记得做一次归一化:q = q / norm(q)。这个习惯我一直保持到现在。
好了,坐标系和姿态表示就讲到这里。这些东西看着简单,但真到了调飞控的时候,你会发现每一步都离不开它们。下一章我们讲传感器,到时候你会看到,这些坐标系转换是怎么跟加速度计、陀螺仪的数据结合在一起的。
公众号:蓝海资料掘金营,微信deep3321