Беспилотники и автономные полётыМашинное зрениеСоревнования и турниры

Как мы улетели и с трудом вернулись: подробный отчёт об участии в соревнованиях летающих роботов КРОК

От новости на Хабрахабре в сентябре 2012 года до финала на полигоне КРОК: как команда из Сергиева Посада обучала квадрокоптер находить крест-маркер по одной камере, почему «датчики врут» и как ветер чуть не сорвал всё за два дня до старта.

Материал пересказывает отчёт самой команды, опубликованный вскоре после финала. Все этапы описаны с её слов.

Старт: 3 сентября 2012

Прочитав на Хабрахабре новость о соревнованиях летающих роботов, участники поняли, что искали повод перевести многолетний интерес к робототехнике в профессиональное русло. Решения принимались быстро: взять готовый дрон и сосредоточиться на программном обеспечении, а для демонстрации компетенции в компьютерном зрении использовать только камеру. Иллюзий о победе не было: команд много, приз один. Организацию соревнований участники оценили как беспрецедентно высокую для России.

Почему камера

По мнению авторов, «практически все датчики врут»: лидар дорог, не видит объёма и слепнет в ясную погоду; сонары мешают друг другу и ловят непонятные отражения; ИК-дальномеры и Kinect работают лишь на близких расстояниях. Полёт по датчикам возможен для узких, почти лабораторных задач, а у большинства датчиков ограничен радиус действия.

Камера универсальнее: по весу и энергопотреблению сравнима с сонарами, по скорости — с лидарами, а по дальности и разрешению конкурентов у неё нет. Практически вся живая природа использует оптику. Цена — необходимость эффективных алгоритмов, но именно ими команда занималась профессионально. (Оценки относятся к 2013 году; подробнее и с поправкой на сегодняшний день — в руководстве по датчикам.)

Рождённые ползать: тренировки на земле

Свободного времени почти не было: участники работали в разных местах и встречались в кафе или дома. Поскольку опыт с наземными роботами уже был, тренировались на них: на платформу Pololu 3Pi поставили камеру и модуль связи, на ватмане изобразили полигон чёрной изолентой, напечатали уменьшенные копии маркеров и начали писать алгоритмы. Эксперименты доказали принципиальную возможность выполнить задание только по камере.

Контрольные точки отбора

Первая контрольная точка требовала видеоролик-презентацию команды. Его сняли на фоне Троице-Сергиевой лавры при температуре около −20 °C — с третьего дубля. Организаторы выкладывали ролики по мере получения; команда была в первой-второй десятке. Просмотрев все ролики (более восьми часов), авторы заключили, что многие участники не осознают сложность задачи.

Следующие этапы это подтвердили:

ЭтапЧто требовалосьОсталось участников
КТ-1Видеоролик-презентация237
КТ-2Подтвердить участие204
КТ-3Показать управляемый автоматически дрон72

Первое прозрение: кресты вокруг нас

К тому моменту у команды был Parrot AR.Drone 2.0. Языком разработки выбрали C#, воспользовались готовой библиотекой для связи с AR.Drone, написанной Русланом Баланухиным, и начали с простой цели: взлететь, найти по нижней камере крест и зависнуть над его центром, противодействуя сносу потоками воздуха. Заказали у рекламщиков уменьшенные копии маркеров диаметром один метр и положили один в центре комнаты 4 × 4 м.

Сразу выяснилось:

  • крестов вокруг оказывается очень много;
  • «белое» и «чёрное» — понятия относительные;
  • стандартные алгоритмы выделения линий OpenCV находят линии там, где их вообще не ожидаешь;
  • с камеры приходят битые кадры.

Отказавшись на время от поиска линий, крест стали распознавать по контуру. За пару недель точность распознавания довела до 70–80 % при любом освещении, и дрон научился зависать над крестом. Тогда же поняли: нельзя доверять единичному распознаванию, результаты нужно усреднять.

«Морковка» для дрона

За месяц до КТ-3 команду пригласили на весенние соревнования роботов физико-математического лицея № 239 в Санкт-Петербурге, где была дисциплина «Воздушные гонки» по регламенту RobotChallenge: за 10 минут пролететь как можно больше правильных восьмёрок. На полу была начерчена пунктирная линия. Идея: вместо центра креста передавать системе управления верхнюю видимую точку пунктира — дрон, как мул за морковкой, пытался зависнуть над ней, а ему подсовывали следующую.

