Среди всех импульсивных покупок этого года мой квадрокоптер — та, о которой я совсем не жалею. Вообще, меня всегда восхищали дроны (это понятно, это все-таки летающие роботы) и мне нравится программировать — поэтому я решил взять лучшее из обоих миров и пойти купить свой. Рынок предлагает несколько альтернатив, но мой идеальный дрон должен был обладать следующими обязательными характеристиками:
- его можно было бы запрограммировать на полноценном языке, таком как C или Python.
- в нем должна быть хотя бы камера, а может и еще какие-то датчики, и к ним должен быть доступ через какой-то API
- он должен быть совместим с каким-либо модульным аппаратным обеспечением plug-and-play.
TelloTalent от DJI соответствует всем вышеперечисленным требованиям. Что меня действительно поразило, так это яркий светодиодный экран в комплекте с ним и все крутые проекты, сделанные сообществом: есть люди, управляющие дроном движениями рук или тела, разрабатывающие автономные планы полета с помощью визуальных маркеров и даже изменяющие его назначение случайным образом. такие вещи, как сканеры штрих-кода. В этом репозитории собрано множество крутых проектов от сообщества, и я рекомендую его посмотреть: возможности безграничны.
С другой стороны, я должен признать, что на практике этот дрон представляет собой нечто большее, чем просто навороченная игрушка, что, конечно, не так уж и плохо. Он явно предназначен только для образовательных целей: для начала забудьте о полетах на открытом воздухе и приготовьтесь к ужасно короткому сроку службы батареи. Тем не менее, он по-прежнему отлично справляется со своей задачей и, на мой взгляд, представляет большую ценность.
Обзор компонентов и SDK
Как упоминалось выше, Tello Talent поставляется с аппаратным модулем, содержащим микроконтроллер ESP32, светодиод и матричный экран. Самим дроном можно управлять, подключившись через WiFi или отправив команды на последовательный порт USB.
DJI предлагает официальное приложение для кокпита, позволяющее управлять дроном и делать несколько снимков, но ничто не мешает вам создать собственное: на самом деле, с дроном можно взаимодействовать благодаря текстовому SDK. Выдержка из списка команд показана ниже. Более подробную информацию можно найти в официальной документации здесь.
Моя цель была проста: управлять дроном только с микроконтроллера, из скрипта, который я разработал на C, а затем прошил в память ESP32 ROM.
Разработка плана полета
Настроить Arduino IDE для работы с ESP32 оказалось не так просто, как я думал: документация непонятна, примеры скудны и, к сожалению, часто от китайскоязычных авторов. Однако после пары попыток мне удалось загрузить правильные драйверы и заставить их работать в моей Arduino IDE. С другой стороны, вспомогательные пакеты и примеры от разработчиков TelloTalent также оказались чрезвычайно полезными, поскольку я не являюсь опытным программистом на языке C — и, конечно же, в любом случае не имею отношения к встраиваемым системам.
Доступны два важных метода: setup
и loop
. Как следует из названий, они соответственно используются для начальной фазы запуска дрона и для основного цикла поведения. Поскольку я хотел выполнить короткую 30-секундную процедуру, я поместил всю свою логику в раздел setup
. Также можно использовать функцию setup
для бездействия и ожидания определенного события (например, нажатия кнопки или получения определенной команды) перед входом в основной цикл. Во всяком случае, для начала я разработал базовый план полета:
Как здесь можно отметить, пакеты tt_matrix
и tt_sdk
выполняют тяжелую работу. tt_sdk
— это простой интерфейс, который отделяет высокоуровневые команды SDK от подключения к последовательному порту и передачи данных; с другой стороны, tt_matrix
имеет дело с низкоуровневыми операциями для доступа и записи в реестры светодиодного экрана. Кстати говоря, пришло время повозиться с маленькими огоньками.
Анимация светодиодного экрана
После создания плана полета я хотел сделать этот проект немного более личным с пользовательской анимацией на экране дрона. Чип ESP32 на TelloTalent поставляется со светодиодной матрицей 8x8, которой достаточно для отображения небольшого количества текста и рендеринга некоторых простых спрайтов. Я решил, что мой дрон идеально впишется в тему инопланетян и космических кораблей, и должен стать монстром из Space Invaders 👾.
Сейчас документация по ТТ не супердоступна, но какой-то реверс-инжиниринг показал, что на экране есть два цветовых канала — синий и красный. Эти два канала могут быть независимо установлены (и смешаны) в каждой ячейке экрана, а их яркость может быть настроена на 256 различных уровней интенсивности. Обладая этой информацией, я, наконец, смог нарисовать моего любимого инопланетного монстра в двух чередующихся спрайтах:
Наконец, я написал простой метод для анимации НЛО:
sprite_a
и sprite_b
— это просто матрицы с постоянными значениями, соответственно моделирующие один из двух инопланетных спрайтов.
Включение параллельного выполнения
У меня был план полета и способ анимировать спрайты на экране. Однако, поскольку метод move_sprite
имел блокирующий бесконечный цикл, он никогда не позволял выполнить план полета. Как я могу заставить мой Tello делать обе вещи одновременно?
К счастью, микроконтроллер ESP32 поставляется с набором полезных RTOS API, таких как xTaskCreate
и его возможности многозадачности:
BaseType_t xTaskCreate(TaskFunction_t pvTaskCode, const char * const pcName, configSTACK_DEPTH_TYPE usStackDepth, void *pvParameters, UBaseType_t uxPriority, TaskHandle_t *pxCreatedTask);
xTaskCreate
берет ссылку на функцию (новую «задачу») и добавляет ее в очередь задач, готовых к запуску: затем ОС будет управлять одновременными задачами, чередуя их, например, используя время, затраченное на ожидание. для операций ввода-вывода.
Наиболее важными аргументами здесь являются pvTaskCode
, имя функции-обработчика матрицы, и usStackDepth
, глубина стека, которую необходимо выполнить целевой задаче: признаю, что я просто угадал здесь подходящее значение после неудачной пары попыток, выбор в конце кратного минимально допустимого размера стека:
xTaskCreate( move_sprite, "Move Sprite", configMINIMAL_STACK_SIZE * 2, NULL, tskIDLE_PRIORITY, &xHandle );
Наконец-то я смог собрать все вместе в одном скрипте:
Теперь маленький НЛО был готов к взлету!
Заключение
Программирование моего дрона Tello для следования простому плану полета при взаимодействии с его светодиодным экраном было очень забавным опытом и способом выйти из моей зоны комфорта: иметь дело с программным обеспечением, близким к «металлу», и с ограничениями в реальном времени, понимание беспилотников и, прежде всего, суметь разобраться в скудной, а иногда и неясной документации благодаря реинжинирингу и переводу с китайского 🤓. В общем, при наличии небольшого воображения и доброй воли Tello может предоставить огромный источник идей для побочных проектов и уникальных задач!
Какие ваши любимые побочные проекты по дронам или робототехнике? Поделитесь ими со мной в разделе комментариев!
Рекомендации
- Руководство пользователя Tello SDK
- Пакет поддержки TelloTalent Arduino | github.com
- Документация FreeRTOS | xTaskCreate
Want to Connect? Join my newsletter for more stories like this