2、坐标系与旋转:地球坐标系、机体坐标系、欧拉角、旋转矩阵、四元数基础

各位同学,欢迎来到第二章。

说实话,坐标系和旋转这部分内容,是很多飞控初学者第一个“劝退点”。我当年刚入行时,看着欧拉角和四元数也是一头雾水。但后来我发现,只要把几个核心概念理清楚,这东西其实没那么玄乎。

这一章,我们就来聊聊飞控里最常用的几个坐标系,以及它们之间怎么“转”起来。

2.1 地球坐标系:我们到底在哪儿?

飞控要控制飞机,首先得知道飞机在空间中的位置和姿态。这就需要一个“绝对”的参考系。

地球坐标系,也叫导航坐标系(NED系),就是干这个的。

  • N (North):指向地理北极
  • E (East):指向正东
  • D (Down):指向地心,也就是垂直向下

说白了,这就是一个固定在地球上的三维直角坐标系。我们通常用 nNED 来表示它。

我个人习惯把地球坐标系想象成一张巨大的网格纸,飞机就是网格上的一个点。它的经纬度、高度,都能在这个坐标系里找到对应的位置。

小提示: 在大多数多旋翼飞控中,我们默认起飞点就是地球坐标系的原点。这样计算起来方便,也够用。

2.2 机体坐标系:飞机自己的“视角”

地球坐标系是“上帝视角”,但飞控还得知道飞机自己是怎么“坐”的。这就引出了机体坐标系(Body Frame)。

机体坐标系是固定在飞机上的,它跟着飞机一起动。通常我们这样定义:

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

嗯,这里要注意,不同飞控的轴定义可能略有不同,但主流PX4/ArduPilot都是这么定义的。我用 bBody 来表示它。

你想想看,飞控上所有的传感器——陀螺仪、加速度计、磁力计——它们测量的数据,都是基于这个机体坐标系的。比如陀螺仪测到的角速度,就是飞机绕自己X、Y、Z轴的旋转速度。

2.3 欧拉角:最直观的旋转描述

好了,现在我们有地球坐标系和机体坐标系。那怎么描述飞机相对于地球的“姿态”呢?

最直观的方法,就是欧拉角。它用三个角度来描述一次旋转:

  • 滚转角 (Roll, φ):绕X轴旋转的角度
  • 俯仰角 (Pitch, θ):绕Y轴旋转的角度
  • 偏航角 (Yaw, ψ):绕Z轴旋转的角度

我记得刚学飞控时,最喜欢用欧拉角,因为它太直观了。看到 roll=10°,我马上就能想象出飞机向右倾斜了10度。

但欧拉角有个著名的“坑”——万向锁(Gimbal Lock)。当俯仰角接近±90°时,滚转和偏航会失去一个自由度,导致姿态解算出现奇异。这在多旋翼飞行中虽然不常见,但一旦遇到,后果很严重。

避坑指南: 我曾经在一个项目中,因为过度依赖欧拉角进行姿态插值,导致飞机在做大机动动作时姿态解算突然崩溃。从那以后,我内部运算只用四元数,欧拉角只用来做显示和日志记录。

2.4 旋转矩阵:数学上的“旋转”

欧拉角虽然直观,但做数学运算不方便。我们需要一个更“数学”的工具——旋转矩阵

旋转矩阵是一个3x3的正交矩阵,它能把一个向量从一个坐标系旋转到另一个坐标系。比如,把机体坐标系下的加速度计读数,旋转到地球坐标系下。

从欧拉角到旋转矩阵的转换公式如下(Z-Y-X顺序):

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

其中:
Rz(ψ) = | cosψ  -sinψ  0 |
         | sinψ   cosψ  0 |
         | 0      0     1 |

Ry(θ) = | cosθ   0   sinθ |
         | 0      1   0    |
         | -sinθ  0   cosθ |

Rx(φ) = | 1   0      0    |
         | 0   cosφ  -sinφ |
         | 0   sinφ   cosφ |

说白了,旋转矩阵就是三个基本旋转矩阵的乘积。你只要记住这个顺序(Z-Y-X),大部分飞控算法都能搞定。

我个人习惯在代码里用 rotation_matrix 这个变量名,清晰明了。

2.5 四元数:飞控的“秘密武器”

旋转矩阵虽然好用,但它有9个参数,计算量大,而且容易产生数值误差。有没有更优雅的方案?

有,那就是四元数

四元数是一个超复数,它用4个参数来描述旋转:

q = w + xi + yj + zk

其中:
w 是实部
x, y, z 是虚部
i² = j² = k² = ijk = -1

你可能会觉得这很抽象。其实说白了,四元数就是用一个“轴角”来表示旋转。它没有万向锁问题,而且插值平滑,计算效率高。现代飞控(如PX4)的姿态解算核心,几乎全是基于四元数的。

我记得有一次调试一个高速穿越机,用欧拉角做姿态控制时,飞机在翻滚时总会出现抖动。换成四元数后,问题立刻解决了。嗯,这就是四元数的魅力。

核心要点:
  • 欧拉角:直观,但有万向锁,适合显示和日志
  • 旋转矩阵:数学严谨,但参数多,计算量大
  • 四元数:无奇点,计算快,适合内部姿态解算和控制

2.6 它们之间的转换

在实际工程中,我们经常需要在三者之间来回转换。下面给出最常用的转换公式:

四元数 → 欧拉角:

roll  = atan2(2*(w*x + y*z), 1 - 2*(x² + y²))
pitch = asin(2*(w*y - z*x))
yaw   = atan2(2*(w*z + x*y), 1 - 2*(y² + z²))

欧拉角 → 四元数:

w = cos(φ/2)*cos(θ/2)*cos(ψ/2) + sin(φ/2)*sin(θ/2)*sin(ψ/2)
x = sin(φ/2)*cos(θ/2)*cos(ψ/2) - cos(φ/2)*sin(θ/2)*sin(ψ/2)
y = cos(φ/2)*sin(θ/2)*cos(ψ/2) + sin(φ/2)*cos(θ/2)*sin(ψ/2)
z = cos(φ/2)*cos(θ/2)*sin(ψ/2) - sin(φ/2)*sin(θ/2)*cos(ψ/2)

这些公式你不需要死记硬背,但最好能理解它们的物理意义。我在项目中,通常把这些转换函数封装成工具类,随用随调。

2.7 本章小结

这一章我们聊了飞控里最基础的几个概念:地球坐标系、机体坐标系、欧拉角、旋转矩阵和四元数。

你可能会觉得内容有点多,但别急。这些东西就像飞控的“字母表”,后面所有的控制算法、姿态解算,都是基于它们展开的。

下一章,我们会进入真正的“实战”——姿态解算。到时候你会发现,今天学的这些坐标系和旋转知识,全都会用上。

课后练习: 试着用你熟悉的编程语言,写一个函数,把欧拉角(roll, pitch, yaw)转换成四元数。然后验证一下,当pitch=90°时,四元数是否还能正常工作。

好了,今天就到这里。我们下章见。