我正在使用python2.7.9,GPSD和python-gps软件包在Raspberry Pi 2中使用adafruit最终GPS突破。我已成功通过串行端口以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句子也有scripts和other 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
标志,我的新gps也不会在断电之间停留在更高频率的更新中。我必须重新发出命令。可能是电池电量不足,运算符(operator)失误,或者我不知道此缺陷是无法将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读数等。我刚刚在其中添加了gpsd设备报告刷新按键的two Python gpsd client demonstration scripts可以为您提供帮助,(单击
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]))
关于python - 使用gpsd和python更改更新率,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37354512/