使用gpsd和python更改更新速率

kjg*_*ory 7 python gps gpsd python-3.x raspberry-pi2

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

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

在此输入图像描述

我的问题是我找不到足够的python-gps模块或GPSD文档,它会告诉我如何用python脚本连续向GPS发送命令.有人能指出我正确的方向吗?

Nod*_*dak 5

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

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

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

还有脚本其他项目可用,但都需要gpsd不能控制gps.gpsd将阻止向gps发送控制字符串.

此外,如果gpsd中有-b标志,/etc/default/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发出数据包的波特率)为我返回错误.

即使没有-bgpsd默认设置中的标志,我的这个 gps也不会保持锁定在掉电之间的更高频率更新.我必须重新发出命令.这可能是一个糟糕的电池,操作员错误,或者我不明白这个缺陷是一个不能阻止gps到达其他系统的功能.(原因-b)

这是你如何改变使用gpsd的gps的响应,或者我是怎么做的.

但是,在回答您的问题时,要通过Python使用gpsd更改gps响应的速率

import subprocess
subprocess.call(['gpsctl', '-c', '0.2'])  # Digits are the time in seconds.
Run Code Online (Sandbox Code Playgroud)

试试看吧.使用gpsctl -c 0.25返回季度秒gps读数等.

为了提供两个Python gpsd 客户端演示脚本,我刚刚添加了一个gpsd设备报告刷新按键,(点击d刷新并查看新设置中的数字.)

它们用于Python 2.7-3.5 gpsd python客户端,当函数在演示脚本中找到一个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]))
Run Code Online (Sandbox Code Playgroud)