GPS 数据解析
最近研究 GPS 的数据解析,发现网上都是零零散散的知识,干脆整理一份完整点的出来。
卫星是怎么向设备发送数据的?
卫星数据并不会主动单独发给你设备,而是持续不断地广播导航信息。卫星发的是原始导航信号,包括:时间、位置、卫星状态等信息。数据速率非常低,例如 GPS L1 频段的数据速率是 50bps;
这些原始信号由接收机(GNSS 模块)接收、解码、计算后,再通过串口、USB 或其他接口输出成我们能理解的格式,比如 NMEA 字符串。
GNSS 模块(比如 u-blox、NEO-6M、ZED-F9P、或者高通芯片集成的 GNSS)内部做了大量处理:
-
并行接收多颗卫星。假设你同时接收到 10 颗卫星,每颗 50bps,就是 500bps。模块把这些数据同时接收、解调、校正、组合;
-
内部还运行了定位算法,把卫星数据用于三角定位,算出经纬度、速度、航向、高度等;
-
再把这些结果封装成标准语句输出,比如每秒发一条
$GNRMC
、$GPGGA
、$GPGSV
等。每条语句几十到几百字节,加起来远超过原始的 50bps。也就是说,原始电文的信息密度远远大于你最终看到的 NMEA 字符串。
刷新率理论极限
理论上,GNSS 设备的刷新率最高可以达到 100Hz,甚至更高,但这取决于多个因素。现实中,主流高端设备通常支持 5Hz~20Hz,极限可达 100Hz。
NMEA 数据的解析
GPS 回传的数据由许多“语句”(sentence)组成,如下:
$GNRMC,075232.300,V,3610.72413,N,12811.99741,E,000.0,000.0,030425,,,N*78
$GNGGA,075232.400,,,,,0,12,1.00,,,,,,*44
$GNGSA,M,1,11,20,12,06,,,,,,,,,2.22,1.00,1.98,1*0B
$GNGSA,M,1,69,73,,,,,,,,,,,2.22,1.00,1.98,2*04
$GNGSA,M,1,26,13,21,,,,,,,,,,2.22,1.00,1.98,3*0B
$GNGSA,M,1,20,08,19,29,,,,,,,,,2.22,1.00,1.98,4*00
$GPGSV,4,1,14,04,13,049,,05,17,230,,06,50,010,23,09,34,076,,1*61
$GPGSV,4,2,14,11,45,318,32,12,27,299,36,14,06,170,,17,41,122,,1*6B
$GPGSV,4,3,14,19,67,096,,20,51,252,25,22,24,183,,25,02,321,,1*6D
$GPGSV,4,4,14,40,15,256,,41544,E,1,
每一行为一句语句,由 $
开头,以 *XX
结尾,由许多逗号分隔成“字段”(column)。
第一个字段 $GXXXX
叫作语句标识符(sentence identifier),用于标识语句的类型。
最后一个字段是十六进制的校验和,由 $
到 *
之间所有字符的 ASCII 码按顺序的异或值得出。最后的校验值必须是两位数的十六进制,如果不满两位,则需要在前面补 0,例如 0E
。
以下为各种类型语句的定义:
GNRMC
含义:推荐的最小特定 GNSS 数据(Recommended Minimum Specific GNSS Data)。 作用:提供基本定位信息,如时间、位置、速度、日期等。 是基础导航数据,适合快速获取位置和时间。提供基本的二维位置(经纬度)、时间、日期、速度和航向。
字段说明:
- GNRMC:句子标识符(GN 表示组合导航,RMC 表示最小推荐数据)。
- hhmmss.ss:UTC 时间(小时分钟秒,带小数秒,例如 12:35:19.00)。
- A:状态(A = 有效,V = 无效)。
- llll.ll:纬度(度分格式,例如 4807.038 表示 48度07.038分)。
- a:纬度方向(N = 北,S = 南)。
- yyyyy.yy:经度(度分格式,例如 01131.000 表示 11度31.000分)。
- a:经度方向(E = 东,W = 西)。
- x.x:地面速度(节,knots,例如 022.4 节)。
- x.x:地面航向(度,相对于真北,例如 084.4 度)。
- ddmmyy:日期(日月年,例如 230394 表示 1994年3月23日)。
- x.x:磁偏角(度,例如 003.1,可为空)。
- a:磁偏角方向(E = 东,W = 西,可为空)。
- m:模式指示(A = 自主,D = 差分,E = 估算,N = 无效)。
- s:导航状态指示(S = 安全,C = 警告,U = 不安全,V = 无效)。
- *hh:校验和(十六进制,例如 *6A)。
GPRMC
定义与 GNRMC 一致。区别在于 GNRMC 中的 "GN" 表示多系统组合导航(GPS + GLONASS + 北斗等),GPRMC 专指 GPS 的数据。
GNGGA
含义:全球导航卫星系统定位数据(Global Navigation Satellite System Fix Data)。 作用:提供详细的定位信息,包括时间、位置、高度、卫星数量等。 提供详细的三维位置数据(经纬度、海拔高度)和定位质量信息(如卫星数量、HDOP)。但不包含速度、航向或日期信息。
字段说明
- GNGGA:句子标识符(GN 表示组合导航,GGA 表示定位数据)。
- hhmmss.ss:UTC 时间(小时分钟秒,带小数秒,例如 12:35:19.00)。
- llll.ll:纬度(度分格式,例如 4807.038 表示 48度07.038分)。
- a:纬度方向(N = 北,S = 南)。
- yyyyy.yy:经度(度分格式,例如 01131.000 表示 11度31.000分)。
- a:经度方向(E = 东,W = 西)。
- x:定位质量(0 = 无效,1 = GNSS/GPS 单点定位,2 = 差分 GNSS,6 = 估算等)。
- xx:使用的卫星数量(例如 08 表示 8 颗)。
- x.x:水平精度因子(HDOP,例如 0.9,值越小精度越高)。
- x.x:海拔高度(米,相对于平均海平面,例如 545.4)。
- M:高度单位(M = 米)。
- x.x:大地水准面高度(米,相对于椭球面,例如 46.9,可为空)。
- M:大地水准面高度单位(M = 米,可为空)。
- x.x:差分时间(秒,自上次差分更新的时间,可为空)。
- xxxx:差分参考站 ID(例如 0010,可为空)
- *hh:校验和(十六进制,例如 *47)。
其中,“定位质量”(Fix Quality Indicator)这个字段的值有以下 6 种可能(通常从 0 到 5),每种值对应不同的定位状态:
-
0 - 无效(Invalid)
表示当前没有有效的定位数据。可能是因为接收机未能接收到足够的卫星信号,或者信号质量不足以计算位置。 -
1 - GPS 单点定位(GPS Fix)
表示接收机使用标准 GPS 信号完成了单点定位。这是基本的定位模式,仅依赖 GPS 卫星信号,未使用差分技术。 -
2 - 差分 GPS(DGPS Fix)
表示定位数据通过差分 GPS(Differential GPS)增强,精度高于普通的 GPS 单点定位。通常需要地面参考站提供校正数据。 -
3 - PPS 定位(Precise Positioning Service Fix)
表示使用精确定位服务(通常与军用 GPS 相关,在民用设备中几乎不用),精度更高。不过在民用设备中,这个值较少见。 -
4 - RTK 固定解(Real-Time Kinematic Fixed)
表示使用实时动态(RTK)技术,达到了固定解状态。这是高精度定位的一种,通常用于测量或导航领域,精度可达厘米级。 -
5 - RTK 浮动解(Real-Time Kinematic Float)
表示使用 RTK 技术,但仅达到了浮动解状态。精度比固定解低,但仍优于普通的 GPS 定位。
GPGGA
定义与 GNGGA 一致。区别在于 GNGGA 中的 "GN" 表示多系统组合导航(GPS + GLONASS + 北斗等),GPGGA 专指 GPS 的数据。
GNGSA
含义:GNSS 卫星运行状态(GNSS DOP and Active Satellites)。 作用:报告定位模式、使用的卫星编号和精度因子(DOP)。 提供精度和卫星使用情况,适合分析定位可靠性。
字段说明:
- GNGSA:句子标识符(GN 表示组合导航,GSA 表示稀释精度和活动卫星)。
- A:定位模式选择(A = 自动,M = 手动)。
- x:定位类型(1 = 未定位,2 = 2D,3 = 3D)。
- xx:卫星编号 1。4-15. xx:使用的卫星编号(最多 12 个,例如 19、23、27 等,未用字段为空)。
- xx:卫星编号 2。
- xx:卫星编号 3。
- xx:卫星编号 4。
- xx:卫星编号 5。
- xx:卫星编号 6。
- xx:卫星编号 7。
- xx:卫星编号 8。
- xx:卫星编号 9。
- xx:卫星编号 10。
- xx:卫星编号 11。
- xx:卫星编号 12。
- x.x:位置精度因子(PDOP,例如 1.6)。
- x.x:水平精度因子(HDOP,例如 0.9)。
- x.x:垂直精度因子(VDOP,例如 1.3)。
- x:系统标识(1 = GPS, 2 = GLONASS, 3 = Galileo, etc.)
- *hh:校验和(十六进制,例如 *2F)。
其中,PDOP, HDOP, VDOP 表示这 12 颗卫星共同参与定位所得到的整体定位精度。
GPGSA
定义与 GNGSA 一致。区别在于 GNGSA 中的 "GN" 表示多系统组合导航(GPS + GLONASS + 北斗等),GPGSA 专指 GPS 的数据。
GPGSV
含义:美国 GPS 卫星可见信息(GPS Satellites in View)。 作用:列出当前可见卫星的编号、仰角、方位角和信噪比。 提供卫星状态详情,适合信号质量监控。
字段说明:
- GPGSV:句子标识符(GP 表示 GPS,GSV 表示可见卫星信息)。
- x:消息总数(表示总共有几条 GSV 句子,例如 3)。
- x:当前消息序号(例如 1,表示这是第 1 条)。
- xx:可见卫星总数(例如 11)。
- xx:卫星编号 1(PRN 号,例如 03)。
- xx:仰角 1(度,0-90,例如 45)。
- xxx:方位角 1(度,0-359,例如 111)。
- xx:信噪比 1(dB,例如 42,空表示无信号)。
- xx:卫星编号 2(例如 07)。
- xx:仰角 2(例如 32)。
- xxx:方位角 2(例如 315)。
- xx:信噪比 2(例如 39)。
- xx:卫星编号 3(例如 14)。
- xx:仰角 3(例如 67)。
- xxx:方位角 3(例如 220)。
- xx:信噪比 3(例如 45)。
- xx:卫星编号 4(例如 19)。
- xx:仰角 4(例如 12)。
- xxx:方位角 4(例如 050)。
- xx:信噪比 4(例如 36)。
- *hh:校验和(十六进制,例如 *77)。
GLGSV
含义:俄罗斯 GLONASS 卫星可见信息(GLONASS Satellites in View)。 作用:同上
GAGSV
含义:欧洲 Galileo 卫星可见信息(Galileo Satellites in View)。 作用:同上
GBGSV
含义:中国北斗卫星可见信息(Beidou Satellites in View)。 作用:同上
GQGSV
含义:日本 QZSS 卫星可见信息(QZSS Satellites in View)。 作用:同上