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):

  1. 选定一个参考点(比如基站位置),将其WGS84坐标转为ECEF。
  2. 计算目标点与参考点的ECEF差值向量。
  3. 用旋转矩阵将差值向量转到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 坐标系转换原理——一张图讲清楚

这三个坐标系的关系,我画了一张图帮你理解:

坐标系转换关系图 WGS84 经纬度 + 海拔 ECEF 地心地固直角坐标 ENU 站心东北天坐标 公式转换 旋转+平移 逆转换 WGS84 → ECEF:椭球参数 + 公式计算 ECEF → ENU:选定参考点 + 旋转矩阵 ENU → WGS84:逆旋转 + 逆公式 应用场景:GPS原始数据(WGS84) → 定位解算(ECEF) → 局部路径规划(ENU) 漂移分析时,通常在ENU坐标系下观察偏差最直观

3.5 实战中的坐标系选择建议

我根据项目经验,给你几个实用建议:

场景 推荐坐标系 原因
获取原始GPS数据 WGS84 卫星直接输出,无需转换
多基站差分定位 ECEF 便于向量计算和误差建模
局部路径规划 ENU 直观,符合人类空间感知
漂移分析与可视化 ENU 偏差量直接对应东、北、天方向
全球导航 WGS84 标准格式,兼容性好

核心要点:

  • WGS84是输入输出格式,ECEF是计算空间,ENU是分析空间。
  • 转换时注意经纬度单位(弧度 vs 度数),这是最常见的bug来源。
  • 参考点精度直接影响ENU坐标的可靠性。

好了,坐标系这块就讲到这里。你把这些搞清楚了,后面分析漂移原因时,就能精准定位问题出在哪个环节。

一个小技巧: 我习惯在代码里把坐标系转换封装成独立的函数,每次调用前都打印一下输入输出,方便调试。你试试看,能省不少排查时间。

可可精品资料库