Если нет денег на AXIS, или управляемая вебкамера своими, в меру кривыми, руками

:

Когда я впервые увидел трансляцию видео с управляемой вебкамеры на 13-м этаже МГУ, меня это очень впечатлило. Настолько, что захотелось устроить нечто аналогичное. На камеры типа AXIS 214PTZ лишних денег у меня нет, так что пришлось на некоторое время эту идею оставить. До тех пор, пока я не узнал про Arduino и про то, что к ней можно приделать «сетевую карту» и моторчики. Необходимые комплектующие быстренько были приобретены и у меня в наличии оказалось всё для сооружения полноценной вебкамеры, управляемой по сети.

Изучение интернетов показало что идея приделать камеру к сервам приходит первой ко всем счастливым обладателей ардуины и сервомашинок. Однако, ни одна из уже реализованных схем управления (кнопками, мышкой PS/2, с управляемого роутера, с компа, с вебстранички на встроенном в ардуину сервере) меня не впечатлило, ибо неудобно, имхо. Хотелось чего-то универсального, чтобы можно было выложить веб-интерфейс на сайт и с него управлять.

В итоге появилась вот такая штукенция:


Обычная вебкамера Logitech Pro 9000 (выигранная давным-давно в «Компьютерре») прикреплена к качалке сервы №1 (ось Y). Серва №1, в свою очередь, прикреплена к качалке сервы №2 (ось X). А серва №2 довольно крепко прикручена к основанию — тяжёлому деревянному бруску. Сервы — самые простенькие и дешёвые SRM-102 (примерно 400 руб. за штуку).

Вот и вся конструкция, всё элементарно. Для соединений использованы планки от детского конструктора (помните, такие старые советские металлические конструкторы? Они ещё есть в продаже).

Контролер всего этого безобразия состоит из связки Arduino (точнее, Freeduino 2009) и Ethernet Shield v2. Тоже ничего сложного.

Придумалась примерная схема управления. Скрипт в веб-интерфейсе получает команды (нажатия кнопок, движения мыши и т.д.) и в определённом формате пишет их в базу. Ардуина циклически делает GET-запрос скрипту на сервере и скрипт выдаёт все команды из БД, после чего база очищается. Может, можно и покрасивее сделать, но меня в таком виде пока всё устраивает.

На серваке у меня MySQL крутится, база HEAP (чтоб пошустрее было). Структура вот такая:

CREATE TABLE `servo` (
`id` smallint(6) NOT NULL AUTO_INCREMENT,
`cam_id` tinyint(4) NOT NULL,
`action` varchar(20) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `cam_id` (`cam_id`)
) ENGINE=MEMORY DEFAULT CHARSET=cp1251 AUTO_INCREMENT=1 ;

Далее идут скрипты. Первый, самый главный, скетч для собссно Ардуины. Скетч не особо вылизан, так что его стопудово можно улучшить. Но, так как он стабильно работает, меня пока устраивает. Как заливать скетч не объясняю, ибо если вы знакомы с Ардуино, вы это уже знаете. Я использую IDE Arduino 18, так что и скетч под неё. В новой версии IDE скорее всего не заведётся!

Файл servowebclient.pde

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

index.php — собссно, страница с веб-интерфейсом управления камерой.
set.php — асинхронно вызываеся из index.php и пишет в БД нужные команды на перемещение камеры
get.php — скрипт вызывается удалённо Ардуиной, читает команды из БД и выдаёт их plain text'ом

Эти файлы, и вообще всю структуру каталога вебморды можно взять вот тут в архиве. serva.rar
Используемые библиотеки для Ардуины вот тут — libs.rar

В принципе, всё. Надеюсь, теперь все те, кто называл меня мегамозгом расслабятся и скажут «да это каждый дурак может» :-)

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

Логика управления прекрасно программируется на Javascript в основном файле index.php Так как за размещение команд отвечает функция MakeAction, с ней можно творить что угодно. Например, на вебморде есть ссылки типа «Фиксированные точки — Балкон». Это обычный вызов этой самой MakeAction(11, координата_x, координата_y), т.е. куда камеру надо направить. И таким образом можно программировать любые перемещения. Но надо не забывать о том что таким образом можно засрать очередь команд по самое нехочу. Например, у меня была функция Javascript «влево_вправо». Которая в цикле изменяла координату X, в итоге камера циклично гоняла туда-сюда. И если у кого-то в браузере была включена эта функция, никак нельзя было её остановить, пока её не выключал тот кто её включил. Временное решение было ставить таймер на подгрузку через jQuery ещё одного файлика, который принудительно убивал тот таймер. Это некрасиво, но работало.

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

