0

所以我使用来自 matplotlib 的 FuncAnimation 来动态绘制从串行端口到达的一些数据(在我的项目中是来自dronekit 的车辆类,它用绿点显示),我所拥有的基本上是每个调用的动画循环正在接收一个新的车辆类别,其数据已更改,因此可以绘制它,但由于某种原因,它绘制但在任务线程之后几秒钟后(它允许“刷新”它弹出的车辆数据和杀死蟒蛇(死亡之轮),这就是我得到的:

在此处输入图像描述

我在 FuncAnimation 开始运行时调用的函数中放置了一些跟踪打印,如下所示:

def droneAnimation(i, vehicle, droneScatter):
     time.sleep(1)
     lat = [vehicle.location.global_relative_frame.lat]
     lon = [vehicle.location.global_relative_frame.lon]
     alt = [vehicle.location.global_relative_frame.alt]
     print("Alt received: " + str(alt))
     droneScatter._offsets3d = (lat,lon,alt)
     print("Changed pos")

如您所见,这些打印在最初的几秒钟内被触发,但在几次迭代后仍然崩溃。FuncAnimation 是这样调用的:

        fig,droneScatter = plotLiveSimpleFacade(vehicle,w,2)
        ani = FuncAnimation(fig,droneAnimation, fargs = (vehicle,droneScatter))
        plt.draw()
        plt.pause(0.1)
        m = threading.Thread(target=MissionStart(vehicle,hmax) , name = "MISSION")
        m.start()

供参考:fig 是一个 plt.figure(),droneScatter 只是一个散点,vehicle 是包含动态更新数据的载具类,MissionStart 线程只是一个使载具类超时变化的线程。

我还想提一下,无花果处于交互模式,并且轴限制设置得很好(我看到当您动态更改数据但不缩放轴时可能有问题),尝试不同的 plt 组合.draw() 和 plt.plot(block = False) 导致我根本不绘制或只是一个空白图。

因为我不知道是什么原因造成的,所以我会在这个和线程上贴上dronekit标签,看看是否有人知道!

4

1 回答 1

0

我已经研究过使用 matplotlib 进行线程化,并且看起来像使用这个所说的库进行线程化并不是最好的,因为它不是线程安全的,最好的办法是使用 python 查看多处理或以不同的方式解决问题。您可以在这篇文章中找到更多信息

于 2020-04-24T15:31:09.997 回答