Создание дрона Raspberry Pi + ESP32: мои первые шаги в робототехнике

Создание дрона Raspberry Pi + ESP32: мои первые шаги в робототехнике

27 апреля 2022 г.

Всем привет! Меня зовут Антон. И я хочу поделиться историей своих первых шагов в робототехнике и конкретно о моем дроне Raspberry Pi + ESP32. (Я также снял об этом видео и прикрепил его в конце статьи)


Предисловие


В начале истории я работал веб-разработчиком (React, Typescript и т.д.), имел некоторые знания C++, что касается электроники — я мог паять оборванные провода от наушников. Проблема заключалась в том, что, будучи веб-разработчиком, я начал чувствовать себя неудовлетворенным, потому что то, что я делаю, никак не влияет на физический мир. Конечно, существует множество чисто программных проектов, которые влияют на реальный мир, но я решил выбрать самый простой подход и погрузиться в робототехнику.


Поэтому я прочитал несколько книг на эту тему, посмотрел несколько видео на YouTube, прочитал несколько статей и купил паяльное оборудование и 3D-принтер, поскольку 3D-принтеры сегодня дешевы и доступны и могут избавить меня от головной боли, связанной с изготовлением деталей из пищевых контейнеров и подобный хлам.


Первый робот


Моим первым роботом была эта гусеничная платформа:


мой первый робот


Я разработал детали в Blender, а затем распечатал их. Я использовал Raspberry Pi в качестве мозга и блок питания в качестве источника питания. Контроллер мотора спаял из реле и транзисторов. В процессе изготовления этой штуки столкнулся с одной проблемой, когда все собрал, моторы еле шевелились. Оказалось я перепутал коллектор и эмиттер транзисторов, и после их перепайки все заработало. Эту штуку сложно назвать роботом, потому что она ничего не делает сама по себе и управляется только дистанционно. В любом случае, я чувствовал себя прекрасно, поверив в себя, и решил сделать то же самое, но летающее.


Второй робот


После некоторых исследований я решил использовать некоторые обычные детали квадрокоптера, такие как бесщеточные двигатели, электронные регуляторы скорости и липо-аккумулятор, способный обеспечить большой ток для двигателей. В качестве мозга я все же использовал тот же Raspberry Pi. После того, как я узнал, как связать Raspberry Pi с ESC, я начал проектировать раму, чтобы удерживать все части. Я делал это, полагаясь только на интуицию, в надежде, что требования к раме не очень строгие, потому что я видел дронов таких странных форм, которые еще могли летать.


Я также купил плату с гироскопом, акселерометром, барометром и магнитометром на шине i2c. Еще до того, как я узнал, что такое ПИД-регулятор, мой первый интуитивный подход был похож на то, как работает его Р-компонент — просто увеличивайте или уменьшайте скорость двигателя пропорционально углу, на который дрон отклоняется от горизонтальной плоскости.


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


вертикальное движение ограничено шнурками


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


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


скриншот мобильного приложения


другой скриншот


Изначально, по какой-то причине, я сосредоточился на контроле горизонтального выравнивания, просто чтобы понять, что я не могу его безопасно протестировать, и что мне больше нужно, так это автоматический контроль высоты. Моей первой мыслью было использовать показания барометра, но они были недостаточно точными для контроля высоты в помещении (или, может быть, я просто использовал их неправильно), поэтому я купил ультразвуковой датчик в местном магазине электронных компонентов. На самом деле, у него был странный интерфейс, который переводил один из контактов в высокий уровень во время измерения, и вам приходилось считать время, чтобы вычислить расстояние. Когда Raspberry Pi находился в относительном бездействии, он работал нормально, но под вычислительной нагрузкой он просто пропускал тайминги, а показания были мусором. Вот и пришлось добавить в проект дополнительный контроллер AVR исключительно для измерения этих таймингов и вывода результатов в удобном цифровом виде на интерфейс SPI.


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


горизонтальное движение ограничено тормозным тросом


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


