2、坐标系与旋转:地球坐标系、机体坐标系、欧拉角、旋转矩阵、四元数基础
好,咱们正式开始聊飞控里最绕不开的一个话题——坐标系与旋转。
说实话,我当年刚入行时,被这几个概念折磨得不轻。什么欧拉角、四元数,看着公式就头疼。后来在项目里摔过几次机,才真正明白:坐标系搞不清楚,飞控代码写得再漂亮也是白搭。
这一节,咱们就把这些基础概念掰开揉碎了讲。你跟着我的思路走,保证能理清楚。
2.1 地球坐标系:飞控的“绝对参考系”
地球坐标系,也叫导航坐标系。说白了,就是给无人机一个“绝对”的位置参考。
我习惯用 NED(北东地) 坐标系:
- X轴:指向地理北极
- Y轴:指向地理东向
- Z轴:指向地心(向下)
为什么Z轴要向下?嗯,这里要注意:这是航空领域的惯例。你想想看,飞机在地面时,高度为0,飞起来后高度为正,Z轴向下正好符合这个直觉。
核心理解:地球坐标系是固定不动的。无人机所有的位置、速度、加速度,最终都要换算到这个坐标系下才有意义。
我在项目中遇到过一个问题:有个同事把GPS的高度数据直接当成“海拔高度”用,结果无人机在丘陵地带飞着飞着就撞山了。为什么?因为GPS给的是WGS84椭球高,不是真正的海拔高。这就是坐标系没对齐的典型坑。
2.2 机体坐标系:无人机“自己”的坐标系
机体坐标系是固定在无人机身上的。不管飞机怎么翻、怎么转,这个坐标系跟着飞机一起动。
标准定义是这样的:
- X轴:指向机头方向(前进方向)
- Y轴:指向机身右侧
- Z轴:指向机身下方
你想想看,无人机上的IMU(惯性测量单元)测量到的加速度和角速度,都是基于机体坐标系的。但我们要控制飞机的位置,必须知道它在“地球坐标系”下的状态。
这就引出了一个问题:怎么把机体坐标系下的数据,转换到地球坐标系下?
答案就是——旋转。
2.3 欧拉角:横滚、俯仰、偏航
欧拉角是最直观的旋转描述方式。它用三个角度来描述一个物体的姿态:
| 角度 | 符号 | 描述 | 范围 |
|---|---|---|---|
| 横滚角 | φ (phi) | 绕X轴旋转,左右倾斜 | -180° ~ 180° |
| 俯仰角 | θ (theta) | 绕Y轴旋转,抬头低头 | -90° ~ 90° |
| 偏航角 | ψ (psi) | 绕Z轴旋转,机头朝向 | -180° ~ 180° |
我个人习惯用 Z-Y-X 的旋转顺序(先偏航、再俯仰、最后横滚)。这个顺序在飞控领域最常用,也最符合直觉。
注意!欧拉角有个致命问题——万向锁(Gimbal Lock)。
当俯仰角达到 ±90° 时,横滚和偏航会失去一个自由度。我曾经在调试一个特技飞行的无人机时,就因为没处理好万向锁,导致飞机在倒飞时姿态解算直接崩了。嗯,从那以后,我再也不敢在飞控核心代码里只用欧拉角了。
2.4 旋转矩阵:数学上的“坐标系转换器”
旋转矩阵,说白了就是一个3x3的矩阵。它能把一个向量从一个坐标系,旋转到另一个坐标系。
比如,从机体坐标系到地球坐标系的旋转矩阵 R,满足:
P_earth = R * P_body
其中 P_body 是机体坐标系下的向量,P_earth 是地球坐标系下的同一个向量。
旋转矩阵由三个基本旋转矩阵相乘得到:
R = R_z(ψ) * R_y(θ) * R_x(φ)
每个基本旋转矩阵长这样(以绕Z轴旋转为例):
R_z(ψ) = [cosψ -sinψ 0]
[sinψ cosψ 0]
[0 0 1]
你想想看,三个矩阵乘在一起,虽然公式看着复杂,但计算机算起来非常快。而且旋转矩阵没有万向锁问题。
我的经验:在实际飞控代码里,我很少直接手写旋转矩阵的乘法。一般都是用现成的数学库,比如PX4里的matrix库,或者自己封装好的函数。但理解原理很重要——至少你得知道,为什么旋转矩阵的逆等于它的转置(因为它是正交矩阵)。
2.5 四元数:飞控的“终极武器”
四元数,听起来很玄乎。其实它就是一个四维的复数扩展:
q = w + xi + yj + zk
其中 w 是实部,x、y、z 是虚部。约束条件:w² + x² + y² + z² = 1(单位四元数)。
为什么飞控要用四元数?三个理由:
- 无万向锁:这是最大的优势。做全姿态飞行时,四元数是唯一的选择。
- 计算量小:四元数乘法只需要16次浮点运算,而旋转矩阵乘法需要27次。
- 插值平滑:两个姿态之间做平滑过渡,四元数的球面线性插值(SLERP)非常优雅。
我记得第一次在STM32上跑四元数解算时,发现CPU占用率从30%降到了8%。那一刻我就明白了——四元数才是飞控的标配。
四元数和旋转矩阵可以互相转换。比如,从四元数到旋转矩阵的公式:
R = [1-2(y²+z²) 2(xy-wz) 2(xz+wy) ]
[2(xy+wz) 1-2(x²+z²) 2(yz-wx) ]
[2(xz-wy) 2(yz+wx) 1-2(x²+y²) ]
看着复杂?别怕。实际代码里,你只需要调用一个函数:quat2rotm(q) 就行了。
核心理解:在飞控里,我们通常用四元数做姿态解算和更新,用欧拉角做显示和调试,用旋转矩阵做坐标系转换。三者各司其职。
2.6 实战中的选择建议
好了,理论讲完了。咱们聊聊实际项目中怎么选。
| 场景 | 推荐使用 | 原因 |
|---|---|---|
| 姿态解算(IMU融合) | 四元数 | 无万向锁,计算量小 |
| 姿态显示(地面站) | 欧拉角 | 直观,人眼容易理解 |
| 坐标系转换(控制律) | 旋转矩阵 | 方便做向量运算 |
| 姿态插值(云台控制) | 四元数 | SLERP平滑无突变 |
我的建议:刚开始学飞控时,先用欧拉角理解姿态的概念。等你要写实际飞控代码了,果断切换到四元数。我曾经见过一个团队,因为一直用欧拉角做姿态控制,结果在横滚角超过90°时直接炸机。这个教训,希望你不要重蹈覆辙。
最后,送你一句话:坐标系是飞控的“语言”,旋转是飞控的“语法”。这两样搞不明白,后面的PID调参、卡尔曼滤波都是空中楼阁。
下一节,咱们就基于这些坐标系知识,开始聊角速度环的调优。到时候你会发现,今天打下的基础,全都能用上。