我有一个机器人项目,基本上是一个路径跟踪问题。 在PC中,参考生成算法在Python3.65中实现。该算法将获取室内GPS数据,并使用这些不断更新的数据来计算机器人汽车的参考路径。当然,该算法在 为True时: .... 框架。 仅当采样频率很高(例如0.001s)时,该算法才能很好地工作。 但是,问题在于,在计算参考路径之后,需要通过Serial.write()将路径信息逐字节写入PC的串行端口。 此serial.write()函数仍然是for循环。而且此写入过程非常慢(16个字节超过0.02s)。如果for循环包含在while True:框架中,则类似于:
while True:
Data = Ref_generation()
Bytes_Full = Float_2_Bytes_List(Data)
for ele in Bytes_Full:
Serial.write(ele) # VERY SLOW!!!
sleep(0.001)
然后,由于周期远大于0.001s,因此无法正确计算数据。
简而言之,如何将快速计算算法与慢速serial.wtite()分开?我尝试了多线程,但没有用。
任何帮助将不胜感激,非常感谢!
答案 0 :(得分:1)
您不需要利用多个cpu内核,只需要等待作为串行端口...您的CPU将处于空闲状态,等待。 。产生新的线程/进程只是等待是浪费...
这就是为什么您应该尝试使用一些异步IO解决方案的原因。
例如,使用https://github.com/pyserial/pyserial-asyncio或https://twistedmatrix.com/documents/16.1.0/api/twisted.internet.serialport.SerialPort.html
这些异步框架允许您注册事件并在事件完成时自动调用函数,全部在单个线程/进程中。
它们还允许您在所需的时间安排事件。
答案 1 :(得分:1)
我有一个类似的问题,我使用 daemon线程来运行串行通信部分。因此,请尝试在守护进程线程上运行串行通信,该线程将在主机进程的后台运行。这将使您的程序能够同时运行任务,而与串行通信所需的等待时间无关。这样,您可以将快速计算算法与慢速serial.wtite()分开。
您可以找到有关守护程序线程here的更多信息。为了避免缓冲区滞后,您可以使用pySerial中的reset_output_buffer()
。