Flix: разработка полетного контроллера с нуля
2.02K subscribers
48 photos
31 videos
3 files
67 links
По всем вопросам @okalachev
Чат обсуждения: @opensourcequadcopterchat
GitHub: https://github.com/okalachev/flix
Учебник: https://quadcopter.dev
Download Telegram
Media is too big
VIEW IN TELEGRAM
Демонстрация полета flix на проектной школе в Гимназии им. Примакова
🔥155👍3🤯1
Channel name was changed to «Flix: разработка полетного контроллера с нуля»
🎉 Репозиторий с исходным кодом квадрокоптера опубликован: https://github.com/okalachev/flix.
🎉15👍7🤡3
О чем будет этот канал

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

Я буду разбирать решения конкретных задач автопилотирования, например, фильтрация данных с датчиков, регулирование, запись и анализ логов, выполнение акробатических маневров (например, флипов), автономный полет по точкам, взаимодействие с наземной станцией по MAVLink и т. д.

Моя итоговая цель: создание учебника (или даже учебного курса) по теме создания автопилотов БПЛА, который будет использовать мой дрон в качестве учебного пособия. Возможно, все это выльется в какой-нибудь коммерческий продукт. А, возможно, и не выльется, время покажет :)
🔥28👍132🤡1
А вот как выглядит мой квадрокоптер-прототип под «капотом». Виден используемый десятиосный модуль IMU GY-91 (MPU9250) и месиво из проводов. Знаю, что MPU9250 устарел, но тем не менее решил использовать именно его, как проверенную классику. Но не исключено, что стоит его и поменять: он обладает достаточно высоким уровнем шума.
👍16😁32
FAQ #1

Получил довольно много вопросов по проекту, большое спасибо вам за интерес! Напишу ответы на некоторые из вопросов, которые задавали больше одного раза.

Где и когда можно купить? Сейчас этот проект на стадии прототипа. Но вы можете купить такой же набор компонентов, которые указаны в таблице, и попробовать собрать этот квадрокоптер самим (на свой страх и риск). Мне будет крайне интересно получить такой фидбэк!
А вот потенциальное создание продукта — это одна из целей этого блога: посмотрим, что из этого получится.

Почему Arduino? Мне очень понравилось, как разработчики Arduino реализовали свою консольную утилиту для работы с Arduino-проектом: arduino-cli. Среди прочего там реализован файл метаданных проекта и зависимостей — sketch.yaml, который позволяет делать воспроизводимые сборки.
Кроме того, мне нравится идея, что прошивку STEM-квадрокоптера можно открыть в стандартной Arduino IDE, модифицировать в ней что угодно и практически одной кнопкой загрузить в квадрокоптер.
Да, Arduino обвиняют в незрелости и игрушечности, но мне кажется, что это куда более актуально для ее древней реализации для AVR, чем для относительно новых для ESP32 и STM.

Где полная схема? Пока еще не готова, но будет. Есть общая структурная схема соединения компонентов, а конкретные номера пинов пока можно найти в исходнике.
🔥14👍9
Симулятор — это один из наиболее интересных компонентов этого проекта. Кстати, далеко не у всех полетных контроллеров есть симуляция, так что это еще и его отличие от других. Проект использует Gazebo Classic в качестве платформы для симуляции. Это универсальная платформа, которая моделирует физическую среду. Она используется для разных типов роботов: роверов, самолетов, мультикоптеров, роботов-манипуляторов.

Изначально моя идея была в том, чтобы симуляция запускала оригинальный Arduino'вский полетный код, не требуя никакой его модификации. И вот как мне удалось это реализовать.

1. Модель. Я разработал физическую модель своего дрона для Gazebo.
2. Плагин для Gazebo. Я написал плагин для Gazebo, который получает инпут с обычного USB-пульта, считывает данные с виртуальных датчиков, передает эту информацию в код для Arduino, а затем рассчитывает силы, которые создают пропеллеры. Исходный код этого плагина находится в файле simulator.cpp.
3. Имитация Arduino. В файле Arduino.h находится частичная реализация API Arduino, которая работает в контексте запущенной в Gazebo симуляции.

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

