У нас в МАИ на 8 институте учатся будущие разработчики IT‑продуктов и софта для авиационных систем, аэропортов, логистики и много чего ещё интересного. Один из курсов с 2023 года мы решили посвятить разработке программного обеспечения для автопилота. В курсе всё как положено, с красивыми диаграммами регуляторов, кватернионами и кодами таких проектов как Ardupilot, PX4, Betaflight, iNav и другими.

Однако, довольно сложно сразу вкатиться в тему полетных прошивок — они переполнены всякими фичами и функционалом, так что неподготовленному разработчику сложно понять как же это всё работает. Поэтому долгое время я искал такой проект, который позволяет «на пальцах» объяснить как работает прошивка полётника. Таким проектом для меня стал Flix от Олега Калачева. Про опыт сборки проекта и изучения на его основе полетной прошивки со студентами и пойдет разговор в этой статье.

Оглавление

  1. Что нужно знать для понимания

  2. Проекты относительно небольших полетных прошивок и их коды

  3. Код прошивки Flix и чем он нам понравился

  4. Запуск в симуляторе Gazebo с телефоном вместо RC

  5. Схема и процесс сборки квадрокоптера

  6. Запуск собранного квадрокоптера с пультом RC

  7. Пару слов о том, как мы это использовали в учебном процессе

Что нужно знать для понимания

Чтобы программировать полетный контроллер квадрокоптера нужно как минимум понимать почему и как этот набор различного «железа» вообще летает. А для этого нужно знать конструкцию типового квадрокоптера и принципы управления. Плюс все коды написаны на C++ или даже LUA и как минимум C++ нужно изучить в части синтаксиса.

Далее будет нудный нужный текст про то что нужно знать чтобы программировать беспилотник. Те кто считают, что можно сразу приступать к программированию не зная основ могут его пропустить, наш девиз: Слабоумие и Отвага! но мы любим во всем детально разобраться.

Раз уж мы про программирование на Си, то для начала всегда рекомендую изучить синтаксис C++ благо для этого сейчас есть много готовых курсов и решений. Мы в МАИ пользуемся Хендбуком от коллег из Яндекса — изучить можно тут. В целом тем кто пройдет такой курс уже будет просто разобраться в коде и понять как все это работает. Плюс коллеги постоянно актуализируют Хендбук и следят за стандартами языка, поэтому даже тем кто и так всё знает бывает полезно его пролистать.

Дальше больше — многие наши программисты не видели как летает беспилотник и из чего он состоит, поэтому как минимум нужно разобраться как летает квадрокоптер. Например вот тут можно «на пальцах» понять как осуществляется управление и зачем квадрокоптеру 4 винта. После того как в целом стало понятно какой винт нужно ускорить, какой замедлить чтобы выполнить маневрирование уже можно переходить к более сложным материалам.

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

Запрос: электрическая схема квадрокоптера, Модель: Kandinsky 3.1
Запрос: электрическая схема квадрокоптера, Модель: Kandinsky 3.1

В целом нужно понимать, какие датчики можно установить на борт беспилотного летательного аппарата. Какой контроллер всё это может обрабатывать. На практике достаточно представлять, что аппарату требуется IMU, а для ориентации вне помещений можно использовать GPS. Про GPS можно отдельно посмотреть тут для глубокого понимания. Очень классная статья — рекомендую. Я «завис» на несколько часов.

Для задач управления используются PID регуляторы. Вот тут можно посмотреть, что это такое и «с чем его едят». Плюс представлять, что такое фильтрация сигналов, хотя бы в части понимания и общего представления про фильтрацию. Привет Электротехнике, которую очень часто забывают или вообще игнорируют.

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

Алексей Савватеев (источник Фото)
Алексей Савватеев (источник Фото)

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


© Алексей Савватеев

.

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

На этом в целом можно уже можно закончить нудную часть перейти к теме статьи.

Проекты полетных прошивок и их коды

Благодаря тому, что сейчас микроконтроллеры довольно дёшевы уже есть много проектов квадрокоптеров для самостоятельной сборки, часто имеющие свои полетные коды. Я принципиально стараюсь не рассматривать самые известные проекты — Ardupilot, PX4, Betaflight, iNav, как фактически уже промышленные решения. Попытаюсь найти небольшие проекты на которых становится понятно как работает полетная прошивка. То есть будем искать проекты для обучения на которых можно быстро понять основные принципы (с прицелом на последующее изучение промышленных решений) и при необходимости доработать всё что хочется.

