Управление квадрокоптером через интернет

Управление квадрокоптером через интернет

Это продолжение повествования об автономном дроне. В первой части говорилось про hardware, в этой речь пойдет про software. Для начала небольшой ликбез про взаимодействие оператора с коптером. Вот типичная схема у большинства самосборных дронов:

А вот схема у продвинутых дронов:

Так работают игрушечные дроны, которые управляются со смартфона:

Управлять дроном через интернет можно так (при наличии сим-карты со статическим IP-адресом):

Или так, если IP-адрес динамический:

Для надежности и резервирования каналов связи последний вариант можно развить до такого состояния:

Далее я буду описывать процесс настройки полетного контроллера Emlid Navio 2 и микрокомпьютера Raspberry Pi 3.


Но, с небольшими модификациями, эти настройки подойдут для любого полетного контроллера, с которым можно общаться по протоколу MAVLink в связке с любым компьютером на ОС семейства Linux.

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

ПО для управления дроном на ПК и планшетах

Для управления БПЛА используются специальные программы GCS (Ground Control Station). Далее по тексту я буду использовать эту аббревиатуру. Мне по душе пришлась QGroundControl, мультиплатформенная (Windows, Linux, MacOS, iOS, Android) GCS с открытым исходным кодом, которая стала частью проекта DroneCode. Но есть и альтернативы, бесплатные и коммерческие: APM Planner, MissionPlanner, UgCS, LibrePilot, OpenPilot, Tower (DroidPlanner) для Android, MAVPilot (iOS), SidePilot (iOS). А также консольная MAVProxy.

Установка образа ОС на SD-карту

Для нормальной работы автопилота крайне рекомендуется использовать “быстрые” SD-карты (класс 10). Медленные карты памяти не успевают сохранять логи автопилота даже на небольшой частоте, в результате чего они получаются кривыми или вообще не пишутся. Свидетельством этого может быть ошибка “No IO heartbeat”, которую можно наблюдать в консоли MAVLink (как смотреть консоль MAVLink описано ниже). При покупке смотрите на возможность писать 4К видео: скорее всего это будет быстрая SD. К сожалению, я об этом узнал после падения дрона, когда нужно было проанализировать логи и узнать причину. Логи оказались нечитаемы для нескольких GCS. Причина отключения моторов в полете оказалась банальна: я забыл подправить в настройках значение минимального напряжения на аккумуляторе для срабатывания failsafe.

Итак, скачиваем готовый образ Raspbian Stretch с предустановленными Ardupilot и ROS от Emlid со страницы оригинальной инструкции. И пишем его на карту памяти с помощью Etcher или любой подобной программы.

Чтобы сразу после включения Raspberry соединялся с вашей WiFi сетью, необходимо отредактировать файл wpa_supplicant.conf в корне SD-карты. В нем должны быть такие строки:

Можно настроить и без WiFi, подключив одноплатник к роутеру Ethernet-кабелем. Теперь вынимаем SD-карту из ПК, вставляем ее в Raspberry и включаем питание. Через полминуты он должен появиться в админке роутера на странице подключенных устройств (хостнейм navio).

Обновление дистрибутива и установка необходимых пакетов

Открываем SSH-клиент и соединяемся с Raspberry (локальный IP-адрес navio вместо RASPBERRY_IP_ADDRESS):

Стандартный пароль: raspberry. В первую очередь необходимо расширить файловую систему ОС на весь объем SD-карты:

После перезагрузки, соединяемся еще раз и обновляем дистрибутив:

Устанавливаем дополнительные пакеты:

и компилируем обертку gst-rpicamsrc для gstreamer и родной камеры Raspicam:

Проверим работает ли камера (создается видеофайл test.h264):

Если gstreamer запустился, подождите пару секунд, чтобы записалось видео. Прервать процесс можно клавишами Ctrl+C. Если видео есть, значит камера работает.

Настройка и запуск Ardupilot

Релизы новых версий Ardupilot немного запаздывают в сборке от Emlid. Если необходимый функционал доступен в самой последней версии, то установить ее из исходников можно по этой инструкции.

Разработчики Navio добавили в свою сборку простую и удобную утилиту Emlid tool для проверки датчиков и настройки Ardupilot. Сначала проверим, видит ли Raspberry контроллер Navio:

Если в ответ на эту команду выдает что-то вроде:

значит видит. Проверим состояние датчиков (покажет список и состояние):

и драйвера ШИМ-контроллера в ядре Linux:

0 = не работает, 1 = работает.

Прошивка ШИМ-контроллера обновляется так:

Теперь настроим Ardupilot:

В терминале откроется текстовый GUI с пошаговыми менюшками. Выбираем copter последней версии, тип arducopter, автозапуск при включении (On boot: enable), старт после настройки (Ardupilot: start).

Выходим через пункт меню Quit.

