3、坐标系统与基准:WGS84坐标系、地心地固坐标系(ECEF)、站心坐标系(ENU)、坐标系转换原理
做定位漂移分析,绕不开坐标系统。
说实话,我早年刚入行时,觉得坐标转换就是个数学公式,查查资料就能搞定。直到有一次,我在一个车载项目里,把WGS84的经纬高直接当成了平面坐标去算距离,结果偏差了上百米。嗯,从那以后,我再也不敢小看坐标系了。
这一节,咱们就把几个核心坐标系掰开揉碎讲清楚。你搞懂了它们,定位漂移的根源就看清了一半。
3.1 WGS84坐标系——GPS的“母语”
WGS84,全称World Geodetic System 1984。说白了,它就是GPS卫星用的那个地球模型。
我习惯把它理解成一个“大地坐标系”。它用经度、纬度、海拔高度来描述一个点的位置。你手机里拿到的原始GPS数据,通常就是WGS84格式。
核心参数:
- 长半轴 a = 6378137.0 m
- 扁率 f = 1/298.257223563
- 地心引力常数 GM = 3986004.418×10⁸ m³/s²
- 自转角速度 ω = 7292115.0×10⁻¹¹ rad/s
你可能会问:“为什么不用正球体?”
因为地球是扁的。赤道半径比两极半径大约21公里。WGS84这个椭球模型,就是为了更精确地拟合真实地球形状。
我的经验: 在低精度场景(比如百米级),你可以把WGS84近似成球体。但做厘米级RTK定位时,必须用椭球模型,否则误差会直接吃掉你的精度。
3.2 地心地固坐标系(ECEF)——三维直角坐标
WGS84虽然直观,但做计算不方便。你想啊,经纬度是角度,算距离还得用球面三角公式,麻烦得很。
ECEF坐标系就解决了这个问题。它以地球质心为原点,X轴指向本初子午线与赤道的交点,Z轴指向北极,Y轴按右手定则确定。
转换公式(WGS84 → ECEF):
// 输入:纬度 lat(弧度)、经度 lon(弧度)、海拔高度 h(米)
// 输出:ECEF坐标 (X, Y, Z)
double a = 6378137.0; // 长半轴
double f = 1.0 / 298.257223563; // 扁率
double e2 = 2*f - f*f; // 第一偏心率平方
double N = a / sqrt(1 - e2 * sin(lat) * sin(lat));
double X = (N + h) * cos(lat) * cos(lon);
double Y = (N + h) * cos(lat) * sin(lon);
double Z = (N * (1 - e2) + h) * sin(lat);
这段代码我写过不下五十遍。每次写都提醒自己:纬度、经度一定要先转成弧度。我见过有人直接用度数算,结果坐标飞到天上去。
3.3 站心坐标系(ENU)——本地“东北天”
ECEF坐标虽然好算,但不够直观。你想想,你站在地面上,想知道前方10米处有个点,ECEF给的是几十万米的绝对坐标,根本没法直接感知。
ENU坐标系就是为这个场景设计的。它以你所在的位置为原点,东向为X轴,北向为Y轴,天向为Z轴。说白了,就是“东北天”。
转换流程(ECEF → ENU):
- 选定一个参考点(比如基站位置),将其WGS84坐标转为ECEF。
- 计算目标点与参考点的ECEF差值向量。
- 用旋转矩阵将差值向量转到ENU坐标系。
// 参考点:纬度 lat0, 经度 lon0
// 目标点ECEF差值:dx, dy, dz
// 输出:ENU坐标 (east, north, up)
double sin_lat = sin(lat0);
double cos_lat = cos(lat0);
double sin_lon = sin(lon0);
double cos_lon = cos(lon0);
double east = -sin_lon * dx + cos_lon * dy;
double north = -sin_lat * cos_lon * dx - sin_lat * sin_lon * dy + cos_lat * dz;
double up = cos_lat * cos_lon * dx + cos_lat * sin_lon * dy + sin_lat * dz;
注意: 参考点的选择很关键。如果你做差分定位,参考点必须是固定的、坐标已知的点。我曾经在一个项目中,把移动站的位置当参考点,结果ENU坐标全乱套了。
3.4 坐标系转换原理——一张图讲清楚
这三个坐标系的关系,我画了一张图帮你理解:
3.5 实战中的坐标系选择建议
我根据项目经验,给你几个实用建议:
| 场景 | 推荐坐标系 | 原因 |
|---|---|---|
| 获取原始GPS数据 | WGS84 | 卫星直接输出,无需转换 |
| 多基站差分定位 | ECEF | 便于向量计算和误差建模 |
| 局部路径规划 | ENU | 直观,符合人类空间感知 |
| 漂移分析与可视化 | ENU | 偏差量直接对应东、北、天方向 |
| 全球导航 | WGS84 | 标准格式,兼容性好 |
核心要点:
- WGS84是输入输出格式,ECEF是计算空间,ENU是分析空间。
- 转换时注意经纬度单位(弧度 vs 度数),这是最常见的bug来源。
- 参考点精度直接影响ENU坐标的可靠性。
好了,坐标系这块就讲到这里。你把这些搞清楚了,后面分析漂移原因时,就能精准定位问题出在哪个环节。
一个小技巧: 我习惯在代码里把坐标系转换封装成独立的函数,每次调用前都打印一下输入输出,方便调试。你试试看,能省不少排查时间。
可可精品资料库