🎯 Полётные миссии
circle_flight.py
Полёт по окружности
mission_examples/circle_flight.pyЛетит по восьми точкам окружности радиусом 0.7 м на высоте 1 м, публикуя видео.
Дрон набирает высоту 1 м, затем проходит 8 точек окружности с шагом 45°, ожидая прибытия в каждую. Во время полёта кадры камеры публикуются в поток video. При завершении или ошибке выполняется посадка.
Как работает
- Создать
Pioneer(),Camera(),ImageViewer(). - Выполнить
arm(),takeoff()и выход на высоту 1 м. - В цикле рассчитывать точку окружности и лететь в неё
go_to_local_point. - Пока ждём точку — получать кадр и публиковать в
video. - После полного круга выполнить
land(). - В
finallyзакрыть поток, камеру и соединение.
Используемые методы SDK
Pioneer()arm()takeoff()go_to_local_point()point_reached()land()Camera()get_cv_frame()ImageViewer()imshow()ImageViewer.close()Camera.stop()close_connection()
Ключевые параметры
| Параметр | Значение | Описание |
|---|---|---|
circle_radius | 0.7 м | Радиус окружности. |
circle_points | 8 | Число точек на окружности. |
z | 1.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() # закрываем соединение с квадрокоптером