Python, Raspberry Pi, Pixhawk и квадрокоптер. Или как не надо делать роботов

Привет, меня зовут Алексей, уже 7 лет я ведущий разработчик Smart TV-решений в «Центре высоких технологий». Каждый год у нас проводится конкурс новогодних украшений, и каждый раз мы ничего не украшаем, а пилим всякие технологичные штуки. В этот раз скрестили дрон и Smart TV-приложение. А что из этого получилось — читайте ниже.

Идея была вполне реализуемая. Хотели сделать квадрокоптер в виде саней Деда Мороза, который бы сам и под музыку развозил по офису подарки для сотрудников. При этом ориентироваться в пространстве он должен был с помощью анализа ArUco-меток, взаимодействуя с приложениями для телевизоров («сдувание» работающими винтами дыма из труб, выбегание зверушек для встречи или провожания квадрокоптера).

И на всё три месяца. Конечно же, мы не успели.

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

Я и мое оформление:)
Я и мое оформление:)

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

Да, мы перерыли интернетики с целью найти библиотеку для управления контроллером коптера. Да, надо было передавать в клиент стримом изображение с веб-камеры и анализировать его на сервере. Да, нужно было сделать бомболюк. Да, надо в целом написать оболочку, которая бы это всё в себе собирала. Ну и что? Мы всё это уже делали (кроме управления контроллером). Поэтому проекту дали зеленый свет.

Устройство

Каждая надсадно жужжащая у вас над головой эволюционная ошибка вертолета, в принципе, состоит из одного набора механизмов и схем. Это:

  • контроллер;
  • двигатели с винтами;
  • аккумулятор;
  • регулятор скорости (ESC);
  • антенна телеметрии;
  • GPS-модуль и компас;
  • камера.

Последние два пункта опционально. Схему устройства винтокрылого друга можно увидеть вот тут:

Python, Raspberry Pi, Pixhawk и квадрокоптер. Или как не надо делать роботов

Это добро ставится на корпус. Впрочем, корпус решили сделать свой. Потому что:

  • Сами с усами.
  • Нуждались в корпусе именно в виде саней.
  • Уже неприлично дорого получалось.

Контроллер

Python, Raspberry Pi, Pixhawk и квадрокоптер. Или как не надо делать роботов

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

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

Python, Raspberry Pi, Pixhawk и квадрокоптер. Или как не надо делать роботов

Мы выбрали относительно мажорский контроллер. «Относительно», потому что я потом внимательнее посмотрел на монстров, которые предлагаются для серьёзных дядей… Тем не менее, контроллер имеет GPS, компас, автопилот, всякие прочие хорошие плюшки, поддерживает до восьми двигателей.

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

Двигатели

Python, Raspberry Pi, Pixhawk и квадрокоптер. Или как не надо делать роботов

Этих друзей превеликое множество. Круглых, квадратных, кривых, косых, больших, маленьких, дорогих и дешевых. Основное отличие: максимальная потребляемая мощность, сила тока и количество оборотов в секунду. В идеальном представлении сани должны были уметь поднимать банку пива (0,5 кг).

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

Аккумулятор

Python, Raspberry Pi, Pixhawk и квадрокоптер. Или как не надо делать роботов

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

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

Во-вторых, он не только жрет, но ещё и умеет оставлять заряд «про запас». Идея хорошая, потому что при достижении порогового значения напряжения, машина прерывает полет и совершает мягкую посадку, но выражается это в том, что банка «высаживается» ещё быстрее.

Регулятор скорости

Python, Raspberry Pi, Pixhawk и квадрокоптер. Или как не надо делать роботов

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

Антенна телеметрии

Python, Raspberry Pi, Pixhawk и квадрокоптер. Или как не надо делать роботов

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

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

GPS-модуль

Python, Raspberry Pi, Pixhawk и квадрокоптер. Или как не надо делать роботов

Основной и практически единственный способ позиционирования летающего уничтожителя нервов в пространстве. Обычно GPS-модуль содержит в себе ещё и компас. Чтобы на него ничего не влияло в полете, модуль ставится на специальную штангу, чтобы вот совсем ничего не влияло. Мы его использовали только ради компаса, потому что в помещении GPS не очень хорошо ловит. Поддерживает и другие системы позиционирования.

Как любой уважающий себя GPS, умеет ошибаться. Ошибка варьируется от нескольких метров до нескольких материков. Но в целом необходимый прибор на улице для осуществления миссий на удалении.

Камера

