2、坐标系与坐标变换:地球坐标系、机体坐标系、欧拉角与四元数、坐标变换矩阵

说实话,坐标系这个东西,刚入门的时候很容易被绕晕。

我记得我第一次做无人机仿真,明明代码逻辑都对,飞机就是原地打转。查了两天,最后发现是坐标变换矩阵写反了。嗯,从那以后,我对坐标系就格外上心。

这一节,咱们就把坐标系和坐标变换彻底讲透。你想想看,无人机在天上飞,它得知道自己在哪里,机头朝哪,姿态怎么样。这些信息,全靠坐标系来描述。

2.1 地球坐标系:飞机到底在哪?

地球坐标系,说白了就是给地球贴个标签,让无人机知道自己的绝对位置。

最常用的有两种:

  • 地理坐标系(LLA):经度、纬度、高度。GPS直接输出的就是这个。
  • 地心地固坐标系(ECEF):以地心为原点,X轴指向本初子午线,Y轴指向东经90度,Z轴指向北极。做远距离导航时用得多。

我个人习惯,在局部路径规划时,会把LLA转成平面坐标。为什么呢?因为经纬度算距离太麻烦了,还得考虑地球曲率。

核心转换: 从LLA到平面坐标,常用的是UTM投影或者高斯-克吕格投影。简单说,就是把地球表面“拍平”。

2.2 机体坐标系:飞机头朝哪?

地球坐标系是“世界”的视角。那飞机自己怎么看自己?这就用到机体坐标系了。

机体坐标系的原点在飞机的重心。通常这样定义:

  • X轴:指向机头方向(前进方向)
  • Y轴:指向飞机右侧(右翼方向)
  • Z轴:指向飞机下方(符合右手定则)

我在项目中遇到过一个问题:IMU(惯性测量单元)安装的时候,如果没对准机头,那输出的加速度和角速度就是歪的。这时候必须做标定,把IMU的坐标系旋转到机体坐标系。

注意: 不同飞控厂商对机体坐标系的定义可能略有差异。比如有的把Z轴朝上。拿到新飞控,第一件事就是确认坐标系定义,否则后面全白干。

2.3 欧拉角:最直观的姿态描述

欧拉角,就是用来描述“飞机相对于地球坐标系转了多少”。

三个角度:

角度 含义 范围
滚转角(Roll, φ) 绕X轴旋转,左右倾斜 -180° ~ 180°
俯仰角(Pitch, θ) 绕Y轴旋转,抬头低头 -90° ~ 90°
偏航角(Yaw, ψ) 绕Z轴旋转,机头朝向 -180° ~ 180° 或 0° ~ 360°

欧拉角的好处是直观。你一看“俯仰30度”,就知道飞机抬头了。

但它有个致命问题——万向锁。当俯仰角接近±90度时,滚转和偏航会耦合,丢失一个自由度。我曾经在调试一个特技飞行的无人机时,就遇到了万向锁,姿态解算直接崩了。

我的建议: 如果只是做普通的水平飞行控制,欧拉角够用。但如果要做全姿态机动(比如穿越机、特技飞行),赶紧换四元数。

2.4 四元数:优雅的数学工具

四元数,听起来高大上,其实就是为了解决万向锁而生的。

它用四个数来表示旋转:

q = w + xi + yj + zk

其中 w 是实部,x、y、z 是虚部。约束条件是 w² + x² + y² + z² = 1。

为什么用四个数?因为它在数学上避免了奇异性,而且插值平滑,计算效率高。

我记得第一次手写四元数更新代码时,公式推导了半天。其实你不需要完全理解它的几何意义,会用就行。核心操作就两个:

  1. 四元数乘法:用来组合旋转
  2. 四元数归一化:防止累积误差导致模长偏离1

实用技巧: 从IMU读取的角速度,通过四元数微分方程更新姿态,是飞控里最常用的方法。代码大概长这样:

// 四元数更新(简化版)
void quaternionUpdate(float gx, float gy, float gz, float dt) {
    float q0, q1, q2, q3; // 当前四元数
    float dq0, dq1, dq2, dq3;
    
    dq0 = 0.5f * (-q1*gx - q2*gy - q3*gz) * dt;
    dq1 = 0.5f * ( q0*gx + q2*gz - q3*gy) * dt;
    dq2 = 0.5f * ( q0*gy - q1*gz + q3*gx) * dt;
    dq3 = 0.5f * ( q0*gz + q1*gy - q2*gx) * dt;
    
    q0 += dq0; q1 += dq1; q2 += dq2; q3 += dq3;
    
    // 归一化
    float norm = sqrt(q0*q0 + q1*q1 + q2*q2 + q3*q3);
    q0 /= norm; q1 /= norm; q2 /= norm; q3 /= norm;
}

2.5 坐标变换矩阵:连接不同坐标系

有了地球坐标系和机体坐标系,怎么把机体的加速度转换到地球坐标系?

答案就是坐标变换矩阵(也叫旋转矩阵)。

从机体坐标系到地球坐标系的旋转矩阵,可以用欧拉角或四元数构造。

用欧拉角构造(Z-Y-X顺序):

R = Rz(ψ) * Ry(θ) * Rx(φ)

展开后是一个3x3的矩阵。我一般不会手算,直接调库或者用现成公式。

用四元数构造更简洁:

R = [
    [1-2(q2²+q3²), 2(q1q2-q0q3), 2(q1q3+q0q2)],
    [2(q1q2+q0q3), 1-2(q1²+q3²), 2(q2q3-q0q1)],
    [2(q1q3-q0q2), 2(q2q3+q0q1), 1-2(q1²+q2²)]
]

有了这个矩阵,你就可以把机体坐标系下的加速度、磁场等数据,转换到地球坐标系下使用。

避坑指南: 我曾经在写卡尔曼滤波时,把旋转矩阵的转置和逆搞混了。记住,旋转矩阵是正交矩阵,它的逆等于转置。但前提是矩阵构造正确,顺序别搞反。

2.6 总结与实用建议

好了,这一节的内容不少。我帮你理一下思路:

  • 地球坐标系:告诉无人机“你在哪”
  • 机体坐标系:告诉无人机“你朝哪”
  • 欧拉角:直观,但有万向锁,适合水平飞行
  • 四元数:无奇异性,适合全姿态,但不够直观
  • 坐标变换矩阵:连接两个世界的桥梁

我个人建议,新手先从欧拉角入手,理解姿态的概念。等遇到万向锁了,再切换到四元数。这样印象更深。

下一节,咱们聊聊传感器融合,怎么把IMU、GPS、磁力计的数据揉在一起,得到准确的姿态和位置。到时候,这些坐标系知识全都会用上。

课后小练习: 写一个函数,输入欧拉角(roll, pitch, yaw),输出对应的四元数。再写一个逆函数。这两个函数在飞控开发中会反复用到。