Квадрокоптер ArDrone 2.0
Parrot AR.Drone – это радиоуправляемый квадрокоптер, то есть вертолет с четырьмя несущими винтами, размещенных на выносных диагональных балках. Сам AR.Drone работает под управлением операционной системы Linux, а в качестве пульта ДУ к квадрокоптеру может выступать практически любой сенсорный смартфон и планшет на Android или iOS. Дистанция устойчивого управления по Wi-Fi – от 25 до 100 метров и зависит от помещения и погодных условий, если полеты происходят на улице.
Из-за низкой стоимости, большого количества качественных сенсоров, а так же благодаря открытому API, AR.Drone стал популярной платформой для научных экспериментов и образовательных целей. Он применяется в работах по автоматическому управлению, обучению AI, автономному видеонаблюдению, взаимодействию человек-машина, и т.д.
У меня возникло желание организовать голосовое управление AR.Drone из ROS, чтобы в перспективе он работал в паре с роботом Turtlebot.
Драйвер квадрокоптера ArDrone 2.0 для ROS
Ardrone_autonomy является ROS драйвером для квадрокоптера Parrot ArDrone. Поддерживает квадрокоптеры ArDrone 1.0 и ArDrone 2.0. Этот пакет является ответвлением пакета ArDrone Brown. Пакет позволяет получать сообщения с датчиков ArDrone, получать изображения с камер, управлять движением квадрокоптера и свечением светодиодов.
Установка пакета ArDrone autonomy. Сначала клонируем код в директорию пакетов (ROS_PACKAGE_PATH — у меня ros_pkgs)
$ cd ~/ros_pkgs $ git clone https://github.com/AutonomyLab/ardrone_autonomy.git $ rosstack profile && rospack profile $ roscd ardrone_autonomy
Далее — компиляция ArDrone SDK 2.0. Запускаем скрипт build_sdk.sh
$ ./build_sdk
Если компиляция прошла успешно — проверяем содержимое каталога lib
$ ls ./lib
Должно быть так:
libavcodec.a libavformat.a libpc_ardrone_notool.a libvlib.a libavdevice.a libavutil.a libsdk.a libavfilter.a libpc_ardrone.a libswscale.a
И сборка пакета
rosmake ardrone_autonomy
Для запуска драйвера
rosrun ardrone_autonomy ardrone_driver
Cписок тем для публикации данных драйвера ardrone_autonomy
/ardrone/bottom/camera_info /ardrone/bottom/image_raw /ardrone/bottom/image_raw/compressed /ardrone/bottom/image_raw/compressed/parameter_descriptions /ardrone/bottom/image_raw/compressed/parameter_updates /ardrone/bottom/image_raw/theora /ardrone/bottom/image_raw/theora/parameter_descriptions /ardrone/bottom/image_raw/theora/parameter_updates /ardrone/camera_info /ardrone/front/camera_info /ardrone/front/image_raw /ardrone/front/image_raw/compressed /ardrone/front/image_raw/compressed/parameter_descriptions /ardrone/front/image_raw/compressed/parameter_updates /ardrone/front/image_raw/theora /ardrone/front/image_raw/theora/parameter_descriptions /ardrone/front/image_raw/theora/parameter_updates /ardrone/image_raw /ardrone/image_raw/compressed /ardrone/image_raw/compressed/parameter_descriptions /ardrone/image_raw/compressed/parameter_updates /ardrone/image_raw/theora /ardrone/image_raw/theora/parameter_descriptions /ardrone/image_raw/theora/parameter_updates /ardrone/imu /ardrone/land /ardrone/mag /ardrone/navdata /ardrone/reset /ardrone/takeoff /cmd_vel /tf
Список сервисов драйвера ardrone_autonomy
/ardrone/bottom/image_raw/compressed/set_parameters /ardrone/bottom/image_raw/theora/set_parameters /ardrone/bottom/set_camera_info /ardrone/flattrim /ardrone/front/image_raw/compressed/set_parameters /ardrone/front/image_raw/theora/set_parameters /ardrone/front/set_camera_info /ardrone/image_raw/compressed/set_parameters /ardrone/image_raw/theora/set_parameters /ardrone/imu_recalib /ardrone/setcamchannel /ardrone/setflightanimation /ardrone/setledanimation /ardrone/togglecam /ardrone_driver/get_loggers /ardrone_driver/set_logger_level
Информацию, полученную от квадрокоптера, драйвер публикует в тему ardrone/navdata. Тип сообщения ardrone_autonomy::Navdata
Предоставляется следующая информация
header: ROS message header
batteryPercent: оставшегося заряда батареи дрона (%)
state: статус ArDropne
0: не определен 1: Inited 2: на земле 3,7: в полете 4: Hovering 5: Test (?) 6: не включен 8: Landing 9: Looping (?)
rotx: левый / правый наклон в градусах (поворот вокруг оси X)
roty: Вперед / назад, наклон в градусах (поворот вокруг оси Y)
rotz: Ориентация в градусах (поворот вокруг оси Z)
magX, magY, magZ: магнитометра (только AR-Drone 2,0 )
pressure: давление воспринимается барометр дрона (только AR-Drone 2,0 )
temp : температура воспринимается датчиком дрона
wind_speed: Расчетная скорость ветра (только AR-Drone 2,0 )
wind_angle: Расчетный угол ветра (только AR-Drone 2,0 )
wind_comp_angle: Предполагаемый угол компенсации ветра (только AR-Drone 2,0 )
altd: Расчетная высота (мм)
vx, vy, vz: Линейная скорость (мм / с)
ax, ay, az: линейное ускорение (G)
tm: Timestamp из данных, возвращаемых Drone
В экспериментальную тему Base публикуются сообщения типа sensor_msg/Imu, выдающие показания линейного ускорения, угловой скорости и ориентации устройчтва по осям x, y, z.
Камеры
Оба AR-Drone 1,0 и 2,0 оснащен двумя камерами. Одна фронтальная камера направлена вперед и одна вертикальную камеру вниз. Драйвер ardrone_driver создает три темы ardrone/image_raw, ardrone/front/image_raw and ardrone/bottom/image_raw. В каждую из этих тем публикуются сообщения типа image_transport
Для вывода на камеру (текущую)
rosrun image_view image_view image:=/ardrone/image_raw
или на конкретную (допустим front)
rosrun image_view image_view image:=/ardrone/front/image_raw
Отправка команд для AR-Drone
Взлет — отправка пустого сообщения в тему ardrone/takeoff
Посадка — отправка пустого сообщения в тему ardrone/land
Сброс параметров(аварийная остановка) — отправка пустого сообщения в тему ardrone/reset
rostopic pub /ardrone/land std_msgs/Empty
После взлета для управления движением ArDrone необходимо посылать сообщения типа geometry_msgs::Twist в тему cmd_vel
-Linear.x: двигаться назад
+ Linear.x: двигаться вперед
-Linear.y: переместить вправо
+ Linear.y: движение влево
-Linear.z: двигаться вниз
+ Linear.z: двигаться вверх
-Angular.z: повернуть налево
+ Angular.z: повернуть направо
Диапазон для каждого компонента должно быть от -1,0 до 1,0. Максимальный диапазон может быть настроен с помощью ROS параметры обсуждаются далее в этом документе. Публикация «0» значение для всех компонентов сделает команду держать зависания.
rostopic pub -r 10 /cmd_vel geometry_msgs/Twist '{linear: {x: 0.1, y: 0.0, z: 0.0}, angular: {x: 0.0,y: 0.0,z: 0.0}}'
Светодиодные анимации
Вызов службы ardrone/setledanimation будет вызывать выполнение одной из 14 предопределенных светодиодной анимаций для ArDrone.
Параметры
uint8 типов : тип анимации, который является число в диапазоне [0 .. 13];
float32 частоты : частота анимации в Гц;
uint8 продолжительность : продолжительность анимации в секундах.
Тип параметра анимации:
BLINK_GREEN_RED;
BLINK_GREEN;
BLINK_RED;
BLINK_ORANGE;
SNAKE_GREEN_RED;
FIRE;
STANDARD;
RED;
GREEN;
RED_SNAKE;
BLANK;
LEFT_GREEN_RIGHT_RED;
LEFT_RED_RIGHT_GREEN;
BLINK_STANDARD.
Эти анимации можно протестировать в командной строке, например
rosservice call /ardrone/setledanimation 1 4 5
Полетные анимации
Вызов службы ardrone/setflightanimation будет выполнять одну из 20 предопределенных полетных анимаций (полетных фигур) для ArDrone. Параметры:
uint8 типов : тип полета анимация, число в диапазоне [0 .. 19]
uint16 продолжительность : продолжительность анимации. Используйте 0 для длительности по умолчанию (рекомендуется)
ARDRONE_ANIM_PHI_M30_DEG;
ARDRONE_ANIM_PHI_30_DEG;
ARDRONE_ANIM_THETA_M30_DEG;
ARDRONE_ANIM_THETA_30_DEG;
ARDRONE_ANIM_THETA_20DEG_YAW_200DEG;
ARDRONE_ANIM_THETA_20DEG_YAW_M200DEG;
ARDRONE_ANIM_TURNAROUND;
ARDRONE_ANIM_TURNAROUND_GODOWN;
ARDRONE_ANIM_YAW_SHAKE;
ARDRONE_ANIM_YAW_DANCE;
ARDRONE_ANIM_PHI_DANCE;
ARDRONE_ANIM_THETA_DANCE;
ARDRONE_ANIM_VZ_DANCE;
ARDRONE_ANIM_WAVE;
ARDRONE_ANIM_PHI_THETA_MIXED;
ARDRONE_ANIM_DOUBLE_PHI_THETA_MIXED;
ARDRONE_ANIM_FLIP_AHEAD;
ARDRONE_ANIM_FLIP_BEHIND;
ARDRONE_ANIM_FLIP_LEFT;
ARDRONE_ANIM_FLIP_RIGHT.
Эти анимации можно протестировать в командной строке, например
rosservice call /ardrone/setflightanimation 1 0
Полетные анимации можно запустить во время полета ArDrone.
Можно попробовать поуправлять ArDrone и с клавиатуры
rosrun teleop_twist_keyboard teleop_twist_keyboard.py
Но я бы не советовал — управлять очень трудно — пара жестких падений квадрокоптера заставила меня отказаться от этой идеи.
Для дальнейшей работы необходимо было организовать управление Ardrone c помощью джойстика. Как я подключал джойстик рассказано здесь.
Далее — Распознование голоса с помощью julius — Часть 2