Проверим запустился ли Ardupilot:

Обратите внимание, файл запуска в systemd называется arducopter, так как настроен был вариант copter.

Теперь нужно настроить Ardupilot так, чтобы он отправлял нам телеметрию. Для этого отредактируем файл конфигурации:

В нем должны быть такие строки:

Сохраняем файл (Ctrl+X, затем Y) и перезапускаем Ardupilot:

Проверить состояние процесса Ardupilot можно такой командой:

С такими настройками Ardupilot будет транслировать телеметрию (пакеты MAVLink) в локальный UDP-порт 14550. Далее, скрипт MAVProxy (описание ниже) будет забирать оттуда телеметрию и передавать в GCS или скрипт, а также отправлять в обратном направлении пакеты с командами.

Вместо локального адреса и порта можно записать IP-адрес ПК или планшета в локальной сети и пакеты будут транслироваться сразу туда.

Однако, такой подход оправдан, если данные телеметрии больше нигде не используются и у устройства с GCS статический IP адрес. Иначе каждый раз в настройках Ardupilot придется прописывать новый. Чтобы общаться с автопилотом по TCP могли одновременно несколько GCS с динамическими адресами и еще какие-нибудь скрипты на самом бортовом компьютере, удобнее использовать MAVProxy.

Этот скрипт (написан на Python) может получать пакеты MAVLink на локальный UDP-адрес и ретранслировать их на несколько локальных или удаленных IP-адресов как по UDP, так и по TCP. Пакеты передаются в обоих направлениях Ardupilot ⇔ GCS. Кроме того, MAVProxy представляет из себя полноценную GCS, но с текстовым интерфейсом.

MAVProxy

MAVProxy уже установлен в образе Navio. Его также можно установить и на ПК (Windows, Linux, MacOS) для дальнейшего общения с автопилотом в консольном режиме.

Убедившись, что Ardupilot работает, запустим на Raspberry скрипт MAVProxy такой командой:

Параметр —master=udp:127.0.0.1:14550 задает для скрипта источник данных. Это локальный UDP-порт, который был прописан в файле конфигурации Ardupilot. После запуска команды, MAVProxy соединиться с этим портом и выведет на экран сообщения автопилота, примерно как у меня:

Так как автопилот еще не откалиброван и до конца не настроен, то об этом красноречиво говорят и сообщения. В этом режиме можно общаться с автопилотом посредством команд. Если бы дрон был полностью настроен, то вот такая последовательность двух команд привела бы к старту двигателей и взлету дрона на высоту 20 м:

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

Установка связи с дроном в локальной сети

Остановим скрипт (Ctrl+C) и снова запустим его в таком виде:

С дополнительным параметром —out=tcpin:0.0.0.0:5762 MAVProxy будет слушать порт 5762 на входящие TCP соединения от GCS. Как только GCS соединиться, пакеты с данными начнут перемещаться между дроном и GCS. Попробуем подключиться с ПК:

Если подключение удалось, то GCS покажет кучу сообщений с требованием откалибровать датчики и загрузит бортовые параметры с их текущими значениями:

Калибровка датчиков и настройка параметров автопилота

Калибровку автопилота можно сделать почти в любой GCS. В документации Ardupilot она описана во всех подробностях. Прежде всего устанавливаем тип рамы. У меня стандартная 4-х моторная компоновка, поэтому это Quad X.

Первый полет лучше все же сделать в ручном режиме. Подключаем и калибруем радиоуправление (приемник и передатчик).

Осталось откалибровать акселерометр и компас.

Для того, чтобы Ardupilot видел и учитывал данные с внешних датчиков, установим необходимые параметры:

FLOW_ENABLE = 1 (Enabled)
FLOW_ADDR = 0 (0 = вариант для стандартного адреса 0х42)

Для лазерного высотомера VL53L0X (инструкция)

RNGFND_TYPE = 16 (VL53L0X)
RNGFND_ORIENT = 25 (ориентация дальномера вниз)
RNGFND_ADDR = 41 (I2C-адрес в десятичном виде). Адрес датчика по-умолчанию 0x29, что в десятичном виде = 41.
RNGFND_SCALING = 1
RNGFND_MIN_CM = 5
RNGFND_MAX_CM = 120
RNGFND_GNDCLEAR = 15 (расстояние от датчика до поверхности, когда дрон стоит на земле)

PLND_ENABLED = 1
PLND_TYPE = 2
PLND_BUS = 1

Для сонара переднего обзора (инструкция)

RNGFND2_TYPE = 2 (MaxbotixI2C sonar)
RNGFND2_ORIENT = 0 (ориентация дальномера вперед)
RNGFND2_MAX_CM = 700 (макс дальность в сантиметрах)

Теперь перезапускаем Ardupilot из меню GCS, снова соединяемся с бортом и открываем окошко MAVLink Inspector, чтобы увидеть данные с датчиков.

