DimDrone20: как я сделал летающую платформу для computer vision исследований

b0bc8491fcdd1c477d57d88fa482472b.png

С 2017 года я делаю разный computer vision: начиная от понятных детекций и классификаций, заканчивая чтением по губам.

И вот после череды случайностей, я оказываюсь единственным Computer Vision инженером в стартапе, который делает беспилотные вертолеты. По это причине я решаю ворваться со своей computer vision ноги и сделать какой-нибудь pet project связанный с дронами.

План такой: соберу просто квадрик с камерой, автопилотом и какой-нибудь edge железкой (нейронки и прочий CV гонять), получится плюс-минус универсальная летающая платформа. Например, как эта, но более гибкая и дещевая. И интересный применений масса: от детекции человека и следования за ним, до управления квадрокоптером с помощью Reinforcement Learning-a.

Так и начался мой путь длиной в 8 месяцев: от идеи и заказа первых компонентов на aliexpress до полноценного использования квадрокоптером визуальной одометрии, рассчитанной на борту, и полета по ней.

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

А во второй части (она уже готовится!) расскажу, про то, как заставить эту платформу удерживать позицию и летать простые миссии без использования GPS, с помощью visual SLAM.

Итак, рама

Раму квадрокоптера решил выбрать 450ого размера (расстояние между диагональными моторами равно 450 мм).

6f1fcc832eff4e48a0d011c36f20cfd2.png

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

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

Итак, моторы

844f98080c401dea718404d1df1e7332.JPG

По-хорошему, чтобы решать какие моторы вам нужны желательно понимать финальную взлетную массу дрона. Но делать я так, конечно же, не стал ¯\_(ツ)_/¯

На сайте где вы покупаете раму (в моем случае AliExpress) на странице товара скорее всего будут рекомендованные производителем компоненты. В моем случае это были моторы на 700KV (← число сильно кореллирующее со скоростью вращения винтов; чем больше ваш дрон, тем KV должно быть меньше). Здесь подробнее по KV.

Итак, регуляторы оборотов

f2bcf010323b7c5a58345902151c0d7e.JPG

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

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

Еще обращайте внимание по какому протоколу общается ESC. Ищите сразу DShotXXX (чем больше число XXX, тем лучше)

Также неплохо было бы убедиться, что software автопилот, который вы будете использовать поддерживал протокол ESC (если это ArduPilot или PX4, скорее всего с этим проблем не будет)

Итак, лопасти

У лопастей есть два численных параметра на которые надо смотреть при покупке (обычно они пишутся в названиях как одно четырехзначное число — XXYY): длина и шаг (обе в дюймах). С длиной все понятно. Что же такое шаг? Это расстояние которое проходит винт за один оборот по прямой оси. Вот изображение хорошо это иллюстрирующее.

7530f7228ba8a9742f79d2289f7d001f.png

Как упрощенную модель, советую держать в голове, что шаг очень сильно зависит от угла атаки лопастей: больше угол — больше шаг.

На самом деле это я сейчас такой умный, а в начале проекта я просто взял винты рекомендованные производителем рамы. В моем случае это винты 1145.

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

И да (сейчас будет аксиома): 1) только карбоновые винты (самые крепкие из доступных обычным хобийщикам) и 2) не ограничивайте себя одной парой.

Итак, батареи

b9f55cbe03aa9be516e83d38848fe28e.JPG

Тут две главные цифры это вольтаж (или количество «банок») и емкость.

Алгоритм такой: смотрим какой вольтаж пишет производитель выбранных вами моторов и берем такой же. По емкости можно разгуляться, вопрос лишь в том, сколько вам позволяет ваш бюджет. Я выбрал 4S Li-Po батарею и решил, что по емкости она должна быть около 5000 mAh. Так и выбирал. Пока у меня две такие батареи, которые позволяют висеть (самый энергозатратный режим для квадрокоптера) в воздухе порядка 20 минут.

Итак, приёмник и передатчик

3ca27ad18bcd596ae0c29ed501e88df8.jpg

В любом случае дроном нужно будет управлять в ручном режиме для этого нам нужен передатчик (аппаратура\пульт) и приемник. Здесь конкретных правил выбора я назвать не могу и не хочу т.к. новичок и так перегружен информацией. Кому хочется прямо в дебри различий между разными аппаратурами, тот найдет способ. А для себя (и всем советую) я взял приемник и передатчик от FrSky (Taranis X10 lite и FrSky R-XSR). Они далеко не дешевые, но почти самое оптимальное, что можно взять начинающему по соотношению цена\качество.

