c - Linux GPSD 比 GPS 鼠标的原始数据更准确
问题描述
我买了一个便宜的 USB GPS 鼠标,想用树莓派读取位置信息。GPS 鼠标的原始(串行)数据如下所示:
$GPRMC,130312.00,A,4751.29758,N,01208.72343,E,0.067,,140721,,,A*7E
$GPVTG,,T,,M,0.067,N,0.125,K,A*24
$GPGGA,130312.00,4751.29758,N,01208.72343,E,1,08,1.46,450.1,M,45.7,M,,*5F
$GPGSA,A,3,08,21,27,32,22,01,10,03,,,,,2.79,1.46,2.37*07
$GPGSV,3,1,10,01,41,288,36,03,17,228,21,08,66,190,24,1
0,31,054,08*7B
$GPGSV,3,2,10,14,17,316,13,21,66,300,37,22,41,231,29,24,00,026,*74
$GPGSV,3,3,10,27,38,157,17,32,41,096,27*7D
$GPGLL,4751.29758,N,01208.72343,E,130312.00,A,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。Is 有一些演示程序可以直观地显示数据。如果我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
所说。
推荐阅读
- html - 用于拖放、另存为 PDF 和打印的 Web 应用程序
- java - 从 xlsx 表中获取数据,不显示 jtable 中的最后三行
- c - C命名管道不适用于多进程
- apache-kafka-connect - 在设置 Salesforce kafka pushtopic 源连接器方面需要帮助
- javascript - jQuery-validate 插件 - 重置表单字段状态
- r - 安装 JLutils 失败
- javascript - 如何覆盖 Date.prototype.toJSON 并在实现中使用原型的功能?
- regex - 在数字中查找两位数(非/连续)
- dask - 如何确定 dask worker 是否空闲?
- python - 获取集合索引以循环返回