Полет

Инициализация

Чтобы управлять квадрокоптером, создайте объект Clover2.

from clover2 import Clover2

drone = Clover2()
# или с именем ноды:
drone = Clover2("my_drone")

Clover2 — обертка над узлом ROS 2. При создании объекта запускается нода и фоновый поток для работы ROS 2.

Полезные команды

Используйте следующие команды для управления квадрокоптером:

drone.arm()          # запуск электродвигателей
drone.disarm()       # остановка электродвигателей
drone.land()         # посадка

drone.is_armed()     # проверка состояния электродвигателей: True/False
drone.flight_mode()  # получение текущего режима полета PX4

Полет по точкам

Чтобы отправить квадрокоптер в заданную точку, используйте функцию navigate_wait(). Укажите систему координат в параметре frame_id. Координаты точки задайте параметрами x, y и z. Скорость полета задайте параметром speed.

В следующем примере квадрокоптер летит со скоростью 0,5 м/с. Функция navigate_wait() ожидает завершения полета до указанной точки. После этого программа продолжает выполнение.

drone.navigate_wait(frame_id="map", x=1.0, y=2.0, z=1.5, speed=0.5, yaw=0.0)

В этом примере координаты заданы относительно системы координат карты frame_id="map". Чтобы изменить высоту относительно текущего положения, используйте систему координат base_link.

В следующем примере квадрокоптер поднимется на 0,5 м относительно текущего положения.

drone.navigate_wait(frame_id="base_link", z=0.5, speed=0.5)

Используйте navigate_wait(), когда следующую команду нужно выполнить после достижения точки.

Полет без ожидания

Функция navigate() работает так же, как navigate_wait(), но не ожидает завершения полета до указанной точки. После отправки команды программа продолжает выполнение сразу.

drone.navigate(frame_id="map", x=1.0, y=2.0, z=1.5, yaw=0.0, speed=0.5)

Используйте navigate(), когда программа должна продолжить работу сразу после отправки команды.

Пример: полет по квадрату

В этом примере квадрокоптер поднимается на высоту 1 м и последовательно перемещается по четырем точкам, образующим квадрат.

import time
from clover2 import Clover2

drone = Clover2()

NAN = float("nan")
square_points = [(NAN, 2), (2, NAN), (NAN, -2), (-2, NAN)]

time.sleep(1)
drone.navigate_wait("base_link", z=1, speed=1.0)

for x, y in square_points:
    time.sleep(1)
    drone.navigate_wait("base_link", x=x, y=y, speed=0.8)

time.sleep(5.0)
drone.land()

float("nan") создает специальное значение NaN для координаты, которую не нужно изменять. Четыре пары координат задают последовательные перемещения:

  1. x не изменяется, y увеличивается на 2 м;

  2. x увеличивается на 2 м, y не изменяется;

  3. x не изменяется, y уменьшается на 2 м;

  4. x уменьшается на 2 м, y не изменяется.

Так квадрокоптер выполняет перемещение по четырем сторонам квадрата.

После выполнения всех команд программа ожидает 5 секунд и запускает посадку с помощью функции land().

Получение текущих координат

Чтобы получить текущие координаты квадрокоптера относительно системы координат карты, используйте функцию get_position().

print(drone.get_position())

Функция возвращает координаты и ориентацию квадрокоптера:

DronePosition(x=-0.2, y=-0.05, z=1.0, roll=0.0, pitch=0.0, yaw=-0.4)

Получение координат относительно другой системы

Вы можете получить координаты квадрокоптера относительно другой системы координат. Например, чтобы получить координаты относительно маркера map_aruco_1, укажите его имя:

print(drone.get_position("map_aruco_1"))

Результат:

DronePosition(x=-1.0, y=-0.2, z=1.0, roll=0.0, pitch=0.0, yaw=1.17)

Имя системы координат должно существовать в системе TF. Если указанной системы нет или между системами координат невозможно определить преобразование, получить положение не удастся.