Тот же проект betaflight начинался в 2015 году с совершенно небольшого объема кода и был довольно прост для изучения. Сейчас данный проект существенно больше, почти в 14.5 раз и ориентироваться в нём гораздо сложнее. Это прямая оценка по количеству строк кода без учета роста сложности.

Анализ количества строк кода прошивки betaflight от 2015 года
Анализ количества строк кода прошивки betaflight от 2015 года

Рассмотрим проекты полетных прошивок небольших квадрокоптеров на ESP32 и не только. Далее будут те проекты, которые удалось найти на обширных просторах интернета. Наверняка их больше, так что если в комментах накидаете ещё, буду рад расширить этот список.

Проекты квадрокоптеров и ссылки

Полетная прошивка

Краткое описание

Mini Arduino FPV Drone
(видео, материалы, код прошивки)

MultiWii
(медленный сайт прошивки)

Есть FPV, свой софт для заливки прошивки, свой кастомный пульт, все программируется и собирается с максимальным использованием Arduino совместимых компонентов, относительно дешевый, код поддерживает 10 мультироторных аппаратов, код хотя и разделен на модули требует времени на понимание

Crazyflie (видео, материалы)
его порт на Esp32
ESP S2 Drone
(видео, материалы, код прошивки)

Crazyflie
(описание)

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

Drone on ESP32 (видео, код)

MadFlight

Есть всё необходимое. Довольно много разных проектов на данном коде, но код уже весьма сложный для понимания, хотя и разделен на блоки и подсистемы

Различные проекты (пример видео)

Cleanflight

Решение для мультикоптеров и аппаратов самолетного типа, в целом также большой и уже профессиональный код и своя экосистема

Carbon Aeronautics Drone (видео, материалы)

Самый короткий код на Arduino

Супер минималистичный код всего на 170 строк для управления квадрокоптером. Очень классные материалы для STEM обучения, но не содержит архитектуры для более сложных проектов

А ещё есть много вот таких видео в т.ч. проектов на raspberry pi или orange pi от индийских коллег. В основном, у них всё классно летает, но непонятно на чём, а в ссылках вообще не указывается что за прошивка была использована (полагаю одна из упомянутых выше).

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

Создается экосистема вокруг кода-ядра полетной прошивки. Но вот как раз это ядро начинает теряться из виду, хотя именно на нём все и работает.

О пользе системного мышления (с) Утащено отсюда
О пользе системного мышления (с) Утащено отсюда

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

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

Что сразу порадовало - это наличие симуляции в Gazebo! А значит можно летать без "железа", которое нужно заказывать из Китая и потом ждать не менее месяца. Стоимость "железа" тоже весьма демократичная, особенно если у вас уже есть какая-либо аппаратура радиоуправления.

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

Код прошивки flix

Давайте знакомится с кодом. Первым делом настроим среду для работы и клонируем репозитарий flix. Можно работать как с VSCode, так и со средой Arduino, тут кому что больше нравится. Удобнее всего работать под ОС Linux. Первым делом клонируем репозитарий git проекта:

git clone https://github.com/okalachev/flix

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

Код в среде Arduino IDE
Код в среде Arduino IDE

Общее описание работы кода приведено в репозитарии. Но оно очень лаконичное и краткое. Разберем код более подробно. Логика работы квадрокоптера прекрасно прослеживается в коде! Первым делом открываем файл flix.ino. Всё четко и понятно с интуитивно понятными названиями функций. Лаконично в 66 строк на момент написания статьи. Так, например, выглядит основной цикл:

void loop() {
	readIMU();
	step();
	readRC();
	estimate();
	control();
	sendMotors();
	parseInput();
#if WIFI_ENABLED == 1
	processMavlink();
#endif
	logData();
}

