第二章:坐标系与姿态表示——飞控系统的“世界观”
各位同学,欢迎来到第二章。
做飞控这么多年,我最大的体会就是:坐标系选不对,后面全白费。你想想看,导弹在天上飞,它怎么知道自己朝哪飞?怎么知道目标在哪?说白了,就是靠坐标系来“定位”自己。这一章,我们就来聊聊飞控系统的“世界观”——坐标系与姿态表示。
2.1 常用坐标系:飞控的“参考系”
坐标系这东西,说白了就是一把尺子。你站在不同地方量,结果不一样。飞控系统里,常用的坐标系有三大类:地心坐标系、地理坐标系、弹体坐标系。我一个个讲。
2.1.1 地心坐标系(ECEF)
地心坐标系,全称是 Earth-Centered Earth-Fixed。它的原点在地球质心,Z轴指向北极,X轴指向本初子午线与赤道的交点,Y轴按右手定则确定。
这个坐标系最大的特点是:它跟着地球一起转。所以,地面上一个固定点,在地心坐标系里的坐标是变化的(因为地球在自转)。
核心用途:主要用于卫星导航、远程导弹的初始对准。GPS给出的经纬高,最终都要转换到地心坐标系里才能用。
💡 我个人习惯:在做远程弹道计算时,先用地心坐标系算轨道,再转回地理坐标系。这样能避免地球自转带来的误差累积。
2.1.2 地理坐标系(NED/ENU)
地理坐标系,也叫导航坐标系。它的原点在飞行器质心,三个轴分别指向北、东、地(NED)或者东、北、天(ENU)。
飞控系统里,NED坐标系用得最多。为什么?因为导弹的俯仰、偏航、滚转,都是相对于当地水平面来定义的。你想想看,导弹抬头30度,这个“抬头”就是相对于地理坐标系说的。
| 坐标系 | X轴 | Y轴 | Z轴 | 典型应用 |
|---|---|---|---|---|
| NED | 北 | 东 | 地 | 导弹制导、无人机导航 |
| ENU | 东 | 北 | 天 | 地面雷达、光电跟踪 |
⚠️ 注意:我曾经在项目里吃过亏——把NED和ENU搞混了,结果导弹的航向角差了90度。嗯,那次试飞差点出事。所以,一定要在代码注释里写清楚用的是哪个。
2.1.3 弹体坐标系(Body Frame)
弹体坐标系,原点在导弹质心,X轴沿弹体纵轴向前,Y轴指向右侧(从尾部看),Z轴向下(右手定则)。
这个坐标系是跟着导弹一起动的。你坐在导弹里,你看到的“前”、“右”、“下”,就是弹体坐标系的方向。
为什么要用弹体坐标系?因为导弹上的传感器(陀螺、加速度计)都是固定在弹体上的。它们测到的数据,天然就是弹体坐标系下的。所以,控制律设计通常也在弹体坐标系里做。
2.2 姿态表示:怎么描述导弹“转”了?
有了坐标系,接下来就是怎么描述导弹的姿态。说白了,就是导弹相对于地理坐标系“转”了多少。常用的方法有三种:欧拉角、方向余弦矩阵、四元数。
2.2.1 欧拉角
欧拉角是最直观的。它用三个角度来描述旋转:俯仰角θ、偏航角ψ、滚转角φ。
- 俯仰角θ:弹体纵轴与水平面的夹角。抬头为正。
- 偏航角ψ:弹体纵轴在水平面上的投影与北向的夹角。右偏为正。
- 滚转角φ:弹体绕纵轴旋转的角度。右滚为正。
旋转顺序是:先偏航,再俯仰,最后滚转。这个顺序不能乱,乱了姿态就变了。
优点:直观,人脑好理解。
缺点:有“万向锁”问题。当俯仰角接近±90度时,偏航和滚转就分不清了。我当年做垂直发射导弹时,就遇到过这个问题——导弹刚出筒时几乎是垂直的,欧拉角直接炸了。
2.2.2 方向余弦矩阵(DCM)
方向余弦矩阵,是一个3x3的矩阵。它能把一个向量从一个坐标系旋转到另一个坐标系。
比如,从弹体坐标系到地理坐标系的旋转矩阵C_b^n,它的每一列就是弹体坐标轴在地理坐标系里的方向余弦。
// 方向余弦矩阵示例(从弹体到地理)
C_b^n = [
[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θ]
];
💡 我个人习惯:在做惯性导航解算时,用DCM来更新姿态。虽然计算量比四元数大一点,但物理意义清晰,调试时容易发现问题。
2.2.3 四元数
四元数,是数学家发明的“神器”。它用一个四维向量来表示旋转:q = [q0, q1, q2, q3]。
其中,q0是标量部分,代表旋转角的一半的余弦;[q1, q2, q3]是矢量部分,代表旋转轴的方向。
四元数最大的好处是:没有奇点,计算效率高。而且,两个旋转的复合,用四元数乘法就能搞定,比矩阵乘法快得多。
// 四元数乘法示例(复合旋转)
q_result = q1 * q2;
// 具体实现:
// q0 = q1_0*q2_0 - q1_1*q2_1 - q1_2*q2_2 - q1_3*q2_3;
// q1 = q1_0*q2_1 + q1_1*q2_0 + q1_2*q2_3 - q1_3*q2_2;
// q2 = q1_0*q2_2 - q1_1*q2_3 + q1_2*q2_0 + q1_3*q2_1;
// q3 = q1_0*q2_3 + q1_1*q2_2 - q1_2*q2_1 + q1_3*q2_0;
⚠️ 注意:四元数必须归一化!我见过太多新手,算着算着四元数的模就不等于1了,结果姿态越偏越远。所以,每步更新后都要做归一化。
2.3 三种姿态表示方法的对比
| 方法 | 直观性 | 计算效率 | 奇点问题 | 适用场景 |
|---|---|---|---|---|
| 欧拉角 | ★★★★★ | ★★★ | 有(俯仰±90°) | 地面显示、手动控制 |
| 方向余弦矩阵 | ★★★★ | ★★ | 无 | 惯性导航、坐标转换 |
| 四元数 | ★★ | ★★★★★ | 无 | 飞控解算、姿态更新 |
2.4 知识体系总览
下面这张图,是我自己画的。它把这一章的核心逻辑串起来了。你仔细看一遍,应该能明白坐标系和姿态表示在整个飞控系统里的位置。
2.5 避坑指南:我踩过的那些坑
做飞控十几年,我在坐标系和姿态表示上栽过不少跟头。分享几个典型的,你们以后遇到了能少走弯路。
- 坐标系混用:有一次,导航模块输出的是NED坐标,控制模块却按ENU来解算。结果导弹飞出去就偏了90度。嗯,那次排查花了我整整两天。
- 欧拉角顺序搞错:不同厂家、不同芯片,欧拉角的旋转顺序可能不一样。有的先偏航再俯仰,有的先俯仰再偏航。一定要看手册!
- 四元数忘记归一化:这个我前面提过。每步更新后,记得做 q = q / norm(q)。不然误差会越积越大。
- 万向锁没处理:如果你的导弹有垂直发射或者大俯仰角机动,建议别用欧拉角做解算,改用四元数或者DCM。
总结一下:
坐标系是飞控的“世界观”,姿态表示是“语言”。选对了,后面顺风顺水;选错了,调试到怀疑人生。
我个人建议:解算用四元数,显示用欧拉角,转换用DCM。这样各取所长,既高效又直观。
公众号:蓝海资料掘金营,微信deep3321