【发布时间】:2020-12-21 07:53:16
【问题描述】:
我正在使用 RTK GPS 导航构建由 Raspberry Pi 控制的自动漫游车。我在流动站上使用两个独立的 U-Blox RTK GPS 模块以 4Hz 运行,以获得非常准确的位置和航向计算,它们都通过 USB 端口连接到 Pi。我正在使用 pyserial 库来读取通过 USB 输出的 NMAE 语句。我遇到的问题是每个模块发送的串口数据是精确同步的,所以在一个端口调用 Serial.readline() 时,发送到另一个端口的数据丢失了。
代码的基础目前看起来像这样:
`class GPS():
def __init__(self,port,baud):
self.gpsSerial = serial.Serial(port,baud)
# init some variables
return
def read(self):
NMEASentance = str(self.gpsSerial.readline())
if NMEASentance not what_i_wanted_or_blank:
return 0
# do some processing, update vars
return 1
frontGps = GPS(port1,baud)
rearGps = GPS(port2,baud)
while True:
if frontGps.read():
# grab the new data
if rearGps.read():
# grab the new data
最终发生的情况是,当一个串行端口正在被读取并处理数据时,另一个正在同时传输并且丢失了。我试过一个接一个地进行两次读取,然后将处理留待以后处理,但问题仍然存在。 如何同时读取两个端口?将每个串行读取工作线程化(它们仍将在同一进程中运行,因此不会同时执行,对吗?) 如果解决方案是多处理,那么有人可以发布一些框架代码供我遵循,因为这个问题真的让我很头疼。 感谢您的帮助!
【问题讨论】:
-
请问您为什么有 2 个 GPS?您是否考虑过使用单独的进程来馈送
gpsd? linux-magazine.com/Issues/2018/210/Tutorial-gpsd -
我使用了两个,以便始终知道流动站的精确方向。借助基站,它可以提供流动站上两个固定点的 GPS 位置,精度为厘米,从而提供方向(甚至俯仰)。我使用 GPS 和指南针为之前的迭代编写的 Python 代码运行良好,但使用指南针会带来一些问题,例如对电机产生的磁场敏感并且必须定期校准。我玩过 gpsd,但没有花时间尝试集成它。我希望快速修复 python 代码
-
我不确定是什么导致了问题,所以不要浪费太多时间遵循我的(猜测的)建议,但如果没有其他人回答并且你有时间......你可能会考虑从您当前的主进程中启动 2 个新的、独立的 Python 进程。首先创建两个多处理队列,并为每个新的 Python 进程传递一个队列,让每个新进程在循环中简单地重复读取 GPS,并将它们进入的任何内容写入队列以供主进程获取。只是让 2 个 GPS 单元非常独立的想法。
-
@MarkSetchell 谢谢,明天早上我会试一试。这听起来像是一个很有前途的解决方案!
-
@MarkSetchell 宾果游戏!设置两个进程以从串行端口读取并将它们添加到共享队列。按预期工作,谢谢!
标签: python raspberry-pi python-multiprocessing python-multithreading pyserial