Flix: разработка полетного контроллера с нуля
1.91K subscribers
35 photos
24 videos
2 files
58 links
По всем вопросам @okalachev
Чат обсуждения: @opensourcequadcopterchat
GitHub: https://github.com/okalachev/flix
Учебник: https://quadcopter.dev
Download Telegram
This media is not supported in your browser
VIEW IN TELEGRAM
Это — самый первый летающий Flix на бесколлекторных моторах!

Пользователь @chkroko проявляет впечатляющую активность и теперь успешно собрал дрон на бесколлекторниках. Используется ESC SpeedyBee Mini V2 4-в-1, причем он подключен по интерфейсу DShot (не PWM). DShot — это цифровой интерфейс, который, в отличие от PWM, не требует калибровки, поддерживает реверс и телеметрию.

Как я и предполагал, алгоритм управления не потребовал никакой модификации для работы с BLDC — многие об этом спрашивали. Сам патч для поддержки DShot можно увидеть здесь. Используется библиотека DShotRMT (с правками).

Как всегда, сборка добавлена в «официальный» реестр сборок, там указаны все подробности и дан полный список компонентов. #user
🔥51👍1732🏆1🍾1
🐍 pyflix — Python-библиотека для Flix

Это большое нововведение в проекте! Теперь возможно получать доступ к Flix из Python-скрипта (по Wi-Fi): читать телеметрию, выполнять команды, управлять полетом (эта часть в разработке).

Как обычно, дизайн библиотеки построен по принципу простоты и минимализма. Вся работа происходит через объект класса Flix:


from pyflix import Flix
flix = Flix() # создаем объект и ждем подключения


Телеметрия читается через поля объекта, причем их имена соответствуют именам глобальных переменных в коде прошивки:


flix.mode # текущий режим
flix.armed # заармлен ли дрон
flix.landed # на земле ли дрон
flix.attitude # текущая ориентация
flix.rates # угловые скорости
flix.channels # каналы с RC
flix.motors # выходы на моторы
flix.acc # данные акселерометра
flix.gyro # данные гироскопа


Библиотека построена вокруг паттерна Observable — предусмотрена возможность реакции на события:


flix.on('connected', lambda: print('Есть подключение'))
flix.on('disconnected', lambda: print('Подключение потеряно'))
flix.on('print', lambda text: print(f'Flix: {text}')) # вывод консоли дрона


Кроме того, можно ждать наступления событий, в том числе с условием:


gyro = flix.wait('gyro') # ждем новых данных гироскопа
attitude = flix.wait('attitude') # ждем обновления ориентации
flix.wait('armed', value=True, timeout=10) # ждем арминга
flix.wait('motors', value=lambda motors: not any(motors)) # ждем, когда все моторы остановятся


Доступна работа с параметрами и CLI:


pitch_p = flix.get_param('PITCH_P') # прочитать параметр
flix.set_param('PITCH_P', 5) # установить параметр
imu = flix.cli('imu') # выполнить команду
flix.cli('reboot') # перезапустить дрон


Запланировано автоматические управление полетом (пока не работает):


flix.set_position() # управление позицией
flix.set_attitude() # управление ориентацией
flix.set_rates() # управление угловыми скоростями
flix.set_motors() # управление моторами
flix.set_controls() # управление "стиками" (уже работает)


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

Библиотека уже доступна в pip (pip install pyflix) и работает как с реальным дроном, так и с симулятором. Ее можно попробовать прямо сейчас. Что думаете? Что добавить или изменить в API?
🔥41👍10🏆21
⚡️Первое настоящее испытание Flix «в полях».

Мой проект будет использован в качестве платформы в проектной смене «Роболагерь» в лагере «Пионер» под Питером. В течение этой и следующей недели 9 школьников будут собирать дроны Flix и пытаться заставить их полететь, причем желательно автономно (если повезет!).

Компоненты закуплены, в том числе много дополнительных — всевозможные варианты ESP32, ESP32-CAM, IMU, дальномеры, барометры и другие датчики.

Я тоже туда приеду через пару дней — обязательно напишу, как все пройдет и что у ребят получится.

Пишите — какие проекты можно попробовать реализовать в рамках такой смены?
🔥63👍218🎉3🤯1🏆1
Добрался до Роболагеря. За эти несколько дней все участники уже собрали свои квадрокоптеры, и больше половины из них уже успешно полетели! 🎉

Дети самостоятельно спроектировали и изготовили рамы для дронов (по мотивам моей). Используется как 3D-печать, так и лазерная резка по дереву — оба типа рамы успешно летают. Летаем с пульта BetaFPV через Wi-Fi.

Из модификаций: собственно, кастомные рамы, buck-boost-конвертеры для питания, многие поставили на дроны ИК-дальномеры. На один из дронов будет установлен датчик PMW3901 (optical flow). Еще один участник заводит дрон на плате ESP32-CAM. На этой плате не хватает пинов для моторов, и поэтому команды управления моторами будут передаваться на вспомогательный AVR, который будет генерировать PWM-сигналы.

