使用gpsd和python更改更新率

时间:2016-05-20 19:30:14

标签: python python-3.x gps raspberry-pi2 gpsd

我使用我的Raspberry Pi 2使用python2.7.9,GPSD和python-gps包使用adafruit终极GPS突破。我通过串口成功获得了1Hz的gps更新。

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

enter image description here

我的问题是我无法找到足够的python-gps模块或GPSD文档,它会告诉我我应该如何使用python脚本通过串口向GPS发送命令。有人能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:5)

我刚从同一个家庭拿起一个gps。 (MTK)他们使用$PMTK控制字符串。对PMTK protocol的任何搜索都会提供无穷无尽的资源。限制是gps本身。

对于一次性转换,标准方法来自根终端执行echo -e "\$PMTK220,200*2C\r\n" > /dev/ttyAMA0,或者设备连接的任何地方,用于5Hz响应。

  • -e标志允许解析反斜杠
  • $ NMEA句子的开头
  • P专有信息
  • MTK NMEA数据类型
  • 220数据包类型
  • 200分组数据
  • *数据结尾
  • 2C Checksum
  • \r\n NMEA句子的结尾

还有scriptsother projects可用,但都需要gpsd无法控制gps。 gpsd将阻止向gps发送控制字符串。

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

您可以在后面滑入,并使用来自shell的控制字符串来操纵速率。 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发出数据包的波特率)为我返回错误。

即使没有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返回四分之一秒gps读数等。

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

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

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