Сразу понятно как "работает" квадрокоптер. Так же работают практически все полетные прошивки: считывание данных с IMU, задержка, считывание данных сигналов управления с аппаратуры, вычисление будущего положения беспилотника (эстиматор), определение управляющих воздействий (контрол), отправка на моторы полученных команд. Плюс три служебных блока - взаимодействие по uart, если включено, то обработка команд Mavlik и сохранение данных логов.

Также лаконично выглядит и setup. Все те настройки которые нужны в первую очередь тоже тут. Это скорость порта, каналы управления и номера моторов. А пины моторов там где им и положено - в файле motors.ino.

#define RC_CHANNELS 6
#define RC_CHANNEL_ROLL 0
#define RC_CHANNEL_PITCH 1
#define RC_CHANNEL_THROTTLE 2
#define RC_CHANNEL_YAW 3
#define RC_CHANNEL_ARMED 4
#define RC_CHANNEL_MODE 5

#define MOTOR_REAR_LEFT 0
#define MOTOR_REAR_RIGHT 1
#define MOTOR_FRONT_RIGHT 2
#define MOTOR_FRONT_LEFT 3

Особенно порадовал код эстиматора. Это вам не EKF3 в Ardupilot. На таком коде просто можно объяснить сложные концепции.

А на блоке управления полетом очень хорошо можно показывать различные режимы полета и как осуществляется управление. Вот тут про режимы полета:

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

void controlTorque() {
	if (!armed) {
		memset(motors, 0, sizeof(motors));
		return;
	}

	motors[MOTOR_FRONT_LEFT] = thrustTarget + torqueTarget.x + torqueTarget.y - torqueTarget.z;
	motors[MOTOR_FRONT_RIGHT] = thrustTarget - torqueTarget.x + torqueTarget.y + torqueTarget.z;
	motors[MOTOR_REAR_LEFT] = thrustTarget + torqueTarget.x - torqueTarget.y + torqueTarget.z;
	motors[MOTOR_REAR_RIGHT] = thrustTarget - torqueTarget.x - torqueTarget.y - torqueTarget.z;

	motors[0] = constrain(motors[0], 0, 1);
	motors[1] = constrain(motors[1], 0, 1);
	motors[2] = constrain(motors[2], 0, 1);
	motors[3] = constrain(motors[3], 0, 1);
}

Описание текущей версии кода прошивки по 17 файлам

Файл

Описание

flix.ino

Основной запускаемый файл проекта с главным циклом

cli.ino

Реализация интерфейса командной строки (через COM порт)

control.ino

Логика управления полетом

estimate.ino

Эстиматор для определения положения коптера на основе гироскопа и акселерометра

imu.ino

Работа с IMU - гироскоп и акселерометр, включая калибровку

led.ino

Работа с лампочкой микроконтроллера

log.ino

Логирование в RAM микроконтроллера

lpf.h

Фильтр нижних частот (LPF)

mavlink.ino

Протокол MAVLink для коммуникации по Wifi

motors.ino

Код для контроля моторов через ESC

pid.h

Реализация PID регулятора

quaternion.h

Легкая библиотека работы с кватернионами (с удобными преобразованиями в вектора)

rc.ino

Работа с радиоприемником

time.ino

Работа со временем микроконтроллера

util.ino

В основном математические функции и защита от перезагрузки при низком напряжении питания

vector.h

Легкая библиотека работы с векторами

wifi.ino

Параметры и логика Wifi подключения

Некоторые полезные штуки сразу включенные в проект, такие как работа с протоколом MAVLink, возможность работы по Wifi и конечно же симулятор в Gazebo о котором далее.

Запуск в симуляторе Gazebo и с телефоном вместо RC

Для управления коптером в среде симуляции нам понадобится пульт радиоаппаратуры мобильный телефон. Но для того чтобы управлять беспилотником нам нужно установить приложение наземной станции управления. Наиболее популярным проектом является приложение qgroundcontrol. Но ставить его мы будем не через магазины приложений, а напрямую из релизов официального репозитария (качаем последнюю версию тут).

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

Для работы с нашим проектом нужно будет внести некоторые настройки. А именно включить виртуальный джойстик (если он не был включен ранее) и убрать автоцентрирование газа. Иначе виртуальный квадрокоптер будет как у меня при первом запуске постоянно улетать в космос. Переходим в настройки приложения (нажимая на иконку приложения в левом верхнем углу)

