我使用 python2.7.9、GPSD 和 python-gps 包将 adafruit 终极 GPS 突破与我的 Raspberry Pi 2 一起使用。我成功地通过串行端口获得了 1Hz 的 gps 更新。
该设备据说能够进行 10Hz 更新,我想启用它。根据数据表(见下面的片段),这可以通过串行命令设置。
我的问题是我找不到足够的 python-gps 模块或 GPSD 文档来告诉我应该如何使用我的 python 脚本通过串行方式向 GPS 发送命令。有人可以指出我正确的方向吗?
我使用 python2.7.9、GPSD 和 python-gps 包将 adafruit 终极 GPS 突破与我的 Raspberry Pi 2 一起使用。我成功地通过串行端口获得了 1Hz 的 gps 更新。
该设备据说能够进行 10Hz 更新,我想启用它。根据数据表(见下面的片段),这可以通过串行命令设置。
我的问题是我找不到足够的 python-gps 模块或 GPSD 文档来告诉我应该如何使用我的 python 脚本通过串行方式向 GPS 发送命令。有人可以指出我正确的方向吗?
我刚从你家买了一个gps。(MTK) 他们使用$PMTK
控制字符串。任何搜索PMTK protocol
都会提供无穷无尽的资源。限制是gps本身。
对于一次性转换,标准方法是从根终端执行echo -e "\$PMTK220,200*2C\r\n" > /dev/ttyAMA0
,或连接设备的任何位置,以获得 5Hz 响应。这
-e
标志允许解析反斜杠$
NMEA 语句的开头P
专有信息MTK
NMEA 数据类型220
数据包类型200
数据包数据*
数据结束2C
校验和\r\n
NMEA句子的结尾也有可用的脚本和其他项目,但都要求 gpsd 不能控制 gps。gpsd 将阻止向 gps 发送控制字符串。
此外,如果 gpsd 中有-b
标志,/etc/default/gpsd
则在连接设备时不会写入设备。它将选择通用 NMEA驱动程序,并且不会将任何控制字符串写入 gps。
您可以滑入后面,并使用外壳中的控制字符串操纵速率。 gps 会喷出数据,但 gpsd 不会确认速率。
看来,gpsd更喜欢1 秒计时。即使 gps 能够更快地循环,即使您已经使用其他方法重新/设置速率,并且这样做,gpsd 也需要被告知速率已经改变。
这就是gpsctl -c 0.2
(没有 sudo)发挥作用的地方。它捆绑在 gpsd 包中。
如果只有一个设备连接到 gpsd,在示例中,gpsctl 会将该设备更改为 0.2 秒计时周期并将其传送到 gpsd。时间以秒为单位。是的,它可以设置得非常慢/快,但没有伪装能力。如果它做不到,它就不会做,也不会告诉你它没有/不能,除非出现致命错误。
只要有容量,端口速度就不是问题。曾经数过的人说 4800 波特足以在一秒钟内读取一次数据以发送数据。它取决于有效负载,但它适用于经验法则。10Hz 可能会使许多系统上的默认波特率为 38400。我试过了,没有坏掉。
您只是想确保 gpsd 在提高速度之前没有协商到 9600 波特,以防万一。 gpsctl -s XXXX
(设置 GPS 发送数据包的波特率)为我返回错误。
即使没有-b
gpsd 默认设置中的标志,我的这个新gps 也不会在断电之间保持锁定在更高频率的更新中。我必须重新发出命令。这可能是电池坏了,操作员错误,或者我不明白这个缺陷是一个功能,它不会将 gps 锁定到其他系统无法触及的地方。(一个原因-b
)
这就是你如何改变使用 gpsd 的 gps 的响应,或者我是如何做到的。
但是,在回答您的问题时,要使用 Python通过 gpsd 更改 gps 响应的速率
import subprocess
subprocess.call(['gpsctl', '-c', '0.2']) # Digits are the time in seconds.
试试看。使用gpsctl -c 0.25
返回四分之一秒 gps 读数等。
帮助的是两个 Python gpsd 客户端演示脚本,我刚刚添加了一个 gpsd 设备报告刷新按键,(点击d
刷新并查看新设置中的数字。)
它们适用于Python 2.7-3.5 gpsd python 客户端,当函数在演示脚本中找到主页时,它看起来像这样:
def hertz(hz):
"""Change or enumerate a Faster/Slower gps refresh rate if device is able"""
from subprocess import call
inverse = str(1 / hz)
call((['gpsctl', '-c', inverse]))