我使用我的Raspberry Pi 2使用python2.7.9,GPSD和python-gps包使用adafruit终极GPS突破。我通过串口成功获得了1Hz的gps更新。
据称这个设备能够进行10Hz更新,我想启用它。根据数据表(参见下面的代码段),可以通过串行命令设置。
我的问题是我无法找到足够的python-gps模块或GPSD文档,它会告诉我我应该如何使用python脚本通过串口向GPS发送命令。有人能指出我正确的方向吗?
答案 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句子的结尾还有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
标志,我的 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]))