Теперь немного о процессе тестирования, ибо о нём я просто должен рассказать.

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

Я всё пытался разместить описание камеры здесь на Хабре, но из-за маленькой, но очень положительной кармы никак не мог это сделать. Ну ни как, хоть ты тресни. Отчаявшись, я разместил вопрос в Q&A. В результате мне карму залили по-полной, намного больше чем требовалось для размещения топика. За что, в очередной раз, спасибо ребятам. Народу с Хабра очень понравилась (судя по комментам) моя реализация управления, так что камера на данный момент, почти непрерывно крутится уже девять часов (взято из статистики трансляции на смотри.ком). Сервы холодные, не греются нифига. Ардуина слегка тёпленькая. За всё это время был только один глюк — ардуина сетку потеряла. Как оказалось, «у меня был обрыв» (с)Антон Уральский

Были ещё глюки, связанные с включенным очень долгим воспроизведением обученных перемещений (кто-то врубил обучение, долго водил мышой а потом нажал Play), так что этот режим я ограничил сотней команд. Само собой, это ограничение легко обходится :-)

Завтра у меня рабочий день, на ночь я камеру отключу, но утром включу снова, на работе. Там ещё веселее будет.

UPD> Первая конструкция (на деревянном бруске) оказалось не очень устойчивой — удалось несколько раз её опрокинуть, резко мотнув камеру из стороны в сторону. Так что появилась новая модификация — серва №2 прикручена к маленькому деревянному брусочку. В брусочке просверлена дырочка, как раз под диаметр винта на стандартном крепеже от штатива. Ну и брусочек приклеплён к штативу от обычного фотоаппарата. Конструкция получилась меганадёжная — народ упорно вот уже 7 часов пытается её опрокинуть, а не получается.

Вдобавок, рядом с основной камерой была поставлена вторая (точно такая же Logitech, но стационарная), через которую можно было наблюдать, как колбасится первая. Очень увлекательное зрелище, если честно.

На удивление быстрой получилась реакция камеры — задержка по отношению к управлению в веб-морде составляет (у меня, во всяком случае) доли секунды. Хотя я дома сижу, а сервер на работе и между нами обычный корбино/билайновский интернет. Притормаживает видеотрансляция на smotri.com, но это не всегда.

Ну и дальше немного фотографий камеры и несколько видеороликов, для наглядности конструкции.

Несколько демонстрационных видеороликов (видео что-то не вставляется, так что просто ссылки даю):
www.youtube.com/watch?v=diEv3LS1nWg
www.youtube.com/watch?v=JEpCG5_nl1s
www.youtube.com/watch?v=t6cCTCtWCqg

Кстати, доча обожает эту игрушку. Правда, ей неважно, камера там или ещё что-то. Главное что двигается www.youtube.com/watch?v=dEOh0asfVJ0

А вот и, собсственно, котроллер. Бутерброд из Freeduino и Ethernet Shield

Ну и наконец,

Боже, дай сил моему серваку выдержать Хабраэффект, когда топик будет опубликован. И не дай загнуться камере в самом рассвете сил.

P.S. Проверял работу в Опере 10.63 и в свежем Хроме. Остальные браузеры теоретически тоже должны справляться.

P.P.S. Пользуясь случаем, хочу передать привет хабраюзеру SysCat, который однажды подарил мне мою первую Ардуину с е-шылдом и тем самым сподвиг на кучу интересных изысканий.

UPD> Забыл самое главое — рабочий веб-интерфейс вот тут www.g0l.ru/test/serva
Просьба отнестись с пониманием — камера и сервы не резиновые, так что не дёргайте, если она уже двигается. Оставлю включенной до утра, потом заберу с собой на работу и там включу.

UPD> Сделано управление через вебинтерфейс, но с геймпада. Нужна софтинка типа Joy2Key, для маппинга кнопок геймпада на клавиатурные кнопки. Если назначить кнопки вверх-влево-вниз-вправо на клавиатурные W A S D то можно управлять с геймпада. Обчные клавиатурные кнопки тоже работают.