Оригинал статьи на сайте Bitcraze: Autonomous Robotics at UW Seattle

Зимой 2020 года Crazyflie 2.1 стала отличной робототехнической платформой для ознакомления с автономной робототехникой в Университете Вашингтона. Наша аспирантура по направлению биотехнологической робототехники завершилась серией проектов Crazyflie. Всего за 10 недель мы приобрели знания в областях:
- Python
- Операционная система для роботов (ROS)
- Сборка пользовательских датчиков
- Написание новых драйверов
- Разработка и тестирование алгоритмов управления
- Устранение неполадок и самостоятельное обучение
Курс был предложен Лабораторией по разработке автономной робототехники Университета Вашингтона, возглавляемой доктором Сойером Б. Фаллером (Sawyer B. Fuller). Курс был поддержан кандидатом наук Мелани Андерсон (Melanie Anderson), которая провела фантастическое исследование со своим микробеспилотником на базе Crazyflie. Финальный проект был посвящен превращению микробеспилотника Crazyflie в биотехнологического автономного робота. Наша команда состояла из трех человек, аспирантов Университета Вашингтона по направлению «робототехника», и включала Нишанта Элькунчвара (Nishant Elkunchwar), Кришну Баласубраманиана (Krishna Balasubramanian) и Джессику Ноуи (Jessica Noe).
Алгоритм поиска света «Run-and-Tumble», основанный на идее хемотаксиса бактерий
Перед нашей командой стояла задача – микробеспилотник Crazyflie должен был найти и идентифицировать источник света. Для выполнения этой задачи мы выбрали алгоритм «Run-and-Tumble», основанный на идее хемотаксиса бактерий. Что такое хемотаксис, вы можете прочитать в этой статье. Для понимания процесса посмотрите анимацию здесь.
В обоих случаях, и в бактериальном хемотаксисе, и в нашем алгоритме «run-and-tumble», объект (бактерия или робот) может:
- Двигаться своим ходом
- Определять магнитуду чего-либо в окружающей среде (например, химические выделения от источника пищи или интенсивность света)
- Определять, стала магнитуда более или менее интенсивной, чем была некоторое время назад.
Этот метод работает лучше, если в окружающей среде есть заметный переход от низкой концентрации чего-либо к высокой, чтобы бактерия или робот могли двигаться к источнику высокой концентрации.
Детали алгоритма «run-and-tumble» демонстрируются на диаграмме ниже. Суммируя вышесказанное, микробеспилотник Crazyflie взлетает, начинает движение и, если интенсивность света увеличивается, он продолжает «бежать» в том же направлении. Если же интенсивность света уменьшается, он начинает «вращаться» в разных направлениях. Дополнительные уровни принятия решения включают команды «Avoid Obstacle» и «Stop», если Crazyflie достиг цели.

