Полет¶
Инициализация¶
Чтобы управлять квадрокоптером, создайте объект 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 для координаты, которую не нужно изменять.
Четыре пары координат задают последовательные перемещения:
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. Если указанной системы нет или между системами координат невозможно определить преобразование, получить положение не удастся.