Почти 4 года прошло с выпуска первой статьи об учебном квадрокоптере Геоскан Пионер. За это время формат конструктора для сборки учебного квадрокоптера успел набрать популярность - он хорошо подходит как для организации учебного процесса со школьниками или студентами, так и для использования на различных хакатонах, соревнованиях, или при выполнении на его базе исследовательских проектов. Ключевые элементы обучения на сегодняшний день - это развитие навыков программирования для решения задач автономного полета коптера, понимание основ алгоритмов управления и работа с различными функциональными модулями. Для юных пользователей порог входа был снижен за счёт возможности использования визуального блочного программирования в плагине для TRIK-Studio, а вот создание более сложных программ требовало знакомства с языком Lua. В 2020 году линейка Пионеров дополнилась новыми моделями - появились младший  и старший «братья»  Мини и Макс. И если по размеру и массе братья стоят по ранжиру  - Мини самый маленький и легкий, а Макс самый большой и тяжелый, то по функционалу младший уже готов дать фору своему предшественнику (назовём его Классическим Пионером).  Во-первых, уже в базовой комплектации Пионер Мини имеет видеокамеру с возможностью передачи видео по Wi-Fi. Во-вторых, он оснащен датчиками, которые могут обеспечивать автономный полёт в помещениях с использованием сразу нескольких систем навигации - УЗ и ИК (подробнее про них расскажу в отдельном материале). Если вкратце - это внешние системы позиционирования в помещении, которые позволяют коптеру ориентироваться в локальной, зафиксированной системе координат, связанной с точкой взлета. В случае отсутствия системы навигации коптер не потеряется, т.к. имеет датчик оптического потока и TOF дальномер.  Все эти функции доступны и Классическому Пионеру, но требуют использования отдельных модулей расширения. Концепция с дополнительными модулями позволяла адаптировать базовый набор под различные учебные или соревновательные кейсы. Например, модуль захвата груза в паре с модулем GPS позволяет реализовать простейший кейс поисковой операции. Однако для тех, кто только начинает свое знакомство с коптерами такое разнообразие может оказаться лишним и даже  пугающим, поэтому для таких пользователей и был создан Мини: недорогой, ударопрочный коптер, который "из коробки" оснащён самым необходимым для автономных полетов в помещении. Ну и в-третьих, благодаря наличию Wi-Fi удалось добавить для Мини  возможность программировать на Python.  Какая связь? Сейчас поясню. Пионер Мини рассчитан на полёт в помещении, и применение на нём Wi-fi в качестве канала связи было не только оправдано, но и открыло новые возможности по сравнению с Классическим Пионером, где обеспечивалась только узкополосная, но дальнобойная связь в канале 868МГц. Простота подключения (без использования доп. модулей), высокая скорость передачи данных и поддержка протокола MAVLink в совокупности позволяют осуществлять программирование квадрокоптера удаленно, используя, к примеру, ноутбук, на котором запущена программа. В данном случае коптер как бы визуализирует код, написанный  пользователем на компьютере. При этом все, что происходит с коптером можно отслеживать на экране ноутбука в реальном времени, в том числе по изображению с видеокамеры.  В случае с Классическим Пионером пользователям было доступно только программирование на Lua с использованием базовых реализованных функций и готовых модулей, фактически без обратной связи или возможности отладки. Это позволяло освоить стандартную методику преподавания, но как только ученик хотел сделать что-то свое, начинались проблемы, о которых далее.  Почему Lua не лучший вариант для обучения программированию: Несмотря на большие возможности Классического Пионера за счет разнообразных модулей расширения, часто “узким горлышком” учебного задания или проекта становился именно подход к реализации скрипта на квадрокоптере.  Постараюсь объяснить это на примере. Есть типичная для школьных олимпиад по робототехнике  задача - получить картинку с камеры и на основании какой-то информации с нее полететь в нужную сторону. Если вы работаете с техническим зрением, то в голове сразу выстраивается картина: берем OpenCV, обрабатываем видеопоток, выдаем команду. Но с Пионером не все так просто…  Контроллер автопилота решает только задачи управления и связи, при этом пользовательские скрипты на  Lua запускаются внутри интерпретатора, который сам является частью прошивки. Поэтому вычислительные мощности автопилота как и набор доступных интерфейсов оказывается ограниченным и логичным решение является использование внешнего вычислителя. Например, мы можем подключить к автопилоту модуль с камерой OpenMV H7, которая имеет достаточно мощный контроллер для обработки изображений и способна выдавать результаты обработки в виде команд в декартовых координатах. Дальше нас ждут сюрпризы. Среда программирования Pioneer Station, поддерживает только работу с автопилотом, позволяя  написать код на Lua  и загружать его в коптер. Для работы с камерой нужно отдельно установить среду OpenMV IDE, и оказывается, что камера программируется уже на MicroPython… К слову, IDE для камеры довольно хорошая и поддерживает отладку, правда отследить работу программы можно только по светодиодам - отладчик для работы Lua скриптов внутри автопилота не предусмотрен. Камера с автопилотом может быть соединена по интерфейсу UART, а для её подключения к автопилоту, для крепления на раме коптера используется плата адаптер. В этом случае ученик бОльшую часть времени тратит, чтобы разобраться с общим несовершенством платформы, на которой должен обучаться, и  меньший упор делает на непосредственное развитие навыков  программирования. Ну и при практическом использовании не очень удобно постоянно приносить коптер к компьютеру для перепрошивки. При решении задач эти хождения туда-сюда очень утомляют. Здесь и пришла идея об удаленном программировании, когда основной код выполняется на ноутбуке, а коптер лишь является источником данных и исполнителем команд. При реализации нового режима долгих споров о выборе языка программирования не было. Конечно, Python. Python в последние годы де-факто стал образовательным стандартом, когда речь заходит об обучении программированию. Во многом благодаря низкому порогу вхождения и таким свойствам языка, как динамическая типизация, упрощенное ООП и удобство использования библиотек. В интернете сейчас есть много образовательных курсов, направленных именно на первое знакомство с программированием через Python. В контексте применимости к робототехническим кейсам язык себя хорошо зарекомендовал, в первую очередь из-за своих скриптовых корней, однако если в лоб начать сравнивать его с Lua, то станет понятно, что у Python есть свои ограничения в быстродействии. Но опять же, когда мы говорим об образовании, на первые роли выходит удобство и понятность, а быстродействие обычно описывается фразой „лишь бы работало…“ Lua является очень быстрым и легким скриптовым языком во многом потому, что из коробки в нем практически ничего нет. И тут Python с пакетным менеджером просто не оставляет ему шансов. Вернусь к вышеописанной задаче по обработке изображения. Вполне логичной кажется ситуация, когда скрипт должен работать в асинхронном режиме. Я имею ввиду, что обработка изображения не должна „вешать” часть кода, связанную с отправкой команд управления дрону. На Python уже „из коробки” стоят пакеты threading и multiprocessing, к которым в придачу идет отличная документация и примеры, когда как на Lua скорее всего я найду чей-нибудь проект на github-е, и если в нем окажется хороший readme, это уже будет огромной удачей. Также важным фактором является и то что, Python используется как нативный язык для ROS, что позволяет сильно облегчить процесс понимания разработки своих роботов. Другим преимуществом Python в образовательной робототехнике является организация „экосистемы“ обучения. Касательно квадрокоптеров многие задачи строятся вокруг создания алгоритмов полета на основе обработки информации с сенсоров, поэтому очень удобно проводить расчеты и визуализировать процессы в одной среде.  Так, библиотека numpy может стать полноценной альтернативой вычислениям в более мощных пакетах, таких как Matlab, а полученные результаты можно очень легко встроить в программы полета. Опять же, говоря о техническом зрении, многие процессы получения геометрических характеристик сводятся к последовательным переходам от одной системы координат к другой, и тут возможности матричных вычислений numpy очень сильно помогают. Библиотека matplotlib со своей стороны может отлично помочь в визуализации данных, получаемых с дрона в реальном времени. Но в ситуации, когда для реализации Lua скриптов их заливают в  микроконтроллер, возможности подключить к нему пользовательскую  библиотеку нет вообще.  Чем сейчас удобна работа с библиотекой: Библиотека для программирования Пионер Мини на Python выложена как open-source проект на github, а так же может быть установлена используя pip с хранилища PyPi. Это, по сравнению с применением Lua скриптов, позволило реализовать полноценную версионность и дало нам уверенность в том, что пользователь сам может узнать об актуальной версии библиотеки.  Реализация библиотеки представляет собой класс квадрокоптера, в котором присутствуют методы по получению изображения с камеры квадрокоптера, полета, управлению светодиодами и получению “сырых” данных с датчиков. Освоив работу с ними с помощью преподавателя, ничего не мешает ученику внедрить свои идеи в скрипт квадрокоптера: будь то распознавание объектов или ARUCO маркеров, использование нейросетей, построение различных регуляторов и т.д. В дополнение к этому был реализован метод запуска предварительно залитого на коптер Lua скрипта по воздуху (в дальнейшем хочется также реализовать загрузку скрипта, чтобы уже написанные образовательные методики могли использоваться удобнее). Также, опираясь на опыт разработки полетных заданий на Lua, часто случались ситуации когда ученик совершал „фатальную“  ошибку в коде, которая могла привести к полному крашу коптера. Используя Python, удобно применять механизм прерываний по нажатию клавиш на клавиатуре, который позволяет спасти квадрокоптер в таких ситуациях либо же корректно завершить скрипт. Что не менее важно, так это на примере объяснять ученикам важность механизмов защиты и предусматривать их с самого начала работы. В процессе полета библиотека по умолчанию логирует происходящие события в терминал, что очевидно на порядок ускоряет процесс отладки пользовательских программ. При работе с камерой библиотека позволяет выводить видеопоток на экран, а используя стандартные средства OpenCV по его обработке, довольно просто визуализировать происходящий анализ картинки. Как самый свежий пример расскажу вкратце об опыте работы с Python на Пионере Мини в  ФМЛ № 239 г. Санкт-Петербурга.  Школьники Центра робототехники в январе этого года работали с установкой всего необходимого ПО (PyCharm Community и Pioneer Station 1.11.0.), перепрошивали ESP-32 до версии 0.2.7., учились подключать компьютер к дрону. В итоге за одно занятие они смогли разобраться и запустить скрипт калибровки камеры на Python.  Сейчас у них есть возможность опробовать другие примеры скриптов и создать свои уникальные кейсы, например, реализовывать полёт Пионер Мини по линии (с помощью библиотек OpenCV и pioneer_sdk).  Все ученики говорят, что для них плюсы в работе с Пионером Мини - это широта возможностей коптера, способность полноценной реализации функций компьютерного зрения с помощью библиотеки OpenCV и компактность дрона. У всех есть большой интерес и к появлению дополнительных модулей (для изучения Python и видеозрения).