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 知识体系总览
为了让你更直观地理解整个坐标系与旋转的关系,我画了一张结构图:
3.7 实际项目中的坐标系陷阱
我在做地面站开发时,遇到过几个典型的坐标系问题,分享给你:
- 传感器安装方向不一致——飞控板在机架上的安装角度不是0°,需要做安装角校准。否则加速度计和陀螺仪的读数在机体系下就是错的。
- 坐标系左右手系混淆——有些传感器用右手系,有些用左手系。转换时一定要确认,否则旋转方向会反。
- 欧拉角旋转顺序不统一——PX4用Z-Y-X,有些算法用Z-X-Y。地面站显示时如果顺序不对,姿态角会完全错误。
我的习惯:在代码里统一用四元数做内部运算,只在显示和日志记录时转成欧拉角。这样既避免了万向锁,也减少了坐标系转换出错的概率。
3.8 小结
这一章我们讲清楚了两个核心坐标系——机体系和地理系——以及它们之间的旋转关系。旋转矩阵是连接两者的数学工具,而欧拉角和四元数是描述旋转的两种方式。
记住一句话:传感器在机体系,控制目标在地理系,旋转矩阵是桥梁。后面讲姿态解算和PID控制时,你会反复用到这些概念。