第二章:坐标系与时间系统

各位同学好,我是老张。今天咱们聊聊导航系统里最基础、也最容易出坑的两个东西——坐标系和时间系统。

说实话,我见过太多工程师在坐标转换上翻车了。有一次项目联调,两个子系统算出来的位置差了十几公里,排查了三天,最后发现是坐标系没对齐。嗯,这种低级错误,咱们今天一次性讲清楚。

2.1 常用坐标系

导航里常用的坐标系,说白了就三种:地心地固系、地理系、导航系。我习惯把它们比作「地球的骨架」、「你脚下的地图」和「你手里的指南针」。

2.1.1 地心地固坐标系(ECEF)

ECEF 的原点在地球质心,Z 轴指向北极,X 轴指向本初子午线与赤道的交点。这个坐标系跟着地球一起转,所以叫「地固」。

我个人觉得,ECEF 最大的好处是——它是个直角坐标系,算距离、算向量都很方便。GPS 卫星的轨道位置,就是用 ECEF 算的。

关键参数:
  • 原点:地球质心
  • Z 轴:指向协议地球北极(CTP)
  • X 轴:指向本初子午线与赤道交点
  • Y 轴:按右手定则确定

2.1.2 地理坐标系(LLA)

地理坐标系就是咱们常说的经纬高(Latitude, Longitude, Altitude)。你打开手机地图,看到的那个位置,就是 LLA 坐标。

这里有个坑——纬度有大地纬度和地心纬度之分。大地纬度是参考椭球面的法线与赤道面的夹角,地心纬度是质心连线与赤道面的夹角。两者差多少?最多能差 0.2 度,换算成距离就是 20 多公里。

避坑指南: 我曾经在融合 GNSS 和 INS 数据时,发现位置跳变。查了半天,原来是 GNSS 输出的是大地纬度,而 INS 用的是地心纬度。两者差了 0.1 度,导致融合结果震荡。后来统一成大地纬度,问题解决。

2.1.3 导航坐标系(NED / ENU)

导航坐标系是跟着载体走的。NED 是北东地,ENU 是东北天。我个人习惯用 NED,因为无人机、导弹的惯导系统大多用 NED。

你想想看,NED 的 Z 轴指向地心,正好和重力方向一致。这样加速度计测出来的重力分量,可以直接用来做初始对准,多方便。

2.2 坐标转换

坐标转换是导航系统的核心操作。说白了,就是把一个坐标系下的位置,换算到另一个坐标系下。

2.2.1 ECEF ↔ LLA 转换

这个转换有标准公式。从 LLA 到 ECEF:

// LLA 转 ECEF
double a = 6378137.0;          // 地球长半轴
double f = 1.0 / 298.257223563; // 扁率
double e2 = 2*f - f*f;         // 第一偏心率平方

double sinLat = sin(lat);
double cosLat = cos(lat);
double sinLon = sin(lon);
double cosLon = cos(lon);

double N = a / sqrt(1 - e2 * sinLat * sinLat);

double x = (N + alt) * cosLat * cosLon;
double y = (N + alt) * cosLat * sinLon;
double z = (N * (1 - e2) + alt) * sinLat;

反过来,从 ECEF 到 LLA 需要迭代计算。我记得第一次写这个函数时,迭代了 5 次就收敛了,精度到毫米级。

2.2.2 ECEF ↔ NED 转换

这个转换需要先知道参考点的 LLA 坐标。然后构建旋转矩阵:

// 构建从 ECEF 到 NED 的旋转矩阵
double sinLat = sin(refLat);
double cosLat = cos(refLat);
double sinLon = sin(refLon);
double cosLon = cos(refLon);

double R[3][3] = {
    {-sinLat*cosLon, -sinLat*sinLon,  cosLat},
    {-sinLon,        cosLon,          0     },
    {-cosLat*cosLon, -cosLat*sinLon, -sinLat}
};

然后,把 ECEF 坐标差乘以这个旋转矩阵,就得到 NED 坐标了。

经验之谈: 我建议你在做坐标转换时,先把所有数据统一到 ECEF 下。因为 ECEF 是直角坐标系,加减乘除都方便。等算完了,再转回你需要的坐标系。这样能减少很多不必要的麻烦。

2.3 时间系统

时间系统比坐标系更容易被忽视,但坑更多。我见过因为时间不同步,导致定位结果差了上百米的案例。

2.3.1 UTC 时间

UTC 是协调世界时,咱们日常用的就是它。UTC 基于原子时,但为了和天文时对齐,会不定期插入闰秒。从 1972 年到现在,已经加了 27 秒了。

嗯,这里要注意——闰秒是 UTC 独有的。GPS 时、星历时都不管这个。

2.3.2 GPS 时间

GPS 时从 1980 年 1 月 6 日 0 时开始计数,单位是周 + 秒。它不跳闰秒,所以 GPS 时和 UTC 的差值是整数秒。

截至 2024 年,GPS 时比 UTC 快 18 秒。这个差值会随着闰秒的增加而变大。

时间系统 起始时刻 与 UTC 的关系
UTC 1972-01-01 00:00:00 基准时间
GPS 时 1980-01-06 00:00:00 UTC + 18s(2024年)
星历时 J2000.0 与 UTC 有复杂转换关系

2.3.3 星历时(Julian Date / Barycentric Dynamical Time)

星历时主要用于天文和深空导航。它基于太阳系质心动力学时间,不受地球自转影响。

说实话,做地面导航很少用到星历时。但如果你做卫星轨道设计、深空探测器导航,那就绕不开它了。

避坑指南: 我曾经在融合 GPS 和北斗数据时,发现时间戳对不上。后来发现,GPS 用的是 GPS 时,北斗用的是北斗时(BDT)。BDT 比 GPS 时快 14 秒。如果不做时间对齐,融合结果就是错的。

2.4 知识体系总览

下面这张图,是我自己画的坐标系与时间系统的知识结构。你把它存下来,以后遇到相关问题时,先看这张图,心里就有数了。

坐标系与时间系统知识体系 常用坐标系 地心地固系 (ECEF) 地理系 (LLA) 导航系 (NED/ENU) 载体坐标系 坐标转换 ECEF ↔ LLA ECEF ↔ NED 旋转矩阵法 四元数法 时间系统 UTC(协调世界时) GPS 时(周+秒) 星历时(TDB/JD) 核心原则:统一基准,避免混用

这张图把坐标系、坐标转换、时间系统串在了一起。你写代码时,先确认数据在哪个坐标系、用哪个时间系统,然后再做转换。顺序别搞反了。

本章核心要点:
  1. ECEF 是直角坐标系,适合计算;LLA 是地理坐标系,适合人读;NED 是导航坐标系,适合控制。
  2. 坐标转换用旋转矩阵或四元数,注意参考点的选择。
  3. 时间系统必须统一,UTC、GPS 时、星历时之间要明确转换关系。
  4. 多传感器融合时,先对齐坐标系和时间,再做数据融合。

好了,坐标系和时间系统就讲到这里。下一章咱们聊传感器特性——IMU 和 GNSS 各自的脾气秉性,以及怎么让它们好好配合。


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