铁路工程卫星定位测量规范(标准号:TB 10054-2025 )
全球导航卫星系统(GNSS, Global Navigation Satellite System)包括美国GPS、俄罗斯GLONASS、中国北斗(BDS)、欧盟伽利略(Galileo)等,为全球提供高精度定位、导航和授时服务。随着GNSS设备的普及,不同厂商的接收机、显示器、传感器等设备需要统一的通信协议以实现数据交互。
NMEA-0183协议由美国国家海洋电子协会(National Marine Electronics Association, NMEA)制定,最初用于解决航海电子设备间的兼容性问题。该协议定义了一套基于 ASCII 码的文本数据格式,支持异步串行通信,适用于低速数据传输场景(如串口、蓝牙)。通过标准化报文结构,GNSS设备可统一输出位置、时间、速度、卫星状态等信息,极大降低了系统集成成本。
- 1983年:NMEA发布首版《NMEA 0183 接口标准》(1.0版),主要用于航海设备(如罗盘、测深仪)的数据交换,未直接支持GNSS。
- 1992年:随着GPS民用化,2.0版协议引入针对GPS的专用语句(如
$GPRMC
、$GPGGA
),定义了经纬度、时间、定位状态等核心字段。 - 1998年:3.0版优化校验机制,强制要求校验和字段,并支持更多卫星系统(如差分GPS)。
- 2004年:3.1版增加对GLONASS的支持,引入
$GNGGA
等多系统兼容语句(GN
为通用前缀)。 - 2019年:4.1版扩展支持北斗(BDS)、伽利略(Galileo),完善多星座混合定位数据格式,兼容现代GNSS接收机。
目前,NMEA-0183仍是低成本GNSS设备的主流协议,尽管面临NMEA-2000(高速网络协议)的竞争,但其简单性和跨平台兼容性使其在嵌入式系统、消费电子中持续广泛应用。
1. 基本通信参数
- 物理层:异步串行通信(UART),常用波特率:4800、9600、19200 bps;数据位:8位;停止位:1位;无校验位(偶校验可选,取决于设备配置)。
- 数据格式:以文本行(ASCII码)为单位,每行对应一条报文,以
\r\n
(CRLF)结尾,长度通常不超过80字节。
2. 报文结构
每条报文由以下部分组成(以$GPRMC,081836,A,3751.65,S,14507.36,E,000.0,360.0,130998,011.3,E*62
为例):
[起始符] [语句标识] [数据字段] [校验和] [结束符]
$ GPRMC 各字段 *62 \r\n
- 起始符:固定为
$
(或!
,较少用)。 - 语句标识:由5-6个字符组成,前两位为系统标识(如
GP
代表GPS,GN
代表多系统通用),后3-4位为功能码(如RMC
代表推荐最小定位信息)。 - 数据字段:以逗号分隔的具体数据,允许空字段(表示未提供该数据)。
- 校验和:
*
后接两位十六进制数,计算方式为$
到*
之间所有字符的异或(XOR)结果。 - 结束符:固定为
\r\n
(十进制ASCII码13和10)。
3. 常用语句解析
(1)核心定位语句
语句 | 名称 | 功能描述 |
---|---|---|
$GPGGA |
全球定位系统固定数据 | 包含UTC时间、经纬度、定位状态、卫星数、精度因子、海拔高度等信息。 |
$GPRMC |
推荐最小定位信息 | 包含UTC时间、日期、经纬度、速度、航向、定位状态等核心导航数据。 |
$GPGSA |
卫星星历及DOP值 | 提供当前使用的卫星列表、定位模式(2D/3D)、PDOP/HDOP/VDOP等精度因子。 |
$GPGSV |
可见卫星信息 | 分多条报文描述当前可见的所有卫星的ID、仰角、方位角和信噪比(SNR)。 |
$GPVTG |
地面速度和航向 | 提供地面速度( knots/m/s)、真北/磁北航向角等信息。 |
(2)字段详解(以$GPRMC
为例)
$GPRMC,081836,A,3751.65,S,14507.36,E,000.0,360.0,130998,011.3,E*62
081836
:UTC时间(小时:分钟:秒,08:18:36)。A
:定位状态(A
=有效,V
=无效)。3751.65,S
:纬度(37°51.65’ S,度分格式,需转换为十进制:37 + 51.65/60 = 37.86083° S)。14507.36,E
:经度(145°07.36’ E,转换为145 + 7.36/60 = 145.12267° E)。000.0
:地面速度(节,0.0节表示静止)。360.0
:航向角(度,相对于真北,360°即0°)。130998
:日期(日/月/年,13日9月1998年)。011.3
:磁偏角(度,E表示东偏,需结合当地磁偏参数校正)。
(3)校验和计算
以GPRMC
语句为例,计算$
到*
之间的字符异或:
- 字符序列:
GPRMC,081836,A,3751.65,S,14507.36,E,000.0,360.0,130998,011.3,E
- 异或运算:从第一个字符
G
(ASCII 71)开始,依次与下一个字符异或,最终结果为0x62,对应校验和*62
。
4. 多系统兼容性
现代设备支持多GNSS星座(如GPS+北斗+GLONASS),NMEA-0183通过前缀区分:
GP
:仅GPS;GN
:多系统通用(兼容所有支持的卫星系统);BD
:北斗专用(如$BDGGA
)。- 通用语句(如
$GNGGA
)可包含多系统融合定位数据,字段定义与单系统语句一致。
四、应用场景
1. 航海导航
- 船舶定位:通过
$GPRMC
获取实时经纬度、航速、航向,结合电子海图(ECDIS)实现航线规划。 - 差分定位:接收
$GPDTM
(差分基站信息)提升定位精度,满足港口作业、远洋航行需求。
2. 陆地交通
- 车载导航:车载GPS模块通过NMEA-0183输出位置数据,供导航软件显示实时轨迹、计算路线。
- 物流追踪:物联网设备(如货车GPS终端)通过串口或蓝牙发送NMEA报文,后台解析后监控车辆位置与状态。
3. 航空与无人机
- 通用航空:小型飞机使用NMEA设备获取位置、高度(
$GPGGA
中的海拔字段),辅助目视飞行规则(VFR)导航。 - 无人机控制:飞控系统接收GNSS报文,实现定点悬停、航路点飞行等自主控制功能。
4. 测绘与地理信息
- 高精度定位:通过
$GPGSA
的DOP值评估定位精度,结合RTK(实时动态)技术(需扩展协议支持)实现厘米级测绘。 - 时间同步:利用
$GPRMC
的UTC时间字段,为分布式系统提供纳秒级授时(需设备支持高精度时标)。
5. 消费电子与物联网
- 运动手表:内置GNSS芯片通过NMEA协议输出跑步、骑行轨迹数据,同步至手机APP。
- 资产追踪:低功耗设备(如集装箱追踪器)通过NMEA报文发送位置,经GPRS/4G上传至云端平台。
五、使用举例
1. 报文解析代码(Python)
def parse_nmea(line):
if not line.startswith('$') or '*' not in line:
return None
# 提取校验和并计算
data_part, checksum_part = line[1:].split('*', 1)
checksum_calculated = 0
for c in data_part:
checksum_calculated ^= ord(c)
if int(checksum_part[:2], 16) != checksum_calculated:
print("校验和错误")
return None
# 分割字段
fields = data_part.split(',')
sentence_id = fields[0]
if sentence_id == 'GPRMC':
return parse_gprmc(fields)
elif sentence_id == 'GPGGA':
return parse_gpgga(fields)
else:
return fields
def parse_gprmc(fields):
# 字段索引:0=GPRMC, 1=时间, 2=状态, 3=纬度, 4=NS, 5=经度, 6=EW, ...
time_utc = fields[1] # 格式:HHMMSS
status = fields[2]
lat = float(fields[3]) if fields[3] else 0.0
lat_dir = fields[4]
lon = float(fields[5]) if fields[5] else 0.0
lon_dir = fields[6]
# 度分转换为十进制
lat_dec = lat / 100.0
lat_dec = lat_dec if lat_dir == 'N' else -lat_dec
lon_dec = lon / 100.0
lon_dec = lon_dec if lon_dir == 'E' else -lon_dec
return {
'type': 'GPRMC',
'time_utc': time_utc,
'status': status,
'latitude': lat_dec,
'longitude': lon_dec
}
2. 典型报文示例
(1)有效定位报文($GPRMC
)
$GPRMC,123519,A,3723.2475,N,12158.3416,W,000.5,064.7,120598,020.3,E*68
- 解析结果:UTC时间12:35:19,定位有效,北纬37.38745°,西经121.97236°,速度0.5节,航向64.7°,日期12日5月1998年,磁偏角20.3°东。
(2)卫星状态报文($GPGSV
)
$GPGSV,3,1,11,01,78,352,43,02,49,239,42,03,42,083,44,06,34,293,45*7F
$GPGSV,3,2,11,07,22,329,41,08,16,046,39,10,17,238,40,12,28,143,47*7A
$GPGSV,3,3,11,13,34,068,44,15,23,346,40,24,35,140,44*70
- 说明:共3条报文(
3,1
表示总3条,当前第1条),可见11颗卫星。每颗卫星包含ID、仰角(°)、方位角(°)、信噪比(dBHz)。
3. 注意事项
- 时区转换:NMEA时间为UTC,需根据当地时区(如北京时间+8小时)转换为本地时间。
- 数据刷新率:典型设备输出频率为1Hz(每秒1条报文),高速运动场景需确认设备支持更高刷新率(如5Hz、10Hz)。
- 多系统兼容:若设备支持北斗/GLONASS,需识别语句前缀(如
$BDGGA
)并统一解析逻辑。
说明
GPS数据遵循NMEA-0183协议,该数据标准是由NMEA(National Marine Electronics Association,美国国家海事电子协会)于1983年制定的。统一标准格式NMEA-0183输出采用ASCII 码,其串行通信的参数为:波特率=4800bps,数据位=8bit,开始位=1bit,停止位=1bit,无奇偶校验。 数据传输以“语句”的方式进行,每个语句均以“$”开头,然后是两个字母的“识别符”和三个字母的“语句名”,接着就是以逗号分割的数据体,语句末尾为校验和,整条语句以回车换行符结束。 NMEA-0183的数据信息有十几种,这些信息的作用分别是:$GPGGA:输出GPS的定位信息;$GPGLL:输出大地坐标信息;$GPZDA:输出UTC时间信息;$GPGSV:输出可见的卫星信息;$GPGST:输出定位标准差信息;$GPGSA:输出卫星DOP值信息;$GPALM:输出卫星星历信息;$GPRMC:输出GPS推荐的最短数据信息等。
一、 输出语句说明:
1,
$GPRMC语句
(Recommended Minimum Specific GPS/TRANSIT Data-RMC,推荐定位信息1次/1秒) 对于一般的GPS动态定位应用,GPRMC语句完全满足要求。该语句中包括经纬度、速度、时间和磁偏角等字段,这些数据为导航定位应用提供了充分的信息。下表详细说明GPRMC语句中的各个字段: $GPRMC,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,,<12> 字段 $GPRMC语句意义——取值范围 <1> UTC时间:hhmmss.ss——000000.00~235959.99
<2> 状态,有效性 ——A表示有效;V表示无效
<3> 纬度格式:ddmm.mmmm——0000.00000~8959.9999 (标准的度分格式)
<4> 南北半球——N北纬;S南纬
<5> 经度格式:dddmm.mmmm——00000.0000~17959.9999 (标准的度分格式)
<6> 东西半球——E表示东经;W表示西经
<7> 地面速度——000.00~999.999
<8> 速度方向——000.00~359.99
<9> 日期格式,月日年——010100~123199
<10> 磁偏角,单位:度——00.00~99.99
<11> 磁偏角方向——E表示东;W表示西
<12> 模式指示及校验和—— A=自主定位,D=差分,E=估算,N=数据无效
例如:$GPRMC,074529.82,A,2429.6717,N,11804.6973,E,12.623,32.122,010806,,W,A*08
2,$GPGGA语句
(Global Positioning System Fix Data-GGA,GPS定位信息, 输出1次/1秒) GPS定位主要数据,该语句中包括经纬度、质量因子、HDOP、高程、基准站号等字段。下表详细说明GPGGA语句中的各个字段: $GPGGA,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,,<12>,,<14> 字段 $GPGGA语句意义——取值范围 <1> UTC时间:hhmmss.ss——000000.00~235959.99
<2> 纬度,格式:ddmm.mmmm ——0000.00000~8959.9999 (标准的度分格式)
<3> 南北半球——N北纬;S南纬 <4> 经度格式:dddmm.mmmm ——00000.0000~17959.9999 (标准的度分格式)
<5> 东西半球——E表示东经;W表示西经
<6> 质量因子——0=未定位,1=GPS单点定位固定解,2=差分定位,3=PPS解;4=RTK固定解;5=RTK浮点解;6=估计值;7=手工输入模式;8=模拟模式;
<7> 应用解算位置的卫星数——00~12
<8> HDOP,水平图形强度因子——0.500~99.000 ;大于6不可用
<9> 天线高程(海平面)——-9999.9~99999.9
<10> 线线高程单位(m) ——m
<11> 大地水准面起伏——地球椭球面相对大地水准面的高度
<12> 大地水准面起伏单位(m) ——m
<13> 差分GPS数据期——差分时间(从最近一次接收到差分信号开始的秒数,如果不是差分定位将为空),不使用DGPS时为空
<14> 基准站号——0000~1023;不使用DGPS时为空
$GPGGA,074529.82,2429.6717,N,11804.6973,E,1,8,1.098,42.110,M,,M,,*76
3,$GPGSV语句
(GPS Satellites in View-GSV,可见卫星信息,1次/5秒)
GPS可见星的方位角、俯仰角、信噪比等每条语句最多包括四颗卫星的信息,每颗卫星的信息有四个数据项,即:(4)-卫星号,(5)-仰角,(6)-方位角,(7)-信噪比
$GPGSV,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<11>,<12>,<13>,<14>,<15>,<16>,<17>,<18>,<19>
字段 $GPGSV语句意义——取值范围
<1> 总的GSV语句电文数——0~12
<2> 当前GSV语句号
<3> 可视卫星总数——0~32
<4> 卫星号——1~32
<5> 仰角——00~90
<6> 方位角——000~359
<7> 信噪比——00~99dB无表未接收到讯号
<8> 卫星号——1~32
<9> 仰角——00~90
<10> 方位角——000~359
<11> 信噪比——00~99dB无表未接收到讯号
<12> 卫星号——1~32
<13> 仰角——00~90
<14> 方位角——000~359
<15> 信噪比——00~99dB 无表示未接收到讯号
<16> 卫星号——1~32
<17> 仰角——00~90
<18> 方位角——000~359
<19> 效验和,格式:*效验和——检查位
$GPGSV,3,1,11,1,83,54,32,3,19,192,28,6,26,57,36,7,51,140,37*7D
$GPGSV,3,2,11,14,40,136,34,16,64,266,36,20,21,293,,22,2,168,*4C
$GPGSV,3,3,11,23,10,321,,25,53,7,40,30,2,46,*48
4,$GPVTG语句
(Track Made Good and Ground Speed-VTG,地面速度信息)
格式:$GPVTG,<1>,T,<2>,M,<3>,N,<4>,K,<5>*hh
字段 $GPVTG语句意义——取值范围
<1> 以真北为参考基准的地面航向——000.000~359.999
<2> 以磁北为参考基准的地面航向——000.000~359.999
<3> 地面速率——000.000~999.999节
<4> 地面速率——0000.0~1851.8公里/小时
<5> 模式指示——A=自主定位,D=差分,E=估算,N=数据无效(仅NMEA0183 3.00版本输出)
<6> hh 校检位
$GPVTG,257.314,T,257.314,M,10.739,N,19.888,K,A*2F
5,$GPGSA语句
(GPS DOP and Active Satellites-GSA,当前卫星信息,1次/1秒)
GSA : GNSS 的当前卫星和精度因子,包括可见卫星PRN号,以及PDOP、HDOP、VDOP。如:
<1> 模式 ——M = 手动, A = 自动。
<2> 定位类型——1 = 未定位, 2 = 二维定位, 3 = 三维定位。
<3> PRN 数字——01 至 32 表天空使用中的卫星编号,最多可接收12颗卫星信息。正在用于解算位置的卫星号(01~32,前面的0也将被传输)。
<4> PDOP位置精度因子——0.5~99.9
<5> HDOP水平精度因子——0.5~99.9
<6> VDOP垂直精度因子——0.5~99.9
<7> Checksum.(检查位).
$GPGSA,<1>,<2>,<3>,<3>,,,,,<3>,<3>,<3>,<4>,<5>,<6>,<7>
$GPGSA,A,3,19,11,03,23,27,13,16,,,,,,3.43,1.67,2.99*0E
6,$GPGLL语句
(输出大地坐标信息)
$GPGLL,<1>,<2>,<3>,<4>,<5>,<6>,<7>*61
字段 $GPGLL语句意义——取值范围
<1> 纬度:ddmm.mmmmm——0000.00000~8959.9999
<2> 南纬或北纬——北纬N,S南纬
<3> 经度:dddmm.mmmmm——0000.00000~17959.99999
<4> 东、西经 ——东经E,西经W
<5> UTC时间——hh:mm:ss
<6> 数据状态——A有效,V无效
$GPGLL,2431.25310,N,11806.15429,E,081401.00,A,A*61
7,$GPZDA 语句
(输出UTC时间和日期信息)
$GPZDA, <1>,<2>,<3>,<4>,<5>*hh
字段 $GPZDA语句意义——取值范围
<1> 时间:hhmmss.ss——0000000.00~235959.99
<2> 日——00~31
<3> 月——00~12
<4> 年——0000~9999
<5> 地方时与世界时之差
<6> 检校位 hh——
$GPZDA,081401.00,14,09,2006,00,00*62
8,$GPGST 语句
(GPS 伪距噪声统计,包括了三维坐标的标准偏差信息)
字段——示例——说明
Sentence ID ——$GPGST
UTC Time——024603.00——UTC time of associated GGA fix
RMS deviation——3.2——Total RMS standard deviation of ranges inputs to the navigation solution
Semi-major deviation——6.6——Standard deviation (meters) of semi-major axis of error ellipse
Semi-minor deviation——4.7——Standard deviation (meters) of semi-minor axis of error ellipse
Semi-major orientation——47.3——Orientation of semi-major axis of error ellipse (true north degrees)
Latitude error deviation——5.8——Standard deviation (meters) of latitude error
Longitude error deviation——5.6——Standard deviation (meters) of longitude error
Altitude error deviation——22.0——Standard deviation (meters) of latitude error
Checksum—— *58
$GPGST,024603.00,3.2,6.6,4.7,47.3,5.8,5.6,22.0*58
9,$GPCN0语句
各颗用于解算的卫星信噪比:
$GPCN0,30,40,35,26,24,36,31,38
二、 输出时间说明:
GPGGA(1次/1秒) GPGSA(1次/1秒) GPGSV(1次/5秒) GPRMC(1次/1秒) 另可选用GLL,VTG或SiRF二进制格式.
三、坐标系统WGS84
WGS-84坐标系(World Geodetic System)是一种国际上采用的地心坐标系。坐标原点为地球质心,其地心空间直角坐标系的Z轴指向国际时间局(BIH)1984.0定义的协议地极(CTP)方向,X轴指向BIH1984.0的协议子午面和CTP赤道的交点,Y轴与Z轴、X轴垂直构成右手坐标系,称为1984年世界大地坐标系。这是一个国际协议地球参考系统(ITRS),是目前国际上统一采用的大地坐标系。GPS广播星历是以WGS-84坐标系为根据的。 WGS84坐标系,长轴6378137.000m,短轴6356752.314,扁率1/298.257223563。
DOP值有三种测量类型:
水平、垂直和说明(mean)。HDOP测量它和经纬度的关系作为精度,VDOP测量他和海拔的关系作为精度,PDOP,给出一个关于经纬度、海拔精度的完整等级。每个DOP值都是1到50之间数值,其中50 表示非常差的精度,1则表示很理想的精确度。 表2-1列出了划分的一份精确的PDOP值细目分类。PDOP分类描述:
PDOP值——评价——说明
1~2——理想——这是最高的信任级别,应用程序可以在任何时候获取最高的精度
2~3——极好——值得信任的级别,位置的测量相当精确,可以应用于绝大多数应用程序,但是有些非常敏感的应用程序就不行了
4~6——好——这是用来做商业应用的最低等级。位置的测量可以用来做线路导航建议
7~8——中等——位置测量可以用来计算,但是质量还应该提高。推荐用语天空观察
9~20——中下——信任级别很低。位置测量结果应该丢弃或者仅用于粗略估计当前位置
21~50——差——在这个级别的测量结果是不精确的,大概会有半个足球场大的误差,应该丢弃
四,常用精度
PDOP:位置精度因子(Position Dilution of Precision),直译为“精度强弱度”,通常翻译为“相对误差”。具体含义是:由于观测成果的好坏与被测量的人造卫星和接收仪间的几何形状有关且影响甚大,所以计算上述所引起的误差量称为精度的强弱度。天空中卫星分布程度越好,定位精度越高(数值越小精度越高)。PDOP表示三维位置定位精度与导航台几何配置关系的一个参数。在全球定位(GPS)系统中,等于用户位置的径向误差(1°)与用户到卫星的距离测量误差(1°)的比值。
Pdop取值范围为:0.5–99.9,为纬度、经度和高程等误差平方和的开根号值,所以Pdop的平方 =Hdop 的平方 +Vdop 的平方。HDOP2+VDOP2=PDOP2
PDOP( position dilution of precision ) 三维位置精度因子:为纬度、经度和高程等误差平方和的开根号值
TDOP(time dilution of precision )钟差精度因子:为接收仪内时表偏移误差值。
HDOP(horizontal dilution of precision )水平分量精度因子:为纬度和经度等误差平方和的开根号值。
VDOP(vertical dilution of precision )垂直分量精度因子
age:差分延时
VRMS:水平残差
HRMS:垂直残差
RMS :HRMS2+VRMS2=RMS2
距离基准站的距离:两个经纬度坐标之间的距离计算:
//////////两个经纬度坐标计算距离///////////////////////
private double EARTH_RADIUS = 6378.137;//地球半径
private double rad(double d)
{
return d * Math.PI / 180.0;
}
public double GetDistance(double lat1, double lng1, double lat2, double lng2)
{
double radLat1 = rad(lat1);
double radLat2 = rad(lat2);
double a = radLat1 - radLat2;
double b = rad(lng1) - rad(lng2);
double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a/2),2) +
Math.cos(radLat1)*Math.cos(radLat2)*Math.pow(Math.sin(b/2),2)));
s = s * EARTH_RADIUS;
s = Math.round(s * 10000) / 10000;
return s;