2. 定位原理回顾:GPS三边定位、伪距测量与星历

做定位漂移修复,你得先懂定位原理。不然你连问题出在哪都不知道。

我见过太多工程师,一上来就调滤波参数、改天线匹配,折腾半天发现——原来是星历过期了。嗯,这种坑我踩过不止一次。

这一节,我们把GPS定位的三个核心概念掰开揉碎。三边定位、伪距测量、星历与历书。搞懂它们,你才能理解漂移是怎么来的。

2.1 三边定位:不是三角测量,别搞混

很多人以为GPS用的是「三角测量」。其实不是。GPS用的是三边定位(Trilateration)。

区别在哪?三角测量靠角度,三边定位靠距离。GPS卫星不告诉你「我从哪个方向来」,它只告诉你「我离你多远」。

打个比方:

  • 你知道自己离北京1200公里——那你可能在一个半径1200公里的圆上。
  • 你又知道自己离上海800公里——两个圆相交,位置缩小到两个点。
  • 再知道离广州1500公里——三个圆交于一点,你的位置就定了。

GPS也一样。一颗卫星给一个球面,两颗给一个圆,三颗给两个点,四颗才能定出唯一解。为什么是四颗?因为接收机时钟不准,需要第四颗星来解时间误差。

关键点:三边定位需要精确的距离测量。距离不准,位置就飘。这就是漂移的根本原因之一。

我在项目里遇到过一种情况:明明搜到12颗星,定位精度却差到几十米。后来发现,是其中几颗星的伪距测量值被多径干扰污染了。三边定位算法把坏数据也算了进去,结果自然就飘了。

2.2 伪距测量:GPS的距离尺子

GPS怎么测距?靠的是伪距(Pseudo-range)。

原理其实不复杂。卫星发一个信号,上面带着发射时间戳。接收机收到后,对比自己的本地时间,算出信号飞了多久。再乘以光速,就是距离。

但问题来了——接收机的时钟不准。卫星上的原子钟精度在纳秒级,接收机里的晶振可能差几十微秒。光速是3×10⁸ m/s,1微秒的误差就是300米。

所以这个测出来的距离不是真距,叫「伪距」。它包含了几项误差:

误差源 典型量级 说明
卫星钟差 1-5米 卫星时钟与GPS系统时偏差
接收机钟差 数米到数百米 晶振漂移,需通过四星解算消除
电离层延迟 2-10米 信号穿过电离层时速度变化
对流层延迟 0.5-2米 大气折射影响
多径效应 1-50米 信号反射导致路径变长

你看,伪距测量本身就带着一堆误差。这些误差叠加起来,定位结果不飘才怪。

我的经验:调试定位漂移时,第一步不是改算法,而是看伪距残差。如果某颗星的残差明显偏大,多半是多径或信号遮挡。先排除它,再谈优化。

2.3 卫星星历与历书:GPS的「时刻表」

卫星在天上飞,位置一直在变。接收机得知道每颗卫星此时此刻在哪,才能算距离。

这个「卫星位置信息」就写在星历(Ephemeris)里。星历包含卫星的轨道参数、钟差修正系数,精度很高,但有效期短——通常只有2到4小时。

与之对应的是历书(Almanac)。历书是粗略的轨道信息,精度低,但有效期长——能用几个月。历书的作用是让接收机快速知道「哪些卫星在天上」,辅助搜星。

对比项 星历 历书
精度 米级(轨道位置) 千米级
有效期 2-4小时 数月
数据量 大(每颗星独立) 小(全部卫星共用)
用途 定位解算 快速搜星、TTFF优化
更新方式 实时接收卫星广播 可预存或网络辅助

星历过期了怎么办?接收机算出来的卫星位置就是错的。伪距再准也没用——你拿一把准尺子去量一个标错位置的物体,结果当然不准。

注意:星历过期是定位漂移的常见原因之一。尤其是设备长时间关机后再开机,星历可能已经失效。这时候定位会突然跳变几十公里——我管这叫「星历休克」。解决办法是启用AGPS(辅助GPS)快速下载新星历,或者等接收机自己重新捕获。

2.4 三者关系:一张图说清楚

三边定位是方法,伪距测量是数据,星历是前提。缺一不可。

下面这张图展示了GPS定位的完整数据流:

GPS定位数据流与漂移根源 GPS卫星 广播星历 + 测距码 伪距测量 含钟差/大气/多径误差 星历解码 获取卫星位置/钟差 三边定位解算 最小二乘法 / 加权最小二乘 输出位置/时间 漂移根源:伪距误差大 → 三边定位方程病态 → 位置解算不稳定 多径、星历过期、电离层异常、接收机钟差 → 伪距不准 → 定位飘移

你看,从卫星到最终位置,每一步都可能引入误差。伪距测量带进来的是原始误差,星历过期带来的是系统性偏差,三边定位算法如果没处理好,还会放大这些误差。

我个人的习惯是:遇到漂移问题,先看星历是否新鲜,再看伪距残差是否合理,最后才动定位算法。这个排查顺序,能帮你省下至少一半的调试时间。

2.5 小结

这一节我们聊了三件事:

  • 三边定位——靠距离不是靠角度,四颗星解一个点。
  • 伪距测量——GPS的尺子,但尺子本身有误差。
  • 星历与历书——卫星的「位置表」,过期了定位就飘。

说白了,GPS定位就是一个「用带误差的尺子去量移动的目标」的过程。理解了这个本质,你再看漂移问题,就不会一头雾水了。

一个小建议:如果你手头有GPS模块,可以试着用串口抓一下$GPGSV和$GPGGA语句。看看星历状态和伪距值。亲眼看到数据,比看一百页文档都管用。