4、RTK定位:载波相位差分、整周模糊度固定、厘米级定位实现

各位同学,欢迎来到RTK定位这一章。

说实话,GPS单点定位大家都很熟悉了,精度大概在米级。但自动驾驶要求的是厘米级,差了整整两个数量级。怎么跳过去的?核心就是RTK——实时动态差分技术。

我当年刚接触RTK时,觉得这东西挺玄乎的。后来亲手搭了一套基准站+流动站,才真正搞明白。说白了,RTK就是利用两个接收机之间的空间相关性,把误差给干掉。

4.1 载波相位观测值:比伪距精细100倍

先问大家一个问题:为什么伪距只能做到米级?

因为伪距用的是C/A码,一个码片宽度约293米,就算接收机能把相位锁定到1%的码片宽度,精度也就3米左右。这已经是极限了。

但载波不一样。L1载波频率1575.42MHz,波长约19厘米。你想想看,如果能测量载波的相位,理论上精度可以达到毫米级。

载波相位观测值的数学模型是这样的:

Φ = ρ + c·(dt_r - dt_s) + λ·N - I + T + ε

其中:

  • Φ:载波相位观测值(单位:米)
  • ρ:卫星到接收机的几何距离
  • c·(dt_r - dt_s):接收机和卫星钟差
  • λ·N:整周模糊度(λ是波长,N是整数)
  • I:电离层延迟
  • T:对流层延迟
  • ε:噪声和其他误差

注意这个λ·N,它就是整周模糊度。载波相位测量只能测到不足一周的小数部分,整周数N是未知的。不把这个N解出来,你就没法用载波做高精度定位。

核心要点:载波相位精度高,但存在整周模糊度问题。RTK的核心任务就是把这个N给固定下来。

4.2 差分技术:消除共性误差

单台接收机做载波相位定位,误差源太多了。钟差、电离层、对流层、轨道误差……每个都是几米到几十米的量级。

RTK的思路很巧妙:在已知坐标的位置架一台基准站,让它和流动站同时观测同一颗卫星。两站距离不远(一般20公里以内),那么很多误差是共性的。

做个差分:

ΔΦ = Φ_r - Φ_b

基准站的位置已知,可以算出几何距离的真值。然后基准站把观测值和计算值一起发给流动站。流动站一差分,钟差基本消掉了,电离层和对流层也消掉了大部分。

我曾在城市峡谷做过测试,基准站和流动站相距5公里,差分后残差只有几厘米。效果非常明显。

4.3 双差观测模型:整周模糊度的整数特性

单差还不够完美。因为接收机钟差虽然消了,但卫星钟差还在。怎么办?再做一次差分——星间差分。

这就是双差模型:

∇ΔΦ = ∇Δρ + λ·∇ΔN + ∇Δε

双差之后,接收机钟差和卫星钟差全没了。电离层、对流层也基本消干净了。剩下的就是几何距离差和整周模糊度差。

而且最关键的是:∇ΔN是整数。这个整数特性,是RTK能够实现厘米级定位的基石。

个人经验:我在做双差处理时,习惯先做站间单差,再做星间双差。顺序不能乱,否则整数特性会被破坏。曾经踩过这个坑,排查了两天才发现是差分顺序搞反了。

4.4 整周模糊度固定:RTK的灵魂

好,现在问题来了:双差模型里,∇ΔN是未知整数。怎么把它求出来?

常用的方法有两种:

  1. LAMBDA方法(Least-squares AMBiguity Decorrelation Adjustment)
  2. 直接搜索法(适用于短基线)

LAMBDA是目前最主流的。它的核心思想分三步:

  1. 浮点解:先把∇ΔN当作浮点数,用最小二乘解出来
  2. 整数变换:对浮点解做Z变换,降低模糊度之间的相关性
  3. 整数搜索:在变换后的空间里搜索整数组合,找到最优解

代码实现大致是这样的:

// 伪代码:LAMBDA方法核心步骤
// 1. 构建法方程,求解浮点模糊度
Matrix N_float = solveNormalEquation(designMatrix, observations);

// 2. 获取浮点解的协方差矩阵
Matrix Q_N = getCovariance(N_float);

// 3. Z变换,降低相关性
Matrix Z = decorrelationTransform(Q_N);
Matrix N_float_transformed = Z * N_float;

// 4. 整数搜索
Matrix N_int_transformed = integerSearch(N_float_transformed, Z * Q_N * Z.T);

// 5. 逆变换回原始空间
Matrix N_int = Z.inverse() * N_int_transformed;

搜索完成后,还要做Ratio检验。就是比较最优解和次优解的残差比值。Ratio值大于3.0,我才敢说固定成功了。

注意:整周模糊度固定不是100%成功的。多路径效应严重、卫星几何分布差、基线太长,都可能导致固定失败。这时候只能退而求其次,用浮点解——精度会降到分米级。

4.5 厘米级定位实现:从理论到工程

理论讲完了,咱们看看工程上怎么落地。

一个完整的RTK定位流程是这样的:

  1. 基准站:架设在已知坐标点,持续观测卫星,生成差分改正数
  2. 数据链路:基准站通过电台、4G或NTRIP协议,把改正数发给流动站
  3. 流动站:接收改正数,做双差处理,解算整周模糊度
  4. 位置输出:固定成功后,输出厘米级坐标

我参与过一个自动驾驶项目,用的是u-blox F9P模块。实测效果:

场景 基线长度 固定成功率 定位精度(RMS)
开阔道路 5 km 98% 2.5 cm
城市峡谷 3 km 85% 4.8 cm
高架桥下 2 km 60% 12.3 cm(浮点解)

你看,开阔场景下厘米级定位完全没问题。但到了遮挡严重的区域,固定率下降,精度也跟着掉。

避坑指南:我曾经在隧道出口处遇到过整周模糊度重新初始化的问题。车辆一出隧道,卫星信号恢复,但模糊度需要重新固定,中间有3-5秒的收敛时间。解决方案是:结合IMU做组合导航,在信号中断期间用IMU推算位置,保持模糊度参数的连续性。

4.6 工程实现中的几个关键点

最后,分享几个我在工程中总结的经验:

  • 周跳检测:载波相位容易发生周跳,必须用GF(Geometry-Free)或MW(Melbourne-Wübbena)组合实时检测。一旦发现周跳,对应的模糊度参数要重置。
  • 多频点利用:现在GPS有L1/L2/L5,北斗有B1I/B2I/B3I。多频点组合可以加快模糊度固定速度。我习惯用L1+L2双频,固定时间能缩短到10秒以内。
  • 高程精度:RTK的水平精度很好,但高程精度差一些,一般是水平精度的1.5-2倍。做自动驾驶时,建议结合气压计或IMU来辅助高程估计。
  • 数据链路延迟:差分改正数有延迟,超过2秒就会影响定位精度。用4G网络时,要注意网络延迟抖动。我一般会在流动站做延迟补偿。

嗯,RTK定位的内容就讲到这里。下一章我们会讲惯性导航,看看IMU怎么和RTK配合,实现更鲁棒的高精度定位。