Программирование дронов

Программирование дрона

Управлять квадрокоптером — это целое искусство, но писать программы, которые позволяют ему летать в автономном режиме, — дело не менее захватывающее. В этой статье я расскажу о том, как создать программу на Python, которая будет вести беспилотник, и покажу, как протестировать ее в симуляторе.

Нашими основными инструментами будут среда разработки приложений для робототехники Robot Operating System и программный симулятор Gazebo. Их используют, чтобы тестировать алгоритмы в симуляционной среде и разбивать при этом как можно меньше техники. И ROS, и Gazebo работают в Linux — мы будем работать в Ubuntu 16.04.

Какие бывают дроны

Дроны бывают разные. По конструкции различают несколько типов дронов:

  • мультироторный — коптеры;
  • самолетный — fixed wing;
  • гибридный — он взлетает вертикально, потом использует крылья.

Также дроны делятся на потребительские (consumer) и коммерческие (commercial).

Потребительские, как ты понимаешь, — это те, которые можно купить в магазине и использовать как летающую камеру. DJI Phantom и Mavic — хорошие модели. Есть и менее дорогие, но они определенно уступают по качеству. Такие квадрокоптеры используют для съемки разных мероприятий, зданий, исторических объектов. Например, с беспилотника можно сделать серию фотографий здания или памятника, а затем создать из них 3D-модель объекта методом фотограмметрии.

Как правило, такие дроны летают на ручном управлении, реже по миссии в автономном режиме по GPS-координатам. Рынок потребительских квадрокоптеров больше чем наполовину принадлежит одной компании — DJI. С ней очень сложно конкурировать, поскольку там делают реально крутой продукт: доступный, функциональный, удобный. Хотя в области квадрокоптеров для селфи DJI начинает теснить компания Skydio со своим дроном R2. Фишка этого дрона в том, что он может летать автономно, например за мотоциклистом в лесу. При этом беспилотник видит все препятствия и прокладывает автономный безопасный маршрут в реальном времени так, чтобы человек всегда оставался в кадре. Реально крутая штука.

Коммерческие дроны используются в компаниях для решения определенной задачи. Дроны следят за состоянием сельхозполей, летая над ними регулярно и делая фотографии, другие дроны умеют распылять удобрения точечно. Их используют на стройках, в карьерах. Каждый день они облетают строительный объект, делают фотографии, по которым создается 3D-модель в облаке, и уже она помогает отслеживать ежедневные изменения.

Пример российской компании, которая активно работает с этой технологией на рынке США, — Traceair.

Другой способ применения — осмотр трубопроводов дронами. Это особенно актуально для России: у нас газовые трубопроводы тянутся на тысячи километров, и надо контролировать утечки и врезки.

Ну и конечно, у всех на слуху доставка товаров дронами. Не знаю, заработает ли когда-нибудь сервис Amazon Prime Air, но уже сейчас компания Matternet доставляет товары в Цюрихе и некоторых городах США, а компания Zipline давно отправляет медикаменты в полет над просторами Африки. В России успехов тут пока намного меньше, недавно была новость про дрон Почты России, который разбился на первом тесте, а Сбербанк тестирует доставку денег дронами.

Компании Volocopter и Ehang уже имеют летающие прототипы такси, а компания с российскими корнями Hoversurf разрабатывает летающий байк.

В помещениях тоже есть задачи для коммерческих дронов, но пока они не сильно распространены, в этой области идут интенсивные R&D-исследования. Возможные применения для такого вида дронов:

Поживем — увидим, какие проекты будут реализованы и задисраптят нашу жизнь. Глобальная цель — сделать систему управления дроном, которой герой фильма «Бегущий по лезвию 2049» мог бы сказать: «Сфотографируй тут все!»

Кадр из фильма «Бегущий по лезвию 2049»
Кадр из фильма «Бегущий по лезвию 2049»

Автономная навигация

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

Для автономного управления дрону надо как минимум знать с высокой точностью свои координаты в пространстве. На открытом пространстве можно использовать GPS — точность достигается в несколько метров. Дополнительная наземная станция и технология GPS RTK увеличат точность до нескольких сантиметров. Но наземную станцию не всегда возможно использовать, и это очень дорого. Обычного GPS хватает для задания маршрута полета над сельхозполями, стройками, трубопроводами, и дроны в этих случаях летают автономно. Эта функция есть у любого современного дрона, который можно найти в продаже.