На тот момент у меня уже была регулировка высоты, но добиться стабильного горизонтального выравнивания все равно не получалось, хоть я и реализовал для нее ПИД-регулирование. Я предположил несколько причин этого, и я не уверен, какая из них больше всего способствовала проблеме. Но вот они:


  • Для первого и, наверное, самого важного, я использовал дешевые пропеллеры (и даже пытался их распечатать) и пренебрег необходимостью их балансировки, что, в свою очередь, перегружает датчики IMU шумом, что снижает их точность. Когда я, наконец, решил решить эту проблему, я добавил в свое приложение функцию, позволяющую считывать последние 100 показаний гироскопа и выводить диапазон между наибольшим и наименьшим значением. Чем больше диапазон работы винта, тем более он неуравновешен. Я случайно прилепил скотч к лопастям пропеллеров, затем прогнал их, чтобы проверить значение, если оно увеличилось — наверное, плохое место для приклеивания, если шум уменьшился — я на правильном пути, то я пытался приклеить дальше или ближе к центру и еще раз проверьте, таким образом я уменьшил шум на каждом пропеллере.

  • Вторая возможная проблема заключается в том, что Raspberry Pi имеет только два канала ШИМ, но с ним управляются четыре ESC, а программная ШИМ может быть недостаточно точной, а также тратит впустую такты ЦП. Поэтому я решил использовать ESP32 для этой задачи, потому что они дешевы, легко доступны и имеют множество интерфейсов, которых нет в Raspberry Pi. Я начал с управления ESC через ESP32, подключенный к Raspberry Pi через SPI, и в итоге перенес всю логику полетного контроллера в ESP32.

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

  • Еще одна проблема — неоптимальные коэффициенты для дополнительного фильтра, который я использовал для оценки угла наклона. Оптимальным является 0,999 для угла, оцененного по интегральным показаниям гироскопа, и 0,001 для угла, измеренного акселерометром.

  • Я не учел, что тангаж превращается в крен и наоборот, если наклонный дрон вращается вокруг своей локальной оси z.

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

Где-то в процессе разработки меня разочаровало количество проводов между модулями и способ их размещения. Поэтому я решил потратить некоторое время на умение делать печатные платы на заказ. Я долго об этом думал, но отговаривал необходимость покупать дорогие инструменты и иметь дело с химикатами.


На самом деле все оказалось проще, чем я думал, я посмотрел несколько туториалов по KiCAD, чтобы создать дизайн своей печатной платы. Я купил б/у лазерный принтер за 40$, также купил обычный утюг без отверстий за 5$, а самым дорогим инструментом был сверлильный станок за 75$. Химикаты оказались не такими опасными, они не растворят вашу кожу, если вы к ним прикоснетесь.


дизайн в KiCAD


после травления и нанесения паяльной маски


Так что я сделал эту плату с четвертой попытки. Самым сложным было нанесение паяльной маски. Что делает эта печатная плата, так это то, что она соединяет датчики, ESP32 и Raspberry Pi и подает соответствующее напряжение на разные части.


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


скрипт анализатора полетов


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


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


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


набросок скрипта, отслеживающего синюю метку


Я поместил камеру на дно дрона и попытался удержать эту синюю метку на полу с помощью библиотеки OpenCV. После нескольких попыток и настроек вот результат:


https://www.youtube.com/watch?v=poqQmvoBlP8


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


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



В текущей конфигурации дрон сделан так: ESP32 отвечает за контроль высоты, направления и выравнивания. Он берет данные с датчиков IMU и лазерного датчика расстояния на дне. Он дает команды контроллерам двигателей, а также принимает команды от raspberry pi, который сам отвечает за связь с приложением и управление положением, используя данные с камеры.


Если кому интересно посмотреть код


[Часть ESP32] (https://github.com/Tohntobshi/r_control_aux)


[Часть Raspberry Pi] (https://github.com/Tohntobshi/rcontrol2)


[Клиентское приложение для Android] (https://github.com/Tohntobshi/flying_android_client)


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


Также я снял видео по этому поводу:


https://www.youtube.com/watch?v=3mAFEW0YOJ0


Спасибо за внимание! Ваше здоровье!



Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE