2. 坐标系与运动学基础:地球坐标系、机体坐标系、欧拉角与四元数、无人机运动学模型

各位同学,欢迎来到《轨迹规划在无人机航迹中的实践》的第二讲。

今天我们要聊的,是无人机轨迹规划里最基础、也最绕不开的一块硬骨头——坐标系与运动学。说实话,我见过不少新手,算法写得飞起,结果一上真机就炸机。为什么?坐标系搞反了,姿态解算出错了。嗯,这玩意儿要是搞不清楚,后面所有的规划都是空中楼阁。

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

做轨迹规划,首先得知道飞机在哪儿。这个「在哪儿」,得有个统一的参考标准。

我个人习惯把地球坐标系分成两类:一类是给「大地测量」用的,另一类是给「导航控制」用的。

2.1.1 地心地固坐标系(ECEF)

这个坐标系的原点在地球质心。Z轴指向北极,X轴指向本初子午线与赤道的交点,Y轴按右手定则确定。说白了,它是一个随着地球自转一起转的坐标系。

我在做长航时无人机项目时,经常用ECEF来做GPS数据的预处理。因为GPS给出的经纬高(LLA)数据,最终都要转成ECEF下的笛卡尔坐标,才好做后续的路径插值。

2.1.2 北东地坐标系(NED)

这个更常用。原点在无人机起飞点或某个参考点。X轴指向北,Y轴指向东,Z轴指向地心(也就是向下)。

你想想看,我们做轨迹规划时,关心的往往是「相对于起飞点往北飞了多远,往东飞了多远,高度变化了多少」。NED坐标系正好满足这个需求。

核心要点: 轨迹规划中,我们通常把NED坐标系作为全局参考系。所有航点、障碍物位置,都先统一到这个坐标系下。

2.2 机体坐标系:飞机自己的小世界

地球坐标系是「上帝视角」,而机体坐标系是「飞机视角」。它的原点在飞机质心,X轴指向机头,Y轴指向右翼,Z轴指向下(符合右手定则)。

为什么要搞个机体坐标系?因为传感器(IMU、磁力计)测量的数据,都是相对于飞机本身的。比如加速度计测的是「飞机在X轴方向上的加速度」,而不是「地球北向的加速度」。

这里有个坑,我曾经踩过:

避坑指南: 我曾经在飞控代码里,直接把IMU输出的加速度数据当成NED坐标系下的数据去积分,结果位置估计飞出了几十米的误差。后来排查了一整天,才发现是坐标系没转换。记住:传感器数据在机体坐标系,规划指令在地球坐标系,两者之间必须做旋转。

2.3 欧拉角与四元数:姿态的两种「语言」

好了,现在有了两个坐标系,怎么把一个坐标系下的向量转到另一个坐标系下?这就涉及到姿态表示了。

2.3.1 欧拉角

欧拉角用三个角度来描述姿态:横滚角(Roll)、俯仰角(Pitch)、偏航角(Yaw)。

旋转顺序一般是:先偏航(绕Z轴),再俯仰(绕Y轴),最后横滚(绕X轴)。这个顺序很重要,搞反了姿态就全乱了。

角度 符号 范围 物理意义
横滚角 φ -π ~ π 绕机头轴线旋转
俯仰角 θ -π/2 ~ π/2 绕右翼轴线旋转
偏航角 ψ -π ~ π 绕垂直轴线旋转

欧拉角直观,但有个致命问题——万向锁。当俯仰角接近±90°时,横滚和偏航会耦合,丢失一个自由度。我在做特技飞行轨迹规划时,就因为这个吃过亏,飞机在做大角度俯仰时姿态解算直接崩了。

2.3.2 四元数

四元数用四个数来表示旋转:q = [w, x, y, z]。它没有万向锁问题,计算效率也高。

我建议所有做轨迹规划的同学,都尽量用四元数做姿态插值和旋转。虽然它不如欧拉角直观,但胜在稳定。

四元数转旋转矩阵的公式(C++代码示例):

