使用 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]))
我在 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]))