使用 gpsd 和 python 更改更新率

changing update rate with gpsd and python

我在 Raspberry Pi 2 中使用 adafruit ultimate GPS breakout,使用 python2.7.9、GPSD 和 python-gps 包。我成功地通过串行端口以 1Hz 的频率获取 gps 更新。

该设备应该能够进行 10Hz 更新,我想启用它。根据数据表(见下面的片段),这可以通过串行命令设置。

我的问题是我找不到关于 python-gps 模块或 GPSD 的足够文档来告诉我应该如何使用我的 [=22] 通过串口向 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语句结束

也有 scripts and other projects 可用,但都要求 gpsd 不受 gps 的控制。 gpsd 将阻止向 gps 发送控制字符串。

此外,如果您在 /etc/default/gpsd 中有 -b 标志,则 gpsd 在连接时不会写入设备。它会选择一个 generic NMEA 驱动程序,并且不会向 gps 写入任何控制字符串。

您可以从后面偷偷摸摸,并使用 shell 中的控制字符串来操纵速率。 gps 会发送数据,但 gpsd 不会确认速率。

看来,gpsd 更喜欢 1秒计时。即使 gps 能够更快的周期,即使您已经使用其他方法 re/set 速率,并且这样做,也需要告知 gpsd 速率已经改变。

这就是 gpsctl -c 0.2(无 sudo)发挥作用的地方。它捆绑在 gpsd 包中。

如果只有一个设备连接到 gpsd,在示例中,gpsctl 会将那个设备更改为 0.2 秒计时周期并将其传送到 gpsd。时间以秒为单位。是的,它可以设置漂亮slow/fast,但没有伪装能力。做不到它就不做,也不告诉你它没有做't/can,除非出现致命错误

端口速度不是问题,只要有容量。有人曾经统计过,4800 波特足以在发送数据所需的一秒内读取一次数据。这取决于有效载荷,但它适用于经验法则。 10Hz 可能会使许多系统默认使用 38400 波特。我试过了,没有坏。

您只是想确保 gpsd 在提高速度之前没有协商到 9600 波特,以防万一。 gpsctl -s XXXX(设置 GPS 发送数据包的波特率)returns 对我来说是个错误。

即使 gpsd 默认设置中没有 -b 标志,我的这个 new gps 也不会保持锁定在断电之间的更高频率更新中。我必须重新发出命令。可能是电池坏了,操作员失误了,或者我不明白这个缺陷是一个功能,不会将 gps 锁在其他系统无法触及的地方。 (-b的一个原因)

这就是您如何更改使用 gpsd 的 gps 的响应,或者我是如何更改的。

然而,在回答您的问题时,要通过 gpsd 和 Python

更改 gps 响应的速率
import subprocess
subprocess.call(['gpsctl', '-c', '0.2'])  # Digits are the time in seconds.

试试看。使用 gpsctl -c 0.25 returns 四分之一秒 gps 读数等..

帮助 two Python gpsd client demonstration scripts 我刚刚添加了 gpsd 设备报告刷新按键,(点击 d 刷新并查看新设置中的数字。)

它们用于 Python 2.7-3.5 gpsd python client,当函数在演示脚本中找到一个位置时,它将看起来像这样:

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]))