Веб-версияОткрыть в Telegram
FFlix: разработка полетного контроллера с нуля

Flix: разработка полетного контроллера с нуля

@opensourcequadcopter · канал · Технологии · в индексе с 2026-07-13
2 302подписчиков+4 за неделю
1 061средний охват поста
46.1%ER — охват к подписчикам
7постов за 30 дней
Фотография
нажмите — покажем
Смена в Роболагере в самом разгаре — большая часть дронов уже летает. Вообще, такое мероприятие это идеальный способ тестирования Flix. В каком-то смысле это даже лучше, чем профессиональные тестировщики. Мы намеренно не даем участникам доскональную схему сборки, даем возможность экспериментировать с компонентами, дизайном рамы, электроникой и, конечно, модификацией прошивки. Для проекта это большой плюс, потому что позволяет проверить сразу много самых разных вариантов использования. Для детей это тоже плюс. Я думаю, что самому решать неожиданные возникающие проблемы интереснее, чем собирать готовый выверенный комплект. По ходу смены я сделал много правок в документации, исправил баги в прокси для ESP‑NOW и добавил туда функцию автоматического поиска по каналам. Еще я добавил новый фейл-сейф: отключение пропеллеров в случае переворота дрона, он действительно оказался нужен. Обнаружили периодические креши из-за системы логирования, пока ее отключили. Один из участников уже смог реализовать удержание высоты! Теперь будем экспериментировать с удержанием позиции. Установили сверху полигона камеру, которая будет находить дрон и передавать ему координаты. Итоговая задача, которую мы придумали для соревнования: автоматический взлет и удержание позиции (с использованием любых доступных датчиков). Чей дрон дольше провисит в заданной области, тот и выиграет.
4 · 1.2K ·
O
Фотография
нажмите — покажем
Видео
IMG_1659 (1).mp4 · 24.5 МБ · нажмите — покажем
Видео
IMG_1663.converted.mp4 · 8.4 МБ · нажмите — покажем
3 · 2.5K ·
O
Видео
IMG_1789 (1)-1-2.mp4 · 35.4 МБ · нажмите — покажем
Первый полет с удержанием позиции Задача автоматического удержания позиции оказалась совсем не простой для ребят (и связь отваливается, и esp’шки сгорают, и еще всякое), несколько человек уже были близки, но сегодня, в последний день перед финальными испытаниями, один из участников смог ее решить! На видео самый первый успешный полет. Используется верхняя камера, дальномер, связь через библиотеку pyflix, простые пиды по трем координатам. Осталась еще одна пара, посмотрим, у кого что получится. Эра автономки на Flix открыта.
12 · 2K ·
O
Видео
IMG_1898.MOV · 19.6 МБ · нажмите — покажем
Сегодня были финальные испытания. И целых два дрона смогли стабильно удерживать позицию дольше 2 минут. Победил @edkaya2320 с дополнительными баллами за крутейшее техническое решение: реализована полноценная навигация с выбором целевой точки по клику. В итоге дети смогли за 9 дней собрать дроны, разработать систему компьютерного зрения, передачу данных на дрон и простейший position control, причем он работает довольно неплохо. Думаю, что это реально крутой результат. Позже напишу более подробные выводы по смене.
19 · 1.8K ·
O
Видео
good-pos-control-2.mp4 · 14.9 МБ · нажмите — покажем
Фотография
нажмите — покажем
Дизайн простого position control для квадрокоптера @edkaya2320 выложил свою реализацию position control на GitHub, и можно посмотреть, насколько она проста по дизайну. Код там слегка сумбурный, но он сделан в рамках смены, так что это нормально. В целом, это обычный трехмерный PID-регулятор. ↔️ Горизонтальная позиция дрона определяется по камере, закрепленной сверху. Поиск делается классическим методом: обнаружение дрона по цвету (дрон обклеен зеленой лентой), поиск контуров, выбор наибольшего контура, расчет центра масс контура для определения координат. Затем эти координаты передаются на дрон в MAVLink-сообщении VISION_POSITION_ESTIMATE. Это делается через библиотеку pyflix и ESP-NOW. Дрон принимает эти координаты и передает их в два PID-регулятора, который сразу рассчитывает требуемые углы по pitch и roll. Эти углы ограничиваются, чтобы дрон мог перелетать из точки в точку без слишком резких наклонов. При запуске дрон должен быть ориентирован так, чтобы оси координат изображения совпадали с его собственными осями координат, иначе удержание позиции работать не будет. ↕️ Удержание высоты работает при помощи лазерного дальномера VL53L1X. При обновлении данных расстояние отправляется в PID. Чтобы получить итоговый уровень газа, к выходу PID добавляется константа heightC (газ висения). Чего здесь нет: 🔹Фильтра Калмана. 🔹Использования акселерометра для расчета скорости и позиции. 🔹Вообще расчета скорости и velocity control в каком-либо виде. 🔹Калибровки камеры. И даже с таким простым алгоритмом получается довольно хорошее удержание позиции. Конечно, на видео я выбрал удачный фрагмент, но тем не менее. Видимо, очень многое зависит от качества полета дрона в принципе, а не только от сложности алгоритма. Теперь я собираюсь добавить position control в основную прошивку. Возможно, именно такой простой вариант, раз уж он работает.
12 · 2.3K ·
O
Фотография
нажмите — покажем
Результаты Роболагеря 1️⃣ Я сменой доволен. Дети за девять дней сделали реально работающую систему для position control квадрокоптера. Я даже не знаю, чтобы где-то было что-то аналогичное в рамках образовательного мероприятия. И получился первый осмысленный автоматический полет Flix. 2️⃣ Нашли баги/проблемы, это хорошо. Многое было починено по ходу. Переделаны некоторые части кода, добавлен фейлсейф по перевороту. 3️⃣ Я специально поменял Wi-Fi на ESP-NOW, учитывая какие проблемы с связью были в прошлом году, но это как-то не очень помогло. Связь с дроном все равно работала нестабильно. Ожидал от ESP-NOW большего. Возможно, это из-за большого количества Wi-Fi точек, а может что-то мы не так делали. Тут надо думать. С такой связью разрабатывать сложно. 4️⃣ В день соревнований между участниками завязалась настоящая полемика. Те, кто не выиграл, обвинили победителей в использовании вайбкодинга. Мол, это неспортивно и нечестно. Победители действительно активно использовали ИИ, и мы это никак не регламентировали. Результаты остались в силе. А как вы думаете, допустимо ли использование ИИ/агентов на подобных соревнованиях или нет?
3 · 2.1K ·
O
Фотография
нажмите — покажем
Каково же было мое удивление, когда в поисках вдохновения я загуглил 8520 quadcopter frame и на первой же странице увидел собственную раму для Flix, продающуюся на индийском Амазоне (!), по цене 215 рупий (с 64-процентной скидкой). Не знаю, зачем это кому-то может быть нужно, ведь ее очень легко распечатать, но, видимо, покупают, раз продается. Причем они даже взяли мою фотографию, но зачем-то перекрасили ее нейронкой в черный цвет. Ссылку на оригинал они оставить забыли. Еще я как-то нашел такой китайский проект: https://github.com/songge8/CF-Drone. Это коптер на печатной плате, прошивка полностью базируется на моей, только переведена на китайский. Из кода убраны все мои копирайты, и им даже хватило наглости добавить туда свои. Вообще, меня удивляет насколько непринужденно люди убирают копирайты из кода, который они берут, как будто они там стоят для красоты. Я создал issue с просьбой вернуть копирайты обратно и добавить ссылку на оригинал, но спустя месяц автор так и не отреагировал.
9 · 2.4K ·
O
Уменьшаю степень гиковости прошивки Наконец-то доделал несколько фич, которые хотел сделать еще до Роболагеря. Они делают прошивку проще для тех, кто просто хочет собрать дрон, а не разбираться в коде (таких оказалось довольно много). 1️⃣ Полная конфигурация IMU из QGroundControl (commit) IMU теперь конфигурируется параметрами: 🔹Выбор модели IMU (IMU_MODEL) и шины подключения (IMU_BUS). 🔹Настройка кастомных пинов для подключения (IMU_PIN_SCK, IMU_PIN_MISO, IMU_PIN_MOSI, IMU_PIN_CS, IMU_PIN_SCL, IMU_PIN_SDA, IMU_PIN_INT). Это последнее критичное, что можно было настроить только изменением исходника. До этого я уже добавил параметры для настройки пинов моторов, пина RC-приемника и пина измерения напряжения — теперь все это меняется динамически. Прошивка Flix стала универсальной, и поэтому теперь есть... 2️⃣ Предсобранные бинарники (commit) Бинарники выкладываются автоматически на каждый коммит и теперь всегда будут доступны по таким красивым ссылкам: 🔹quadcopter.dev/flix.esp32.merged.bin — для классической ESP32. 🔹quadcopter.dev/flix.esp32c3.merged.bin — для ESP32-C3. 🔹quadcopter.dev/flix.esp32s3.merged.bin — для любого ESP32-S3. 🔹quadcopter.dev/flix.esp32s3.opi.merged.bin — ESP32-S3 с OPI PSRAM (8/16MB). 🔹quadcopter.dev/flix.esp32s3.qspi.merged.bin — ESP32-S3 с QSPI PSRAM (2MB). Тип подключения PSRAM, увы, можно выбрать только на этапе компиляции, поэтому это минимальный набор сборок, который я смог родить, чтобы покрыть все более-менее популярные платы на ESP32. Теперь любой может накатить прошивку прямо из браузера, используя вот этот веб‑прошивальщик, вообще без установки каких-либо программ — это реально работает, я проверил. Использовать Arduino IDE/arduino-cli не обязательно. Инструкция. Конечно, на ивентах мы по-прежнему будем собирать прошивку, это важная часть философии, но наличие бинарников понизит порог входа. 3️⃣ А еще собирается бинарник для платы Flix2: quadcopter.dev/flix.flix2.merged.bin. Он полностью преднастроен, ready-to-fly. Я добави
7 · 2.2K ·
Фотография
нажмите — покажем
Где перед? У моей платы уже целых два пользователя (в качестве альфа-тестеров), и в принципе, она летает. Сейчас делаю третью ревизию, и вот думаю: а не стоит ли мне ее перевернуть? Конечно, ориентацию можно задать софтверно, но рисунки и надписи на плате софтверно не задашь, они физические. Мне интересно узнать ваше мнение. Как вам кажется, где у этого дрона перед?
2 · 2.1K ·
O
Видео
camera-2.mp4 · 43.5 МБ · нажмите — покажем
Я не мог отправить в производство 3-ю (надеюсь, финальную) ревизию платы Flix2 без того, чтобы проверить ключевую фичу — возможность навигации с использованием камеры. Для тестов я использовал камеру на основе датчика OV2640 с углом обзора 66°. Я специально взял камеру почти без искажений, чтобы расчет 3D-позиции маркеров был проще. Вот, что у меня получилось: ✅ Стриминг картинки с камеры в полете — работает. Я запускаю его в отдельном FreeRTOS-потоке, и он не влияет на полетный алгоритм. Поскольку эта камера умеет отдавать JPEG, по сути MJPEG-стрим просто перекладывает байты из камеры прямо в TCP и почти не потребляет ресурсов. Задержка минимальная, особенно на разрешении 320x240, хотя думаю, что можно сделать еще меньше, если попробовать передавать данные с потерями. ✅ Также завелось распознавание маркеров — причем прямо на ESP! Я использую библиотеку apriltag-esp32, распознавание также запускается в отдельном потоке. Конечно, время распознавания оставляют желать лучшего (~300 мс), но все-таки это микроконтроллер. Круто, что ESP32 в принципе может это делать, да еще и одновременно с полетом. Библиотека не только распознает маркеры, но и рассчитывает их координаты, что я и собирался использовать для удержания позиции. ❌ А вот удержание позиции по маркеру вот так сходу не заработало. В основном дрон просто сваливает в случайном направлении. Возможно, задержка слишком большая или алгоритм position control слишком примитивный. Я попробую оптимизировать алгоритм и разные другие идеи, на худой конец буду распознавать маркер на внешнем компьютере, а не на борту. Есть еще идея оставить задачу навигации по маркерам на какое-то из мероприятий, типа Роболагеря. Она сложная, но все-таки мне кажется, что это реально. Но главное это то, что камера работает, и работает неплохо. И даже силовые линии на моторы не создают каких-то особых помех, как я предполагал, а ведь там рядом еще и DC-DC с индуктивностью.
11 · 1.9K ·
O
Добавляем Flix в MAVLink Думаю, мой проект дорос до уровня, когда он может официально стать частью MAVLink — протокола, который используется для связи дрона и наземной станции. Я создал заявку с добавлением идентификатора для Flix в MAV_AUTOPILOT. Предлагается новая запись MAV_AUTOPILOT_FLIX со значением 21. Зачем это нужно: ▶️ Во-первых, это позволит программам (например, Mavlink Joystick от @goldarte или mavros) отличать Flix от других автопилотов. Они смогут корректно обрабатывать полетные режимы, параметры и все прочие особенности моей прошивки. ▶️ Во-вторых, это позволит другим разработчикам и пользователям узнать о существовании Flix. Официальное включение в MAVLink даст проекту намного больше видимости. ▶️ И в-третьих, это просто почетно. Протокол MAVLink используется очень широко, и иметь там свою запись для проекта это круто, тем более, что реально живых автопилотов там не так уж и много. Теперь ждем, что ответят разработчики. Надеюсь, текущий политический контекст не повлияет на их решение.
5 · 1.8K ·
O
Oleg KalachevДобавляем Flix в MAVLink Думаю, мой проект дорос до уровня, когда он может официально стать частью MAVLink — протокола, который используется для связи дрона и наземной станции. Я создал заявку с добавлением идентификатора для Flix в MAV_AUTOPILOT. Предлагается новая запись MAV_AUTOPILOT_FLIX со зна
Фотография
нажмите — покажем
Ну что ж, никакие негативные факторы не повлияли и мой PR вмержили! Новое значение MAV_AUTOPILOT уже появилось на сайте. Я уже обновил библиотеку mavlink-arduino и (в торжественной обстановке) поменял значение HEARTBEAT.autopilot в прошивке, и вроде все работает.
5 · 1.8K ·
O
Фотография
нажмите — покажем
Фотография
нажмите — покажем
Метаданные параметров QGroundControl умеет красиво показывать параметры прошивки, для этого ему нужен файл ее метаданных. В обсуждении PR про MAV_AUTOPILOT_FLIX меня навели на мысль попробовать раздавать этот файл в виде внешнего URL, и это сработало! См. красивые параметры Flix на скриншотах. Вообще метаданные это JSON-файлы с информацией о том, как работать с прошивкой. В случае параметров это их тип, текстовое описание, единицы измерения, минимум/максимум, и, что важно, список возможных значений. Работает все это так. Сначала QGC запрашивает у автопилота general-метаданные, автопилот отвечает ссылкой на general.json и его CRC. В этом general.json есть ссылка на json с метаданными параметров и также его CRC. QGC загружает и этот json, кэширует его, и дальше уже использует для красивого рендеринга параметров. По мне, чересчур замысловато (зачем несколько json?), но вот так уж устроен MAVLink. Все это я реализовал, причем малой кровью — всего +8 SLOC в основном коде (да, я их считаю). Добавлена обработка запроса сообщения COMPONENT_METADATA. И теперь QGC показывает описания параметров, красивый выбор модели IMU, режима Wi-Fi. Угловые параметры отображаются в градусах, а не в радианах! Собственно, Flix просто передает QGC вот такие ссылки: 🔹https://quadcopter.dev/meta/2566517357/general.json 🔹https://quadcopter.dev/meta/3307474483/parameters.json Правда, без интернета это не будет работать, и это существенный минус. Для работы без интернета надо вкручивать mavftp, но я пока не очень хочу добавлять такой огромный кусок кода в Flix ради этого. Уязвимость в QGC По ходу работы обнаружилась смешная уязвимость. Когда QGC загружает файл, он на самом деле НЕ проверяет его CRC, а просто сразу использует этот CRC в качестве ключа для кэша. А что если — подумал я — положить туда CRC от файла параметров какого-нибудь другого полетника, например PX4? Неужели, сработает? И да, так и вышло. Я могу как угодно описать параметры PX4, в том числе подменить описания каких-то о
2 · 1.8K ·
O
А теперь важные новости для проекта. В начале ноября мы планируем провести образовательную смену по мотивам Роболагеря, но только на этот раз — с платами Flix2. Это будет первая настоящая проверка. Идею поддержал образовательный центр «Созвездие» в Курганской области. Теперь всего за полтора месяца мне нужно изготовить две партии новых плат — сначала проверочную, а потом полноценную. И очень желательно нигде при этом не налажать. Оставшиеся после смены платы я выложу в свободную продажу. Сейчас я рассматриваю варианты, где их можно произвести. Если у вас есть проверенный производитель плат, полностью под ключ, включая доставку в Москву, пожалуйста, напишите мне в личку.
5 · 1.8K ·
O
Видео
led2.converted.mp4 · 31.9 МБ · нажмите — покажем
Пока я жду новую версию платы, решил вкрутить в прошивку поддержку RGB-светодиода, который на ней есть, а точнее даже поддержку полноценной светодиодной ленты. Причем оказалось, что в ESP32 даже есть встроенное API для управления RGB-светодиодом — rgbLedWrite(). Правда только одним, для ленты не подходит. Еще я смотрел на библиотеку FastLED, но она мне не понравилась. Слишком монструозная. И добавляет аж 300 Кб оверхеда к размеру прошивки, так что она даже перестает вмещаться в дефолтный partition scheme ESP32. Для такой простой функции это перебор. В итоге, раз уж сейчас век ИИ, я заиишил свой собственный драйвер для светодиодов, который занимает всего 140 строк, и добавил его в библиотеку FlixPeriph. Что важно, отправка команд на светодиоды работает асинхронно, то есть ее можно вызывать из основного цикла без всякой многопоточности. Что получилось В прошивку добавлена поддержка RGB LED в виде следующих параметров: 🔹LED_TYPE — тип светодиодки (0 — обычный LED, 1 — WS2812). 🔹LED_PIN — номер пина. 🔹LED_COUNT — количество светодиодов в ленте. 🔹LED_BRIGHTNESS — яркость светодиодов (от 0 до 1). Конечно, все эти параметры (включая номер пина) работают динамически, и любой можно поменять прямо на лету. Также я предусмотрел 3 анимации: заполнение (fill), мигание (blink) и радуга (rainbow). Анимацию можно запускать из консоли: led fill 255 0 0 led blink 0 255 0 led rainbow Номер анимации и ее параметры занимают 4 байта, то есть удобно помещаются в один float-параметр. Поэтому я сделал параметры, которые задают анимацию для каждого полетного режима: LED_ANIM_RAW, LED_ANIM_ACRO, LED_ANIM_STAB, LED_ANIM_AUTO. Правда, их значения не будут читаемы для пользователя, хотя если сделать кастомную gcs, то все-таки будут. Но этот момент я еще не додумал. Поддержка в Python Из Python также можно включать анимацию (через консоль): flix.cli('led rainbow') И управлять отдельными светодиодами: flix.set_led(True) # включить светодиод flix.set_led((0, 127, 0)) # задать цвет пе
3 · 989 ·
O
Фотография
нажмите — покажем
Фотография
нажмите — покажем
Новые платы приехали! Цвет — шикарно белый. Все производство заняло всего 14 дней (включая доставку!), это невероятно быстро. Я уже чекнул USB, RGB-светодиод и IMU. Полет пока не проверял. А в довесок к платам мне прислали еще и лунные пирожки. Как я понял, кроме того, что это традиционный подарок на китайский Праздник середины осени, это еще и символ сотрудничества. Это прикольно.
2 · 921 ·

Открытая публичная лента из поискового индекса ChatCrawler — «Google по публичному Telegram»; обновляется по мере обхода площадки. Время — UTC.

Только публичный контент, официальный API Telegram. О проекте · Вопросы · Чего мы не делаем · Убрать страницу из выдачи · Каталог · Поиск · Как мы считаем