2、坐标系与旋转:地球坐标系、机体坐标系、欧拉角、旋转矩阵、四元数基础
各位同学,欢迎来到第二章。
说实话,坐标系和旋转这部分内容,是很多飞控初学者第一个“劝退点”。我当年刚入行时,看着欧拉角和四元数也是一头雾水。但后来我发现,只要把几个核心概念理清楚,这东西其实没那么玄乎。
这一章,我们就来聊聊飞控里最常用的几个坐标系,以及它们之间怎么“转”起来。
2.1 地球坐标系:我们到底在哪儿?
飞控要控制飞机,首先得知道飞机在空间中的位置和姿态。这就需要一个“绝对”的参考系。
地球坐标系,也叫导航坐标系(NED系),就是干这个的。
- N (North):指向地理北极
- E (East):指向正东
- D (Down):指向地心,也就是垂直向下
说白了,这就是一个固定在地球上的三维直角坐标系。我们通常用 n 或 NED 来表示它。
我个人习惯把地球坐标系想象成一张巨大的网格纸,飞机就是网格上的一个点。它的经纬度、高度,都能在这个坐标系里找到对应的位置。
2.2 机体坐标系:飞机自己的“视角”
地球坐标系是“上帝视角”,但飞控还得知道飞机自己是怎么“坐”的。这就引出了机体坐标系(Body Frame)。
机体坐标系是固定在飞机上的,它跟着飞机一起动。通常我们这样定义:
- X轴 (Roll轴):指向机头方向
- Y轴 (Pitch轴):指向飞机右侧(右翼方向)
- Z轴 (Yaw轴):指向飞机下方(符合右手定则)
嗯,这里要注意,不同飞控的轴定义可能略有不同,但主流PX4/ArduPilot都是这么定义的。我用 b 或 Body 来表示它。
你想想看,飞控上所有的传感器——陀螺仪、加速度计、磁力计——它们测量的数据,都是基于这个机体坐标系的。比如陀螺仪测到的角速度,就是飞机绕自己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 本章小结
这一章我们聊了飞控里最基础的几个概念:地球坐标系、机体坐标系、欧拉角、旋转矩阵和四元数。
你可能会觉得内容有点多,但别急。这些东西就像飞控的“字母表”,后面所有的控制算法、姿态解算,都是基于它们展开的。
下一章,我们会进入真正的“实战”——姿态解算。到时候你会发现,今天学的这些坐标系和旋转知识,全都会用上。
好了,今天就到这里。我们下章见。