0

だから私は 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 タグを付けて、スレッドに何か考えがあるかどうかを確認します!

4

1 に答える 1