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度时,滚转和偏航会耦合在一起,丢失一个自由度。固定翼飞机一般不会飞到这个角度,但做特技飞行或者垂直爬升时,还是要注意。

避坑指南: 我曾经在做一个垂直起降固定翼(VTOL)项目时,飞机在过渡阶段俯仰角接近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 物理意义明确,转换方便 计算量大,需正交化 坐标转换、理论分析
我的建议: 姿态解算用四元数,控制律设计用欧拉角(小角度假设下),坐标转换用DCM。三者各有各的舞台,别指望一种方法打天下。

好了,这一章的内容就到这里。坐标系和姿态表示是飞控算法的基石,一定要理解透彻。下一章,我们会进入动力学建模,看看飞行器到底是怎么飞起来的。