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

Полёт по окружности

mission_examples/circle_flight.py

Летит по восьми точкам окружности радиусом 0.7 м на высоте 1 м, публикуя видео.

Дрон набирает высоту 1 м, затем проходит 8 точек окружности с шагом 45°, ожидая прибытия в каждую. Во время полёта кадры камеры публикуются в поток video. При завершении или ошибке выполняется посадка.

Как работает

  1. Создать Pioneer(), Camera(), ImageViewer().
  2. Выполнить arm(), takeoff() и выход на высоту 1 м.
  3. В цикле рассчитывать точку окружности и лететь в неё go_to_local_point.
  4. Пока ждём точку — получать кадр и публиковать в video.
  5. После полного круга выполнить land().
  6. В finally закрыть поток, камеру и соединение.

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

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

ПараметрЗначениеОписание
circle_radius0.7 мРадиус окружности.
circle_points8Число точек на окружности.
z1.0 мВысота полёта.

Запуск

cd mission_examples
python3 circle_flight.py

Результат

  • Полёт по окружности и поток rtsp://10.42.0.1:8889/video/.

Видеопотоки

rtsp://10.42.0.1:8889/video/

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

  • Требуется свободная зона радиусом больше 1 м и устойчивая навигация.

Примечания

  • Использует ImageViewer, поэтому требует драйвер камеры gstreamer.

Требования

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

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

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


circle_radius = 0.7                                   # радиус окружности в метрах
circle_points = 8                                     # количество точек на окружности
circle_angle = 0                                      # стартовый угол на окружности в градусах
z = 1.0                                               # высота полета в метрах


def get_point_on_circle(angle, radius):               # функция расчета координат точки на окружности
    radians = math.radians(angle)                     # переводим угол из градусов в радианы
    x = radius * math.cos(radians)                    # вычисляем координату точки по оси X
    y = radius * math.sin(radians)                    # вычисляем координату точки по оси Y
    return x, y                                       # возвращаем координаты X и Y


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


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


try:                                                  # основной код находится внутри блока try
    time.sleep(3)                                     # ставим паузу на 3 секунды для подключения к квадрокоптеру

    drone.arm()                                       # включаем двигатели
    drone.takeoff()                                   # производим взлет

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

    wait_for_point()                                      # ждем, пока дрон поднимется на заданную высоту

    while circle_angle < 360:                             # выполняем полет, пока не пройдем полный круг
        frame = camera.get_cv_frame(timeout=1.0)          # получаем один кадр с камеры
                                                          # timeout=1.0 - время ожидания кадра в секундах

        if frame is not None:                             # проверяем, что кадр успешно получен
            video_drone.imshow("video", frame, fps=30)    # запускаем трансляцию видео
                                                          # video - название трансляции
                                                          # frame - изображение с камеры
                                                          # fps=30 - количество кадров в секунду

        x, y = get_point_on_circle(circle_angle, circle_radius) # рассчитываем следующую точку окружности

        drone.go_to_local_point(x=x, y=y, z=z, yaw=0, time=3)   # летим в рассчитанную точку окружности
        wait_for_point()                                        # ждем, пока дрон долетит до точки

        circle_angle += 360 / circle_points             # увеличиваем угол для перехода к следующей точке

    drone.land()                                        # производим посадку после завершения полетного задания

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

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

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