«Почти» потому что в последнее время слышал много хороших отзывов про RadioMaster. Подозреваю, что они тоже составляют неплохую конкуренцию FrSky на этом рынке, но нужно проверять.

Итак, автопилот

Автопилотом называют как software stack для управления дроном (state estimation, драйвера для различной подключаемой периферии, ОС для микроконтроллера), так и hardware (железяка где собственно software stack работает).

Hardware автопилот это микроконтроллер, в который уже встроены самые вжные датчики для управления (зачастую это IMU, барометр, магнетометр).

113819ced770a797235d5105878a1a3c.png

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

Для этого используется тьма-тьмущая сложных и не очень алгоритмов. Т.к. моей целью не было самому писать все эти алгоритмы и мне бы хотелось использовать что-то готовое. Насколько мне известно в open-source есть только два автопилота, которые позволяют использовать визуальную одометрию (что для меня было важно): ArduPilot и PX4.

Я методом тыка выбрал ardupilot (все еще не уверен, что сделал правильный выбор) и по документации с их сайта выбрал один из самых новых на начало 2020-ого года hardware автопилотов — pixhawk 4 mini.

Итак, companion computer

703468998b610a4b2d2456fe3b2ff9c7.JPG

Это еще одна числодробилка для нашего дрона, но уже гораздо мощнее. Обычно на companion computer возлагают такие задачи, как кодирование и стриминг видео с курсовой камеры, какой-нибудь сложный path planning, external navigation, обнаружение препятствий + task specific задачи.

И тут на самом деле есть из чего выбирать: Intel Movidius, Google Coral, Jetson серия. Raspberry серию изначально не раcсматривал т.к. уже в самых ближайших планах были нейронки, а пускать их на «малине» нужно только при крайней необходимости.

Остановился в итоге на Jetson-e Nano (самый дешевый из тогда доступных) поскольку кроме удобства запуска нейронок (TensorRT), это еще и железка с обычной GPU т.е. можно переписывать какие-то медленные куски кода на CUDA (все ведь умеют переписывать медленные куски кода на CUDA, так, чтобы это не стало еще медленней?), что очень актуально для SLAM алгоритмов.

Итак, камера

У меня под рукой была камера Intel RealSense D435, от которой я использовал только модуль, который выдает RGB картинку. В общем случае я бы посоветовал взять Raspberry Pi камеру c MIPI интерфейсом т.к. подключить и начать пользоваться максимально просто и в интернете много различных 3D моделей кейсов для такой камеры, наверняка найдете что-то подходящее, чтобы поставить на раму.

Стоит, правдв, учесть, что они все с rolling shutter т.е. при плохой балансировке лопастей и наличии вибраций на дроне, картинка с камеры запросто может превратиться в мыло.

Итак, собираем!

напомню вам картинку из заставки поста

1cca86567abd8bfe3b0b40f6c6eb0ee5.png

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

Я не буду подробно останавливаться на процессе сборки, но вот пару моментов, про которые я советую помнить:

  1. На сайте выбранного автопилота будет гайд, а ля Getting Started. Следуйте ему. Там будет и про сборку железа, и про настройку самого АП.

  2. Если это ваш первый опыт сборки, не устанавливайте companion computer и камеру сразу. Сначала убедитесь, что дрон хорошо и предсказуемо летает.

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

  4. Если проверяете вращение моторов в помещении, ВСЕГДА делайте это без лопастей.

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

  6. Если не используете Loctite (я не использую), проверяйте время от времени несколько случайных винтов на дроне (особенно те, что держат моторы). Из-за сильных вибраций на дроне тяга винтов может ослабиться со временем.

  7. Если у вас всех четырех моторах одинаковая резьба (гайка закручивается в одну сторону), ОБЯЗАТЕЛЬНО проверяйте, насколько сильно затянуты эти гайки перед каждым полетом.

  8. Если есть такая возможность (на борту есть GPS), первые полетные тесты делайте в режиме удержания позиции.

  9. Самый простой способ понимать количество заряда на батарее вот такой дешевый вольтметр. Суть вот в чем: чем меньше заряда в батарее осталось, тем меньше на ней напряжение. На одной заряженной LiPo ячейке напряжение 4.2v. Такой вольтметр начнет очень громко пищать, как только напряжение хотя бы одной из «банок» упадет ниже, чем вы на нем выставили (я обычно выставляю около 3.5–3.6v)

Итак, что в итоге?

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

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

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

© Habrahabr.ru