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

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

Что такое дроны

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

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

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

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

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

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

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

Еще одно применение — проверка трубопроводов дронами. Особенно это касается России: наши газопроводы тянутся на тысячи километров, а утечки и врезки надо контролировать.

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

Компании Волокоптер и Эханг уже выпускают прототипы такси, а компания с русскими корнями Ховерсёрф разрабатывает летающий мотоцикл.

В помещении есть задачи и для коммерческих дронов, но пока они не очень распространены, в этой области ведутся интенсивные НИОКР. Возможные области применения дронов этого типа:

  • инвентаризация складских помещений;
  • осмотры зданий внутри зданий;
  • контроль безопасности в подземных шахтах;
  • осмотр промышленного оборудования в магазинах.

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

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

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

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

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

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

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

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

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

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

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

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

Упражняться

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

Контроллер полета

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

Операционная система робота

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

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