На отладку на реальном полигоне было четыре часа, и результатом стали пять кругов и второе место. Но обнаружилась проблема связи: больше половины отведённых 10 минут ушло на восстановление соединения. Позже выяснилось, что это типичная проблема дронов Parrot. Ролик с этих соревнований команда использовала для прохождения КТ-3.

Фильтруй, и всё получится

Вернувшись, команда занялась полётами между маркерами. Нужно было летать на реальные расстояния в реальных условиях, поэтому договорились об использовании школьного спортзала на каникулы. Напечатали кресты в натуральную величину и снова удивились: большой крест целиком в нижнюю камеру просто не помещается. Пришлось вернуться к определению по линиям — но уже с цепочкой фильтров:

  1. получить все линии;
  2. объединить рваные линии и отфильтровать по контрастности и местоположению (кресты на потолке и стенах не нужны);
  3. найти пересечения;
  4. отсеять фигуры, не похожие на настоящий маркер.
Цепочка фильтрации линий при поиске маркера Семь шагов: исходное изображение, найденные линии, фильтр по контрастности, объединение рваных линий, поиск пересечений, отсев непохожих на крест, результат. 1. Исходноеизображение 2. Найденныелинии 3. Фильтр поконтрастности 4. Склейкарваных линий 5. Поискпересечений 6. Отсев непохожихна крест 7. Результат Каждый шаг отбрасывает часть кандидатов: сначала линии, затем пересечения, затем целые фигуры.
Схема цепочки фильтрации, о которой рассказывает отчёт: от всех найденных линий к одному надёжному маркеру.

Авторы признаются, что подход ужасно прожорлив к ресурсам, зато достаточно надёжен: «фильтруем, фильтруем и ещё раз фильтруем».

Ветер и связь

КТ-4 нужно было проходить на полигоне организатора. К проблемам со связью добавился ветер: дрон сносило, а алгоритма противодействия порывам не было. Из двадцати попыток задание удалось выполнить три раза; организаторы засчитали попытку, и команда прошла КТ-4 первой.

Связь окончательно «закрыли» внешней антенной и роутером — способом, найденным до них другими владельцами Parrot. Как выяснилось позже, многие команды столкнулись с проблемой только на финале. За три недели до финала организаторы утвердили полигон, и каждому участнику разрешили дважды приехать для настройки.

Три проблемы на полигоне

После первого визита возникло ощущение, что задание не выполнить:

  • Определение коридора. Перегородка из строительных блоков мешала алгоритму определения стенок.
  • Посадка при ветре. Дрон находил крест, выцеливал и садился «с закрытыми глазами», но порыв сносил его с площадки.
  • Взлёт и разворот при ветре. Операция выполнялась «на автомате», и дрон мог улететь на стену.

Две попытки ручного полёта по камере закончились ударом о стену. За неделю доработали определение коридора методом «точки схода» (vanishing point). Во второй визит, за три дня до старта, коридор удалось пройти автоматически в одну сторону. Ветер при посадке подавили активным удержанием углов крена, тангажа и рыскания, а взлёт стали делать «винтом» — набирая высоту и одновременно разворачиваясь. Порывы имитировали листом ДВП в спортзале, «выглядело довольно комично».

Финал

Вечером 23 августа команда подняла бокалы: теперь она знала, что имеет хороший шанс выполнить задание. Не успели лишь автоматический выбор направления на развилках: использовали правило правой или левой руки, которое переключали после каждой посадки. Это едва не подвело: упёршись в стену на обратном пути, дрон развернулся по правому правилу, потом по левому и лишь после третьей посадки вернулся правильно.

Первая попытка дала 6 минут 45 секунд — по мнению команды, «проигрышное время», ведь достаточно было кому-то просто выполнить задание. Во второй попытке скорость подняли в полтора раза, но забыли изменить параметр торможения, зависящий от расстояния до препятствия, и аппарат остановился о стену. Остальные участники дистанцию так и не прошли; у дрона организаторов было лучшее время, но он выступал вне зачёта.

Что из этого можно вынести

  1. Не доверяйте одному распознаванию — усредняйте.
  2. Тестируйте в реальных условиях: ветер и свет не воспроизвести за столом.
  3. Каждый параметр безопасности должен масштабироваться вместе со скоростью.
  4. Сначала сделайте систему надёжной, потом быстрой.