Linux GPSD 比 GPS 鼠标的原始数据更准确

问题描述

我买了一个便宜的 USB GPS 鼠标,想使用 RaspBerry Pi 读取位置信息。 GPS 鼠标的原始(串行)数据如下所示:

$GPRMC,130312.00,A,4751.29758,N,01208.72343,E,0.067,140721,A*7E 
$GPVTG,T,M,0.125,K,A*24 
$GPGGA,1,08,1.46,450.1,45.7,*5F 
$GPGSA,3,21,27,32,22,01,10,03,2.79,2.37*07 
$GPGSV,41,288,36,17,228,66,190,24,1
0,31,054,08*7B 
$GPGSV,2,14,316,13,300,37,231,29,00,026,*74 
$GPGSV,38,157,096,27*7D 
$GPGLL,A*67

它使用 NMEA 协议,该协议记录在此处:https://www.ifm.com/download/files/nmea_protocol_cr3102/$file/nmea_protocol_cr3102.pdf

例如,在最后一行的 $GPLL 之后,有以度、分和秒为单位的纬度和经度。所以从这个数据我们可以读到:
lat: 47°51'29.758''
lon: 12°08'7.2343''

通过将分钟除以 60 与度相加,然后将秒除以 60*60 相加到该结果中,可以轻松地将这些值转换为十进制度数。所以十进制坐标是:
lat: 47.8582661111°
lon: 12.1353428611°

Linux 有一个众所周知的软件包,称为 GPSD。有一些演示程序可以直观地显示数据。如果我在终端窗口中运行 CGPS -s,我会得到以下数据:
lat: 47.85485133°
lon: 12.14536133°

问题是两个结果相差很大,测试表明来自 CGPS -s 的数据更准确。但这怎么可能呢?我正在读取原始数据,结果比也只能读取原始数据的包更糟糕。这两个结果都不是很准确,但来自 CGPS -s 的数据更准确。

有人知道这是为什么吗,我该如何解决?谢谢!

解决方法

您错误地解释了 NMEA 数据。 NMEA 使用度数加十进制分,不是度/分/秒。 当你看到

$GPGGA,130312.00,4751.29758,N,01208.72343,E

实际上是北纬 47 度 51.29758 分钟和东经 12 度 8.72343 分钟。转换为十进制度数是 47.854959,12.145390,或多或少如 cgps 所说。