Олимпиада «Программирование мобильных роботов — 2010» [25.05.2010-27.05.2010]
В конце апреля чуть ли не случайно я узнал, что меня включили в команду ВНТУ по робототехнике, которая в конце мая будет участвовать во Всеукраинской олимпиаде по программированию мобильных роботов. На меня была возложена задача съездить в Киев, в представительство компании Festo, привезти искомого робота к нам, в Винницу, обучить товарищей по команде (призера многочисленных олимпиад по спортивному программированию Невидомого Виталия и студента 3-го круса специальности интеллектуальных систем Зозовского Александра) азам работы с этим роботом, смотаться по-быстрому в Севастополь всей командой, занять там призовое место и вернуться домой. Задача ясна? Принять к исполнению :)
Робот, за которым я ездил, называется Robotino. Это закрытая аппаратно-программная платформа под управлением собственного легковесного дистрибутива Linux. Краткие характеристики этого робота следующие:
- 37 см в диаметре, 11 кг веса;
- WiFi, при помощи которого осуществляется управление роботом и заливка в его память написанных программ;
- двигатель OmniDrive, который позволяет как управлять каждым из трех колес-роликов по отдельности, так и управлять всем роботом как единым целым;
- веб-камера Logitech для получения видеоданных об окружающей среде;
- 9 инфракрасных датчиков средней чувствительности;
- бампер, который выдает сигнал 0/1 в зависимости от того, было ли столкновение;
- дополнительные оптоволоконные и инфракрасные датчики, о характеристиках которых ничего не скажу, т.к. банально не дошли руки с ними разобраться.
Внешний вид Роботино таков:
Стоимость робота — чуть больше 7000 евро. Как мне кажется — несколько дороговато; за эти деньги можно было бы купить несколько наборов Lego NXT, которые гораздо гибче и легче кастомизируются.
Программируется это чудо либо при помощи RobotinoView II — среды «визуального программирования», либо при помощи API на C/C++, Java, C#, VB.NET, Mathlab, Simulink, Labview.
Среду RobotinoView II (см. ниже) мы, как настоящие парни, отвергли сразу и решили писать на чистом С++.
За неделю подготовки мы написали несколько программ, которые выпоняли часть заданий из условий олимпиады. Каждая команда должна была подготовить домашнее задание. Мы, на всякий случай, подготовили их два: автоматическое прохождение лабиринта по правилу левой руки, и выписывание восьмерки-триплекса вокруг трех столбиков разных цветов. На этом подготовка к олимпиаде закончилась :)
Сама олимпиада проводилась под крышей Севастопольского Национального Технического Университета и Festo-Didactic. В первый день, 25 мая, проводилась регистрация и расселение участников, а также мастер-класс по программированию Роботино, во второй день — непосредственно олимпиада, а в последний день было награждение победителей и экскурсия по Севастополю.
Всего участвовали: мы (Винница), команда из Донецка, две команды из Севастополя, включая организаторов соревнований (!), и команда из Киева.
В день регистрации проводился мастер-класс, который вел один из организаторов и участников Виталий. К сожалению, он осветил только программирование в среде RobotinoView и даже не заикнулся о программировании на чем-то еще. В конце он выдал все желающим «заготовки», которые являли собой частично решенные задания олимпиады. Также мы с приятным удивлением узнали, что задания были несколько упрощены из-за технических трудностей реализации их в запланированном виде.
В результате, список заданий выглядел так:
- Езда по лабиринту при помощи джойстика: глядя на робота — 10 баллов, ориентируясь на показания камеры — 20 баллов.
- «Воротца и маячки»: потушить 3 раноцветных маячка при помощи инфракрасного луча — 10 баллов, проехать между двумя парами ворот — 20 баллов, описать воьсмерку — 30 баллов, описать восьмерку-триплекс — 40 баллов.
- Езда по линии: просто следовать линии — 10 баллов, объехать два перпятствия — 20 баллов.
- Домашнее задание — до 50 баллов.
В нашем распоряжении было 5 роботов Роботино, из которых два с более новым железом и прошивкой, два — более старых. Что было неприятного: роботов постоянно тасовали, поэтому программу приходилось постоянно калибовать заново, что было значительной тратой времени и нервов.
Наша команда: Зозовский Александр, Богомолов Юрий, Невидомый Виталий и наш тренер — Месюра Владимир Иванович
Согласно жеребьевке, мы начали с задания с воротцами и маячками. Нас сразу же сбил с толку судья, сообщим «Вы выбирайте самое сложное задание, которое можете выполнить, и двигайтесь дальше!..». На самом же деле следовало выполнять все задания, мы узнали об этом довольно поздно, но еще успели выполнить обычную восьмерку. Триплекс сделать не смогли — при написании программы мы рассчитывали на равное расстояние между воротцами, а на полигоне последний столбик был несколько дальше — таки образом, Роботино просто не успевал за него «зацепиться» датчиком и постоянно ехал мимо.
Наша команда в процессе выполнения первого задания:
Следующим нашим заданием был лабиринт; описывать тут особо и нечего — натренированный в Need For Speed Виталий Невидомый показал второй по времени результат и первый — по чистоте езды :) Баллы начислялись за занятое место по времени, от них отнимались штрафные баллы за касание стенок. У нас был лучший результат по чистоте — 0 касаний при езде глядя, и 1 касание при езде вслепую. Киевляне пролетели лабиринт глядя быстрее всех, но с семью касаниями. Команда Севастополь-1 (организаторы) была, вроде бы, на третьем месте.
Лабиринт выглядел так:
На этом же полигоне мы сразу продемонстрировали наше домашнее задание — автоматическое прохождение лабиринта по правилу левой руки, получив за него максимум (50) баллов.
Последний испытанием была езда по линии. Простое следование мы выполнили на «ура», а вот с объездом препятствий было сложнее: на одном участке сбоила камера, в следствии чего робот не распознавал линию и начинал крутиться на месте, ища ее.
Попытки объехать препятствие:
В результате предварительного подведения итогов были получены такие результаты: Севастополь-1 — первое место (кто бы сомневался :), мы — второе место, Киев — третье место. На этом официальные соревнования закончились.
День награждения был большим сюрпризом: оказалось, организаторы ввели еще и индивидуальный зачет, о котором никто до этого вообще не слышал.
Итого, места и награды:
- Первое место в командном зачете: первая команда СевНТУ.
- Второе место в командном зачете: команда ВНТУ.
- Третье место в командном зачете: команда КПИ.
Места индивидуального зачета, увы, не помню.
После награждения была небольшая экскурсия по Festo-Didactic и свободное время, которое мы полностью посвятили экскурсии по Херсонесу:
В заключение скажу, что совсем недавно Роботино был официально приобретен ВНТУ для проведения тренировок и лабораторных занятий среди студентов, когда будут разработаны соответствующие задания.