Всем привет! Я один из создателей гонок радиоуправляемых тарантасов.

www.redbullsoapboxrace.ru — это онлайн проект, посвященный мероприятию Red Bull Soapbox Race и является гонками тарантасов в миниатюре.

Про наш проект написали пост, и это — ответ на приглашение рассказать о проекте.

Идея родилась на кухне за чашкой кофе, а как все произошло и как нам удалось реализовать проект за 4 недели, читайте дальше.

Публикую пост по просьбе Дмитрия Максимова — автора идеи и архитектуры проекта.

По факту у нас действительно было всего 4 недели на запуск проекта, но, как ни удивительно, командой из 6-ти человек мы справились с этой задачей. Для нас это было хорошей школой командной работы в экстремальных условиях.

Неделя 1


Архитектура

Архитектура на первый взгляд довольно простая:



Рассматривали несколько вариантов реализации:

  1. Готовые машинки с управлением через интернет. Такой вариант получался золотым, поэтому от него отказались сразу.
  2. Обращались в www.jokerracer.com, но они сказали, что на создание проекта у них ушло пол года и столько же потребуется, чтобы его заново поднять, а у нас было чуть больше 3-х недель. Кстати, у них были просто покатушки, а не гонки. Так что, мы по-прежнему можем носить титул «Первые в мире».
  3. Aurdino, который одним концом вставляется в usb порт, а другим цепляется к пульту и передает радио сигнал на машинку. Однако под Arduino требовалась разработка на низкоуровневом языке, а времени было уже в обрез.
  4. Phidgets – платформа с высокоуровневым API на более чем 20 языках и библиотеками для управления контроллерами двигателей, камерой и всевозможными сенсорами.

Последний вариант подошел идеально!

На машинку устанавливается бортовой компьютер на линуксе с 6 usb, к которому подключается микроконтроллер для DC мотора (коллекторный моторчик для движения) и микроконтроллер для серво привода (отвечает за поворот передних колес).

Плюс к компьютеру подключается магнитный датчик для фиксации времени круга, а через usb – камера и wi-fi адаптер.

Выглядит это все следующим образом:



Единственный минус phidgets – нам требовалось 7 комплектов для 7 машинок, а такое количество в полном комплекте можно было купить только в Канаде.

Машинки

С самого начала планировали использовать вот эту машинку: Monster Truck от HCP Racing. Машинка профессиональная, и к ней можно легко найти запчасти.



Еще до старта проекта мы консультировались с ребятами из Главбот, которые рекомендовали машинки с бесколлекторными моторами, поскольку коллекторные придется менять каждые 3 дня при планируемой нагрузке. Но phidgets работают только с DC моторами, поэтому пришлось идти на риск, который, кстати, в итоге оправдался – моторы, конечно, пришлось менять, но не часто, и не из-за большой нагрузки.

Машинка развивает скорость до 16 м/с, а помещение для гонок 15 м в длину, поэтому пришлось придумывать, как замедлять:
  1. Если ставить резисторы, то на подсевшей батарейке машинка уже не поедет. Отметаем.
  2. Думали сделать редукторы, но у нас получилась бы ручная сборка, которая при планируемой нагрузке ломалась бы ежедневно. Отметаем.
  3. Заглянули в API фиджетов и о, чудо! – есть возможность регулировать скорость. На этом и остановились.

Аккумуляторы

Аккумулятор, который идет в комплекте с машинкой, позволяет непрерывно ездить около 15 минут. Заезды у нас практически круглосуточные и хотелось сделать так, чтобы побольше людей смогло покататься, поэтому технические перерывы надо было сокращать до минимума.

В итоге подобрали вариант аккумуляторов, которые могут держать заряд до 4-х часов, но мы, на всякий случай, меняем их каждые 2 часа.



Вроде со всеми комплектующими определились, оставалось все достать, запрограммировать и протестировать.

UPD: Как и обещали, публикуем оставшуюся информацию о проекте!

Неделя 2: Сборка


Как я писал раньше, фиджеты пришлось заказывать из Канады прямо с сайта фиджетов. Всего было около 30-ти микросхем, которые точно бы зависли на российской таможне на пару месяцев, поэтому повезли через финляндию с двойной растоможкой. В июле по словам фиджетов в России появится дистрибьютор, но у нас столько времени не было.

Когда у нас все было на руках и мы собрали первый прототип, вес машинки оказался 3 кг (без учета корпуса) – пришлось укреплять амортизаторы, чтобы машинка не ездила на брюхе.

В итоге это выглядело так:





С помощью прилагавшейся к фиджетам Windows программы, мы смогли протестировать работу фиджетов, и сразу обнаружилось несколько проблем.



Камера

Фиджетовская камера передавала изображение в ужасном качестве, которое постоянно подвисало при разрешении 320Х240 и 10 кадрами в секунду
Сначала было предположение, что это связано с самими фиджетами, поэтому решили сразу использовать IP камеру, чтобы видео шло напрямую. Но этот вариант утяжелял машинку еще на 500 грамм, а этого она могла не выдержать при планируемой нагрузке.

Попробовали другую UVC-совместимую камеру (Logitech HD Pro Webcam C920) с автофокусом, Full HD изображением и аппаратным кодеком видео в h.264, и результат был просто замечательный! Правда использовать кодек h.264 не удалось, поскольку он не поддерживался фиджетами. Пришлось остановиться на MJPEG.

Пробовали также вариант подешевле Logitech HD Webcam C525 (сейчас стоит на онлайн трансляции с трассы), но видео опять стало подвисать.

Также заметили, что если рядом с камерой есть провода, то качество картинки значительно ухудшается, поэтому корпус от камеры снимать не стали, хотя с эстетической точки зрения было бы лучше, если камера находится в корпусе машинки.

Длину всех проводов пришлось укорачивать из-за помех, сказывающихся на работе камеры и wi-fi адаптера.

Неделя 3: Программирование


Заезды длятся 5 минут, одновременно в заездах может участвовать 5 машинок. Есть 2 запасные машинки, которые активируются, если у какой-то из 5-ти не проходит пинг.

Между заездами выделяется 1 минута на переключение управления от одного пользователя к другому.

Каждые 2 часа – технический перерыв на 30 минут на замену батареек и починку, если что-то вышло из строя.

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

1) Все, кто жил в радиусе 200 киллометров, мог записаться на ближайшее время.
2) Другие города могли записаться, начиная с конца расписания

Проблемы с задержкой такой вариант не решал, но, во всяком случае, плохих отзывов в начале не было.

Позже мы расширили возможность записи на ближайшее время для всего центрального региона.

Видео

Для качественного катания было очень важно, чтобы задержка была минимальной, поэтому варианты с трансляцией видео с машинки через медиа сервер отпадал.

Были варианты, чтобы пользователь устанавливал себе Java плагин, но, во-первых, он много весил, а во-вторых, врядли кто-то будет его себе устанавливать. Также хотели использовать Flash элемент, но он требовал наличия файла безопасности crossdomain.xml на домене с видеопотоком, а на веб сервере фиджетов httpd не удалось настроить mime типы для xml файлов.

Остановились на следующем варианте:
Для FF, Safari и Chrome — используем средства самих браузеров, которые могут поддерживать MPEG поток. Для остальных браузеров Java script с обновлением картинок. В итоге в локальной сети задержка составляла 50 милисекунд (для справки — машинка становится практически неуправляемой при задержке пол секунды).

Управление

Иногда получалось так, что при подключении к машинке, не подключался DC контроллер, т.е. пользователь не мог ехать вперед/назад. Эту проблему мы устранили с помощью переподключения. Поэтому во время отсчета времени и первые несколько секунд после машинка стоит на месте, а спустя 10 секунд наконец начинает ехать.

Сервер

Сервер — это обычный компьютер со следующими параметрами:
— процессор Intel Core i3-2100
— материнская плата GIGABYTE GA-H61M-S2V-B3
— оперативная память DDR3 DIMM Hynix — 4 Гб

Загрузка процессора, если катаются 5 машинок, составляет не более 10 процентов.

Интернет

Мы планировали использовать выделенный канал на 100 мб. В итоге нам хватило канала 20 мбит. При одновеременном участии в заезде пяти машинок исходящий траффик составляет около 7 мбит. Входящий трафик вообще не значительный.

Сначала пробовали использовать домашний роутер от Trendnet. Однако при одновременном подключении трех машинок он начинал зависать. Положение исправил переход на роутер Linksys e1200 от Cisco.

Периодически возникают помехи в wi-fi сигнале, и пинг у машинок либо пропадает, либо становится нереально большим. Это происходит раз в 2 дня и длится минут 5-10, потом все стабилизируется. Четкую закономерность выявить не смогли. До сих пор интересно, что такое может включаться на Красном Октябре?:)

Самая большая проблема с управлением была связана с тем, что периодически пропадала связь с машинкой или пользователем в том момент, когда шел запрос “вперед/назад” — в этом случае машинка так и подвисала в движении вперед, утыкалась в препятствие и сжигала мотор.