В качестве основных задач смены пока думаем про: удержание высоты по дальномеру (реально), obstacle avoidance (реально), удержание позиции по optical flow-датчику (посложнее), автономный полет.
🔥41👍183🎉2
Media is too big
VIEW IN TELEGRAM
⚡️Автоматический полет Flix!

Параллельно смене реализую новый режим AUTO для автоматических полетов, управляемых Python-скриптом (или самой прошивкой).

В этом режиме дрон игнорирует команды пилота с пульта и выполняет текущие attitudeTarget, ratesTarget и thrustTarget. В Python-скрипте они задаются функциями flix.set_attitude(), flix.set_rates().

Дрон переводится в автоматический режим функцией flix.set_mode('AUTO'), выводится — любым движением стиков на пульте.

Исходник скрипта для тестового полета: https://gist.github.com/okalachev/da807e2450d0235abce4966478c12ce4.

Сейчас этот режим уже можно протестировать — используйте ветку auto прошивки и последнюю версию библиотеки pyflix.

Новости по смене — дети уже получили очень интересные результаты (кстати, на видео дрон одного из участников). Подробнее — в следующих постах!
👍23🔥8🤩31
This media is not supported in your browser
VIEW IN TELEGRAM
Видео с успешной реализацией упрощенного варианта Obstacle Avoidance от одной из участниц Роболагеря.

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

Что важно, дети реализуют эту функцию непосредственно изменяя код полетной прошивки, а не управляя ей извне. Ключевой модификацией является подмена угла по тангажу в кватернионе attitudeTarget обратно пропорционально расстоянию до препятствия.
🔥35👍15👏9
Media is too big
VIEW IN TELEGRAM
Собрал итоговое видео по Роболагерю. Показал основные этапы работы ребят и атмосферу.

Также на Ютубе: https://youtu.be/Wd3yaorjTx0.

Мои выводы по смене — в следующем посте!
🔥45👍113👏3🏆1
Мои выводы по Роболагерю

Вообще, лично для меня это очень большая история: когда я разрабатывал Flix, я совершенно не был уверен, что удастся его хоть куда-то внедрить и что он вообще будет существовать больше, чем в одном экземпляре. В случае с Роболагерем — спасибо Павлу Томшину, который поверил в проект и проявил инициативу попробовать использовать Flix там.

Собственно, выводы.

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

2️⃣ Существенным отличием этой смены от других похожих было то, что участники непосредственно модифицировали код полетного контроллера квадрокоптера. Это было возможно именно за счет его простого дизайна. Такой подход дает более глубокое понимание полетного алгоритма, чем работа с контроллером, как с черным ящиком. Дети смогли модифицировать прошивку для реализации некоторых элементов автономного полета — удержание высоты, obstacle avoidance, автоматический взлет и посадка (без удержания позиции).

3️⃣ Как я и ожидал, использование чистого Arduino IDE — это большой плюс. Все участники смогли разобраться со сборкой и модификацией прошивки, и на это ушло совсем немного времени.

4️⃣ Мы не использовали RC-приемники — только Wi-Fi соединение. Всего было два пульта BetaFPV LiteRadio 3, которые подключались по USB, и их вполне хватало на 9 участников.

5️⃣ Деревянная рама показала себя не хуже, чем 3D-печатная. Тип рамы можно выбирать в зависимости от оборудования в наличии.

6️⃣ Многие спрашивали про плату ESP32-CAM — на ней запустить дрон так и не удалось. Во-первых, не заработала IMU через SPI, во-вторых, были сложности с подключением моторов через вспомогательный контроллер. Короче говоря, на ней тупо слишком мало пинов.

7️⃣ По ходу смены был разработан прототип режима AUTO и библиотеки pyflix, но активно мы его не использовали.

Краткое описание мероприятия добавлено в статью с пользовательскими сборками. Постараюсь также собрать спроектированные STL-файлы и добавить их туда.

У кого еще есть идеи и предложения по использованию платформы Flix — пишите, я к ним открыт!
🔥52👍14👏95🏆2🍾2
Большой рефакторинг и новые фичи

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

Рефакторинг подсистемы управления. Теперь код интерпретации команд от пилота полностью отделен от кода контуров управления полетом. Функция interpretControls конвертирует положение стиков и режим в универсальную команду управления, которая затем и используется подсистемой управления (без знания о том, откуда эти команды взялись и какой именно сейчас установлен режим). Она состоит из 5 переменных:

1. attitudeTarget — целевая ориентация.
2. ratesTarget – целевая угловая скорость.
3. ratesExtra – дополнительная угловая скорость, добавляется к ratesTarget.
4. torqueTarget — целевой крутящий момент.
5. thrustTarget — целевая общая тяга.

Если какая-то из них установлена в NAN, это значит, что соответствующий ей контур управления надо пропустить. Так, для режима STAB задаются attitudeTarget, thrustTarget и ratesExtra (для управления угловой скоростью по рысканию), для режима ACRO — ratesTarget и thrustTarget, а для режима AUTO возможен любой вариант, в зависимости от того, чем именно мы хотим управлять.

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