Далее выбираем пункт Application Settings и ставим настройки как показано ниже. У нас все равно на борту нет GPS, поэтому и центрировать карту не обязательно ;)

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

Заводим на мобильном телефоне точку доступа (hotspot) и подключаем ваш ПК к этой точке доступа. После этого устанавливаем и запускаем симулятор Gazebo следующим набором команд из директории проекта flix для ОС Ubuntu. Есть возможность запуска и на MacOS

  1. Устанавливаем Arduino CLI

    curl -fsSL https://raw.githubusercontent.com/arduino/arduino-cli/master/install.sh | BINDIR=~/.local/bin sh
  2. Устанавливаем Gazebo 11:

    3curl -sSL http://get.gazebosim.org | sh

    Настраиваем среду Gazebo и все переменные:

    echo "source /usr/share/gazebo/setup.sh" >> ~/.bashrc
    source ~/.bashrc

    Устанавливаем SDL2 и другие зависимости:

    sudo apt-get update && sudo apt-get install build-essential libsdl2-dev
  3. Добавляем вашего пользователя в группу input для того, чтобы работала поддержка джойстика (вам нужно будет выполнить перезагрузку или разлогинится и залогинится после выполнения данной команды):

    sudo usermod -a -G input $USER
  4. Запускаем симуляцию:

    make simulator

Управление в симуляторе выгладит вот так (у меня пока так красиво летать не получается, но ещё несколько дней в симуляторе и будет похоже):

У меня первым делом была аппаратура, но не было самого аппарата. Поэтому я задумался о покупке переходника, чтобы можно было летать в симуляторе. Выбор пал на вот такой переходник, который почему-то не работает в Windows, поэтому тут ищите более интересные решения. В Linux все распознается и работает. Марку приводить не буду, т.к. мне по итогу продукт не понравился, нет драйверов под Win и в целом не работает в RealFlight, а диск оказался пустым и не читался ни на одном из доступных мне 4 дисководов...

Переходник для аппаратуры на USB
Переходник для аппаратуры на USB

Для настройки пульта я использовал программу jstest-gtk для настройки виртуальных джойстиков. Она же мне помогла с калибровкой пульта в прошивке для режима симуляции.

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

Можно летать с пульта радиоуправления
Можно летать с пульта радиоуправления

Теперь можно летать как на настоящем аппарате и отлаживать полетную прошивку добавляя различные фичи ;) После отладки в симуляторе можно переходить к суровой реальности сборке настоящего аппарата и полетам на нём.

Схема и процесс сборки

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

Изначальное фото для сборки в группе проекта (с) Олег Калачев
Изначальное фото для сборки в группе проекта (с) Олег Калачев
Фото собранного проекта Flix (С) Олег Калачев
Фото собранного проекта Flix (С) Олег Калачев

В процессе поиска компонентов, которые представлены в репозитарии проекта выяснилось, что некоторые из них практически невозможно купить - в первую очередь приемник DF500 (SBUS), плюс с поиском пульта возник ряд вопросов. Всё остальное легко находится на Aliexpress или в Озоне. Правда есть нюансы, о которых расскажу далее.

Радиоаппаратура AT-10
Радиоаппаратура AT-10

У меня в наличии была аппаратура RadioLink AT10 (ссылка на видеогайд по ней), поэтому путем нехитрых поисков был найден соответствующий приемник с SBUS Radiolink R6DSM с рабочим питанием от 3 до 6В. В принципе вы можете выбрать любой приемник, главное чтобы он поддерживал SBUS и имел соответствующий диапазон напряжения питания. При заказе R6DSM также обращайте внимание на верный диапазон питания, т.к. рекомендательные алгоритмы нередко подсовывают то что не нужно.

Выбранный приемник под аппаратуру радиоуправления
Выбранный приемник под аппаратуру радиоуправления

После этого мною была составлена схема для сборки квадрокоптера. Она постоянно обновляется и если кто-то найдет в ней баги или неточности, то пишите в комментариях. Из последнего - были исправлены цвета для подключения моторов и подключение питания IMU (питать напрямую от батареи надёжнее). Забыл заменить после сборки, так как на радостях долго летал по помещениям IT-Центра МАИ был очень занят по работе и забыл. Кстати, в прошивке предусмотрены тесты направления вращения моторов, что очень помогает при отладке.

Принципиальная схема для сборки квадрокоптерас радиоаппаратурой совместимой с Radiolink AT10(Ссылка в Miro)
Принципиальная схема для сборки квадрокоптера
с радиоаппаратурой совместимой с Radiolink AT10
(Ссылка в Miro)

По компонентам следует обратить внимание на напряжение моторов и диаметр валов. Рабочее напряжение должно быть именно 3.7В. Причем диаметр вала нужен 0.8 мм, чтобы к нему подходили пропеллеры. Найти именно такие моторы оказалось весьма сложно. Практически все пропеллеры имеют посадочный диаметр 0.8 мм, поэтому если вы, как и я закажите моторы с большим диаметром (1 мм), то есть выход в виде набора микросвёрл. Кстати, с ними пропеллеры держатся очень хорошо, если диаметр отверстия расширить до 0.9 мм. Кроме этого есть готовые наборы 8520 3.7V brushed motor вместе с пропеллерами (там диаметр валов тоже 1мм, если будете заказывать запчасти).

Микросвёрла для расширения отверстий пропеллеров
Микросвёрла для расширения отверстий пропеллеров

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

Название компонента

Цена на 08.09.2024

Аппаратура радиоуправления RadioLink AT10 II (V2)
(самая дорогая часть именно моего проекта, т.к. уже была от самолета, но можно найти и более дешёвое), с зарядкой и дополнительным аккумулятором

12 000 руб

Радиоприемник Radiolink R6DSM

940 руб

Аккумулятор GNB 850mah 1S 60C HV

493 руб

Межплатный кабель JST PH2.0 2PIN с проводом, чтобы подключить аккумулятор (как правило продаются наборами по 10 штук, поэтому цена за всё)

227 руб

ESP32-WROOM-32 WeMos D1 mini 40 pin Type-C USB

274 руб

Гироскоп, акселерометр, магнитометр, барометр GY-91 MPU9250 (обращайте внимание на чип, должен быть MPU-9250 + BMP280, очень много подделок или чипов на базе более дешевого чипа, об этом ниже)

826 руб

Micro FPV RC Quadcopter 100MM Brushed Frame Kit Support 8520 Coreless Motor (собственно сама рама)

818 руб

4 штуки 2.7A 1S Dual Way Micro Brush ESC (сейчас в проекте рассматривается замена на мосфеты, т.к. это одна из дорогих частей проекта)

3272 руб

4 штуки 8520 3.7V brushed motor shaft 0.8mm

192 руб

4 штуки Пропеллеры Hubsan 55 mm (обычно комплект из 20 штук)

236 руб

Итого без аппаратуры радиоуправления:

7278 руб.

Для сборки также понадобится паяльная станция (лучше сразу покупать станцию, если вы собираетесь дальше заниматься квадрокоптерами или робототехникой) - порядка 10 тысяч рублей на 08.09.2024, плюс мелочевка в виде проводов и изоленты для крепления всякой мелочевки. А для крепления плат к раме я использовал уникальный продукт - Двусторонняя Клейкая Лента Прозрачная за 97 рублей.

Плюс для сборки ещё неплохо защитить моторы, распечатав небольшое крепление внизу, если у вас есть 3D принтер. Модельку можно скачать тут. За неё отдельное спасибо Олегу Калачёву. Судя по количеству проб и ошибок - это уже 14 версия где все идеально подходит к моторам при распечатке стандартным соплом 0.4 и слоем 0.2 мм.

Защита для проводов моторов (С) Олег Калачев
Защита для проводов моторов (С) Олег Калачев

Если у вас нет 3D принтера, то после сборки можно просто обмотать моторы внизу изолентой, чтобы проводки от моторов не порвались при первой успешной посадке.

Итого в среднем включая всё оборудование стоимость сборки (с учетом, что аппаратура и паяльная станция останутся у вас для других проектов) составит около 30 000 тысяч. Если у вас уже есть всё для пайки, то около 20 000 тысяч, а если у вас есть аппаратура радиоуправления, то около 7800 рублей. Как я понимаю в будущем проект будет ещё дешевле за счет замены ESC на мосфеты, что явно необходимо, т.к. при подключении от USB они стараются инициализироваться, но у них не получается, что напрягает при работе с проектом.

Помимо базовой конструкции я в схему включил цепь для контроля напряжения на батарейке - т.к. контроль напряжения питания очень важен практически для всех беспилотных летательных аппаратов. В базовой версии кода этого нет - получилось отличное задание для студентов и всего два резистора и конденсатор плюсом к покупкам. Выше их учел в стоимости ;)

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

Расположение IMU и радиоприемника SBUS
Расположение IMU и радиоприемника SBUS

Верный порядок моторов на схеме в Miro. Крепление IMU и радиоприемника к раме сделал на двустороннюю прозрачную липкую ленту. Причем удобно, что у приемника кнопка находится в доступе со внешней стороны рамы. Эта кнопка нам может понадобиться для переключения протокола передачи данных в дальнейшем.

Первым делом при сборке проекта рекомендую подпаивать IMU и выполнить его проверку не прикрепляя к раме, т.к. потом отклеивать в принципе возможно, но лучше до этого не доводить. Для проверки необходимо подпаять питание и IMU к плате микроконтроллера ESP32 Mini и спаять питания 3.3В платы микроконтроллера и GY-91. Это позволит запитать наш IMU через USB. Подключение можно посмотреть на рисунке одного пользователя ниже:

Типовая проблема при сборке - не тот чип вместо MPU9250, чаще всего MPU6050 или его ноунейм клон от Китайских умельцев
Типовая проблема при сборке - не тот чип вместо MPU9250, чаще всего MPU6050 или его ноунейм клон от Китайских умельцев

Далее подключаем микроконтроллер к USB вашего компьютера и грузим прошивку следующей командой. Плюс у нас сразу откроется монитор. Если вы увидите ошибку IMU, значит вам попался "палёный" или "левый" GY-91. Как было в моем случае и у коллеги выше, что сильно задержало первый полет. Детальные инструкции по запуску тут.

Ещё на данном этапе частенько возникают проблемы с USB кабелем - убедитесь, что у вас кабель для передачи данных, а не просто кабель от зарядки (в них просто нет 2-х проводников для данных). И если у вас возникают ошибки при загрузки прошивки на борт, то скорее всего дело именно в кабеле - лучше взять короткий кабель данных :) В моем случае длинный кабель от очков VR не справлялся с задачами загрузки прошивки на микроконтроллер и постоянно летели рандомные ошибки.

Выполняем запуск

make upload monitor

Если все прошло успешно, то вы увидите процесс компиляции (если не выполняли ранее), загрузки полетной прошивки на микроконтроллер и приглашение от полетной прошивки. Нажмите Reset на микроконтроллере. Этап Setup IMU должен пройти успешно. После полной сборки и подключения в окне должно отобразиться следующее:

rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0030,len:1184
load:0x40078000,len:13260
load:0x40080400,len:3028
entry 0x400805e4
Initializing flix
Setup Motors
Motors initialized
Setup IMU, stand still
Setup RC
Initializing complete

Welcome to
 _______  __       __  ___   ___
