だから私は matplotlib から FuncAnimation を使用しているので、シリアルポートから到着したデータを動的にプロットします (私のプロジェクトでは、緑の点で表示される Dronekit の vehicle クラスです)。ループは、プロットできるようにデータが変更された新しい車両クラスを受信していますが、何らかの理由でプロットされますが、ミッションのスレッドの数秒後に (これにより、車両データの「更新」が可能になり、ポップアップし、 Python(Wheel of Death)を殺します。ここに私が得るものがあります:
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 スレッドは、時間の経過とともに車両クラスを変更する単なるスレッドです。
fig が対話モードでオンになっており、軸の制限が適切に設定されていることにも言及したいと思います (データを動的に変更しても、軸をスケーリングしないと問題が発生する可能性があることがわかりました) また、plt のさまざまな組み合わせを試してください。 .draw() と plt.plot(block = False) を使用すると、まったくプロットしないか、空白のプロットになります。
何が原因なのかわからないので、これに Dronekit タグを付けて、スレッドに何か考えがあるかどうかを確認します!