К сожалению, показания IR-Lock тут не видны, для анализа его работы придется взглянуть на бортовые логи. Как это сделать описано здесь.

Читайте также:  Операции с двойной точностью

Осталось настроить параметры безопасности и можно запускать дрон:

Как настроить гироподвес и управление основной камерой в деталях я напишу в одной из следующих статей, основные моменты изложены здесь.

Видеотрансляция

Проверим как работает видеотрансляция в сети WiFi. Такой командой можно запустить видео в TCP-порт на Raspberry с использованием родной утилиты raspivid для камеры Raspicam:

А вот такой командой делается тоже самое, только с использованием ранее скомпилированной обертки rpi-camsrc для gstreamer:

В обоих случаях, трансляция в формате h264 доступна по IP-адресу Raspberry на порту 5001.

Посмотреть ее можно запустив на своем ПК такую команду (должен быть установлен gstreamer), вместо RPI_ADDRESS указываем адрес Raspberry в сети:

В результате должно открыться окошко с видео.

Практически в любую GCS встроен видеоплеер, который может показывать RTSP-видеопоток. Чтобы сделать из Raspberry RTSP-сервер можно использовать консольный плеер VLC. Установка:

Видеотрансляция запускается так:

Видео доступно по адресу (вместо RPI_ADDRESS, адрес Raspberry):

Адрес потока можно использовать для подключения нескольких плееров на разных устройствах, но, так как видеозахват и трансляция для Raspberry весьма трудоемкий процесс, то для нескольких потребителей видео лучше использовать внешний сервер (описание ниже).

Телеметрия через интернет

Чтобы GCS могла подключиться через интернет к дрону с динамическим IP-адресом, необходим промежуточный сервер со статическим IP, на котором будет запущен скрипт MAVProxy. Для этих целей я воспользовался арендой облачного сервера у одного из известных провайдеров. Для MAVProxy подойдет самая минимальная конфигурация, но так как у меня этот же сервер будет заниматься ретрансляцией видео, то я выбрал вариант с чуть большей памятью (одно ядро и 1Гб памяти, Ubuntu 18.04). Для минимальной задержки в прохождении данных между бортом и GCS, сервер должен располагаться в максимальной географической близости к дрону и GCS.

Устанавливаем MAVProxy на сервер. Сначала зависимости:

а потом и сам скрипт через PIP:

и запустим скрипт с такими параметрами:

MAVProxy слушает порт 15001 на входящие пакеты телеметрии от дрона по протоколу UDP, а порт 15002 на входящее TCP-соединение от GCS.

Запустим MAVProxy на Raspberry еще с одним параметром, чтобы телеметрия транслировалась еще и на сервер (вместо SERVER_IP адрес своего сервера):

После старта скрипта на бортовом компьютере, в консоли сервера появятся сообщения от автопилота. Как уже говорилось выше, MAVProxy представляет из себя полноценную GCS с текстовым интерфейсом и в таком состоянии уже можно редактировать параметры и управлять дроном посредством команд в консоли сервера.

Подключим GCS на ПК или планшете к серверу. Настройки соединения такие же как и для локальной сети, только вместо IP-адреса Raspberry указываем адрес сервера и порт 15002.

Теперь можно подключить 4G USB-модем к Raspberry и оценить с какой задержкой реагирует авиагоризонт на экране.

Видео через интернет

Для ретрансляции видео установим на сервер VLC плеер:

После установки, запустим его как ретранслятор c UDP порта 5001 в RTSP канал SERVER_IP:8554/live:

На борту запустим видеотрансляцию с камеры на сервер по UDP (вместо SERVER_IP адрес сервера):

Адрес потока теперь можно использовать как источник видео в настройках GCS или открыть в любом плеере, поддерживающим этот протокол.

Теперь можно спланировать маршрут полета и запустить дрон через интернет, предварительно его включив, например, с помощью помощника по телефону.

Очевидно, что из-за относительно большого времени путешествия видео и телеметрии по сети, такой способ вряд ли подойдет для FPV-полетов в ручном режиме между препятствиями.

Это продолжение повествования об автономном дроне. В первой части говорилось про hardware, в этой речь пойдет про software. Для начала небольшой ликбез про взаимодействие оператора с коптером. Вот типичная схема у большинства самосборных дронов:

А вот схема у продвинутых дронов:

Так работают игрушечные дроны, которые управляются со смартфона:

Управлять дроном через интернет можно так (при наличии сим-карты со статическим IP-адресом):

Или так, если IP-адрес динамический:

Для надежности и резервирования каналов связи последний вариант можно развить до такого состояния:

Далее я буду описывать процесс настройки полетного контроллера Emlid Navio 2 и микрокомпьютера Raspberry Pi 3.