|   ____||  |     |  | \  \ /  /
|  |__   |  |     |  |  \  V  /
|   __|  |  |     |  |   >   <
|  |     |  `-.|  |  /  .  \
|__|     |_______||__| /__/ \__\

Commands:
          help - show help
          show - show all parameters
          <name> <value> - set parameter
          ps - show pitch/rollw
          psq - show attitude quaternion
          imu - show IMU data
          rc - show RC data
          mot - show motor data
          log - dump in-RAM log
          cr - calibrate RC
          cg - calibrate gyro
          ca alibrate accel
          fullmot <n> - full motor test
          reset - reset drone's state

В этом случае можно собирать дальше, припаиваем моторы к ESC и крепим на лучи изолентой любого цвета который вам нравится, спаиваем вместе все провода питания и заводим на разъем для подключения к аккумулятору. По желанию припаиваем питание IMU напрямую к аккумулятору (можно питать и от микроконтроллера через пин 3.3В, а можно напрямую от батареи через 5В - оба варианта рабочие: первый удобен для отладки на первом этапе при питании от USB, дальнейший для отладки с моторами и большей надежности).

После монтажа цепей моторов припаиваем пины приемника и с помощью кнопки на приемнике выбираем нужный режим работы. Нужно нажать дважды в течение 1 секунды для переключения режима на SBUS - светодиод станет фиолетовым.

В итоге должно получиться вот такое чудо техники. Тут отдельно торчат провода для цепи контроля напряжения батареи, а в остальном все собрано как нужно.

Готовность к запуску
Готовность к запуску

Кроме переключения приемника на SBUS не забудьте перевести аппаратуру в 10 канальный режим, т.к. у меня по умолчанию аппаратура была в 12-ти канальном режиме и я долго не мог понять почему при удачном бинде ничего не работает.

Далее биндим приемник и аппаратуру, выбираем на ней нужный нам вид аппарата и можно приступать к настройке. О ней далее

Запуск и настройка квадрокоптера

Когда квадрокоптер собран и выполнен бинд аппаратуры и приемника, то нужно выполнить ещё несколько операций на понимание кода. Это калибровка акселерометра и радиоаппаратуры. Для калибровки подключаем квадрокоптер к USB и запускаем монитор как было описано выше.

Запуск калибровки imu - калибровка акселерометра выполняется командой ca, после чего выполняется стандартная для любой полетной прошивки процедура калибровки и полученные данные нужно вписать в коде в файл imu.ino

Запуск калибровки RC осуществляется командой cr, после чего нужно пройти процесс калибровки последовательно выполняя инструкции. Далее полученные параметры нужно заполнить в файле rc.ino

При калибровке радиоаппаратуры убедитесь, что у вас не включено инвертирование каналов на АТ-10. Вот тут гайд как работать с этой аппаратурой. У меня с этим были проблемы. Если же вы ранее подключали пульт через переходник в среде Gazebo, то все-равно рекомендую выполнить настройку аппаратуры, т.к. значения будут отличаться.

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

Самый большой диван в мире из Саратова (с) Утащено тут
Самый большой диван в мире из Саратова (с) Утащено тут

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

Подготовка к полету
Подготовка к полету

Собственно далее полеты над нашей усадьбой Гончаровых в Яропольце показали, что мощности передатчика и усиления приемника достаточно чтобы квадрокоптер улетел на дальность около 120 метров. Больше просто не пробовал ввиду непредвиденной поломки.

Обучение студентов МАИ

В 2024 году весной материалы проекта Flix использовались на практике в курсе Программирование полетных контроллеров для студентов Передовой инженерной школы МАИ и на 8 институте. Самое прикольное было отлаживать прошивку в симуляторе Gazebo — это реально очень важная и бесценная часть данного проекта.

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

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

Мастер-класс Ухова П.А. по программированию полетной прошивки на IV Весенней Школе математического моделирования в 2024 году в Яропольце
Мастер-класс Ухова П.А. по программированию полетной прошивки на IV Весенней Школе математического моделирования в 2024 году в Яропольце

Также мы демонстрируем разные проекты на курсах повышения квалификации для специалистов и разработчиков. Так что если кто захочет разобраться в премудростях программирования полетных прошивок, то приходите к нам. Тем более, что большую часть расходов на обучение компенсирует специальная грантовая программа. Курс называется - Разработка программного обеспечения для полётного контроллера БАС и будет проводиться в режиме ON LINE.

Вот такая получилась статья в которой много букв и ещё реклама про обучение и про отличный проект Flix. Кто дочитал до конца (или докрутил до этого места) и кому интересен проект залетайте в TG группу, где обсуждается дальнейшее развитие проекта и новая версия реализации этого замечательного аппарата.

А мы и дальше будем на примере таких отличных проектов обучать наших студентов и всех желающих изучить программирование автопилотов :)

// С уважением,
Зам. директора IT-Центра МАИ по RnD, Петр Ухов

Комментарии (1)


  1. Dynasaur
    08.09.2024 18:54

    Такую обширную тему раскрыли в одной статье! Браво! Всё чётко, по порядку, со всеми нужными ссылками и ничего лишнего. Как минимум, чувствуется опыт преподавания :-) Спасибо за качественный материал.