🎯 Полётные миссии mission_with_frames.py

Миссия по точкам с видеопотоком

mission_examples/mission_with_frames.py

Облетает квадрат по четырём точкам, публикуя видео с камеры в поток pioneer_camera.

Дрон взлетает, выходит в начальную точку и проходит 4 точки маршрута, описанные списком waypoints. Во время ожидания прибытия кадры камеры публикуются в поток pioneer_camera.

Как работает

  1. Создать Pioneer(), Camera(), ImageViewer().
  2. Взлететь и выйти в начальную точку (0,0,1).
  3. Для каждой точки из waypoints вызвать go_to_local_point.
  4. Во время ожидания публиковать кадры через imshow("pioneer_camera", frame).
  5. После маршрута выполнить land().
  6. В finally закрыть ресурсы.

Используемые методы SDK

Ключевые параметры

ПараметрЗначениеОписание
waypoints4 точкиМаршрут: (1,0), (1,1), (0,1), (0,0) на высоте 0.7 м.
time3 сВремя достижения точки.

Запуск

cd mission_examples
python3 mission_with_frames.py

Результат

  • Квадратный маршрут и поток rtsp://10.42.0.1:8889/pioneer_camera/.

Видеопотоки

rtsp://10.42.0.1:8889/pioneer_camera/

Безопасность

  • Свободная зона не менее 1×1 м, устойчивая навигация.

Примечания

  • Кадры публикуются только во время ожидания прибытия в точку.

Требования

  • Локальная навигация.
  • Драйвер камеры gstreamer.

Полный исходный код

Показать mission_with_frames.py
from pioneer_sdk2 import Pioneer, Camera, ImageViewer # импортируем классы из библиотеки pioneer_sdk2
import time                                    # библиотека time содержит функции для работы со временем

drone = Pioneer()                              # создаем экземпляр класса Pioneer, устанавливаем соединение
camera = Camera()                              # создаем экземпляр класса Camera для получения кадров с камеры
viewer = ImageViewer()                         # создаем экземпляр класса ImageViewer для трансляции видео

def show_camera():                             # функция вывода видео с камеры дрона
    frame = camera.get_cv_frame(timeout=1.0)   # получаем один кадр с камеры
                                               # timeout=1.0 - время ожидания кадра в секундах

    if frame is not None:                      # проверяем, что изображение получено
        viewer.imshow("pioneer_camera", frame) # отправляем изображение в RTSP-трансляцию


def wait_for_point():                          # функция ожидания прилета дрона в точку
    while not drone.point_reached():           # ждем, пока дрон не достигнет заданной точки
        show_camera()                          # показываем видео с камеры во время полета
        time.sleep(0.1)                        # ставим небольшую паузу, чтобы не нагружать программу


def go_to_start_point():                       # функция взлета и выхода в начальную точку
    drone.arm()                                # включаем двигатели
    drone.takeoff()                            # производим взлет

    drone.go_to_local_point(x=0, y=0, z=1, yaw=0, time=3) # летим в начальную точку
                                                          # x, y, z - координаты точки в метрах
                                                          # yaw - поворот по курсу в градусах
                                                          # time - время, за которое нужно достигнуть точку

    wait_for_point()                           # ждем, пока дрон долетит до начальной точки


def fly_through_points(points):                # функция полета по заданным точкам
    for point in points:                       # перебираем все точки из списка
        drone.go_to_local_point(               # отправляем дрон в текущую точку
            x=point["x"],                      # координата точки по оси X
            y=point["y"],                      # координата точки по оси Y
            z=point["z"],                      # координата точки по оси Z
            yaw=point["yaw"],                  # поворот по курсу в градусах
            time=3                             # время, за которое нужно достигнуть точку
        )

        wait_for_point()                       # ждем, пока дрон долетит до текущей точки


waypoints = [                                  # список точек для полетного задания
    {"x": 1, "y": 0, "z": 0.7, "yaw": 0},      # точка 1
    {"x": 1, "y": 1, "z": 0.7, "yaw": 0},      # точка 2
    {"x": 0, "y": 1, "z": 0.7, "yaw": 0},      # точка 3
    {"x": 0, "y": 0, "z": 0.7, "yaw": 0},      # возврат к начальной точке
]


try:                                           # основной код находится внутри блока try
    go_to_start_point()                        # выполняем взлет и выход в начальную точку
    fly_through_points(waypoints)              # выполняем полет по заданным точкам
    drone.land()                               # производим посадку после завершения полета

except KeyboardInterrupt:                      # если пользователь остановил программу сочетанием Ctrl+C
    print("Остановка программы, производится посадка") # выводим сообщение об остановке программы
    drone.land()                                       # сажаем дрон

except Exception as error:                     # если произошла другая ошибка
    print("Ошибка:", error)                    # выводим текст ошибки
    drone.land()                               # сажаем дрон при ошибке

finally:                                       # блок finally выполнится в любом случае
    viewer.close()                             # останавливаем RTSP-трансляцию
    camera.stop()                              # останавливаем получение кадров с камеры
    drone.close_connection()                   # закрываем соединение с квадрокоптером