Но, с небольшими модификациями, эти настройки подойдут для любого полетного контроллера, с которым можно общаться по протоколу MAVLink в связке с любым компьютером на ОС семейства Linux.

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

ПО для управления дроном на ПК и планшетах

Для управления БПЛА используются специальные программы GCS (Ground Control Station). Далее по тексту я буду использовать эту аббревиатуру. Мне по душе пришлась QGroundControl, мультиплатформенная (Windows, Linux, MacOS, iOS, Android) GCS с открытым исходным кодом, которая стала частью проекта DroneCode. Но есть и альтернативы, бесплатные и коммерческие: APM Planner, MissionPlanner, UgCS, LibrePilot, OpenPilot, Tower (DroidPlanner) для Android, MAVPilot (iOS), SidePilot (iOS). А также консольная MAVProxy.

Установка образа ОС на SD-карту

Для нормальной работы автопилота крайне рекомендуется использовать “быстрые” SD-карты (класс 10). Медленные карты памяти не успевают сохранять логи автопилота даже на небольшой частоте, в результате чего они получаются кривыми или вообще не пишутся. Свидетельством этого может быть ошибка “No IO heartbeat”, которую можно наблюдать в консоли MAVLink (как смотреть консоль MAVLink описано ниже). При покупке смотрите на возможность писать 4К видео: скорее всего это будет быстрая SD. К сожалению, я об этом узнал после падения дрона, когда нужно было проанализировать логи и узнать причину. Логи оказались нечитаемы для нескольких GCS. Причина отключения моторов в полете оказалась банальна: я забыл подправить в настройках значение минимального напряжения на аккумуляторе для срабатывания failsafe.

Итак, скачиваем готовый образ Raspbian Stretch с предустановленными Ardupilot и ROS от Emlid со страницы оригинальной инструкции. И пишем его на карту памяти с помощью Etcher или любой подобной программы.

Чтобы сразу после включения Raspberry соединялся с вашей WiFi сетью, необходимо отредактировать файл wpa_supplicant.conf в корне SD-карты. В нем должны быть такие строки:

Можно настроить и без WiFi, подключив одноплатник к роутеру Ethernet-кабелем. Теперь вынимаем SD-карту из ПК, вставляем ее в Raspberry и включаем питание. Через полминуты он должен появиться в админке роутера на странице подключенных устройств (хостнейм navio).

Обновление дистрибутива и установка необходимых пакетов

Открываем SSH-клиент и соединяемся с Raspberry (локальный IP-адрес navio вместо RASPBERRY_IP_ADDRESS):

Стандартный пароль: raspberry. В первую очередь необходимо расширить файловую систему ОС на весь объем SD-карты:

После перезагрузки, соединяемся еще раз и обновляем дистрибутив:

Устанавливаем дополнительные пакеты:

и компилируем обертку gst-rpicamsrc для gstreamer и родной камеры Raspicam:

Проверим работает ли камера (создается видеофайл test.h264):

Если gstreamer запустился, подождите пару секунд, чтобы записалось видео. Прервать процесс можно клавишами Ctrl+C. Если видео есть, значит камера работает.

Настройка и запуск Ardupilot

Релизы новых версий Ardupilot немного запаздывают в сборке от Emlid. Если необходимый функционал доступен в самой последней версии, то установить ее из исходников можно по этой инструкции.

Разработчики Navio добавили в свою сборку простую и удобную утилиту Emlid tool для проверки датчиков и настройки Ardupilot. Сначала проверим, видит ли Raspberry контроллер Navio:

Если в ответ на эту команду выдает что-то вроде:

значит видит. Проверим состояние датчиков (покажет список и состояние):

и драйвера ШИМ-контроллера в ядре Linux:

0 = не работает, 1 = работает.

Прошивка ШИМ-контроллера обновляется так:

Теперь настроим Ardupilot:

В терминале откроется текстовый GUI с пошаговыми менюшками. Выбираем copter последней версии, тип arducopter, автозапуск при включении (On boot: enable), старт после настройки (Ardupilot: start).

Выходим через пункт меню Quit.

Проверим запустился ли Ardupilot:

Обратите внимание, файл запуска в systemd называется arducopter, так как настроен был вариант copter.

Теперь нужно настроить Ardupilot так, чтобы он отправлял нам телеметрию. Для этого отредактируем файл конфигурации:

В нем должны быть такие строки:

Сохраняем файл (Ctrl+X, затем Y) и перезапускаем Ardupilot:

Проверить состояние процесса Ardupilot можно такой командой:

С такими настройками Ardupilot будет транслировать телеметрию (пакеты MAVLink) в локальный UDP-порт 14550. Далее, скрипт MAVProxy (описание ниже) будет забирать оттуда телеметрию и передавать в GCS или скрипт, а также отправлять в обратном направлении пакеты с командами.

Читайте также:  На экране появляются черные квадратики и пропадают

