2、坐标系与姿态表示:常用坐标系、欧拉角、四元数与方向余弦矩阵
各位同学,欢迎来到第二章。这一章的内容,说白了就是给飞行器定个“位”,再告诉它“脸”朝哪。你想想看,一个飞控算法,连自己在哪里、脑袋朝哪个方向都不知道,那还控个啥?
我个人习惯,在开始设计任何控制律之前,先把坐标系和姿态表示法搞得清清楚楚。这就像盖房子打地基,地基歪了,楼盖得再漂亮也得塌。我在项目中遇到过不止一次,因为坐标系定义混乱,导致仿真数据跟实际试飞数据对不上,排查了整整三天,最后发现是导航坐标系和机体坐标系的转换符号搞反了。嗯,这种坑,踩过一次就记住了。
2.1 常用坐标系
飞控里常用的坐标系,其实就三大类。咱们一个一个说。
2.1.1 地心坐标系(ECEF)
地心坐标系,全称是 Earth-Centered Earth-Fixed。原点在地球质心,Z轴指向北极,X轴指向本初子午线与赤道的交点,Y轴按右手定则确定。这个坐标系主要用于GPS定位和长航时导航。说白了,它是个“绝对”坐标系,跟地球固连在一起转。
我建议:在做长航时飞行或者跨区域飞行时,一定要用ECEF做全局位置解算。但在做姿态控制时,我们很少直接用ECEF,因为它的旋转速度太快(地球自转),不适合描述飞行器本身的姿态变化。
2.1.2 导航坐标系(NED)
导航坐标系,也就是北东地坐标系。原点通常取在飞行器起飞点或地面站位置。X轴指向北,Y轴指向东,Z轴指向地心(向下)。这个坐标系是我们做姿态控制最常用的“参考系”。
为什么用NED?因为直观。你站在地面上,北在哪、东在哪,一目了然。飞行器的俯仰、滚转、偏航,都是相对于这个坐标系定义的。
2.1.3 机体坐标系(Body Frame)
机体坐标系,固连在飞行器上。原点在飞行器质心。X轴指向机头,Y轴指向右翼,Z轴指向机身下方(满足右手定则)。这个坐标系是描述飞行器自身角速度和加速度的“主场”。
你想想看,陀螺仪测到的角速度,加速度计测到的比力,都是在机体坐标系下的。我们要把这些数据转换到导航坐标系,才能做控制。
2.2 欧拉角表示法
欧拉角,可能是大家最熟悉的姿态表示法了。它用三个角度来描述飞行器的姿态:滚转角(φ)、俯仰角(θ)、偏航角(ψ)。
旋转顺序,我建议统一采用 Z-Y-X 顺序(先偏航,再俯仰,最后滚转)。为什么?因为这是航空领域的惯例,跟大多数飞控库(如PX4、ArduPilot)保持一致。我曾经因为用了不同的旋转顺序,导致姿态解算结果跟飞控板上的数据差了十万八千里,后来才发现是顺序问题。
欧拉角的优点很明显:直观,物理意义清晰。你看到俯仰角30度,就知道机头抬起来了。但缺点也很致命:万向锁。当俯仰角接近±90度时,滚转和偏航会耦合在一起,丢失一个自由度。固定翼飞机一般不会飞到这个角度,但做特技飞行或者垂直爬升时,还是要注意。
2.3 四元数表示法
四元数,说白了就是一个超复数。形式是 q = w + xi + yj + zk,其中 w 是实部,x、y、z 是虚部。它用四个参数来表示旋转,没有奇点,计算效率高。
四元数的核心优势:
- 无万向锁:任意姿态都能平滑表示
- 插值方便:做姿态平滑过渡时,用四元数球面线性插值(SLERP)非常自然
- 计算量小:比方向余弦矩阵少很多乘法
但四元数也有缺点:不直观。你看到 q = [0.707, 0, 0.707, 0],能想象出飞机是什么姿态吗?反正我不能。所以,在实际调试中,我通常把四元数转换成欧拉角显示在遥测界面上,方便观察。
四元数的归一化很重要。每次更新完四元数,一定要做归一化处理,否则数值误差会累积,导致姿态发散。嗯,这里要注意,归一化不是可选项,是必选项。
// 四元数归一化示例(C语言风格)
void quaternion_normalize(float q[4]) {
float norm = sqrt(q[0]*q[0] + q[1]*q[1] + q[2]*q[2] + q[3]*q[3]);
if (norm < 1e-10f) {
// 防止除零
q[0] = 1.0f;
q[1] = q[2] = q[3] = 0.0f;
return;
}
float inv_norm = 1.0f / norm;
q[0] *= inv_norm;
q[1] *= inv_norm;
q[2] *= inv_norm;
q[3] *= inv_norm;
}
2.4 方向余弦矩阵(DCM)
方向余弦矩阵,是一个3x3的旋转矩阵。它把机体坐标系下的向量转换到导航坐标系下。说白了,DCM 就是欧拉角和四元数的“实体化”表达。
DCM 的优点是:物理意义明确,每一列或每一行都是坐标轴的方向余弦。缺点是:9个参数,计算量大,而且必须保证正交性(否则矩阵会退化)。
在实际工程中,我很少直接用DCM做姿态更新,因为计算量太大。但DCM在坐标转换时非常有用。比如,你要把机体坐标系下的加速度转换到导航坐标系,直接乘DCM就行。
三种表示法的对比,我整理了一个表格:
| 表示法 | 参数数量 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| 欧拉角 | 3 | 直观,物理意义清晰 | 有万向锁,不适合大机动 | 调试显示、小角度控制 |
| 四元数 | 4 | 无奇点,计算快,可插值 | 不直观 | 姿态解算、大机动控制 |
| 方向余弦矩阵 | 9 | 物理意义明确,转换方便 | 计算量大,需正交化 | 坐标转换、理论分析 |
好了,这一章的内容就到这里。坐标系和姿态表示是飞控算法的基石,一定要理解透彻。下一章,我们会进入动力学建模,看看飞行器到底是怎么飞起来的。