3、坐标系与姿态表示:地理坐标系、机体坐标系、欧拉角、旋转矩阵、四元数基础
做飞控仿真,绕不开的第一个坎儿就是坐标系。我刚开始接触那会儿,也被这些乱七八糟的坐标系搞得晕头转向。说白了,你描述飞机的位置和姿态,总得有个参考系吧?地理坐标系告诉你飞机在哪儿,机体坐标系告诉你飞机头朝哪儿,而欧拉角、旋转矩阵、四元数,就是用来沟通这两个世界的语言。
这一节,咱们就把这些基础概念掰扯清楚。嗯,都是干货,也是后面所有仿真的地基。
3.1 地理坐标系:我们站在哪儿看飞机?
地理坐标系,也叫导航坐标系,或者叫NED坐标系。我习惯叫它“大地坐标系”。它固定在地球上,原点通常选在飞机的起飞点或者地面站的位置。
- N轴(北轴):指向地理北极,也就是正北方向。
- E轴(东轴):指向正东方向,与N轴垂直。
- D轴(地轴):指向地心,也就是垂直向下。注意,是向下!
为什么D轴要向下?因为飞控里加速度计测的就是重力加速度,方向是向下的。你想想看,如果D轴向上,那重力加速度就得写成负的,多别扭。所以NED坐标系是右手坐标系,但D轴向下,这点要记牢。
核心记忆点:地理坐标系是“静止”的,我们用它来描述飞机的绝对位置和速度。在MATLAB仿真里,我们通常把飞机的经纬高转换成NED坐标来用。
3.2 机体坐标系:飞机自己怎么看自己?
机体坐标系就绑在飞机身上,原点在飞机的重心。它跟着飞机一起转。
- Xb轴(滚转轴):指向机头方向。
- Yb轴(俯仰轴):指向飞机右侧机翼。
- Zb轴(偏航轴):指向飞机下方,与Xb、Yb构成右手系。
我在项目中遇到过一个问题:有个同事把机体坐标系的Z轴搞反了,结果仿真出来的飞机一推油门就往地里钻。嗯,这种低级错误,排查起来真的很头疼。所以,机体坐标系的Z轴向下,这是行业惯例,别乱改。
3.3 欧拉角:用三个角度描述姿态
欧拉角是最直观的姿态表示方法。说白了,就是告诉你飞机先绕哪个轴转多少度。
飞控里常用的顺序是:Z-Y-X,也就是先偏航(Yaw),再俯仰(Pitch),最后滚转(Roll)。
- 偏航角 ψ (Yaw):绕Zb轴旋转,机头左右摆动。
- 俯仰角 θ (Pitch):绕Yb轴旋转,机头上下摆动。
- 滚转角 φ (Roll):绕Xb轴旋转,机身左右倾斜。
避坑指南:欧拉角有“万向锁”问题。当俯仰角接近±90°时,偏航和滚转的旋转轴会重合,导致丢失一个自由度。我曾经在仿真大机动飞行时,就因为没处理万向锁,结果姿态解算直接炸了。所以,如果你要做全姿态飞行(比如特技),别只用欧拉角。
3.4 旋转矩阵:数学上的“翻译官”
旋转矩阵,就是把机体坐标系下的向量,翻译到地理坐标系下的工具。反过来也行。
从地理坐标系到机体坐标系的旋转矩阵长这样(按Z-Y-X顺序):
R = Rz(ψ) * Ry(θ) * Rx(φ)
其中:
Rz(ψ) = [cosψ sinψ 0; -sinψ cosψ 0; 0 0 1]
Ry(θ) = [cosθ 0 -sinθ; 0 1 0; sinθ 0 cosθ]
Rx(φ) = [1 0 0; 0 cosφ sinφ; 0 -sinφ cosφ]
你想想看,有了这个矩阵,你就能把机体上的加速度计读数,转换到地理坐标系下,然后积分得到速度、位置。这就是惯性导航的基本原理。
我的小技巧:在MATLAB里,别自己手写矩阵乘法,直接用 angle2dcm(yaw, pitch, roll, 'ZYX') 这个函数。又快又不容易出错。我刚开始手算的时候,经常把正负号搞反,后来就学乖了。
3.5 四元数:为什么飞控都爱用它?
四元数,听起来很高大上,其实就是一个复数在三维空间的推广。形式是:q = w + xi + yj + zk,其中w是实部,x、y、z是虚部。
为什么飞控圈都爱用四元数?说白了,就三个原因:
- 无万向锁:随便你怎么转,都不会出现奇点。
- 计算量小:比旋转矩阵少几个乘法和加法,在嵌入式MCU上跑起来更流畅。
- 插值平滑:两个姿态之间做插值,四元数比欧拉角平滑得多。
我记得有一次做无人机航点跟踪,用欧拉角插值,结果飞机在转弯时姿态抖得厉害。换成四元数球面线性插值(Slerp)后,一下子就顺滑了。嗯,这就是实战经验。
四元数和旋转矩阵可以互相转换。在MATLAB里:
% 欧拉角转四元数
q = eul2quat([yaw, pitch, roll], 'ZYX');
% 四元数转旋转矩阵
R = quat2rotm(q);
3.6 知识体系总览
下面这张图,是我自己梳理的坐标系与姿态表示的核心逻辑。你看一遍,应该就能把这一节的知识串起来了。
3.7 实战建议:在Simulink里怎么选?
在Simulink里做飞控仿真,姿态表示这块我建议你这样搞:
- 内部计算用四元数:姿态解算、控制律计算,都用四元数。稳定,没奇点。
- 显示和调试用欧拉角:人眼看得懂,方便调参。用
quat2eul转一下就行。 - 坐标变换用旋转矩阵:比如把机体加速度转到地理坐标系,直接用旋转矩阵乘一下,逻辑清晰。
我的习惯:在Simulink模型里,我会专门做一个“姿态转换”子系统,把四元数、欧拉角、旋转矩阵的互相转换都封装在里面。这样模型干净,调试也方便。你也不妨试试。
好了,坐标系和姿态表示就聊到这儿。这些东西看着基础,但真到了写代码、搭模型的时候,稍微疏忽一点就会出大问题。嗯,多动手,多仿真,慢慢就熟了。