Вместо локального адреса и порта можно записать IP-адрес ПК или планшета в локальной сети и пакеты будут транслироваться сразу туда.

Однако, такой подход оправдан, если данные телеметрии больше нигде не используются и у устройства с GCS статический IP адрес. Иначе каждый раз в настройках Ardupilot придется прописывать новый. Чтобы общаться с автопилотом по TCP могли одновременно несколько GCS с динамическими адресами и еще какие-нибудь скрипты на самом бортовом компьютере, удобнее использовать MAVProxy.

Этот скрипт (написан на Python) может получать пакеты MAVLink на локальный UDP-адрес и ретранслировать их на несколько локальных или удаленных IP-адресов как по UDP, так и по TCP. Пакеты передаются в обоих направлениях Ardupilot ⇔ GCS. Кроме того, MAVProxy представляет из себя полноценную GCS, но с текстовым интерфейсом.

MAVProxy

MAVProxy уже установлен в образе Navio. Его также можно установить и на ПК (Windows, Linux, MacOS) для дальнейшего общения с автопилотом в консольном режиме.

Убедившись, что Ardupilot работает, запустим на Raspberry скрипт MAVProxy такой командой:

Параметр —master=udp:127.0.0.1:14550 задает для скрипта источник данных. Это локальный UDP-порт, который был прописан в файле конфигурации Ardupilot. После запуска команды, MAVProxy соединиться с этим портом и выведет на экран сообщения автопилота, примерно как у меня:

Так как автопилот еще не откалиброван и до конца не настроен, то об этом красноречиво говорят и сообщения. В этом режиме можно общаться с автопилотом посредством команд. Если бы дрон был полностью настроен, то вот такая последовательность двух команд привела бы к старту двигателей и взлету дрона на высоту 20 м:

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

Установка связи с дроном в локальной сети

Остановим скрипт (Ctrl+C) и снова запустим его в таком виде:

С дополнительным параметром —out=tcpin:0.0.0.0:5762 MAVProxy будет слушать порт 5762 на входящие TCP соединения от GCS. Как только GCS соединиться, пакеты с данными начнут перемещаться между дроном и GCS. Попробуем подключиться с ПК:

Если подключение удалось, то GCS покажет кучу сообщений с требованием откалибровать датчики и загрузит бортовые параметры с их текущими значениями:

Калибровка датчиков и настройка параметров автопилота

Калибровку автопилота можно сделать почти в любой GCS. В документации Ardupilot она описана во всех подробностях. Прежде всего устанавливаем тип рамы. У меня стандартная 4-х моторная компоновка, поэтому это Quad X.

Первый полет лучше все же сделать в ручном режиме. Подключаем и калибруем радиоуправление (приемник и передатчик).

Осталось откалибровать акселерометр и компас.

Для того, чтобы Ardupilot видел и учитывал данные с внешних датчиков, установим необходимые параметры:

FLOW_ENABLE = 1 (Enabled)
FLOW_ADDR = 0 (0 = вариант для стандартного адреса 0х42)

Для лазерного высотомера VL53L0X (инструкция)

RNGFND_TYPE = 16 (VL53L0X)
RNGFND_ORIENT = 25 (ориентация дальномера вниз)
RNGFND_ADDR = 41 (I2C-адрес в десятичном виде). Адрес датчика по-умолчанию 0x29, что в десятичном виде = 41.
RNGFND_SCALING = 1
RNGFND_MIN_CM = 5
RNGFND_MAX_CM = 120
RNGFND_GNDCLEAR = 15 (расстояние от датчика до поверхности, когда дрон стоит на земле)

PLND_ENABLED = 1
PLND_TYPE = 2
PLND_BUS = 1

Для сонара переднего обзора (инструкция)

RNGFND2_TYPE = 2 (MaxbotixI2C sonar)
RNGFND2_ORIENT = 0 (ориентация дальномера вперед)
RNGFND2_MAX_CM = 700 (макс дальность в сантиметрах)

Теперь перезапускаем Ardupilot из меню GCS, снова соединяемся с бортом и открываем окошко MAVLink Inspector, чтобы увидеть данные с датчиков.

К сожалению, показания IR-Lock тут не видны, для анализа его работы придется взглянуть на бортовые логи. Как это сделать описано здесь.

Осталось настроить параметры безопасности и можно запускать дрон:

Как настроить гироподвес и управление основной камерой в деталях я напишу в одной из следующих статей, основные моменты изложены здесь.

Видеотрансляция

Проверим как работает видеотрансляция в сети WiFi. Такой командой можно запустить видео в TCP-порт на Raspberry с использованием родной утилиты raspivid для камеры Raspicam:

А вот такой командой делается тоже самое, только с использованием ранее скомпилированной обертки rpi-camsrc для gstreamer:

В обоих случаях, трансляция в формате h264 доступна по IP-адресу Raspberry на порту 5001.

