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 知识体系总览
下面这张图,是我自己总结的坐标系与坐标变换的知识体系。你可以把它当作一张地图,随时回来查阅。
2.7 实践中的选择建议
在实际项目中,如何选择?我个人的经验是:
- 人机交互界面:使用欧拉角。因为直观,操作员一眼就能看懂飞机的姿态。
- 飞控内部运算:使用四元数。避免万向锁,计算稳定。
- 坐标转换:使用旋转矩阵。将四元数或欧拉角转换为矩阵,然后进行向量变换。
注意: 不同飞控固件对欧拉角的定义顺序可能不同。有的用 ZYX,有的用 XYZ。在对接外部系统时,一定要先确认旋转顺序,否则算出来的姿态会完全错误。我曾经就因为没注意这个细节,导致仿真数据和实际飞行数据对不上,排查了整整两天。