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

各位同学,欢迎来到第二章。这一章的内容,说白了就是无人机自主飞行的“空间语言”。你想想看,如果飞机连自己在哪、头朝哪都说不清楚,那还谈什么自主飞行?

我个人习惯把坐标系和坐标变换比作无人机的“世界观”。它必须理解两个世界:一个是地球这个固定的参考世界,另一个是它自己身体所处的动态世界。这两个世界之间的翻译官,就是欧拉角、四元数和坐标变换矩阵。

核心认知: 坐标系是描述无人机状态的“基准”,坐标变换是连接不同基准的“桥梁”。没有这两样,任务规划就是空中楼阁。

2.1 地理坐标系:无人机的“世界地图”

地理坐标系,也叫导航坐标系,是固定在地球上的。我们通常用 NED 坐标系,也就是北-东-地。

  • X轴(N):指向地理北极
  • Y轴(E):指向正东
  • Z轴(D):指向地心(也就是向下)

为什么Z轴要向下?嗯,这里要注意:这是为了符合右手定则,而且对于飞行器来说,高度信息通常用负的Z值表示,计算起来更直观。我在项目中遇到过新手把Z轴搞反,结果飞机一解锁就往地里钻,还好在地面测试,不然就炸机了。

还有一种叫 ENU 坐标系(东-北-天),常用于机器人领域。但在无人机航测和任务规划里,NED 是绝对的主流。

坐标系 X轴 Y轴 Z轴 典型应用
NED 北 东 地 无人机导航、PX4/ArduPilot
ENU 东 北 天 ROS、地面机器人

我的习惯: 在写任务规划代码时,我会在全局变量里明确标注当前使用的是 NED 还是 ENU,避免后期坐标转换时出现混乱。曾经有一次,就是因为没标注,导致航点数据在导入时全部偏移了 90 度。

2.2 机体坐标系:无人机的“身体感知”

机体坐标系是固定在无人机上的,随飞机一起运动。原点通常在飞机的重心。

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

你想想看,无人机上的IMU(惯性测量单元)测量的加速度和角速度,都是基于这个机体坐标系的。而GPS给出的位置和速度,是基于地理坐标系的。所以,这两个坐标系之间必须建立联系。

2.3 欧拉角:直观但“有坑”的姿态描述

欧拉角是描述机体坐标系相对于地理坐标系旋转关系的三个角度:偏航角(Yaw)、俯仰角(Pitch)、横滚角(Roll)。

  • 偏航角(ψ):绕Z轴旋转,机头指向。
  • 俯仰角(θ):绕Y轴旋转,机头抬升或下降。
  • 横滚角(φ):绕X轴旋转,机身左右倾斜。

欧拉角非常直观,看一眼就知道飞机大概是什么姿态。但是,它有一个著名的缺陷——万向锁(Gimbal Lock)。当俯仰角达到 ±90° 时,偏航和横滚的旋转轴会重合,导致丢失一个自由度。

我曾经踩过的坑: 在做特技飞行任务规划时,我直接用欧拉角进行姿态插值。结果飞机在做大角度俯仰时,姿态突然发生剧烈跳变,差点失控。后来查了日志才发现是万向锁导致的。从那以后,只要涉及大角度机动,我坚决使用四元数。

2.4 四元数:稳定且高效的姿态“救星”

四元数是一个超复数,由四个元素组成:q = w + xi + yj + zk。它没有万向锁问题,而且计算效率高,非常适合计算机处理。

说白了,四元数就是用四个数来描述一个旋转。它比欧拉角多了一个维度,所以能避免奇异性。

四元数和欧拉角可以互相转换。这里给出一个常用的转换公式(从四元数到欧拉角):

// 四元数转欧拉角(弧度)
roll  = atan2(2*(w*x + y*z), 1 - 2*(x*x + y*y))
pitch = asin(2*(w*y - z*x))
yaw   = atan2(2*(w*z + x*y), 1 - 2*(y*y + z*z))

我的建议: 在任务规划系统中,内部运算全部使用四元数。只在需要显示给用户看,或者记录日志时,才转换成欧拉角。这样可以最大程度避免精度损失和奇异问题。

2.5 坐标变换矩阵:连接两个世界的“桥梁”

坐标变换矩阵,也叫旋转矩阵,是一个 3x3 的矩阵。它可以将一个向量从一个坐标系变换到另一个坐标系。

从机体坐标系到地理坐标系的旋转矩阵 R 可以由欧拉角或四元数构造。例如,使用欧拉角时,旋转矩阵是三个基本旋转矩阵的乘积:

R = Rz(yaw) * Ry(pitch) * Rx(roll)

其中:

  • Rz(yaw) 是绕Z轴的旋转矩阵
  • Ry(pitch) 是绕Y轴的旋转矩阵
  • Rx(roll) 是绕X轴的旋转矩阵

这个矩阵有什么用?举个例子:无人机上的加速度计测量的是机体坐标系下的加速度,但我们需要的是地理坐标系下的加速度来计算速度和位置。这时候,只需要将测量值乘以旋转矩阵 R 即可。

关键点: 旋转矩阵是正交矩阵,它的逆矩阵等于它的转置。这意味着从地理坐标系到机体坐标系的变换,只需要对矩阵进行转置即可,计算量非常小。

2.6 知识体系总览

下面这张图,是我自己总结的坐标系与坐标变换的知识体系。你可以把它当作一张地图,随时回来查阅。

坐标系与坐标变换知识体系 坐标系与坐标变换知识体系 地理坐标系 NED / ENU 机体坐标系 X前 Y右 Z下 欧拉角 Yaw / Pitch / Roll 四元数 w + xi + yj + zk 坐标变换矩阵 3x3 旋转矩阵 R 说明:欧拉角和四元数都可以用来构造坐标变换矩阵,但四元数更稳定,适合计算机运算。 地理坐标系和机体坐标系通过旋转矩阵 R 建立联系。

2.7 实践中的选择建议

在实际项目中,如何选择?我个人的经验是:

  1. 人机交互界面:使用欧拉角。因为直观,操作员一眼就能看懂飞机的姿态。
  2. 飞控内部运算:使用四元数。避免万向锁,计算稳定。
  3. 坐标转换:使用旋转矩阵。将四元数或欧拉角转换为矩阵,然后进行向量变换。

注意: 不同飞控固件对欧拉角的定义顺序可能不同。有的用 ZYX,有的用 XYZ。在对接外部系统时,一定要先确认旋转顺序,否则算出来的姿态会完全错误。我曾经就因为没注意这个细节,导致仿真数据和实际飞行数据对不上,排查了整整两天。