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定位的完整数据流:
你看,从卫星到最终位置,每一步都可能引入误差。伪距测量带进来的是原始误差,星历过期带来的是系统性偏差,三边定位算法如果没处理好,还会放大这些误差。
我个人的习惯是:遇到漂移问题,先看星历是否新鲜,再看伪距残差是否合理,最后才动定位算法。这个排查顺序,能帮你省下至少一半的调试时间。
2.5 小结
这一节我们聊了三件事:
- 三边定位——靠距离不是靠角度,四颗星解一个点。
- 伪距测量——GPS的尺子,但尺子本身有误差。
- 星历与历书——卫星的「位置表」,过期了定位就飘。
说白了,GPS定位就是一个「用带误差的尺子去量移动的目标」的过程。理解了这个本质,你再看漂移问题,就不会一头雾水了。
一个小建议:如果你手头有GPS模块,可以试着用串口抓一下$GPGSV和$GPGGA语句。看看星历状态和伪距值。亲眼看到数据,比看一百页文档都管用。