3. 误差源分析

做GNSS定位这么多年,我最大的感受就是:定位不准,十有八九是误差没处理好。说白了,卫星信号从两万公里外传下来,一路上要穿过大气层、反射来反射去,最后才到你的接收机天线。这中间任何一个环节出点小问题,你的定位结果就会“飘”。

今天我们就来把这六个“罪魁祸首”挨个扒一扒。我个人习惯是,遇到定位漂移问题,先按这个清单排查一遍,基本能锁定80%的根因。

核心观点:误差不是用来“消除”的,而是用来“建模”和“补偿”的。你理解得越深,补偿得越准,定位就越稳。

3.1 卫星星历误差

卫星星历,说白了就是卫星的“轨道预报”。卫星在天上飞,地面监控站一直在跟踪它,然后算出它接下来几小时的轨道参数,再通过导航电文发给你。

但问题是——预报总有偏差。太阳光压、月球引力、地球引力场不均匀,都会让卫星的实际轨道偏离预报值。这个偏差就叫星历误差。

  • 典型量级:广播星历误差约 1~5 米(RMS)
  • 对定位的影响:直接映射到用户位置误差,约 1:1 的关系
  • 我遇到过的情况:有一次在山区测试,发现定位结果整体往南偏了 3 米。查了半天,最后发现是当天某颗卫星的星历刚更新,地面站还没来得及上传最新参数。
我的建议:如果你做的是高精度应用(比如车道级导航),别用广播星历。改用精密星历(IGS 提供的 SP3 格式),精度能到厘米级。代价是——你得有网络,或者提前下载好。

3.2 卫星钟差

卫星上的原子钟,精度确实高,但也不是绝对完美。铯原子钟一天可能漂移几纳秒,铷原子钟漂移更大一点。你想想看,光速是 3×10⁸ m/s,1 纳秒的钟差就对应 0.3 米的距离误差。

卫星钟差,就是卫星时间与 GPS 系统时间之间的偏差。导航电文里会发一组钟差参数(a₀, a₁, a₂),用来修正这个偏差。

  • 典型量级:修正后残余误差约 1~2 纳秒(对应 0.3~0.6 米)
  • 关键点:钟差是 每颗卫星独立 的,不能混用
  • 避坑指南:我曾经在写接收机软件时,忘了把卫星钟差参数从导航电文里正确解析出来。结果定位结果忽大忽小,折腾了两天才发现是字节序搞反了。嗯,这种低级错误,犯一次就记住了。
注意:卫星钟差和接收机钟差是两码事。接收机钟差是我们要在定位方程里求解的未知数,而卫星钟差是已知的(由地面监控站测定并上注)。千万别搞混。

3.3 电离层延迟

电离层是大气层中 60~1000 公里的区域,里面有大量自由电子。GPS 信号穿过它时,传播速度会变慢,路径也会弯曲。这个延迟量,跟电子密度和信号频率有关。

为什么它这么讨厌?因为电离层延迟变化很快。白天太阳照射强,电子密度高,延迟大;晚上就小。太阳活动剧烈的时候,延迟能差好几倍。

  • 典型量级:天顶方向约 2~10 米,低仰角时可达 20~30 米
  • 双频消除法:如果你用的是双频接收机(L1+L2 或 L1+L5),可以直接用两个频率的伪距差算出电离层延迟,然后消除掉。这是最干净的方法。
  • 单频怎么办?用 Klobuchar 模型。导航电文里带了 8 个参数,能补偿约 50%~70% 的电离层误差。
实战经验:我在做无人机定位时,发现中午 12 点到下午 2 点这段时间,定位漂移明显比早晚大。后来一查,就是电离层延迟在作怪。如果你做的是实时应用,建议在电离层活跃时段(当地午后)适当降低对定位精度的预期。

3.4 对流层延迟

对流层是大气层最下面 10~20 公里那层。这里没有自由电子,但水汽和干空气会让信号折射。对流层延迟跟电离层不一样——它不随频率变化,所以双频消除法对它没用。

对流层延迟分两部分:

  • 干分量:约占 90%,由大气压力决定,比较好建模
  • 湿分量:约占 10%,由水汽含量决定,变化很快,很难精确建模