Механика арминга/дизарминга теперь аналогична PX4/ArduPilot. То есть чтобы заармить дрон, левый стик нужно переместить вниз-вправо (после этого моторы закрутятся), а чтобы задизармить — вниз-влево. Я очень долго думал, но так и не смог придумать более простой и при этом безопасный вариант, а фактическое отсутствие механизма арминга на практике оказалось небезопасным.

В документации теперь есть инструкция по пилотированию дрона (включая арминг/дизарминг и режимы).

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

Добавлены новые CLI-команды: arm, disarm, stab, acro, auto — для арминга/дизарминга и переключения режимов из консоли.

Все эти нововведения никак не усложнили код (а местами его упростили, например, код подсистемы управления стал короче). Но при этом прошивка становится более юзабельной и расширяемой.
🔥33👍181🙏1
И снова мероприятие с Flix!

Мой рассказ о смене в «Роболагере» привлек внимание, и другие организации тоже заинтересовались проведением у себя чего-то подобного.

С сегодняшнего дня в школе № 548 в Москве начался курс/мастер-класс по Flix, с моим участием. Курс займет несколько недель и будет состоять из 4-5 занятий. Постараюсь еще более глубоко осветить тему полетных алгоритмов, чем это было в «Роболагере». По ходу курса участники самостоятельно спроектируют и соберут дроны с прошивкой Flix, а также, надеюсь, реализуют какие-то интересные модификации, которые я освещу в этом канале.

Уровень IT-класса в школе крайне высокий — на робототехнику выделен чуть ли не целый этаж. В школу ездят ученики со всей Москвы. Несколько участников курса уже даже заранее собрали дроны, правда, пока ни один не полетел.

Сегодня я читал вводную лекцию по БПЛА и по устройству Flix. На следующую неделю ребята получили домашнее задание, собственно, спроектировать и изготовить раму для дрона. Посмотрим, что у них получится!
🔥42👍179❤‍🔥3🏆2👏1🎉1
В субботу прошло второе занятие нашего экспериментального курса по Flix в школе № 548.

Делал лекцию по электронике дрона — разбирал, что к чему подключено и почему именно так. Изучали подключение моторов через MOSFETы, коснулись основ электричества, интерфейсов (UART, I2C, SPI).

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

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

По результатам: большинство учеников уже изготовили свои рамы, и многие даже установили компоненты. Рамы сделали кто во что горазд, не копируя дословно референсную (и я этого и хотел). Есть интересные, странные и необычные решения.

На следующем занятии — настройка и полетные испытания.
🔥54👍171👏1🏆1
Вчера было третье занятие курса в школе № 548. На этот раз это была свободная работа — настройка дронов и тестовые полеты.

🎉 И по итогу почти все собранные дроны полетели! Я смонтировал небольшое видео с полетами и атмосферой.

Из наиболее интересного: чувак собрал самодельный пульт, который должен управлять дроном по протоколу ESP-NOW (см. фото). Его мы пока не завели, тут задача добавить поддержку ESP-NOW в Flix.

Также дрон с удлиненными лучами и пропеллерами 65 мм, он удивительно хорошо и плавно летает, отлично управляется.

Специально для мероприятия я завел ветку в репозитории: school-548. Пока там фичи для решения проблем со связью при большом количество количестве дронов: сделана возможность подключения к роутеру вместо раздачи Wi-Fi, а также отключена рассылка телеметрии, пока дрон не обнаружит QGroundControl, чтобы не забивать эфир.

Дальше мы будем заводить все фичи ребят и пробовать делать автономные/полуавтономные полеты с использованием дальномеров.
🔥38👍8👏1
Flix: разработка полетного контроллера с нуля
flix2-draft.pdf
Пока в Курсе возникла пауза, я решил наконец возобновить работу над платой. Тем более что про нее продолжают спрашивать.

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

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

Я переработал схему, учел комментарии к прошлому посту (в частности, добавил токоограничивающие резисторы перед mosfet'ами), вывел больше пинов на «гребенки», исправил пин для измерения напряжения (ADC на GPIO15 не работает вместе с Wi-Fi).

Оставшиеся вопросы:

1️⃣ Как наиболее оптимально организовать питание ESP32 и других компонентов. Использовать более редкий buck-boost TPS63021 с фиксированным напряжением 3.3 В или TPS63020 с регулируемым выходом? Или поставить boost до 5 В с последующим LDO до 3.3 В, как сделано на некоторых платах?

2️⃣ Как сделать, чтобы плата корректно работала и от аккумулятора, и от USB, от обоих источников одновременно. Сейчас эти линии питания просто соединены напрямую, и это явно не будет работать. Мне нужны какие-то референсы, как это правильно организовывается.

3️⃣ В версии с камерой видимо придется управлять моторами через внешний I2C ШИМ-контроллер, потому что пинов не хватает. А лучше бы через готовый I2C-драйвер для 4 (или больше) коллекторных моторов, но такой я пока не нашел.

Буду рад вашим советам! Свежую версию схемы я приложу в комментариях. ▶️
👍134