Сейчас любой желающий может запустить симулятор flix у себя на машине с Linux и macOS (Windows, к сожалению, толком поддерживается Gazebo). Для этого нужно склонировать репозиторий, установить зависимости и запустить симуляцию согласно инструкции. А если возникнут вопросы или проблемы при запуске, смело пишите мне или создавайте Issue на Github — все это очень сильно помогает мне дорабатывать проект!
👍26🔥154
🎄 Всех с наступившим 2024-м годом! 🎉 В этом году мое начинание с образовательным дроном и этим каналом приобретет поистине грандиозные масштабы :)

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

Моим проектом заинтересовались люди из МГУ, Государственного университета «Дубна» и Московского авиационного института. Спасибо за ваш интерес!

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

У канала теперь есть официальный чат, и там уже идет довольно много интересных и детальных обсуждений, вступайте, кто хочет поучаствовать: @opensourcequadcopterchat.
👍16🎉10🔥711
Новости

Подписчик @peter_ukhov создал свою версию подробной принципиальной схемы квадрокоптера, по которой он сам собирается его собрать. Там пока есть кое-какие неточности, но тем не менее я добавил ссылку на нее в README, потому что до этого принципиальной схемы вообще не было.

Этот же подписчик задал справедливый вопрос об отсутствии хэндлинга зависимости проекта от MAVLink: эту библиотеку можно было скачать только вручную. Мне не нравится использовать git-сабмодули (почему-то любой сложный репозиторий, в котором есть сабмодули, в конечном итоге приходит в какое-то полусломанное состояние, такова уж моя статистика). Поэтому я просто решил создать новую библиотеку: MAVLink для Arduino. Это обычный C MAVLink (v2), но который вы легко можете добавить в свой Arduino-проект стандартными средствами Arduino. Его можно поставить из Library Manager в Arduino IDE либо установить при помощи Arduino-CLI. При этом, благодаря GitHub Actions, сама версия протокола MAVLink будет автоматически обновляться (раз в месяц) и при обновлении будет автоматически выпускаться новая версия MAVLink-Arduino. Удивительно, но до этого такой штуки не было, а теперь, вот, будет.

Поскольку решена проблема с зависимостью от MAVLink, а также другая проблема со сломанным релизом необходимой мне версии библиотеки для IMU MPU9250, теперь есть полная инструкция по сборке прошивки в Arduino IDE. Не требуется использование консоли и какой-либо магии, прошивка собирается в обычной Arduino IDE с библиотеками, доступными в Library Manager.

Буду признателен за любой фидбэк от тех, кто собирается собрать такой квадрокоптер. Будь то отметка в комментариях или в личных сообщениях. Хочется понимать, сколько вас, первых рисковых пользователей :)
👍19🔥41
Мы уже рассмотрели общую архитектуру cимулятора, теперь рассмотрим архитектуру прошивки, которая непосредственно обеспечивает полет. Тем более что я как раз добавил в репозиторий документ с ее кратким обзором.

Прошивка квадрокоптера является обычным Arduino-скетчем, и может быть скомпилирована в Arduino IDE. Для передачи данных между подсистемами используются глобальные переменные.

Почему глобальные, если global variables considered harmful и все такое? В основном, для простоты. Рассматривайте эти переменные как упрощенную реализацию топиков. Многопоточности здесь нет, так что проблемы с синхронизацией доступа также не возникают.

Текущее состояние системы представлено следующими глобальными переменными:

