4. GNSS信号异常处理:多路径效应、遮挡导致跳变、RTK固定解丢失后的处理策略
说实话,GNSS信号异常是定位漂移的头号元凶。
我在做自动驾驶路测时,最怕的就是车辆经过高架桥下或者高楼林立的CBD区域。GNSS信号一乱,定位轨迹就像喝醉了酒一样,东倒西歪。今天我们就来聊聊,怎么对付这些烦人的信号异常。
4.1 多路径效应:信号反射的陷阱
多路径效应,说白了就是GNSS信号不是直线过来的。
它先撞到高楼、地面或者树木,反射一下,再拐进接收机。这样一来,信号传播时间就变长了,伪距测量值偏大,定位自然就偏了。
核心表现:
- 定位结果出现缓慢漂移,不是瞬间跳变
- 在城市峡谷、高架桥下、隧道口尤其明显
- 卫星仰角越低,多路径越严重
我遇到过最典型的一次,是在上海陆家嘴测试。车辆沿着环形天桥绕圈,定位轨迹居然画出了一个“麻花”。后来排查发现,就是周围玻璃幕墙反射信号导致的。
4.1.1 检测方法
怎么判断是不是多路径?我个人习惯看三个指标:
- 载噪比(C/N0):正常值在40-50 dB-Hz。如果某颗卫星的C/N0突然下降,但其他卫星正常,多半是反射信号。
- 伪距残差:解算后的残差突然变大,超过阈值就要警惕。
- 卫星仰角:低于15度的卫星,多路径概率极高。我一般直接剔除。
小技巧:可以在代码里加一个滑动窗口,统计最近10秒的C/N0均值。如果某颗卫星的C/N0比均值低5 dB以上,就标记为“可疑卫星”,降低它的权重。
4.1.2 处理策略
处理多路径,我总结了三板斧:
- 第一板斧:剔除低仰角卫星。设置仰角阈值,比如15度以下直接不用。简单粗暴,但有效。
- 第二板斧:加权最小二乘。根据C/N0给每颗卫星分配权重。信号好的权重高,信号差的权重低。这样即使有反射信号,影响也被压到最小。
- 第三板斧:一致性检测。用IMU预测的位置和GNSS解算的位置做对比。如果偏差超过3米,就认为当前GNSS解不可信,暂时用IMU推算。
// 伪代码:基于C/N0的加权定位
for each satellite s:
if s.elevation < 15°:
continue // 直接剔除
weight = min(1.0, (s.CN0 - 30) / 20) // C/N0 30以下权重为0,50以上权重为1
H_matrix.add(s.line_of_sight_vector * weight)
residual.add(s.pseudorange - predicted_range)
// 加权最小二乘解算
delta_x = (H^T * W * H)^(-1) * H^T * W * residual
4.2 遮挡导致跳变:瞬间的噩梦
遮挡导致的跳变,比多路径更吓人。
车辆从隧道出来,或者从高架桥下穿过,卫星数量从4颗突然变成8颗。定位结果会瞬间跳变几米甚至十几米。你想想看,如果这时候车辆正在变道,后果不堪设想。
注意:跳变不是缓慢漂移,而是瞬间发生的。常规的滤波方法(比如卡尔曼滤波)很难快速跟上这种突变。处理不好,车辆会“抽搐”。
4.2.1 检测方法
我常用的检测手段有两个:
- 位置跳变检测:计算当前GNSS位置和上一帧位置的差值。如果超过5米(车速60km/h时,0.1秒移动约1.7米),就认为发生了跳变。
- 卫星数量突变:如果可见卫星数在1秒内增加或减少超过3颗,说明遮挡环境发生了变化,需要特别处理。
4.2.2 处理策略
嗯,这里要注意。处理跳变不能一刀切。我建议分情况讨论:
| 场景 | 处理策略 | 优先级 |
|---|---|---|
| 卫星数量突然增加 | 对新加入的卫星做“软启动”,前5帧权重从0逐渐增加到1 | 高 |
| 卫星数量突然减少 | 保持上一帧的定位结果,用IMU推算,直到卫星数量稳定 | 高 |
| 位置跳变超过阈值 | 丢弃当前GNSS解,用IMU预测位置,同时降低GNSS的观测噪声协方差 | 最高 |
我曾经在深圳的深南大道上遇到过这种情况。车辆从地王大厦旁边经过,卫星从12颗瞬间掉到5颗,定位跳了8米。还好当时速度不快,而且我提前做了跳变检测,用IMU撑过了那几秒。
4.3 RTK固定解丢失:从厘米级到米级的坠落
RTK固定解丢失,是定位精度从天堂掉到地狱的过程。
固定解时,精度是2-3厘米。一旦变成浮点解或者单点解,精度直接掉到几十厘米甚至几米。如果不做处理,车辆会突然“画龙”。
RTK状态说明:
- 固定解(Fix):整周模糊度已固定,精度2-5cm
- 浮点解(Float):整周模糊度未固定,精度20-50cm
- 单点解(Single):没有差分改正,精度1-5m
4.3.1 为什么会丢失固定解?
原因其实就几个:
- 基准站和流动站之间的基线太长(超过20公里),大气误差无法完全消除
- 遮挡导致共视卫星不足,无法解算整周模糊度
- 电离层活跃,比如中午或者太阳风暴期间
- 数据链路中断,差分改正数收不到
4.3.2 处理策略
我的处理思路是“降级不降速,平滑过渡”。
- 状态切换时,不要立即切换观测噪声。比如从固定解切换到浮点解,GNSS的观测噪声协方差从0.02米逐渐增加到0.5米,过渡时间大约1-2秒。
- 启用IMU辅助。RTK丢失时,IMU的权重自动提高。说白了,就是让IMU多扛一会儿。
- 尝试重新固定。如果丢失时间超过10秒,尝试重新初始化RTK。可以保存最近的基准站观测数据,用“热启动”方式快速恢复。
// RTK状态切换时的协方差调整
if rtk_status == FIX:
gnss_covariance = 0.02 // 2cm
elif rtk_status == FLOAT:
// 逐渐增加,不要跳变
gnss_covariance = min(0.5, gnss_covariance + 0.01 * dt)
elif rtk_status == SINGLE:
gnss_covariance = min(5.0, gnss_covariance + 0.1 * dt)
// 同时调整IMU的权重
imu_weight = 1.0 - (gnss_covariance / 5.0) // 协方差越大,IMU权重越高
避坑指南:我曾经犯过一个错误——RTK丢失后,直接把GNSS观测噪声设成很大的固定值。结果导致滤波器收敛很慢,恢复固定解后还要好几秒才能回到正常精度。后来改成渐变方式,问题就解决了。
4.4 综合处理框架
说了这么多,我们来画一张图,看看这些策略怎么组合在一起。
这张图展示了我的处理流程。说白了就是三步走:先预处理,再检测异常,最后根据异常类型选择策略。每一步都环环相扣,缺一不可。
最后提醒一句:GNSS信号异常处理没有银弹。不同场景、不同硬件、不同算法,效果天差地别。我建议你在实际项目中,先采集一段典型场景的数据,离线调试好参数,再上车实测。这样能省掉很多弯路。
好了,这一章的内容就到这里。GNSS信号异常处理,说白了就是和不确定性做斗争。多路径、遮挡、RTK丢失,每个问题都有对应的解法。关键是要理解它们的本质,然后对症下药。