Полет¶
Инициализация¶
Чтобы управлять квадрокоптером, создайте объект 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(), но не ожидает завершения полета до указанной точки. После отправки команды программа продолжает выполнение сразу. Функция возвращает объект задачи. Через него можно дождаться окончания полёта или досрочно отменить текущую цель.
from clover2.clients import NavigationCanceledError
task = drone.navigate(
frame_id="map", x=1.0, y=2.0, z=1.5, yaw=0.0, speed=0.5
)
# ждать не более 10 секунд
# если timeout сработает, полёт не отменяется автоматически
task.wait(timeout=10.0)
# запросить штатную отмену action
task.cancel()
try:
# ждать окончания
task.wait()
except NavigationCanceledError:
print("Полёт отменён")
Если wait(timeout=...) завершился по timeout, полёт не отменяется автоматически. Для остановки нужно явно вызвать task.cancel().
Используйте 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 для координаты, которую не нужно изменять.
Четыре пары координат задают последовательные перемещения:
xне изменяется,yувеличивается на 2 м;xувеличивается на 2 м,yне изменяется;xне изменяется,yуменьшается на 2 м;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. Если указанной системы нет или между системами координат невозможно определить преобразование, получить положение не удастся.