FuncAnimation не отвечает, когда после динамической отправки данных на график для перемещения точки разброса - PullRequest
0 голосов
/ 22 апреля 2020

Так что я использую FuncAnimation из matplotlib, чтобы динамически отображать некоторые данные, когда они поступают из последовательного порта (в моем проекте это класс транспортных средств от dronekit, который отображается с зеленой точкой), то, что я имею в основном, это анимация называется, что каждый l oop получает новый класс транспортных средств с измененными данными, чтобы их можно было построить, но по какой-то причине он строит графики, но спустя пару секунд после потока миссии (что позволяет «refre sh» "данных об автомобиле, которые он выскакивает и убивает python (Колесо смерти), вот что я получаю:

enter image description here

Я положил некоторые отслеживание отпечатков внутри функции, которая вызывается при запуске 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")

Как вы можете видеть, эти отпечатки срабатывают в первые несколько секунд, но все же вылетает после нескольких итераций. называется так:

        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 и поток, чтобы узнать, есть ли у кого-нибудь идея!

1 Ответ

0 голосов
/ 24 апреля 2020

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

...