Аппаратное обеспечение Crazyflie
Для реализации алгоритма «run-and-tumble» нам был необходим микробеспилотник Crazyflie и дополнительные датчики:
- Плата оптического потока Flow deck от Bitcraze
- Плата Multi-ranger deck от Bitcraze
- Плата для прототипирования Prototype deck от Bitcraze с датчиком интенсивности света
Плата оптического потока Flow deck была ключевым датчиком в достижении автономного полета. Этот датчик определяет высоту Crazyflie над поверхностью и отслеживает его горизонтальные движения со стартовой позиции в системе координат x и y. С установленной платой оптического потока Crazyflie может автономно удерживаться на одинаковой высоте. Также он может двигаться вперед, назад, вправо, влево, на определенную дистанцию или на определенной скорости. Могут быть выбраны некоторые другие установленные программы движения.
Плата Multi-ranger собирает сенсорные данные для избегания препятствий. Эта плата определяет расстояние от Crazyflie до ближайшего препятствия в пяти направлениях: спереди, сзади, справа, слева и сверху. Нашим «порогом» для запуска команды «Avoid Obstacle» было определение препятствия в полуметре от микробеспилотника.
Плата для прототипирования Prototype deck упростила задачу присоединения датчика интенсивности света BH-1750 к Crazyflie для интеграции аппаратного обеспечения датчика и микробеспилотника. Диаграмма показывает, как гребенка соединяется с рядами разъемов в центре платы. Мы припаяли гребенку в центр платы, затем припаяли разъемы, чтобы сформировать непрерывное соединение нашей гребенки и гребенки Crazyflie на левом и правом краях платы. На Wiki Bitcraze есть карта контактов для микробеспилотника Crazyflie и информация об их электроснабжении. Хороший обзор датчика BH-1750 есть на сайте Components101.com, там же есть карта контактов и информация о нагрузочном резисторе 4.7 kOhm, который необходимо разместить на линии 12С.
Очень просто присоединить платы к Crazyflie, потому что на каждой плате от Bitcraze есть пометки «Front», «Up» и «Down», чтобы помочь вам сориентировать плату относительно Crazyflie. Для более подробной информации посмотрите документацию по платам расширения у Bitcraze. Сразу после присоединения плат Flow и Multi-Ranger Crazyflie автоматически идентифицирует их. И все встроенные функции, относящиеся к этим платам, становятся доступными сразу, без необходимости обновления прошивки Crazyflie (Мы оценили эту замечательную функцию!)
Прошивка Crazyflie и программное обеспечение ROS
Bitcraze предоставляет виртуальное устройство (VM) с двумя пакетами ПО для загрузки, которые мы использовали для разработки нашего автономного робототехнического проекта с использованием микробеспилотника Crazyflie:
- «crazyflie-firmware» - набор файлов, написанных на C, которые можно загрузить на микробеспилотник Crazyflie для изменения прошивки, установленной по умолчанию
- «catkin-ws» - набор файлов ROS, которые обеспечивают высокий уровень управления действиями микробеспилотника
Мы изменили «crazyflie-firmware», включив код для нашего датчика интенсивности света. И мы изменили «catkin-ws», добавив функции в программное обеспечение ROS, установленное на Crazyflie. Благодаря виртуальному устройству VM, наша команда сохранила огромное количество времени и усилий – нам не пришлось скачивать базовое виртуальное устройство, затем обновлять ПО, находить библиотеки и отслеживать исправления, несовместимые с ПО. Мы просто начали писать новый код для Crazyflie.
Crazyflie использует преимущество архитектуры программного обеспечения ROS. Образец кода, представленного в виртуальном устройстве VM, позволил нам быстро ознакомиться с базовыми концепциями ROS, такими как узлы, темы, типы уведомлений, публикация и подписка. У нас была возможность понять и написать наши собственные узлы, которые публиковали информацию на разные темы, и написать узлы, которые подписывались на темы для получения и использования информации, чтобы управлять Crazyflie.
Обновление ПО Crazyflie
Основным испытанием нашего проекта было написание нового драйвера к программному обеспечению Crazyflie, чтобы сообщать системе Crazyflie о присоединении дополнительного датчика к шине 12С. Наша команда обратилась к драйверам Arduino с целью понять, как датчик BH-1750 присоединяется к шине 12С Arduino. Мы также изучили открытые драйверы, написанные Bitcraze для платы Multi-ranger, чтобы посмотреть, как она соединяется с шиной 12С Crazyflie. Изучив информацию в открытых источниках и поняв, как использовать протоколы связи 12С, член нашей команды Нишант Элкунчвар (Nishant Elkunchwar) смог написать драйвер, который позволил Crazyflie распознавать сигналы датчика BH-1750 и преобразовывать их в сенсорные данные для использования основанном на ROS программным обеспечением. Сейчас драйвер доступен на Github. Драйвер устанавливается в определенную папку: …\crazyflie-firmware\src\deck\drivers\src.
Следующее изменение в «crazyflie-firmware» - добавление файла «config.mk» в папку «…\crazyflie-firmware\tools\make». Информация о файле «config.mk» доступна на сайте Bitcraze в документации о настройке и сборке.
Последнее изменение в «crazyflie-firmware» - перенос файла «MakeFile» в папку «…\crazyflie-firmware». Изменения в файле «MakeFile» включают добавление одной линии к секции «# Deck API» и двух линий к секции «# Decks». Информация о компиляции файла «MakeFile» подробно изложена на сайте Bitcraze в документации о перепрошивке микробеспилотника.
Внесение изменений в архитектуру управления ROS
Архитектура управления ROS включает в себя уведомления. Нам нужно было определить 3 новых типа уведомления для наших новых файлов ROS. В папку «…\catkin_ws\src\rospy_crazyflie\msg\msg» мы добавили по одному файлу для каждого нового типа уведомления. Также мы обновили «CMakeLists.txt», чтобы добавить название наших файлов с уведомлениями в секцию «add_message_files( )».
Второй частью нашей работы с
ROS стал набор сценариев, написанных на языке программирования Python. Они включали наш алгоритм «run-and-tumble», сценарий publisher и сценарий plotter. Все они доступны на Github.
Характеристики датчика света
К этому моменту датчик интенсивности света был успешно интегрирован в микробеспилотник Crazyflie. Новый код был написан, и программное обеспечение микробеспилотника Crazyflie было обновлено. Мы завершили нашу диагностику, и следующим шагом была характеристика интенсивности света в нашей экспериментальной установке.