Посмотреть ее можно запустив на своем ПК такую команду (должен быть установлен gstreamer), вместо RPI_ADDRESS указываем адрес Raspberry в сети:

В результате должно открыться окошко с видео.

Практически в любую GCS встроен видеоплеер, который может показывать RTSP-видеопоток. Чтобы сделать из Raspberry RTSP-сервер можно использовать консольный плеер VLC. Установка:

Видеотрансляция запускается так:

Видео доступно по адресу (вместо RPI_ADDRESS, адрес Raspberry):

Адрес потока можно использовать для подключения нескольких плееров на разных устройствах, но, так как видеозахват и трансляция для Raspberry весьма трудоемкий процесс, то для нескольких потребителей видео лучше использовать внешний сервер (описание ниже).

Телеметрия через интернет

Чтобы GCS могла подключиться через интернет к дрону с динамическим IP-адресом, необходим промежуточный сервер со статическим IP, на котором будет запущен скрипт MAVProxy. Для этих целей я воспользовался арендой облачного сервера у одного из известных провайдеров. Для MAVProxy подойдет самая минимальная конфигурация, но так как у меня этот же сервер будет заниматься ретрансляцией видео, то я выбрал вариант с чуть большей памятью (одно ядро и 1Гб памяти, Ubuntu 18.04). Для минимальной задержки в прохождении данных между бортом и GCS, сервер должен располагаться в максимальной географической близости к дрону и GCS.

Устанавливаем MAVProxy на сервер. Сначала зависимости:

а потом и сам скрипт через PIP:

и запустим скрипт с такими параметрами:

MAVProxy слушает порт 15001 на входящие пакеты телеметрии от дрона по протоколу UDP, а порт 15002 на входящее TCP-соединение от GCS.

Запустим MAVProxy на Raspberry еще с одним параметром, чтобы телеметрия транслировалась еще и на сервер (вместо SERVER_IP адрес своего сервера):

После старта скрипта на бортовом компьютере, в консоли сервера появятся сообщения от автопилота. Как уже говорилось выше, MAVProxy представляет из себя полноценную GCS с текстовым интерфейсом и в таком состоянии уже можно редактировать параметры и управлять дроном посредством команд в консоли сервера.

Подключим GCS на ПК или планшете к серверу. Настройки соединения такие же как и для локальной сети, только вместо IP-адреса Raspberry указываем адрес сервера и порт 15002.

Теперь можно подключить 4G USB-модем к Raspberry и оценить с какой задержкой реагирует авиагоризонт на экране.

Видео через интернет

Для ретрансляции видео установим на сервер VLC плеер:

После установки, запустим его как ретранслятор c UDP порта 5001 в RTSP канал SERVER_IP:8554/live:

На борту запустим видеотрансляцию с камеры на сервер по UDP (вместо SERVER_IP адрес сервера):

Адрес потока теперь можно использовать как источник видео в настройках GCS или открыть в любом плеере, поддерживающим этот протокол.

Теперь можно спланировать маршрут полета и запустить дрон через интернет, предварительно его включив, например, с помощью помощника по телефону.

Очевидно, что из-за относительно большого времени путешествия видео и телеметрии по сети, такой способ вряд ли подойдет для FPV-полетов в ручном режиме между препятствиями.

Это проект создания управления джойстиком квадрокоптера ArDrone 2.0 c из ROS.

1. Квадрокоптер ArDrone 2.0

Parrot AR.Drone – это радиоуправляемый квадрокоптер, то есть вертолет с четырьмя несущими винтами, размещенных на выносных диагональных балках. Сам AR.Drone работает под управлением операционной системы Linux, а в качестве пульта ДУ к квадрокоптеру может выступать практически любой сенсорный смартфон и планшет на Android или iOS. Дистанция устойчивого управления по Wi-Fi – от 25 до 100 метров и зависит от помещения и погодных условий, если полеты происходят на улице.

Квадрокоптер Parrot AR.Drone 2.0 оснащен 4-мя моторами мощностью 14.5 Вт и выдающих 28 500 RPM. В редукторе используются шестерни из нилатрона для понижения шумов, а бронзовые самосмазывающиеся подшипники позволяют всему этому эффективно вращаться. На контроллере каждого мотора используется 8 MIPS AVR CPU, а сам контроллер влагоустойчив. Максимальная скорость полета — 18 км/ч
На борту обновленной версии квадрокоптера установлены 2 видеокамеры:

Фронтальная HD камера выдает 720p, 30 fps с углом объектива в 92 градуса.
Нижняя QVGA камера (320х240), 60 fps с углом объектива 64 градуса. Её AR.Drone так же использует для замерения горизонтальной скорости.

