Хабрахабр

[Из песочницы] Python + Raspberry Pi + Pixhawk и квадрокоптер. Или как не надо делать роботов

Привет, Хабр!

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

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

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

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

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

Устройство

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

  1. контроллер,
  2. двигатели с винтами,
  3. аккумулятор,
  4. регулятор скорости (ESC),
  5. антенна телеметрии,
  6. GPS-модуль и компас,
  7. камера.

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

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

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

Контроллер

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

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

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

Двигатели

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

Аккумулятор

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

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

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

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

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

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

"

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

GPS-модуль

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

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

Камера

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

Управление

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Да, это очевидно, но ни разу не очевидно. И мы кучу времени потратили, чтобы с этим разобраться.

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

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

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

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

И тут ВНЕЗАПНО выяснилось, что:

  1. коптер летает не ровно,
  2. ошибки его телеметрии ± метр и более,
  3. для полета адекватны задачи типа: поднимись на 10-20 метров, пролети 100 метров на север и т.д.

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

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

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

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

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

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

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

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

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

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

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

Маршруты

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

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

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

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

Коптер: Raspberry Pi, Rasbian, OpenCV, Python 3.5, aiohttp, DroneKit, RPi.GPIO, SQLite.

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

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

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

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

  • Raspberry Pi. Полноценный микрокомпьютер с имеющимися пинами и выходами для специальной камеры и сенсорного экрана. Именно на нем расположен управляющий код, веб-сервер, openCV библиотека. По сути коптер — это летающий сервер.
  • Raspbian. Линуксовая операционная система для «малины». Их несколько и вообще можно ставить любые, но лучше ставить специально предназначенные, иначе могут возникнуть проблемы со взаимодействием с оборудованием компьютера, с теми же пинами, к примеру. Есть даже адаптированная версия десятой 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, от них нужно отказаться в сторону прямых команд в каналы управления. Это влечет необходимость написания своего автопилота, что задача решаемая. А потом — тестировать, тестировать и тестировать.

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

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

Удачи всем!

Теги
Показать больше

Похожие статьи

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»
Закрыть