2. 坐标系与姿态表示:地球坐标系、机体坐标系、欧拉角、旋转矩阵、四元数
好,咱们正式开始聊飞控里最绕不开的一个话题——坐标系和姿态表示。
说实话,我刚开始做飞控那会儿,觉得这东西不就是几个角度嘛,有什么好讲的?结果第一次调PID的时候,飞机在天上乱转,我在地上抓瞎。后来才发现,是坐标系搞混了,姿态算错了。嗯,从那以后,我再也不敢小看这一章了。
2.1 两个核心坐标系:地球坐标系 vs 机体坐标系
飞控里最常用的坐标系就两个:一个是你站在地面上看飞机的坐标系,一个是飞机自己感觉到的坐标系。
地球坐标系(NED系):也叫导航坐标系。我习惯叫它“大地系”。
- N轴:指向正北
- E轴:指向正东
- D轴:指向地心(也就是向下)
你想想看,这个坐标系是固定不动的。不管飞机怎么翻跟头,大地系永远不变。我们在做位置控制、航线规划的时候,用的就是它。
机体坐标系(Body系):这个坐标系是长在飞机上的。
- X轴:指向机头
- Y轴:指向飞机右侧
- Z轴:指向飞机下方(右手定则)
我在项目中遇到过一个问题:IMU(惯性测量单元)输出的加速度数据,默认是在机体坐标系下的。但你要做位置控制,需要的是大地系下的加速度。这就涉及到坐标系转换了。
核心要点:传感器数据在机体系,控制目标在大地系。两者之间必须做转换。
2.2 欧拉角:最直观的姿态表示
欧拉角,说白了就是三个角度:横滚角(Roll)、俯仰角(Pitch)、偏航角(Yaw)。
我个人习惯这样记:
- Roll(φ):绕X轴转,飞机左右倾斜
- Pitch(θ):绕Y轴转,飞机抬头低头
- Yaw(ψ):绕Z轴转,飞机左右转向
欧拉角的好处是直观。你一看Roll=30°,就知道飞机向右倾斜了30度。但坏处也很明显——万向锁。
避坑指南:我曾经在调试一个特技飞行模式时,飞机俯仰角接近90°,结果偏航和横滚突然耦合了,飞机直接失控。这就是万向锁——当Pitch=±90°时,Roll和Yaw的旋转轴重合,丢失了一个自由度。
所以,欧拉角适合给人看,但不适合在飞控内部做连续姿态运算。
2.3 旋转矩阵:数学上的坐标系转换
旋转矩阵,就是把一个向量从一个坐标系转到另一个坐标系。比如把机体系的加速度转到大地系。
从大地系到机体系的旋转矩阵长这样:
R = Rz(ψ) * Ry(θ) * Rx(φ)
其中:
Rx(φ) = [1, 0, 0;
0, cosφ, -sinφ;
0, sinφ, cosφ]
Ry(θ) = [ cosθ, 0, sinθ;
0, 1, 0;
-sinθ, 0, cosθ]
Rz(ψ) = [cosψ, -sinψ, 0;
sinψ, cosψ, 0;
0, 0, 1]
注意顺序:先Roll,再Pitch,最后Yaw。这个顺序不能乱,乱了结果就错了。
我在项目中遇到过一个问题:用旋转矩阵做姿态更新时,每次都要算9个三角函数,计算量很大。对于STM32这种MCU来说,有点吃不消。所以实际飞控里,很少直接用旋转矩阵做实时运算。
2.4 四元数:飞控的“真香”选择
四元数,说白了就是一个复数在三维空间的推广。形式是:
q = w + xi + yj + zk
其中w是实部,x、y、z是虚部。而且满足:
w² + x² + y² + z² = 1
为什么飞控里都用四元数?三个原因:
- 无万向锁:随便你怎么转,不会丢失自由度
- 计算量小:只有乘法和加法,没有三角函数
- 便于插值:两个姿态之间平滑过渡,用四元数球面插值(Slerp)非常方便
个人经验:我建议所有飞控新手直接跳过欧拉角做姿态解算,从四元数入手。虽然刚开始理解起来有点抽象,但一旦习惯了,你会发现它比欧拉角好用太多。
2.5 四元数与旋转矩阵的转换
实际代码里,我们经常需要在四元数和旋转矩阵之间来回转换。比如:
四元数 → 旋转矩阵:
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²)]
旋转矩阵 → 欧拉角:
φ = atan2(R[2][1], R[2][2])
θ = -asin(R[2][0])
ψ = atan2(R[1][0], R[0][0])
嗯,这里要注意:atan2函数比atan好,它能处理四个象限的角度。
2.6 知识体系总览
下面这张图,是我自己总结的坐标系与姿态表示的核心逻辑。你看一遍,应该就能把整个脉络串起来了。
2.7 实际代码中的选择
最后,我分享一下在实际飞控代码里,我是怎么用这些概念的:
| 场景 | 用什么表示 | 为什么 |
|---|---|---|
| 姿态解算(IMU融合) | 四元数 | 无万向锁,计算量小,适合MCU |
| 姿态控制(PID) | 欧拉角 | 直观,方便调参 |
| 坐标系转换 | 旋转矩阵 | 数学上最直接,偶尔用一下 |
| 日志记录 | 欧拉角 | 人看得懂,方便分析问题 |
我的建议:写飞控代码时,内部统一用四元数。只在需要输出给用户看的时候,才转成欧拉角。这样既避免了万向锁,又保证了可读性。
好了,坐标系和姿态表示就聊到这儿。这些东西是飞控的“地基”,地基打不牢,后面盖什么楼都得塌。你先把这几个概念吃透,后面讲姿态解算和控制的时候,咱们就能直接上干货了。
公众号:蓝海资料掘金营,微信deep3321