第二章:坐标系与时间系统
各位同学好,我是老张。今天咱们聊聊导航系统里最基础、也最容易出坑的两个东西——坐标系和时间系统。
说实话,我见过太多工程师在坐标转换上翻车了。有一次项目联调,两个子系统算出来的位置差了十几公里,排查了三天,最后发现是坐标系没对齐。嗯,这种低级错误,咱们今天一次性讲清楚。
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 多公里。
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 坐标了。
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)
星历时主要用于天文和深空导航。它基于太阳系质心动力学时间,不受地球自转影响。
说实话,做地面导航很少用到星历时。但如果你做卫星轨道设计、深空探测器导航,那就绕不开它了。
2.4 知识体系总览
下面这张图,是我自己画的坐标系与时间系统的知识结构。你把它存下来,以后遇到相关问题时,先看这张图,心里就有数了。
这张图把坐标系、坐标转换、时间系统串在了一起。你写代码时,先确认数据在哪个坐标系、用哪个时间系统,然后再做转换。顺序别搞反了。
- ECEF 是直角坐标系,适合计算;LLA 是地理坐标系,适合人读;NED 是导航坐标系,适合控制。
- 坐标转换用旋转矩阵或四元数,注意参考点的选择。
- 时间系统必须统一,UTC、GPS 时、星历时之间要明确转换关系。
- 多传感器融合时,先对齐坐标系和时间,再做数据融合。
好了,坐标系和时间系统就讲到这里。下一章咱们聊传感器特性——IMU 和 GNSS 各自的脾气秉性,以及怎么让它们好好配合。
公众号:蓝海资料掘金营,微信deep3321