«Мозги» дрона представляют из себя 1GHz ARM Cortex A8 процессор с 800 MHz DSP TMS320DMC64x для видео. 1Гбит DDR2 RAM на 200MHz. И управляется это всё с помощью Linux 2.6.32. Соединение с «пультом» управления (коим являются iOS и Android девайсы) происходит по WiFi. Так что коптер несет на себе WiFi точку.
Ориентация в пространстве происходит за счет 3-х осевого гироскопа, 3-х осевого акселерометра, 3-х осевого магнитометра (магнитный компас), датчика давления и ультразвукового высотомера

Читайте также:  Загрузка видео на ютюб

Технические характеристики

  • HD Видеокамера реального времени: 720p 30fps
  • Широкоугольная линза: 92 градуса
  • H264 формат кодирования видео
  • Видео передается и записывается на устройство управления или на usb-накопитель
  • Захват и сохранение изображений в JPEG (720p)
  • 3х секционная литий-полимерная(LiPo) батарея 1,000 mAH
  • Пропеллеры специальной формы для быстрого маневрирования
  • 4 бесщеточных мотора, 14.5 Ватт и скоростью вращения 28,500 в минуту
  • Малошумные шестерни Nylatron
  • Автоматическая остановка всех винтов при контакте с препятствием
  • Полное программное управление моторами
  • Устойчивый к попаданию воды контроллер мотора
  • Специальная подвеска плат управления, гасящая нагрузки
  • Вес: 380г с корпусом для полетов на улице, 420г — с корпусом для полета в помещении
  • Части вертолета сделаны из износоустойчивого и ударопрочного пластика
  • Любая часть вертолета заменяется с помощью специальных инструментов

Электроника и датчики

  • Процессор 16MHz 32 bit ARM Cortex A8 с 800MHz video DSP TMS320DMC64x
  • Память 16bit DDR2 RAM на 200MHz
  • Контроллеры моторов: 8 MIPS AVR CPU
  • Wi-Fi b/g/n
  • 3х осевой акселлерометр
  • 3х осевой гироскоп с углом вращения 2000 градусов/сек
  • Барометрический датчик с точностью +/- 10 Па (80см над уровнем моря)
  • 60 fps вертикальная QVGA камера для измерения горизонтальной скорости
  • 3х осевой магнитометр с точностью до 6 градусов
  • Ультрозвуковые датчики для измерения высоты полета
  • Операционная система Linux 2.6.32

AR.Drone это непросто квадрокоптер, а квадрокоптер с задумкой под идею дополненной реальности (Augmented Reality Drone). Для него есть игровые приложения дополненной реальности, а еще у него открытый API.

Из-за низкой стоимости, большого количества качественных сенсоров, а так же благодаря открытому API, AR.Drone стал популярной платформой для научных экспериментов и образовательных целей. Он применяется в работах по автоматическому управлению, обучению AI, автономному видеонаблюдению, взаимодействию человек-машина, и т.д.

У меня возникло желание организовать голосовое управление AR.Drone из ROS, чтобы в перспективе он работал в паре с роботом Turtlebot. Но для начала необходимо для подстраховки сделать Ardrone управляемым с удобного устройства. Я решил выбрать джойстик.

2. Драйвер квадрокоптера 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)

Далее — компиляция ArDrone SDK 2.0. Запускаем скрипт build_sdk.sh

Если компиляция прошла успешно — проверяем содержимое каталога lib

Должно быть так:libavcodec.a libavformat.a libpc_ardrone_notool.a libvlib.a
libavdevice.a libavutil.a libsdk.a
libavfilter.a libpc_ardrone.a libswscale.a
И сборка пакета

Для запуска драйвера

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

Для вывода на камеру (текущую)

или на конкретную (допустим front)

Отправка команд для AR-Drone

Взлет — отправка пустого сообщения в тему ardrone/takeoff

Посадка — отправка пустого сообщения в тему ardrone/land

Сборос параметров(аварийная остановка) — отправка пустого сообщения в тему ardrone/reset

После взлета для управления движением 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" значение для всех компонентов сделает гул держать зависания.

Светодиодные анимации

Вызов службы ardrone/setledanimation будет вызывать выполнение одной из 14 предопределенных светодиодной анимаций для ArDrone.
Параметры

  • uint8 типов : тип анимации, который является число в диапазоне [0 .. 13];
  • float32 частоты : частота анимации в Гц;
  • uint8 продолжительность : продолжительность анимации в секундах.

Тип параметра анимации:

  1. BLINK_GREEN_RED;
  2. BLINK_GREEN;
  3. BLINK_RED;
  4. BLINK_ORANGE;
  5. SNAKE_GREEN_RED;
  6. FIRE;
  7. STANDARD;
  8. RED;
  9. GREEN;
  10. RED_SNAKE;
  11. BLANK;
  12. LEFT_GREEN_RIGHT_RED;
  13. LEFT_RED_RIGHT_GREEN;
  14. BLINK_STANDARD.