В таком режиме безопасно летать только в открытом небе без препятствий. Если речь идет об обследовании зданий, трубопроводов или применении внутри помещений, то тут не обойтись без дополнительных сенсоров, определяющих расстояние до объектов. Тут используют одномерные сонары, лидары, двумерные лидары, 3D-лидары и камеры глубины. На борту дрона должен быть установлен дополнительный вычислитель, который в реальном времени будет считывать данные с этих сенсоров, строить 3D-модель окружающего пространства и планировать в нем безопасный маршрут.

Есть еще одна важная проблема: если мы летаем в замкнутом пространстве или между высокими зданиями, то сигнал GPS будет недоступен и необходимо иметь другой источник координат дрона в пространстве. Можно определять свои координаты на борту, обрабатывая видеопоток с бортовых камер — лучше использовать стереокамеры или камеры глубины. Такой алгоритм называется SLAM (Simultaneous Localization and Mapping).

В потоке кадров с камеры алгоритм ищет особые точки (features), которыми могут быть маленькие уголки, какие-то неоднородности. Точкам присваиваются дескрипторы таким образом, что, если мы найдем эту же точку в последующих кадрах, когда камера уже успела переместиться в пространстве, ей будет присвоен такой же дескриптор и алгоритм сможет сказать: «Вот на этом кадре есть такая же точка, что и на предыдущем».

Алгоритм не знает 3D-координаты особых точек и координаты камеры в моменты съемок кадров — эти параметры ему как раз и надо вычислить. Он отслеживает изменения пиксельных координат особых точек между кадрами и пытается подобрать такие параметры, чтобы, если спроецировать особые точки в плоскость кадра, получались наблюдаемые или измеренные пиксельные координаты.

В итоге получается оценка перемещения камеры в пространстве. Обычно алгоритм SLAM очень требователен к вычислительным ресурсам, но есть камера Intel RealSense T265 с микросхемой, реализующей вычисления SLAM на аппаратном уровне.

Для организации автономного управления дроном необходимо решить три задачи.

  1. Определить координаты дрона в пространстве. Использовать для этого GPS-приемник или вычислять на борту координаты, обрабатывая видеопоток алгоритмом SLAM. А лучше использовать оба подхода, чтобы знать как глобальные, так и локальные координаты дрона
  2. Построить 3D-карту окружения дрона с помощью сенсоров типа стереокамер, камер глубины, лидаров.
  3. Добавить софт для планирования маршрута с учетом цели полета, текущих координат и карты окружения.

Практика

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

Полетный контроллер

Непосредственно вращением моторов и полетом дрона управляет полетный контроллер, представляющий собой плату Pixhawk с процессором ARM на борту и прошивкой под названием PX4. Сам программный код PX4 можно скомпилировать в режиме software in the loop как раз для тестирования на персональном компьютере на Intel x84 CPU. Софт PX4 в этом режиме думает, что он работает на реальном железе полетного контроллера, хотя на самом деле он выполняется в симуляционной среде на ПК и получает подменные данные с сенсоров.

Программирование дронов

Robot Operating System

Нам потребуется много разных программных модулей. Одни будут работать с сенсорами, другие будут реализовывать SLAM, третьи — строить 3D-карту, четвертые — планировать в ней безопасный маршрут. Для создания этих модулей мы используем Robot Operating System (ROS) — распространенный фреймворк для разработки приложений робототехники. Приложение для ROS представляет собой набор взаимодействующих пакетов, каждый экземпляр которых называется узел, или node.

Один из узлов называется мастер (master node) и отвечает за регистрацию остальных узлов приложения. Каждый узел представляет собой отдельный процесс Linux. ROS предоставляет механизм передачи и синхронизации сообщений между узлами. Существуют как стандартные сообщения, так и определенные программистом. В качестве сообщений выступают данные с сенсоров, видеокадры, облака точек, команды управления и передачи параметров.