Python, Raspberry Pi, Pixhawk и квадрокоптер. Или как не надо делать роботов

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

Управление

Все поделки инженерной мысли сапиенсов, использующие контроллеры, в сущности управляются одной программой: Mission Planer. Выглядит она примерно так:

Python, Raspberry Pi, Pixhawk и квадрокоптер. Или как не надо делать роботов

Подробнее об этом здесь.

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

Правило №1: используй только то, что тебе понадобится

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

Само ручное управление можно осуществлять чем душе угодно. Есть настройки для пульта, для джойстика. Можно вывести управление на мышку и клавиатуру. Основное требование — откалибровать пульт управления. Ну и управлять вручную. Поскольку мы ленивые разработчики, то управлять вручную не хотелось. Хотелось, чтобы винтокрылый побочный результат мыслительной деятельности сам летал.

Программный контроль

На просторах интернета нашли только эту библиотеку, предназначенную для программного управления подобием летательных аппаратов. И написана она (барабанная дробь) на питоне. В общем случае для версий 2.x, но и на питоне 3.5 она работала вполне стабильно. Библиотека обладает богатым функционалом и относительно хорошей документацией. Но прежде чем начинать писать свой мегауправляющий дроном код, сначала надо... Да, надо подключиться к контроллеру.

В качестве управляющей программной компоненты был применен микрокомпьютер Raspberry Pi, на котором развернут веб-сервер на фреймворке aiohttp.

Схему и инструкцию подключения «малины» и контроллера можно посмотреть вот тут.

Схематично это выглядит так:

Python, Raspberry Pi, Pixhawk и квадрокоптер. Или как не надо делать роботов

Способ подключения такой. Контроллер и малина соединяются проводами по указанной схеме. Таким образом эмулируется радиосигнал отправляемый и принимаемый контроллером. На малине необходимо запустить прокси-сервер, который будет цепляться к контроллеру и передавать с него данные. Подключение может быть сделано через телеметрию, либо через USB. Для них используются разные COM-порты. На рисунке представлен способ через телеметрию.

Правило №2: неполная документация. Часто не пишут самые очевидные вещи

Например, для соединения из питона с контроллером необходимо указать адрес и порт: connectionString = ’127.0.0.1:14540′.

Но оказалось, что этот адрес и порт необходимо указать и в строке запуска прокси-сервера. Вот тут:

mavproxy.py —master=/dev/ttyAMA0 —baudrate 921600 —aircraft MyCopter

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

В последний момент выяснилось, что данных для подключения к дрону надо существенно больше. Условно, он должен начать отдавать данные в подключенную телеметрию, в противном случае, он её просто не подключал и сидел довольный.

Отсюда правило №3: используй USB

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

Тестовый полет

Python, Raspberry Pi, Pixhawk и квадрокоптер. Или как не надо делать роботов

И тут внезапно выяснилось, что:

  • Коптер летает неровно.
  • Ошибки его телеметрии +/- метр и более.
  • Для полета адекватны задачи типа: поднимись на 10-20 метров, пролети 100 метров на север и так далее.

Напомню, что эта конструкция, созданная под влиянием вертолетов из фильма «Аватар», запускалась в стенах офиса, где много оргтехники, с потолка свисают лампы, вентиляция и декор. Ну ещё и сотрудники имеются. В общем, очень быстро выяснилось, что серьезный полет в помещении чреват 160 отрубленными головами.

Правило №4: используй нормальные тестовые условия

Если летающий танк размером 50х60 см, то его нахождение в воздухе в замкнутом пространстве неминуемо приведет либо к его повреждению, либо повреждению находящихся рядом с ним. Идеальной тестовой зоной будет помещение размером со спортзал.

Компьютерное зрение

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

Пример меток
Пример меток

Для реализации использовалась библиотека openCV. Она используется для распознавания вообще всего, что только есть, в частности: лиц людей, предметов, автомобильных номеров, ну и наших меток. Установка библиотеки на операционную систему малины — Rasbian — стала сущим кошмаром, с которым поочередно бились четыре человека.

Тем не менее, мы её успешно решили, и теперь машина «научилась» распознавать метки в видеопотоке с веб-камеры. Но опять-таки не хватило времени всё настроить. Например, из двух и более меток библиотека возвращала распознанные номера всех меток, а данные только по одной. Почему так? Тайна велика есть.

Правило главное: выделяй достаточно времени на доводку решения

Прочие органы чувств

