Среди всех импульсивных покупок этого года мой квадрокоптер — та, о которой я совсем не жалею. Вообще, меня всегда восхищали дроны (это понятно, это все-таки летающие роботы) и мне нравится программировать — поэтому я решил взять лучшее из обоих миров и пойти купить свой. Рынок предлагает несколько альтернатив, но мой идеальный дрон должен был обладать следующими обязательными характеристиками:

  • его можно было бы запрограммировать на полноценном языке, таком как 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 может предоставить огромный источник идей для побочных проектов и уникальных задач!

Какие ваши любимые побочные проекты по дронам или робототехнике? Поделитесь ими со мной в разделе комментариев!

Рекомендации

Want to Connect?

Join my newsletter for more stories like this