分量 占比 建模难度 典型量级(天顶)
干分量 ~90% 低(用 Saastamoinen 或 Hopfield 模型) 2.3 米
湿分量 ~10% 高(需要气象传感器或外部数据) 0.1~0.5 米
我的做法:在嵌入式平台上,我一般用 Saastamoinen 模型算干分量,湿分量直接用标准大气模型估算。精度够用,计算量也小。如果你有气压传感器,干分量可以算得更准。

3.5 多路径效应

多路径效应,说白了就是信号“抄近道”或者“绕远路”了。卫星信号本来应该直线到达你的天线,但遇到高楼、地面、水面,就会反射。反射信号比直射信号晚到一点,叠加在一起,伪距就测不准了。

这是我最头疼的误差源。为什么?因为它没有模型可以补偿。星历误差可以建模,电离层可以建模,但多路径完全取决于你周围的环境——今天旁边停了一辆大卡车,明天开走了,多路径就变了。

  • 典型量级:伪距多路径可达 10~20 米,载波相位多路径约 1~5 厘米
  • 抑制方法:
    • 天线设计:用扼流圈天线或抗多路径天线
    • 选址:远离反射面(高楼、水面、金属围栏)
    • 算法:用载波相位平滑伪距,或者用多路径检测算法剔除坏星
  • 我踩过的坑:有一次在停车场做测试,定位结果一直在 2~3 米范围内跳来跳去。我以为是算法问题,折腾了一下午。最后发现——天线旁边 1 米处有一根金属排水管。移开天线后,定位立刻稳定了。嗯,有时候问题不在代码里,在物理世界里。
重要提醒:多路径效应在低仰角卫星上尤其严重。我建议你在定位解算时,把仰角低于 15° 的卫星直接剔除掉。虽然可用卫星少了,但定位质量会明显提升。

3.6 接收机噪声

最后一个误差源,来自接收机自己。热噪声、量化噪声、时钟抖动、射频干扰……这些都会让伪距和载波相位的测量值带上随机误差。

接收机噪声跟前面几个误差不一样——它是随机的、零均值的。也就是说,你测 100 次,平均值是准的,但单次测量有偏差。

  • 典型量级:伪距噪声约 0.1~1 米(取决于信号强度和接收机质量)
  • 载波相位噪声:约 1~5 毫米(远小于伪距噪声)
  • 怎么处理?
    • 用卡尔曼滤波平滑噪声
    • 用载波相位辅助伪距(这就是 RTK 和 PPP 的基础思路)
    • 提高信号跟踪的带宽(但会引入更多干扰,需要权衡)
一个小技巧:如果你在调试时发现定位结果有高频抖动(比如每秒跳几厘米),多半是接收机噪声在作怪。这时候可以试试增大卡尔曼滤波的过程噪声协方差矩阵,让滤波器更“相信”历史轨迹,而不是当前测量值。

知识体系总览

下面这张图,是我自己总结的误差源分析框架。每次做定位漂移排查,我都会按这个顺序走一遍:

GNSS 定位误差源分析框架 定位结果(含漂移) 六大误差源 卫星星历误差 卫星钟差 电离层延迟 对流层延迟 多路径效应 接收机噪声 常用补偿/抑制方法 精密星历 | 双频消除 | 对流层模型 | 载波平滑 | 卡尔曼滤波 | 仰角截止 | 抗多路径天线 —— 根据应用场景选择组合使用 —— 图:GNSS 定位误差源分析框架与补偿方法对应关系

这张图你看懂了吗?从上往下看:定位结果漂移了,先拆成六大误差源,然后针对每个误差源选对应的补偿方法。实际项目中,你不可能把所有方法都用上——资源有限、算力有限、成本有限。我的经验是:先解决量级最大的那个误差。比如你在城市峡谷里,多路径可能是 10 米级的误差,那你就先搞多路径抑制。电离层延迟才 2~3 米,优先级可以往后放。

总结一句话:定位漂移不是玄学,是六个误差源叠加的结果。你把它拆开了、量化了、补偿了,定位自然就稳了。