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是未知整数。怎么把它求出来?
常用的方法有两种:
- LAMBDA方法(Least-squares AMBiguity Decorrelation Adjustment)
- 直接搜索法(适用于短基线)
LAMBDA是目前最主流的。它的核心思想分三步:
- 浮点解:先把∇ΔN当作浮点数,用最小二乘解出来
- 整数变换:对浮点解做Z变换,降低模糊度之间的相关性
- 整数搜索:在变换后的空间里搜索整数组合,找到最优解
代码实现大致是这样的:
// 伪代码: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定位流程是这样的:
- 基准站:架设在已知坐标点,持续观测卫星,生成差分改正数
- 数据链路:基准站通过电台、4G或NTRIP协议,把改正数发给流动站
- 流动站:接收改正数,做双差处理,解算整周模糊度
- 位置输出:固定成功后,输出厘米级坐标
我参与过一个自动驾驶项目,用的是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配合,实现更鲁棒的高精度定位。