// 四元数转旋转矩阵
Eigen::Matrix3d quatToRotMat(double w, double x, double y, double z) {
    Eigen::Matrix3d R;
    R(0,0) = 1 - 2*y*y - 2*z*z;  R(0,1) = 2*x*y - 2*w*z;      R(0,2) = 2*x*z + 2*w*y;
    R(1,0) = 2*x*y + 2*w*z;      R(1,1) = 1 - 2*x*x - 2*z*z;  R(1,2) = 2*y*z - 2*w*x;
    R(2,0) = 2*x*z - 2*w*y;      R(2,1) = 2*y*z + 2*w*x;      R(2,2) = 1 - 2*x*x - 2*y*y;
    return R;
}
个人经验: 在做轨迹平滑时,我习惯用四元数的球面线性插值(SLERP)来生成姿态轨迹。这样能保证姿态变化是连续的,不会出现欧拉角插值时的突变。

2.4 无人机运动学模型:飞机到底怎么动?

有了坐标系和姿态,我们终于可以聊聊运动学了。说白了,运动学模型就是描述「位置、速度、姿态」之间关系的数学方程。

2.4.1 位置运动学

在NED坐标系下,位置的变化率就是速度:

p_dot = v

其中p是位置向量 [x, y, z],v是速度向量 [vx, vy, vz]。

2.4.2 姿态运动学

姿态的变化率(角速度)与欧拉角速率之间的关系,是很多人的噩梦。这里我直接给出简化形式(小角度假设下):

phi_dot   = p + q * sin(phi) * tan(theta) + r * cos(phi) * tan(theta)
theta_dot = q * cos(phi) - r * sin(phi)
psi_dot   = q * sin(phi) / cos(theta) + r * cos(phi) / cos(theta)

其中p、q、r是机体坐标系下的角速度。

嗯,看着复杂对吧?实际工程中,我们很少直接用这个公式做轨迹规划。更常见的做法是:

  • 用四元数微分方程来更新姿态
  • 把角速度作为控制输入,直接规划角速度轨迹

2.4.3 完整的运动学模型

对于四旋翼无人机,我们常用的运动学模型是:

状态量: [x, y, z, vx, vy, vz, qw, qx, qy, qz]
控制量: [推力, 滚转角速度, 俯仰角速度, 偏航角速度]

这个模型有10个状态量,4个控制量。在做轨迹规划时,我们通常会对这个模型做简化,比如假设姿态响应足够快,直接用加速度作为控制输入。

工程建议: 我在实际项目中,通常把运动学模型拆成两层:外层是位置环(用加速度控制),内层是姿态环(用角速度控制)。轨迹规划器只关心外层,内层交给飞控的PID去处理。这样规划问题就简化成了「如何生成平滑的加速度曲线」。

2.5 本章知识体系

为了让大家更直观地理解本章的知识结构,我画了一张图:

坐标系与运动学基础 - 知识体系 坐标系 地球坐标系(ECEF / NED) 机体坐标系(机头/右翼/向下) 坐标系转换:旋转矩阵 姿态表示 欧拉角(Roll/Pitch/Yaw) 四元数(w, x, y, z) 万向锁问题 & SLERP插值 无人机运动学模型 位置运动学:p_dot = v 姿态运动学:四元数微分方程 状态量10维,控制量4维 工程实践:内外环解耦 + 加速度轨迹规划 外层位置环(加速度控制) ←→ 内层姿态环(角速度控制)

这张图把本章的核心逻辑串起来了:从坐标系定义,到姿态表示,再到运动学模型,最后落到工程实践。你想想看,每一步都是环环相扣的。

课后思考: 为什么轨迹规划中常用NED坐标系而不是ECEF?如果你用ECEF做规划,会遇到什么问题?我个人建议你动手写个小程序,把GPS数据从LLA转到NED,再转回来,感受一下坐标变换的细节。

好了,这一章的内容就到这里。坐标系和运动学是后面所有章节的基础,一定要吃透。下一章我们会聊轨迹的数学表示,到时候见。


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