Узлы ROS могут быть запущены на разных машинах — в этом случае взаимодействуют они через сетевой интерфейс. В составе ROS есть специальный узел rviz, он служит для графической визуализации передаваемых в ROS сообщений. Например, можно посмотреть, как БПЛА видит мир вокруг себя, отобразить траекторию его движения и видеопоток с камеры.

Для создания пакетов ROS предоставляет возможность использовать языки C++ и Python.

Программный симулятор реального мира Gazebo

Все эти программные средства должны брать данные с сенсоров и управлять чем-то. Программе неважно, работать ли с реальными или симуляционными датчиками и актуаторами, поэтому все алгоритмы можно сначала протестировать на компьютере, в мире Gazebo.

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

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

Образ Docker

Чтобы развернуть у себя на компьютере описанную среду симуляции, надо поставить большое количество программных пакетов, и могут возникнуть проблемы с зависимостями. Чтобы сэкономить тебе время, я создал образ Docker с уже настроенными пакетами и нужным нам софтом для первого теста дрона в Gazebo.

Найти контейнер можно на моем гитхабе — заходи и скачивай.

Как работает софт управления

В нашем простейшем примере дрон будет летать очень примитивно.

  1. Источник координат дрона — не SLAM, а симулированный сигнал GPS.
  2. Дрон в симуляторе не строит карту окружающего пространства.
  3. Дрон летает по заранее заданной траектории.

Для первого теста вполне неплохо.

Запуск софта

Сначала ставим Docker и пакеты Python.

Качаем образ и софт.

Собираем образ.

Скачиваем и компилируем код PX4 в режиме sitl внутри образа Docker.

Симуляция в Gazebo
Симуляция в Gazebo

Запускаем контейнер в режиме bash, компилируем и запускаем тест.

Ты должен увидеть такое же окошко Gazebo, в котором дрон начнет летать. В консоли ты получишь вот такой вывод:

Тест должен закончиться так.

На ошибки вроде этой не обращай внимания, их выдает PX4 по неизвестной мне причине.

Для завершения процесса нажимай Ctrl-C.
Для завершения процесса нажимай Ctrl-C.

Посмотрим на код

Мой репозиторий Fast Sense основан на материалах команды, которая разработала PX4 — самый популярный опенсорсный полетный контроллер в мире.

У этих ребят есть своя инструкция по запуску в Docker, а на их гитхабе ты найдешь код модуля автономного управления, который я перенес в свой репозиторий, чтобы все находилось в одном месте.

Код управления на Python совсем небольшой, я уверен, ты сможешь в нем разобраться самостоятельно. Я лишь скажу, что начинать надо с чтения функции test_posctl(self). В ней описана логика полета: дрон переводится в режим OFFBOARD, затем армится, взлетает и начинает полет по точкам (0, 0, 0), (5, 5, 2), (5, -5, 2), (-5, -5, 2), (0, 0, 2)).

После чего садится и дисармится.

Что дальше?

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

  • Начинать осваивать профессию программиста-робототехника можно уже со школы.
  • Выбирай вуз, где есть робототехнические кафедры. Если не можешь поехать в Стэнфорд, MIT или ETH Zurich — выбирай МФТИ, Сколтех или НГТУ (наверняка есть и другие наши сильные вузы, но в этих трех я знаю сильные команды, которые занимаются дронами).
  • Приходи на стажировку к нам в Fast Sense.
  • Собирай команду и участвуй в хакатонах COEXCOEX World Skills.
  • И задавай вопросы в комментариях или пиши мне на почту.

До встречи!

Понравилась статья? Поделиться с друзьями:
Комментарии: 1
  1. Алексей

    Добрый день!
    Имеем в наличии дон промышленный matrice 200 v2 от DJi
    хотим его интегрировать со своим программным комплексом, но опыта по дронам нет совсем. Нам необходимо минимум:
    — написать полётное задание в штатном ПО(Pilot);
    — провести обучение по написанию и управлению.
    Максимум:
    — по SDK создать обмен данными через облако;
    — по SDK полётное задание с необходимым функционалом по фото/видео;
    Может быть сумбурно написано, но мы не профи по драном.
    Можете ли Вы помочь в данных вопросах?
    Сколько это может стоить?
    Или куда нам можете посоветовать обратиться?

Добавить комментарий