1. t (float) — время текущего шага в секундах.
2. dt (float) — разница во времени между текущим и предыдущим шагами.
3. rates (Vector) — угловые скорости с гироскопа.
4. acc (Vector) — данные с акселерометра.
5. attitude (Quaternion) — текущая ориентация квадрокоптера, представленная в виде кватерниона.
6. control (float[6]) — положение управляющих стиков в диапазоне [-1, 1].
7. motors (float[4]) — команды на моторы в диапазоне [-1, 1] (отрицательные значения — реверс).

Алгоритм управления полетом реализован в файле control.ino, и его можно охарактеризовать так: двухуровневый трехмерный каскадный PID-регулятор (с low-pass фильтрацией d-членов). В следующих постах мы, конечно, разберем его подробнее. Сейчас можно сказать, что это типовой дизайн алгоритма управления квадрокоптерами. Что-то похожее, к примеру, реализовано и в полетном контроллере PX4.

Главный цикл системы работает с частотой ~1000 Гц. Общий dataflow выглядит следующим образом (см. диаграмму):

1. imu.ino считывает данные с IMU-датчика: гироскопа и акселерометра, учитывая калибровку. Записывает результаты в переменные rates и acc.
2. rc.ino считывает данные с RC-приемника, применяет калибровку, записывает результат в переменную controls.
3. estimate.ino рассчитывает текущую ориентацию квадрокоптера при помощи комплементарного фильтра, который объединяет данные с гироскопа и акселерометра. Результат записывается в переменную attitude.
4. control.ino используя команды со стиков (control), рассчитывает требуемую целевую ориентацию — attitudeTarget. Затем он применяет алгоритм регулирования со значениями rates и attitude в качестве обратной связи PID-регуляторов и рассчитывает выходные сигналы на моторы: motors.
5. motors.ino отправляет необходимые PWM-сигналы на регуляторы моторов.

Конечно, это только общий обзор дизайна прошивки, в дальнейшем я буду разбирать конкретные нюансы. Буду рад также и ответить на ваши вопросы в комментариях!
🔥15👍10
Media is too big
VIEW IN TELEGRAM
Реализовано управление с телефона

Многие об этом спрашивали, и вот, наконец-то получилось реализовать парсинг MAVLink-сообщений и поддержку сообщения для управления дроном при помощи QGroundControl, с телефона (MAVLink-сообщение MANUAL_CONTROL).
Честно говоря, с самого начала разработки я не был уверен, что это вообще получится реализовать, так как с Wi-Fi на этом дроне есть определенные проблемы (подробности в комментариях ➡️).
Но фикс был найден и полет с телефона осуществлен!
Таким образом, этот квадрокоптер имеет смысл и без приемника/пульта управления, что в текущем прототипе составляло около половины его себестоимости.
🔥31👍41
Пост про SBUS

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

Физически SBUS представляет собой обычный односторонний UART (без пина RX), работающий с бодрейтом 100000 и с инвертированным пином TX. То есть в стандартном UART сигнал «1» передается низким напряжением на пине, а сигнал «0» — высоким, а в интерфейсе SBUS — наоборот.

Мне не удалось найти однозначное объяснение, зачем так было сделано. На форумах выдвигаются разнообразные версии: «исторические» причины, экономия энергии, сознательное усложнение reverse-инжиниринга интерфейса (см. одно из обсуждений).

Я собирал дрон с уверенностью, что ESP32 не может работать с такой инвертированной логикой, поэтому использовал внешний инвертор (продается на Ali, стоит копейки, однако занимает немало места на моем миниатюрном дроне). Благодаря комментариям к моему ролику на YouTube я узнал, что ESP32 содержит в себе встроенный инвертор пинов, надо лишь активировать его, и тогда внешний инвертор будет не нужен.

В старой версии библиотеки для работы с SBUS, которую я использую, нет возможности передать флаг о необходимости инверсии пина в качестве параметра, поэтому я решил изучить возможность включения этой инверсии «вручную». Изучив API ESP32-Arduino я нашел такую возможность. Это делается при помощи нестандартной функции Serial.setRxInvert().