Чтобы мутант крыльев Икара не втыкался в возникающие внезапно препятствия, хотели применить датчики расстояния. Они предполагались к нахождению по всем сторонам машины и должны были сигнализировать о приближении препятствия, вследствие чего коптер должен остановиться, сделать «шаг в сторону» и продолжить движение дальше по маршруту.

Этот функциональн мы не успели сделать совсем.

Маршруты

Мы много говорили про маршруты движения коптера. А что же это за звери такие? Скажу сразу, этот функционал был реализован самым первым и в полном объеме, но... не пригодился.

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

Поскольку для каждой вершины мы знаем её координаты, а у коптера мы знаем его расположение (компас) и положение (метки), то вычислить куда надо лететь — чисто технический вопрос. Задача поиска пути между стартовой точкой и финишной решена рекурсивной функцией. Маршруты, ребра и вершины хранятся в развернутой на малине БД.

Правило последнее: делай только то, что нужно для реализации

Технологический стек

Сервер с динамикой для ТВ: node.js, Express, socket.io.

Приложения для ТВ: JavaScript ES6, webpack 2, Canvas.

Репозиторий с кодом коптера вот тут. За звездочки — плюсы в карму.

Пару слов, чтобы пояснить термины (любые оценки прошу считать субъективными).

  • Raspberry Pi. Полноценный микрокомпьютер с имеющимися пинами и выходами для специальной камеры и сенсорного экрана. Именно на нем расположен управляющий код, веб-сервер, openCV библиотека. По сути коптер — это летающий сервер.
  • Rasbian. Линуксовая операционная система для «малины». Их несколько и вообще можно ставить любые, но лучше ставить специально предназначенные, иначе могут возникнуть проблемы со взаимодействием с оборудованием компьютера, с теми же пинами, к примеру. Есть даже адаптированная версия десятой Windows.
  • OpenCV. Библиотека для распознавания элементов в видеопотоке. Также умеет стримить видеопоток, что используется в проекте для выдачи изображения на клиент (да, у коптера есть свой веб-клиент).
  • Python 3.5. Питон. 3.5. Не 2.*.
  • Aiohttp. Асинхронный фреймворк для веб-сервера, написанный на питоне. Почему-то он понравился больше Django. Но тут на выбор.
  • DroneKit. Библиотека для подключения к контроллеру коптера из программы. Весьма богатый функционал, помноженный на относительно неплохую документацию. При условии отсутствия аналогов — блестящий инструмент.
  • RPi.GPIO. Библиотека на питоне для взаимодействия с пинами «малины». Позволяет включать и выключать пины, слушать их значения. Не умеет передавать значения, отличные от 0 или 1. Или я не нашел.
  • SQLite. СУБД + БД + дрова, объединенные в один файл. Идеально подходит для учебных и непродовых проектов, если не надо разворачивать что-нибудь высоконагруженное. Удобно вносить изменения.
  • Node.js. Серверный JavaScript.
  • Express. Фреймворк для веб-серверов, написанный на node.js. Весьма удобен и минималистичен.
  • Socket.io. Серверная и клиентская библиотека для реализации протокола webSocket. Основной плюс — стабильность работы и обширный предоставляемый функционал.

Выводы

В исходной формулировке задача реализуема, хоть и требует существенно больше времени и усилий. Из-за того, что автопилот и методы управления коптером чуть менее, чем полностью завязаны на GPS, от них нужно отказаться в сторону прямых команд в каналы управления. Это влечет необходимость написания своего автопилота, что задача решаемая. А потом — тестировать, тестировать и тестировать.

Лично мне было интересно. И автоматизированный бомбардировщик-наноситель подарков я всё равно сделаю так или иначе. А всем заинтересовавшимся, пожалуй, оставлю:

Правило единственное: ставь высокие и сложные цели и иди к ним

Удачи всем!

1515
14 комментариев

Чем только люди не занимаются, лишь бы не работать.

Вообще-то параллельно мы выпустили smart TV приложение в стор Tizen, помимо этого я ещё преподаю в университете. Просто шило свербит в известном месте, вот и развлекаюсь )

4

Спасибо за материал! Пожалуйста, если хотите вывести картинку в ленту, выведите только одну, а не коллаж (для этого их придётся загрузить в материал по одной)

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

1

Из-за того, что автопилот и методы управления коптером чуть менее, чем полностью завязаны на GPSИнтересно, сожет кто-то делал автопилот с камерой глубины, типа кинекта.
Тогда можно будет сделать автоматическое построение карты и маршрутов по помещениям.

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

Почти ничего не понял, но читать было интересно)