Материал пересказывает отчёт самой команды, опубликованный вскоре после финала. Все этапы описаны с её слов.
Старт: 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.
Фильтруй, и всё получится
Вернувшись, команда занялась полётами между маркерами. Нужно было летать на реальные расстояния в реальных условиях, поэтому договорились об использовании школьного спортзала на каникулы. Напечатали кресты в натуральную величину и снова удивились: большой крест целиком в нижнюю камеру просто не помещается. Пришлось вернуться к определению по линиям — но уже с цепочкой фильтров:
- получить все линии;
- объединить рваные линии и отфильтровать по контрастности и местоположению (кресты на потолке и стенах не нужны);
- найти пересечения;
- отсеять фигуры, не похожие на настоящий маркер.
Авторы признаются, что подход ужасно прожорлив к ресурсам, зато достаточно надёжен: «фильтруем, фильтруем и ещё раз фильтруем».
Ветер и связь
КТ-4 нужно было проходить на полигоне организатора. К проблемам со связью добавился ветер: дрон сносило, а алгоритма противодействия порывам не было. Из двадцати попыток задание удалось выполнить три раза; организаторы засчитали попытку, и команда прошла КТ-4 первой.
Связь окончательно «закрыли» внешней антенной и роутером — способом, найденным до них другими владельцами Parrot. Как выяснилось позже, многие команды столкнулись с проблемой только на финале. За три недели до финала организаторы утвердили полигон, и каждому участнику разрешили дважды приехать для настройки.
Три проблемы на полигоне
После первого визита возникло ощущение, что задание не выполнить:
- Определение коридора. Перегородка из строительных блоков мешала алгоритму определения стенок.
- Посадка при ветре. Дрон находил крест, выцеливал и садился «с закрытыми глазами», но порыв сносил его с площадки.
- Взлёт и разворот при ветре. Операция выполнялась «на автомате», и дрон мог улететь на стену.
Две попытки ручного полёта по камере закончились ударом о стену. За неделю доработали определение коридора методом «точки схода» (vanishing point). Во второй визит, за три дня до старта, коридор удалось пройти автоматически в одну сторону. Ветер при посадке подавили активным удержанием углов крена, тангажа и рыскания, а взлёт стали делать «винтом» — набирая высоту и одновременно разворачиваясь. Порывы имитировали листом ДВП в спортзале, «выглядело довольно комично».
Финал
Вечером 23 августа команда подняла бокалы: теперь она знала, что имеет хороший шанс выполнить задание. Не успели лишь автоматический выбор направления на развилках: использовали правило правой или левой руки, которое переключали после каждой посадки. Это едва не подвело: упёршись в стену на обратном пути, дрон развернулся по правому правилу, потом по левому и лишь после третьей посадки вернулся правильно.
Первая попытка дала 6 минут 45 секунд — по мнению команды, «проигрышное время», ведь достаточно было кому-то просто выполнить задание. Во второй попытке скорость подняли в полтора раза, но забыли изменить параметр торможения, зависящий от расстояния до препятствия, и аппарат остановился о стену. Остальные участники дистанцию так и не прошли; у дрона организаторов было лучшее время, но он выступал вне зачёта.
Что из этого можно вынести
- Не доверяйте одному распознаванию — усредняйте.
- Тестируйте в реальных условиях: ветер и свет не воспроизвести за столом.
- Каждый параметр безопасности должен масштабироваться вместе со скоростью.
- Сначала сделайте систему надёжной, потом быстрой.