Недолго думая, я добавил включение этого внутреннего инвертора в код flix. Правда сейчас у меня под рукой нет сетапа, где SBUS-приемник был бы подключен к ESP32 напрямую, поэтому я не знаю, насколько он рабочий. Просьба к тем, у кого будет возможность проверить, прислать результаты проверки!

В итоге, удалось упростить схему квадрокоптера, убрав из нее инвертор. Кроме того, благодаря обсуждению, инициированному в чате, я обнаружил, что в плате ESP32 Mini, которую я использую, на входе 5В установлен тот же стабилизатор напряжения, что и на плате IMU (ME6211), то есть он сможет питаться от Li-Po батареи. Поэтому я убрал усложнявшее схему питание ESP32 через IMU. Смотрите сильно упрощенную схему, по которой я собираюсь собирать новый дрон, в комментариях. ▶️
🔥8👍7
Flix: разработка полетного контроллера с нуля
Реализовано управление с телефона Многие об этом спрашивали, и вот, наконец-то получилось реализовать парсинг MAVLink-сообщений и поддержку сообщения для управления дроном при помощи QGroundControl, с телефона (MAVLink-сообщение MANUAL_CONTROL). Честно…
Media is too big
VIEW IN TELEGRAM
По просьбе пользователя, полет с телефонного пульта в симуляторе также реализован. Для этого достаточно запустить приложение QGroundControl на телефоне в той же сети, и оно подключится к симуляции автоматически. Далее надо включить в настройках Virtual Joystick (чекбокс Auto-Center Throttle должен быть выключен), и можно летать в симуляторе!

Для этого я реализовал для симулятора функции из прошивки sendWiFi и receiveWiFi, которые отправляют и принимают широковещательные (broadcast) UDP-пакеты с MAVLink-сообщениями.

Если у вас есть в доступе машина с Linux или macOS, попробуйте запустить мой симулятор: для этого есть подробные инструкции. Будет очень интересно получить фидбэк, работает ли на вашей машине симулятор flix и управление с телефона.
👍13🔥9
Media is too big
VIEW IN TELEGRAM
Сделал видео, иллюстрирующее работу Low-pass-фильтров (LPF) в алгоритме управления Flix. См. патч функции interpretRC для этого видео.

LPF (фильтр нижних частот) оставляет в сигнале только низкие частоты, отсекая частоты выше определенного порога (cutoff frequency). Этот фильтр сглаживает сигнал, убирает из него вибрации и шум. Он является одним из ключевых звеньев в алгоритмах управления роботами.

LPF в алгоритме управления моим дроном применяется к:

1. Угловой скорости, полученной с гироскопа (Rates LPF).
2. D-члену PID-регуляторов по угловой скорости (Rates D LPF). В моей реализации PID есть встроенный LPF для этой цели.

Как видно из видео, первый фильтр не оказывает особенного влияния на полет. Но надо учитывать, что IMU MPU-9250 имеет встроенную фильтрацию (184 Гц по умолчанию).

Второй же фильтр оказывает критичное влияние, без него дрон летает нестабильно. Это происходит потому, что D-член PID-регулятора реагирует на скорость изменения ошибки управления и крайне чувствителен к любому входному шуму. Фильтрация D-члена PID-регулятора — это типовой паттерн, и он применяется в самых разных контроллерах, включая PX4 и Betaflight.

В симуляторе этот эффект также проявляется благодаря тому, что в нем есть имитация шума датчиков. Хотя модель в симуляторе не совсем идентична реальности. Например, в модели моторов не учтена задержка управления, поэтому эффект в симуляторе меньше.
👍17🔥7
Flix: разработка полетного контроллера с нуля pinned «О чем будет этот канал Я собираюсь сделать блог по теории и практике создания полетного контроллера квадрокоптера. В процессе создания своего дрона на ESP32 я открыл для себя кучу интересного по теории автоматического управления, инженерии, и собираюсь этим…»