Платформа
В прошлом году мы объявили конкурс летающих роботов с призом в один миллион рублей. Задача казалось бы простая — взлететь, обойти препятствие и сесть на посадочный маркер. Препятствие и маркер сдвигаются от задания к заданию. Робот летит сам, без команд с земли (точнее, он принимает только две: «старт» и «экстренное выключение»).
На момент начала конкурса наша команда инженеров и программистов из департамента информационных технологий никогда не занималась разработкой беспилотников. Но мы решили купить своего робота и участвовать в конкурсе наравне со всеми. Точнее, не совсем наравне — мы не сможем занять призовое место или получить приз по условиям, то есть идём вне зачёта.
Первый раз мы взяли робота в руки летом 2012 года, когда посылка приехала из бельгийского интернет-магазина. Кстати, нам повезло — робот шел всего 3 недели. Часть команд снялась с конкурса из-за того, что их платформы не успели вовремя приехать.
Это было первое и последнее везение в подготовке. С этого момента началась история грабель длиной в несколько месяцев.
Вначале всё выглядело просто
Схема полигона
Итак, первая задача — просто взлет и висение в одной точке. То есть нужно постараться, чтобы робот не падал, не улетал вверх и не рыскал. Второе – это, собственно, путешествие по лабиринту, чтобы не врезаться в стену. Третье – это распознавание. Все эти задачи могут, так или иначе, решаться отдельно. И ещё куча вспомогательных задач вроде фильтрации данных с датчиков (например, из-за непостоянства условий освещения и различных фактур напольного покрытия).
При этом нам наиболее важны высокоуровневые алгоритмы робота, поэтому разрешалось использовать ряд уже готовых библиотек и платформ: например, не писать с нуля распознавание образов и систему стабилизации многороторной платформы в пространстве.
Итак, с того момента как мы открыли посылку, начался хитрый R&D. В команде есть человек с богатым опытом управления квадрокоптерами, но софт для управления ими никто не писал. Поэтому мы начали досконально разбираться во всем с нуля. Пришлось почитать некоторое количество книжек и статей. Вспомнить чему нас учили 10 лет назад в универах, разобраться в физике полёта.
Нужно сказать, что изначально приобретенная нами платформа довольно «глупая», то есть, например, не умеет сама стабилизироваться по горизонтали. Большую часть алгоритмов мы прорабатывали сами. Сейчас мы уже умеем висеть, передвигаться, облетать препятствия. Но летаем пока мы медленно и аккуратно, около 30 сантиметров в секунду. Мы работаем над этим, так как в конкурсе побеждает тот робот, который выполнит задачу за минимальное время, поэтому мы должны быть примером остальным участникам.
На удивление, самой простой частью оказалась математика обхода препятствий и построения траектории полета робота. По крайней мере, пока нам так кажется.
Про датчики
Для ориентации в пространстве мы разрешили использовать GPS-сигнал, но сами исходили из того, что беспилотник может использоваться в закрытых пространствах или в условиях отсутствия GPS-сигнала. Поэтому в нашем роботе стоят другие датчики. К счастью, мы как представители одной из крупнейших IT-компаний в России, можем себе это позволить.
Ещё одно ограничение, которое мы ввели для себя — вся вычислительная мощность должна быть на самом роботе (по условиям конкурса можно использовать автономный вычислительный блок, смонтированный не на самой платформе). Мы использовали Intel NUС, он весит всего 200 грамм.
Intel NUC
Наш лазерный дальномер (точнее, лидар) по паспорту бьёт на 30 метров. То есть, если робот находится в начале полигона, то вполне может «увидеть» дальнюю стену. Это позволяет абсолютно точно понимать, где мы сейчас находимся. В теории. На практике лидар бьёт всего на 10 метров, потому что данные для паспорта писались чуть ли не в условиях идеального отражения луча от стен. В реальности при наших покрытиях теперь есть «слепые зоны». Поэтому изначальный план с тем, что мы всегда видим всю «коробку» полигона теперь не работает, и нам нужно как-то иначе измерять текущую скорость. Например, по принципу optic flow, то есть с использованием датчика, смотрящего вниз на пол (как в мышке).
Внешний вид робота снизу и сверху где-то посреди разработки:
А вот так выглядит платформа на сайте бельгийского интернет-магазина микрокоптеров:
Добавление новых датчиков – это достаточно большая работа. Во-первых, надо обязательно смотреть прошивку. Затем надо провести полевые испытания, которые часто заканчиваются поломкой конструкции. На ее восстановление может уйти несколько дней. Например, когда мы тестировали смотрящий вниз ультразвуковой сонар в роботе, то алгоритм, отвечающий за висение на месте дал сбой, и мы получили кучу гнутого железа вместо летающей плафтормы. Почему? Потому что сонары могут быть «глухими» или возвращают данные с недопустимой задержкой. Бывают сонары, которые хорошо работают в офисе, но плохо работают над асфальтом или другим покрытием и так далее.
Мы перебрали шесть сонаров. Первый раз решение по удержанию мы тестировали в офисе. Потом вышли на улицу и поняли, что сонар на улице земли уже не видит. Потом мы начали прикручивать датчик optic flow, а в нем тоже есть сонар. Значит, старый сонар мы должны выкинуть.
Или вот посадка. После того, как наш робот пролетает ворота (препятствие), изображение с камеры начинает анализироваться на предмет поиска посадочного маркера. Как только маркер находится на картинке — надо решить геометрическую задачу и дать роботу координаты для посадки. А дальше — ещё тесты: где-то мешает погрешность датчиков, где-то мы неправильно учитываем математику, где-то сбоит железо и так далее.
Тесты
Для тестирования алгоритмов мы используем симулятор gazebo, в котором создали достаточно точную модель нашего коптера и датчиков, а также воссоздали модель полигона. Что касается реальных тестов, то сначала мы летали в комнате примерно 10 на 10 метров. Для этого требовалось делать все аккуратно и точно, ведь: летающий робот в таком маленьком пространстве может много чего наделать. Там он у нас держал позицию с точностью до 10 сантиметров.
После этого, мы сделали копию конкурсного полигона на крыше парковки главного офиса КРОК, и приступили уже к проверке робота в «боевых» условиях.
Если научимся быстро проходить лабиринт — сможем облегчить робота за счёт замены аккумулятора на менее ёмкий и соответственно более легкий. Это облегчит конструкцию – сейчас он у нас весит 2,3 килограмма, а это уже предел по комфортному управлению.
Про железо
Наша платформа — Mikrokoper quadro XL. Вот изначальная аппаратная схема:
Схема в итоге была изменена по сравнению с изначально запланированной. Например, мы предполагали, что один аккумулятор будет, собственно, на саму летающую конструкцию (на моторы), и один аккумулятор — для питания датчиков и вычислителя. Сейчас это объединено в один аккумулятор. Плюс, как я уже говорил, поменялась модель сонара. Вернее, вместо сонара встала другая плата, Px4flow, в состав которой уже входит сонар. Пока мы оптимистично на нее смотрим. Возможно, в состав схемы будет еще добавлен акселерометр.
В первой схеме мы планировали вычислитель на базе ARMовских процессоров. Но потом мы остановились на программной архитектуре на базе Framework ROS (Robot Operating System). У этого Framework достаточно жесткие требования к операционным системам, определенные функции они гарантируют только на определенные версии системы Ubuntu основанной на Linux. И не на все ARMовские компы эта система устанавливается безоблачно, скажем так. NUC весит побольше, и питания ест побольше, но зато на нем все идет прекрасно. Это сэкономило нам много времени. Некоторые из команд его также пробовали.
Вот собственно программная архитектура:
Полигон
Много проблем было с тем, что основной пик испытаний робота пришелся на зиму. А нам на открытой платформе приземляться в сугроб — не самая желанная ситуация. Даже замотав плёнкой.
Когда мы построили тестовый полигон, у нас стены были из фанеры с плёнкой (что-то типа ламината), и на нем всё шло гладко. Но стоило их покрасить — и всё, точность датчиков резко упала из-за падения отражающей способности материала.
На днях к нам из Бельгии пришел второй робот. Он нам понадобится в качестве резерва к конкурсу, если с первым что-то случится.
Видео
Мы снимаем видео всего того, что происходит во время тестовых полётов и выкладываем на Ютуб.
Вот здесь можно посмотреть, как мы тестируем робота в условиях сильного ветра:
Вот тут старое видео еще с тех времен, когда мы летали в маленькой комнате:
А вот тут небольшая зарисовка из симулятора – тест на ограничение скорости:
Вот это тоже может быть интересным:
Другие команды
Первые команды стали отваливаться в самом начале из-за проблем с доставкой. Следующий существенный отсев был в апреле-мае, когда команды банально разбивали свои модели. И это очень обидно, когда уже есть наработки, есть понимание, как решать задачи, есть две тысячи строчек написанного кода. Писали, как жалко все это выбрасывать.
Есть команды, которые летают на стандартном AR.Drone. На AR.Drone есть сонары и две камеры: фронтальная HD и камера низкого разрешения, которая смотрит вертикально вниз. То есть в принципе, можно всё сделать как нужно, но задача будет довольно сложной алгоритмически. Можно, конечно, поставить робота носом к посадочному маркеру и решать задачу поиска маркера прямо под собой. Но стоит вмешаться и все провалится.
Есть парни, которые не используют никакой готовой платформы. Возможно, что часть схем они травили сами.
Есть и команды, где далеки от программирования, но зато у них 20-летний стаж по авиамоделированию, они этим ещё со времен Советского Союза занимаются. Берут к себе разработчика, пробуют.
Мы стараемся помогать другим командам: у нас всё-таки есть хороший доступ к железу.
Сейчас на нашем тестовом полигоне уже прошли тестовые полеты в рамках конкурса, могли прийти и не участвующие в битве разработчики беспилотников: заценить полигон, полетать. Сейчас на нем идут полеты в рамках последней контрольной точки (последний день – 21 июля) среди жителей Москвы и области. Если вы участвуете, то просто пишите на robots@croc.ru, мы сделаем пропуск. Советую поспешить с записью, в дни с четверга по воскресенье уже ажиотаж.