Думали перейти на другую частоту передачи wi-fi сигнала (5ГГц), но для этого необходимо было переходить на роутер и wi-fi адаптеры с поддержкой частоты 5ГГц и устанавливать соответствующие драйверы на бортовой компьютер. Несмотря на то что на бортовом компьютере стоит линукс у Phidgets нет стандартного механизма для установки драйверов. Поэтому от идеи перехода на другую частоту отказались.

Неделя 4: Тестирование и запуск


В начале была построена трасса, представляющая из себя восьмерку, с плавным подъемом и крутым спуском.



На спуске был установлен магнит (обычный, для заточки ножей), который активировал магнитный датчик, чтобы фиксировалось время круга.

Регулировка скорости

Мы планировали сделать постоянную скорость машинок, ограничив ее таким значением, чтобы машинка без проблем забиралась на горку. Но столкнулись с зависимостью скорости от степени заряженности батарейки. После 4 кругов машинка уже не могла взобраться на подъем без увеличения скорости, а значит необходимо было бы менять батарейки или увеличивать скорость каждые 4 круга.

Выбрали второй вариант, чтобы максимально автоматизировать процесс и сократить технические перерывы. Регулировка скорости была вынесена в интерфейс управления машинкой. У пользователя появилась возможность прибавлять скорость с помощью кнопок A-Z, чтобы забраться горку.

Когда запустили проект, выяснилось, что подъем не очень интересный с точки зрения катания — он узкий, сложно развернуться, если врезался, и на нем застревает большинство пользователей. Подъем убрали и сделали круговую трассу с маленькой ступенькой, чтобы пользователь не смог проехать обратно.

Моторы

Пока на трассе был подъем, приходилось менять моторы, поскольку они горели из-за подаваемого напряжения, если машинка не двигалась с места. Вентиляторы от ноутбуков помогали охдаждать двигатель, но не всегда.

В какой-то момент моторы в Москве закончились:-) Пришлось ставить предохранитель, который разрывал контакт между контроллером и мотором при сильном нагреве. К сожалению, это приводило к тому, что пользователь в средине гонки просто останавливался и ждал, пока предохранитель остынет и восстановится. Сейчас такой проблемы уже нет, поскольку трассу пересторили.

Вентиляторы

Вентиляторы использовали самые обычные от ноутбуков:

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

Корпус

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





Обновление 1:

Может быть, хабрэффект, а может и еще что-то, но сегодня 5 машинок одновременно ездили с трудом. Поставили 2 роутера — стало лучше.

Обновление 2 — про систему учета времени круга

Еще одним из интересных вопросов на проекте был выбор системы учета времени круга. Было несколько вариантов.

Использовать готовое решение. Для офф-лайновых соревнований радиоуправляемых машинок многие клубы используют профессиональную систему учета времени My Laps. Система состоит из декодера, транспондеров, которые устанавливаются на машинки и рамки, фиксирующей пересечение финишной прямой. При этом если машинка пересекает финишную прямую в обратном направлении, то декодер это понимает.

Однако My Laps достаточно дорогое решение. Мы нашли интересную альтернативу — систему I-Laps, которая практически не уступает My Laps по техническим характеристикам, но цена получается в несколько раз дешевле.

У I-Laps есть собственное программное обеспечение для проведения соревнований. Однако для наших целей оно не подходило, поскольку там не было возможности выгружать данные из системы чтобы показывать время каждого круга и лучшее время круга по окончании заезда.

Еще нашли DCD timeR — с виду очень элегантное решение, и по цене было доступным. Но производители сказали, что не смогут сделать для нас API, чтобы мы выгружали данные к себе на сайт. А жаль — нам это решение очень понравилось.

Мы уже почти свыклись с мыслью что писать интеграцию с I-Laps, нам придется самим, но оказалось что к бортовому компьютеру можно подключить аналоговый магнитный датчик. При повышении значения магнитного поля он отправляет сигнал бортовому компьютеру. В качестве источника магнитного поля мы использовали магнит для крепления инструментов на стену. Gol задавал вопрос о том как мы справились с тем что машинки могут переезжать через финиш в обратном направлении. Пока решили с помощью ступеньки. Более интересное решений — поставить на каждую машинку по два магнитных датчика. Тогда по последовательности их срабатывания можно определить в каком направлении машинка пересекла финишную линию.

Желающих покататься действительно много — нам пришлось открыть ночные часы для заездов, чтобы все могли попробовать. Жаль, конечно, что не все смогли нормально погонять, но ведь это только начало!