4. GPS原理与数据:GPS定位原理、差分GPS(RTK)、GPS数据格式(NMEA)、常见误差源
各位同学,今天我们来聊聊GPS。说实话,在高精地图这个领域,GPS是绕不开的基础。你想想看,一辆自动驾驶车连自己在哪都不知道,那还谈什么规划和控制?但GPS这东西,看着简单,用起来全是坑。我当年刚入行时,就被GPS数据坑过好几次,今天把这些经验分享给你们。
4.1 GPS定位原理:三边测量法
GPS定位的核心原理,说白了就是「三边测量法」。听起来高大上,其实特别简单——就像你在教室里,知道离三面墙的距离,就能算出自己的位置。
具体来说,GPS卫星会不断广播自己的位置和精确的时间戳。你的接收机收到这些信号后,计算信号传播的时间差,再乘以光速,就得到了你到卫星的距离。理论上,知道三颗卫星的距离,就能解出三维空间中的位置(经度、纬度、高度)。
但这里有个关键问题:时间同步。卫星上有原子钟,精度极高,但你的接收机可没有。所以实际上需要第四颗卫星来消除接收机时钟误差。这就是为什么GPS至少需要4颗卫星才能定位。
核心公式:
伪距 = 光速 × (接收时间 - 发射时间) + 时钟误差 + 大气延迟 + 其他误差
实际解算时,我们解的是一个包含4个未知数(x, y, z, dt)的方程组。
我在项目中遇到过一件事:有一次在隧道出口,GPS信号刚恢复,定位直接跳了十几米。为什么?因为卫星数量不够,解算不稳定。嗯,这里要注意——卫星数量少于4颗时,定位结果基本不可信。
4.2 差分GPS(RTK):把误差干掉
普通GPS的精度大概在3-5米,这对高精地图来说完全不够用。高精地图要求车道级精度,也就是10-20厘米。怎么办?上差分GPS,也就是RTK(Real-Time Kinematic)。
RTK的原理其实不复杂。它利用一个已知位置的基准站,计算出GPS信号的误差,然后把这个误差通过无线通信发给移动站(你的车)。移动站用这个误差修正自己的定位结果,精度就能从米级提升到厘米级。
我个人的习惯是:RTK必须配合IMU使用。为什么?因为RTK在信号遮挡时(比如高楼林立的城市峡谷),会频繁丢固定解,变成浮点解甚至单点解。这时候如果没有IMU做航位推算,定位就崩了。
避坑指南:
我曾经在一条高架桥下测试,RTK一直报「固定解」,但定位却偏了2米。后来发现是基准站坐标没校准。记住:基准站的坐标精度,直接决定了RTK的绝对精度。基准站坐标差1米,你的定位就跟着差1米。
RTK的几种状态,你们一定要记住:
| 状态 | 精度 | 说明 |
|---|---|---|
| 固定解(Fixed) | 2-5 cm | 整周模糊度已固定,精度最高 |
| 浮点解(Float) | 20-50 cm | 整周模糊度未固定,精度下降 |
| 单点解(Single) | 3-5 m | 无差分修正,就是普通GPS |
你想想看,如果高精地图采集车用的是浮点解去采集车道线,那地图数据本身就偏了半米,后续的车用这张地图,怎么可能定位准?所以,高精地图采集必须要求RTK处于固定解状态。
4.3 GPS数据格式(NMEA):读懂卫星说的话
GPS接收机输出的数据,通常遵循NMEA-0183协议。这是一种ASCII文本协议,每行以$开头,以回车换行结束。常见的语句有:
- $GPGGA:定位信息,包含经纬度、海拔、卫星数量、精度因子等
- $GPRMC:推荐的最小定位信息,包含速度、航向、日期等
- $GPGSV:可见卫星信息,包含卫星编号、仰角、方位角、信噪比
- $GPGSA:精度因子和卫星编号
举个例子,一条真实的GGA语句长这样:
$GPGGA,123519,4807.038,N,01131.000,E,1,08,0.9,545.4,M,46.9,M,,*47
我来拆解一下:
123519:UTC时间 12:35:194807.038,N:北纬48度07.038分01131.000,E:东经11度31.000分1:定位状态(1=单点定位,2=差分定位,4=RTK固定解)08:使用卫星数0.9:水平精度因子(HDOP),越小越好
注意:NMEA语句中的经纬度是「度分」格式,不是「度」格式。比如4807.038表示48度07.038分,转换成度是48 + 07.038/60 = 48.1173度。我见过不少新手直接拿这个数当度用,结果定位偏了十万八千里。
在实际工程中,我建议不要直接解析NMEA字符串,而是用成熟的库(比如RTKLIB、u-blox的协议栈)。这些库已经处理好了各种边界情况,比如校验和、数据丢帧、多星座混合等。我自己早期写过一个NMEA解析器,结果在卫星信号弱的时候频繁崩溃,后来老老实实换了RTKLIB。
4.4 常见误差源:为什么GPS不准?
GPS的误差来源很多,我挑几个最要命的说说:
- 电离层延迟:GPS信号穿过电离层时,传播速度会变慢。白天电离层活跃,误差可达5-15米。RTK通过差分可以消除大部分,但双频接收机能做得更好。
- 对流层延迟:主要是水汽影响,误差1-3米。这个比较难建模,因为水汽分布变化快。
- 多路径效应:信号打到建筑物、地面、树木上反射后再被接收机收到,造成伪距测量偏差。这是城市环境中最头疼的问题。我曾在高架桥下看到过20米的多路径误差。
- 卫星钟差和星历误差:卫星的时钟和轨道参数本身就有误差,虽然卫星会广播修正参数,但不可能完全消除。
- 接收机噪声:接收机本身的电子噪声,一般0.5-1米,相对较小。
实战经验:
在城市峡谷中,多路径效应是最大的杀手。我建议的做法是:
- 使用扼流圈天线,抑制来自低仰角的反射信号
- 在软件层面,根据信噪比(SNR)给卫星加权,信噪比低的卫星权重降低
- 结合IMU做紧耦合,当GPS出现跳变时,IMU可以平滑掉
还有一个容易被忽略的误差源:天线相位中心变化。不同方向来的信号,天线感受到的相位中心位置是不一样的。高精度的天线会提供相位中心校正模型,但很多便宜的接收机根本不带这个。你想想看,如果天线相位中心偏了5厘米,那你的定位就跟着偏5厘米——这对高精地图来说是不能接受的。
好了,这一章的内容就这些。GPS这东西,原理不复杂,但工程实现全是细节。下一章我们讲IMU,到时候你们会发现,GPS和IMU简直就是天生一对。