第二章 坐标系与姿态表示:地理坐标系、机体坐标系、欧拉角(Yaw/Pitch/Roll)、旋转矩阵

好,咱们正式开始聊偏航控制的核心基础——坐标系和姿态表示。

说实话,我见过不少新手一上来就调PID参数,结果飞机在天上乱转,根本不知道问题出在哪。其实说白了,很多坑都是因为坐标系没搞明白。你想想看,连“往哪转”都没定义清楚,控制算法怎么可能跑对?

2.1 地理坐标系:我们到底在哪个“世界”里说话?

地理坐标系,也叫导航坐标系。我习惯叫它“大地坐标系”。它是个固定不动的参考系,用来描述飞行器相对于地面的位置和姿态。

通常我们这样定义:

  • X轴:指向正东(East)
  • Y轴:指向正北(North)
  • Z轴:指向天顶(Up),符合右手定则

嗯,这里要注意。有些教材会把Z轴指向地心,但在无人机和机器人领域,我们几乎都用“东北天(ENU)”坐标系。我在做第一个飞控项目时,就踩过这个坑——用了“北东地”坐标系,结果姿态解算符号全反了,折腾了两天才发现。

重要原则: 在一个项目中,地理坐标系一旦选定,就不要中途更改。否则你的旋转矩阵、欧拉角定义全得重来。

2.2 机体坐标系:飞机自己怎么看自己?

机体坐标系是固定在飞行器上的。它跟着飞机一起动。我个人习惯把原点放在飞行器的质心。

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

你可能会问:“为什么Z轴要指向下?” 其实这是个历史惯例。在航空领域,为了便于计算升力和重力,大家约定俗成这么定义。我在做固定翼项目时,曾经试着把Z轴朝上,结果和别人的代码对接时,旋转矩阵全得转置,那叫一个痛苦。

小技巧: 如果你刚开始接触,建议直接用标准定义。别自己发明坐标系,除非你想被队友骂。

2.3 欧拉角:Yaw/Pitch/Roll 到底在转什么?

欧拉角是描述机体坐标系相对于地理坐标系旋转的三个角度。说白了,就是飞机怎么从“躺平”状态转到当前姿态。

角度 中文名 旋转轴 范围 我的理解
Yaw(ψ) 偏航角 绕Z轴 [-180°, 180°] 或 [0°, 360°] 机头指向哪个方向
Pitch(θ) 俯仰角 绕Y轴 [-90°, 90°] 机头抬多高
Roll(φ) 横滚角 绕X轴 [-180°, 180°] 机身倾斜多少

这里有个经典问题:旋转顺序是什么?

我建议你记住这个顺序:Z → Y → X,也就是先偏航,再俯仰,最后横滚。为什么是这个顺序?因为这样最符合直觉——你先让飞机对准方向(Yaw),再抬头低头(Pitch),最后调整左右倾斜(Roll)。

避坑指南: 我曾经在代码里用了不同的旋转顺序(X→Y→Z),结果IMU数据解算出来的姿态和实际差了十万八千里。后来查了三天资料才发现,不同厂家的IMU芯片可能默认旋转顺序不同。一定要看数据手册!

2.4 旋转矩阵:用数学描述“转了多少”

欧拉角虽然直观,但计算机不喜欢它。计算机喜欢矩阵。所以我们需要把欧拉角转换成旋转矩阵。

旋转矩阵的作用很简单:把一个向量从一个坐标系变换到另一个坐标系。比如,把机体坐标系下的加速度,转换到地理坐标系下。

三个基本旋转矩阵如下:

// 绕Z轴旋转(Yaw)
Rz(ψ) = [cosψ  -sinψ  0]
        [sinψ   cosψ  0]
        [0      0     1]

// 绕Y轴旋转(Pitch)
Ry(θ) = [cosθ   0   sinθ]
        [0      1   0   ]
        [-sinθ  0   cosθ]

// 绕X轴旋转(Roll)
Rx(φ) = [1   0      0   ]
        [0   cosφ  -sinφ]
        [0   sinφ   cosφ]

完整的旋转矩阵(从机体到地理,按ZYX顺序):

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

R = [cosθ*cosψ,  sinφ*sinθ*cosψ - cosφ*sinψ,  cosφ*sinθ*cosψ + sinφ*sinψ]
    [cosθ*sinψ,  sinφ*sinθ*sinψ + cosφ*cosψ,  cosφ*sinθ*sinψ - sinφ*cosψ]
    [-sinθ,      sinφ*cosθ,                    cosφ*cosθ           ]

嗯,这个矩阵看着有点吓人。但你别怕,实际写代码时,我们很少手写这个矩阵。大部分飞控库(如PX4、ArduPilot)都封装好了。你只需要理解它的物理意义:矩阵的每一列,代表机体坐标系的三个轴在地理坐标系下的方向向量

我的习惯: 在调试时,我会打印旋转矩阵的第一列(机头方向向量),看看它是否和GPS航向一致。如果不一致,十有八九是欧拉角定义或者旋转顺序搞错了。

2.5 知识体系总览

下面这张图,是我自己总结的坐标系与姿态表示的核心逻辑。你看一遍,应该就能把整个章节串起来。

坐标系与姿态表示 知识体系 地理坐标系 X: 东, Y: 北, Z: 天 固定不动 参考基准 旋转关系 欧拉角 Yaw (ψ): 绕Z轴 Pitch (θ): 绕Y轴 Roll (φ): 绕X轴 旋转顺序: Z→Y→X 直观但易万向锁 数学表达 旋转矩阵 3x3 正交矩阵 坐标变换 无万向锁 机体坐标系 X: 机头, Y: 右翼 Z: 下方 随飞行器运动 姿态描述 核心逻辑:地理坐标系 → 欧拉角(描述旋转) → 旋转矩阵(数学计算) ↔ 机体坐标系

这张图你看懂了吗?从左到右,我们先用欧拉角描述“地理坐标系怎么转到机体坐标系”,然后把这个旋转关系写成旋转矩阵,方便计算机做运算。反过来,我们也能从旋转矩阵反解出欧拉角——这就是姿态解算的基本原理。

2.6 实际项目中的选择建议

说了这么多理论,到底怎么选?我根据自己的经验,给你几个建议:

  • 做飞控调试时:用欧拉角,直观好理解。但注意避开Pitch=±90°的情况,否则会万向锁。
  • 写控制算法时:用旋转矩阵或者四元数(下一章会讲)。矩阵运算稳定,没有奇点。
  • 做数据记录和分析时:用欧拉角,方便人类阅读。但内部计算一定要转成矩阵或四元数。
我曾经犯过的错: 在卡尔曼滤波里直接用欧拉角做状态量,结果滤波器在Pitch接近90°时直接发散。后来换成四元数才解决问题。记住:欧拉角只适合给人看,不适合给算法算

好了,这一章的内容就到这。坐标系和姿态表示是整个偏航控制的地基,地基不稳,上层建筑再漂亮也得塌。建议你动手画一画坐标系,写一写旋转矩阵的乘法,感受一下“转”的过程。

核心一句话: 地理坐标系是“世界”,机体坐标系是“自己”,欧拉角是“怎么转”,旋转矩阵是“转了多少”。四者合一,姿态尽在掌握。

公众号:蓝海资料掘金营,微信deep3321