3、坐标系与旋转:机体坐标系、地理坐标系,以及它们之间的转换

做飞控调参这么多年,我见过太多新手一上来就盯着PID参数猛调,结果飞机在天上乱飘,连问题出在哪都不知道。其实,姿态控制的第一步不是调参,而是搞清楚——你究竟在哪个坐标系里描述飞机的姿态。

坐标系搞错了,后面全是白费。今天我们就来把这件事彻底讲清楚。

3.1 为什么需要两个坐标系?

你想想看,飞控板是焊在飞机上的,它测到的角速度、加速度都是相对于飞机本身的。但你要控制飞机悬停、平飞、转弯,这些动作是相对于地面的。所以,我们至少需要两个坐标系:

  • 机体坐标系(Body Frame)——固定在飞机上,随飞机一起动。
  • 地理坐标系(World Frame / NED)——固定在地面上,不随飞机转动。

说白了,飞控芯片读到的数据是“机体系”的,而你要控制的飞行状态是“地理系”的。两者之间的桥梁,就是旋转矩阵。

核心观点:姿态估计的本质,就是通过传感器数据,实时求解从机体坐标系到地理坐标系的旋转关系。

3.2 机体坐标系(Body Frame)

我习惯把机体坐标系记作 Ob-XbYbZb。原点在飞机的重心,三个轴的定义如下:

轴 方向 典型传感器
Xb 机头方向(前进方向) 加速度计X轴、陀螺仪X轴
Yb 机身右侧(右翼方向) 加速度计Y轴、陀螺仪Y轴
Zb 机身下方(垂直向下) 加速度计Z轴、陀螺仪Z轴

这里有个细节要注意:Zb 轴指向下方,这是航空界的惯例。我第一次做四旋翼时,习惯性地把Z轴朝上,结果姿态解算出来的角度符号全是反的。嗯,从那以后我再也没犯过这个错。

3.3 地理坐标系(NED坐标系)

地理坐标系我们通常用 On-XnYnZn 表示,也叫 NED坐标系:

  • N(North)——指向地理北
  • E(East)——指向地理东
  • D(Down)——指向地心(垂直向下)

为什么用NED而不是ENU(东-北-上)?因为大多数飞控算法(如PX4、ArduPilot)都采用NED约定。如果你做地面站开发,一定要和飞控固件保持一致,否则坐标转换会乱套。

小提示:在PX4源码中,地理坐标系下的重力向量是 [0, 0, 9.81] m/s²,因为Z轴向下。如果你用ENU,重力向量就是 [0, 0, -9.81]。这个符号差异,曾经让一个同事排查了整整两天。

3.4 从机体到地理:旋转矩阵

现在问题来了:飞控测到的加速度是机体系的,但我们要知道飞机相对于地面的姿态。怎么转换?

答案是 旋转矩阵 R。它是一个 3×3 的正交矩阵,满足:

v_geographic = R * v_body

其中 v_body 是机体系下的向量,v_geographic 是地理系下的向量。

旋转矩阵 R 可以由三个欧拉角(横滚角 φ、俯仰角 θ、偏航角 ψ)构造出来。我直接给出最常用的 Z-Y-X 顺序旋转矩阵:

R = R_z(ψ) * R_y(θ) * R_x(φ)

其中:
R_x(φ) = [1,      0,       0;
          0,  cos(φ), -sin(φ);
          0,  sin(φ),  cos(φ)]

R_y(θ) = [ cos(θ), 0, sin(θ);
                0, 1,      0;
          -sin(θ), 0, cos(θ)]

R_z(ψ) = [cos(ψ), -sin(ψ), 0;
          sin(ψ),  cos(ψ), 0;
               0,       0, 1]

你可能会问:为什么要用 Z-Y-X 顺序?因为这是航空领域最常用的约定,横滚-俯仰-偏航的顺序,物理意义最直观。

注意:欧拉角存在万向锁问题。当俯仰角 θ = ±90° 时,横滚和偏航的旋转轴重合,会丢失一个自由度。所以实际飞控中,姿态解算通常用四元数,欧拉角只用于显示和调参。

3.5 从地理到机体:逆旋转

反过来,如果要把地理系下的向量转到机体系,只需要用旋转矩阵的转置:

v_body = R^T * v_geographic

因为旋转矩阵是正交矩阵,RT = R-1。这个性质在代码里非常方便,不需要真的去求逆矩阵。

举个例子:地理系下的重力向量是 [0, 0, g]。通过 RT 转换到机体系,就可以得到重力在三个机体轴上的分量。这个分量在加速度计数据校准和姿态初始化中非常有用。

3.6 知识体系总览

为了让你更直观地理解整个坐标系与旋转的关系,我画了一张结构图:

坐标系与旋转:知识体系结构图 机体坐标系 Xb: 机头方向 地理坐标系 NED: 北-东-地 旋转矩阵 R (3×3) v_geo = R · v_body 欧拉角 φ, θ, ψ 四元数 q0, q1, q2, q3 传感器数据 姿态输出 构造R 构造R 实际飞控中:传感器 → 四元数 → 旋转矩阵 → 地理系姿态 → 控制律 欧拉角仅用于显示和调参,避免在控制环路中使用

3.7 实际项目中的坐标系陷阱

我在做地面站开发时,遇到过几个典型的坐标系问题,分享给你:

  1. 传感器安装方向不一致——飞控板在机架上的安装角度不是0°,需要做安装角校准。否则加速度计和陀螺仪的读数在机体系下就是错的。
  2. 坐标系左右手系混淆——有些传感器用右手系,有些用左手系。转换时一定要确认,否则旋转方向会反。
  3. 欧拉角旋转顺序不统一——PX4用Z-Y-X,有些算法用Z-X-Y。地面站显示时如果顺序不对,姿态角会完全错误。

我的习惯:在代码里统一用四元数做内部运算,只在显示和日志记录时转成欧拉角。这样既避免了万向锁,也减少了坐标系转换出错的概率。

3.8 小结

这一章我们讲清楚了两个核心坐标系——机体系和地理系——以及它们之间的旋转关系。旋转矩阵是连接两者的数学工具,而欧拉角和四元数是描述旋转的两种方式。

记住一句话:传感器在机体系,控制目标在地理系,旋转矩阵是桥梁。后面讲姿态解算和PID控制时,你会反复用到这些概念。