Эта характеристика была сделана на основании полета Crazyflie на фиксированной высоте над поверхностью пола в узких рядах вдоль горизонтальных направлений x и y. В итоге график (см. ниже) показывает, что интенсивность света экспоненциально росла с приближением Crazyflie к источнику света.
Характеристика света позволила нам определить «порог» интенсивности источника света. Если этот «порог» достигнут, запускается команда «Stop» и Crazyflie приземляется.

Тестирование алгоритма «Run-and-Tumble»
Когда задача с характеристикой интенсивности света была решена, у нас появилась возможность протестировать наш алгоритм «run-and-tumble». На каждом этапе алгоритма выбиралось одна из четырех команд: «Run», «Tumble», «Avoid Obstacle» или «Stop». График (см. ниже) показывает траектории движения микробеспилотника в соответствии с исполняемыми командами.

Полетное тестирование алгоритма «Run-and-Tumble»
В финальном испытании мы продемонстрировали 4 попытки «run» со стопроцентным определением источника света. Территория для испытания составляла приблизительно 100 кв.м., включая один источник света и 2 препятствия. Среднее время поиска составило 1 мин 41 сек.
Действия «Run» и «Tumble» показаны на видео (фактическая скорость 2х). В конце продемонстрирована команда «Stop», когда интенсивность света достигла порога 800 люксов. Это значило, что Crazyflie нашел источник света и должен приземлиться.
Усвоенные уроки
Это был один из лучших курсов, который мы изучали в Университете Вашингтона. Это было одно из первых занятий с роботом – играть с Crazyflie было настоящей радостью. Еще одним позитивным моментом было ощущение лагеря, в котором мы учились создавать, управлять, тестировать и совершенствовать автономных роботов. Это стало возможным только потому, что микробеспилотник компании Bitcraze с возможностью оптического потока мог безопасно управлять несколькими микробеспилотниками одновременно в нашем маленьком кабинете, где мы учились.
Этот проект по разработке был действительно интересным (читай «сложным»), и мы прошли через множество препятствий, прежде чем смогли повысить уровень своих знаний и навыков. Знание Python помогло нам прочитать предоставленные компанией Bitcraze образцы скриптов для программы управления ROS. Но, прежде чем мы смогли написать наши собственные сценарии управления, нам пришлось изучить архитектуру ROS.
Нишант (Nishant) подробно изучал протоколы 12С, в то время как мы писали новый драйвер для датчика BH-1750. Одним из самых главных уроков, который я извлекла из этого проекта, стало то, что написание драйверов для интеграции датчика и микроконтроллера является сложной задачей. И напротив, использование плат Bitcraze было таким простым, что казалось, это какое-то надувательство (в хорошем смысле!)
Что касается аппаратного обеспечения, одной большой проблемой, с которой мы столкнулись во время разработки, стало случайное повреждение 0.5-миллиметровых коннекторов на микробеспилотнике Crazyflie и платах. Штыри были недостаточно длинными для соединения плат Flow deck и Prototype deck, поэтому мы попытались припаять удлинители на штыри. К сожалению, я не посмотрела ширину штырей Bitcraze и припаяла то, что было в нашем наборе инструментов – 0.1-дюймовые (2.54 мм) удлинители, которые мы использовали для работы с Arduino и BeagleBones. Эти слишком большие штыри повредили коннекторы на платах, и мы потеряли соединение. К счастью, нам удалось починить наши платы, припаяв запасные коннекторы из магазина Bitcraze. Хотела бы я, чтобы длинные штыри были доступны тогда.
Подводя итог, могу сказать, что этот курс был вдохновляющим опытом и помог нашей команде многое изучить за очень короткий промежуток времени. После 10 недель работы с Crazyflie я могу рекомендовать Crazyflie для уроков по робототехнике и учебных лагерей.
Перевод: ООО «Север», Михеева Ксения