2. 坐标系与姿态表示:常用坐标系、欧拉角、方向余弦矩阵、四元数

好,咱们正式开始第二讲。坐标系和姿态表示,这可以说是惯导的“地基”。地基没打牢,后面盖多高的楼都得塌。我见过不少新手,一上来就怼着卡尔曼滤波猛学,结果连坐标系都搞混,最后定位结果天差地别,还找不到原因。

这一章,咱们就把这几个核心概念彻底掰扯清楚。我会结合我实际做项目踩过的坑,给你讲明白。

2.1 常用坐标系:你得知道“我在哪”和“我朝哪”

惯导里,坐标系就是描述物体位置和姿态的“尺子”。尺子不一样,量出来的数自然不一样。常用的就三个:地心地固系、导航系、载体系。

2.1.1 地心地固坐标系(ECEF)

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

为什么需要它? 因为卫星(比如GPS)给出的位置,通常就是ECEF下的坐标。你想想看,卫星绕地球飞,它用ECEF描述自己的位置最方便。我当年做第一个组合导航项目时,直接把GPS的ECEF坐标当成了经纬度去算,结果导航轨迹直接飞到了非洲……嗯,从那以后,我再也不敢小看坐标系转换了。

2.1.2 导航坐标系(n系)

这是咱们最常用的“本地”坐标系。通常取“东北天”或“北东地”。原点在载体所在位置,X轴指向东(或北),Y轴指向北(或东),Z轴指向天(或地)。

导航解算的结果,最终都要转换到n系下,才能直观地告诉用户“你往东走了多少米,往北走了多少米”。我个人习惯用“东北天”,因为Z轴向上,重力加速度是正的,算起来心理上舒服一点。

2.1.3 载体系(b系)

这个坐标系固连在载体(比如无人机、汽车)上。原点在载体质心,X轴指向载体前方,Y轴指向载体右侧,Z轴指向载体下方(“右前下”)。IMU(惯性测量单元)直接测量的加速度和角速度,就是b系下的原始数据。

核心要点: IMU测的是b系下的物理量,导航解算需要n系下的量。所以,所有的核心工作,本质上就是“b系到n系的姿态转换”

2.2 姿态表示:怎么描述“我转了多少”?

知道了坐标系,下一步就是描述载体相对于导航系的转动。常用的有三种方法:欧拉角、方向余弦矩阵、四元数。它们各有优缺点,就像工具箱里的扳手、螺丝刀和钳子,你得知道什么时候用哪个。

2.2.1 欧拉角:最直观,但会“死锁”

欧拉角用三个角度来描述转动:航向角(ψ,绕Z轴)、俯仰角(θ,绕Y轴)、横滚角(φ,绕X轴)。

  • 优点: 物理意义极其清晰。你一看“航向30度,俯仰10度”,脑子里立刻就能想象出载体的姿态。
  • 缺点: 存在“万向节死锁”问题。当俯仰角接近±90度时,航向和横滚会变得无法区分,导致姿态解算发散。

避坑指南: 我曾经在一个无人机项目中,直接用欧拉角做姿态更新。结果飞机做大机动俯冲时,姿态瞬间跳变,差点炸机。从那以后,我只要涉及姿态解算,内部运算一律不用欧拉角,只在最后输出给用户看的时候才转换一下。

2.2.2 方向余弦矩阵(DCM):最稳定,但计算量大

DCM是一个3x3的矩阵,它直接描述了b系到n系的旋转关系。矩阵的每一列,就是b系坐标轴在n系下的投影。

// 一个典型的DCM示例(从b系到n系)
C_b^n = [
  [cosθ*cosψ,  sinφ*sinθ*cosψ - cosφ*sinψ,  cosφ*sinθ*cosψ + sinφ*sinψ],
  [cosθ*sinψ,  sinφ*sinθ*sinψ + cosφ*cosψ,  cosφ*sinθ*sinψ - sinφ*cosψ],
  [-sinθ,       sinφ*cosθ,                    cosφ*cosθ]
]
  • 优点: 没有死锁问题,数值稳定性好。
  • 缺点: 9个元素,计算量大,而且必须保证正交性(否则矩阵会“变形”),需要频繁进行正交化修正。

我个人习惯,在需要做坐标变换(比如把加速度从b系转到n系)时,用DCM最直接。但在做姿态递推更新时,我更喜欢用四元数。

2.2.3 四元数:工程上的最优解

四元数是一个超复数,用一个标量和三个矢量部分表示旋转:q = q0 + q1*i + q2*j + q3*k。它只有4个参数,没有死锁,计算效率高。

  • 优点: 计算量小(比DCM少一半以上),易于插值,没有奇异性。
  • 缺点: 不够直观。你没法直接看出“航向角是多少”。

我的工程建议: 内部姿态解算,永远用四元数。只在需要输出或显示时,才把四元数转换成欧拉角。这是目前业界最成熟、最稳定的做法。

2.3 知识体系总览

为了让你更直观地理解这几个概念之间的关系,我画了一张图。你看完应该就全明白了。

坐标系与姿态表示知识体系 地心地固系 (ECEF) 导航坐标系 (n系) 载体系 (b系) GPS输出 IMU测量 姿态表示:描述 b系 → n系 的旋转关系 欧拉角 直观,但有死锁 方向余弦矩阵 稳定,但计算量大 四元数 工程最优解 核心:IMU输出(b系) → 姿态表示 → 导航解算(n系)

2.4 它们之间怎么转换?

这三种表示方法可以互相转换。我直接给你最常用的公式,你拿去就能用。

2.4.1 四元数 → 欧拉角

// 假设四元数为 q = [q0, q1, q2, q3]
// 计算欧拉角 (航向ψ, 俯仰θ, 横滚φ)
float roll  = atan2(2*(q0*q1 + q2*q3), 1 - 2*(q1*q1 + q2*q2));
float pitch = asin(2*(q0*q2 - q3*q1));
float yaw   = atan2(2*(q0*q3 + q1*q2), 1 - 2*(q2*q2 + q3*q3));

2.4.2 欧拉角 → 四元数

// 输入:航向yaw, 俯仰pitch, 横滚roll
float cy = cos(yaw * 0.5);
float sy = sin(yaw * 0.5);
float cp = cos(pitch * 0.5);
float sp = sin(pitch * 0.5);
float cr = cos(roll * 0.5);
float sr = sin(roll * 0.5);

q0 = cr * cp * cy + sr * sp * sy;
q1 = sr * cp * cy - cr * sp * sy;
q2 = cr * sp * cy + sr * cp * sy;
q3 = cr * cp * sy - sr * sp * cy;

实战技巧: 在嵌入式平台上,atan2asin运算比较耗时。如果你只需要做姿态更新,完全不用转成欧拉角。我一般只在最后输出日志或者传给飞控时,才做一次转换。

2.5 总结

这一章的内容,说白了就是三件事:

  1. 记住三个坐标系: ECEF(卫星用)、n系(导航用)、b系(IMU用)。
  2. 掌握三种姿态表示: 欧拉角(看)、DCM(转)、四元数(算)。
  3. 理解核心逻辑: 所有的工作,都是围绕“如何把b系下的测量值,准确地转换到n系下”展开的。

嗯,这一章就到这里。这些概念你吃透了,后面讲误差建模和标定,你才能听得懂我在说什么。


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