FuncAnimation не отвечает, когда после динамической отправки данных на график для перемещения точки рассеяния

Итак, я использую FuncAnimation из matplotlib, поэтому динамически рисую некоторые данные по мере их поступления из последовательного порта (в моем проекте это класс транспортного средства из 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 — это просто точка разброса, транспортное средство — это класс транспортного средства, содержащий данные, которые динамически обновляются, а поток MissionStart — это просто поток для изменения класса транспортного средства с течением времени.

Так же хочу отметить, что фига в интерактивном режиме включена, и ограничения по осям выставлены хорошо (видел, что при динамическом изменении данных, но без масштабирования осей могут быть проблемы) также, пробуя разные комбинации plt .draw() и plt.plot(block = False) приводят меня к тому, что я вообще не рисую или просто вижу пустой график.

Поскольку я понятия не имею, что вызывает это, я добавлю к этому тэг dronekit и треды, чтобы узнать, есть ли у кого-нибудь идеи!


person Marc Vila    schedule 22.04.2020    source источник


Ответы (1)


Я рассмотрел потоки с помощью matplotlib и похоже, что потоки с этой указанной библиотекой не самые лучшие, поскольку они не являются потокобезопасными, лучше всего посмотреть на многопроцессорность с помощью python или подойти к проблеме по-другому. Дополнительную информацию можно найти в этом сообщении.

person Marc Vila    schedule 24.04.2020