Эти анимации можно протестировать в командной строке, например

Полетные анимации

Вызов службы ardrone/setflightanimation будет выполнять одну из 20 предопределенных полетных анимаций (полетных фигур) для ArDrone. Параметры:

uint8 типов : тип полета анимация, число в диапазоне [0 .. 19]
uint16 продолжительность : продолжительность анимации. Используйте 0 для длительности по умолчанию (рекомендуется)

  1. ARDRONE_ANIM_PHI_M30_DEG;
  2. ARDRONE_ANIM_PHI_30_DEG;
  3. ARDRONE_ANIM_THETA_M30_DEG;
  4. ARDRONE_ANIM_THETA_30_DEG;
  5. ARDRONE_ANIM_THETA_20DEG_YAW_200DEG;
  6. ARDRONE_ANIM_THETA_20DEG_YAW_M200DEG;
  7. ARDRONE_ANIM_TURNAROUND;
  8. ARDRONE_ANIM_TURNAROUND_GODOWN;
  9. ARDRONE_ANIM_YAW_SHAKE;
  10. ARDRONE_ANIM_YAW_DANCE;
  11. ARDRONE_ANIM_PHI_DANCE;
  12. ARDRONE_ANIM_THETA_DANCE;
  13. ARDRONE_ANIM_VZ_DANCE;
  14. ARDRONE_ANIM_WAVE;
  15. ARDRONE_ANIM_PHI_THETA_MIXED;
  16. ARDRONE_ANIM_DOUBLE_PHI_THETA_MIXED;
  17. ARDRONE_ANIM_FLIP_AHEAD;
  18. ARDRONE_ANIM_FLIP_BEHIND;
  19. ARDRONE_ANIM_FLIP_LEFT;
  20. ARDRONE_ANIM_FLIP_RIGHT.

Эти анимации можно протестировать в командной строке, например

Полетные анимации можно запустить во время полета ArDrone.

Можно попробовать поуправлять ArDrone и с клавиатуры

rosrun teleop_twist_keyboard teleop_twist_keyboard.py

Но я бы не советовал — управлять очень трудно — пара жестких падений квадрокоптера заставила меня отказаться от этой идеи.

Подключаем джойстик

У меня имеелся в наличии джойстик Defender Gamne Racer X7

Defender Game Racer X7 имеет 12 кнопок (включая D-Pad и 2 аналоговых джойстика), а также кнопки Turbo, Clear и Home. Устройство поддерживает вибрационную обратную связь, работающую при помощи 2-х вибромоторов. Подключение к компьютеру производится через интерфейс USB. Джойстик может работать в двух режимах, один из которых HID-устройство, другой — контроллер XBOX360 . Переключение производится с помощью кнопки Mode.

Подключаем джойстик к компьютеру с Linux.

Джойстик устройства называются по JSX, у меня было наш джойстик js0. Удостоверимся, что джойстик работает.

На сервере параметров устанавливаем параметр joy_node/dev, где указываем порт подключения нашего джойстика

И запускаем узел joy_node из пакета joy

И смотрим сообщения, публикуемые в тему joy

Создаем новый ROS пакет

Устанавливаем зависимости пакета

Теперь нам необходимо написать скрипт, создающий узел, который будет получать сообщения из темы joy и отправлять команды управления квадрокоптеру Ardrone. Скрипт написан на python.

С помощью джойстика выполняем следующие команды

  • взлет,
  • посадка,
  • движение (вверх, вниз, влево, вправо, вверх, вниз, поворот) со скоростью отклонения джойстиков,
  • зависание,
  • светодиодные анимации 0-13,
  • полетные анимации 0-14 из 19 ,кроме сальто(для включения сальто поменяйте строку num2=min(num2+1,14) на num2=min(num2+1,18).

Текущие значение led-анимации и flight-анимации хранятся на сервере параметров (параметры joystick_num1 и joystick_num2). Последние значения данных, отправляемых в тему cmd_vel также хранятся на сервере параметров (параметр ). Вот его содержимое (nodes/ros_ardrone1_joystick_to_move.py).

Ссылка на основную публикацию
Удалить программу через консоль
Операционная система Windows предлагает несколько способов для удаления установленных приложений и программ. Некоторые пользователи даже прибегают к использованию стороннего программного...
Тормозит wot что делать
Если лагает World Of Tanks World of Tanks – игровой проект, который рассчитан на большую аудиторию фанатов. Это означает, что...
Тормозит мобильный интернет мтс
Результаты поиска Пользование Симптомы При использовании мобильного интернета наблюдаются затруднения в доступе к интернет-ресурсам: слишком медленно происходят загрузка страниц в...
Удалить раздел жёсткого диска
Столкнулись с проблемой, что невозможно удалить EFI раздел с жёсткого диска в Windows? Не волнуйтесь данную проблему можно решить довольно...
Adblock detector