21 июня, в день летнего солнцестояния, в подмосковной усадьбе Середниково прошел шестой по счету костюмированный бал Midsummer Night’s Dream. Каждый год на мероприятии собираются гости в действительно впечатляющих маскарадных костюмах. Однако сегодня мы хотим рассказать немного не об этом.
Наше сотрудничество с организаторами стало уже доброй традицией. В этом году мы решили удивить посетителей интерактивной инсталляцией — «bullet time» фотомашиной, состоящей из 60 смартфонов Nokia Lumia 1520. Она позволяла делать впечатляющие живые снимки с эффектом застывшего времени в формате 360°, которыми впоследствии могли насладиться гости фестиваля. О технических аспектах создания этой фотомашины мы поговорили с нашими коллегами, отвечавшими за непосредственную реализацию проекта.
Процесс
Мы пришли к нашим коллегам из Hello Computer с готовой идеей и… сжатыми сроками. К счастью, они с готовностью взялись за работу:
«На реализацию проекта было выделено всего три недели, а после всех согласований и написаний ТЗ вообще две. Поэтому мы сразу постарались определиться с наиболее оптимальными решениями и платформами, которые смогли бы обеспечить нам быструю скорость разработки.
В первую очередь мы начали с синхронизации телефонов. Понятное дело, что заставить 60 устройств, подключенных по беспроводной связи, сделать снимок одновременно —это довольно сложная задача. Поэтому наш выбор пал на архитектуру «клиент—сервер» ».
По задумке разработчиков телефоны (клиенты) должны были обращаться к серверу, синхронизировать с ним время, высчитывая поправки на прохождение сигнала и получить от сервера время, когда нужно сделать снимок.
Команда
В команду, работавшую над проектом вошло 7 человек: два Windows / Windows Phone разработчика (один работал приложением для телефона, второй над планшетом); cерверный разработчик, работавший с центральным сервером и утилитами для склейки и шеринга; продюсер проекта и ассистент продюсера, отвечавшие за менеджмент; дизайнер; технический директор, на плечи которого легло составление ТЗ, согласование работ, прототипирование, проектирование сети и оборудования.
Архитектура
Как полагается, коллективный мыслительный процесс начался с бурного обсуждения, правда предметом стала сама Nokia Lumia 1520:
«У нас в студии только один человек пользуется Windows Phone, поэтому всем остальным было интересно испытать устройства и заодно потратить полдня на «холивар» на темы: «Нужны ли такие большие телефоны?», «Хорошая ли платформа Windows Phone?» и т.д.».
Однако вскоре проект начал обретать свои черты с технической стороны:
«Поскольку мы с самого начала определились с архитектурой проекта, главной задачей для нас было убрать как можно больше логики на сервер. Выставление любого рода настроек в 60 телефонах — очень трудоемкая задача.
Мы начали с простенького прототипа сервера на NodeJS и скелета приложения для телефона на Windows Phone 8.1. Раз в секунду сервер посылал запросы на смартфоны для синхронизации текущего времени и времени момента съемки. Также мы сделали вывод разницы «внутреннего» времени устройства и хронометража, который он получал от сервера. Эта разница нас порадовала: она была всего в пределах 20-30 миллисекунд».
На первом этапе проектирования у разработчиков было 5 смартфонов, из которых собрали первый прототип. После быстрого тестирования, как водится, выяснились непредвиденные трудности:
«Первое, что бросалось в глаза — это разница в цвете и освещенности снимков. А для «склейки» нам нужно было получить одинаковую картинку на всех устройствах.
Здесь Windows Phone порадовал нас хорошей и полной документацией (например, про то, какие настройки можно передавать в телефон) и готовыми примерами. Нам было важно выставить на всех устройствах одинаковый баланс белого, выдержку и ISO. И благодаря расширенным настройкам съемки в Nokia Lumia 1520, которые обычно встречаются только в фотоаппаратах, нам с легкость удалось выстроить кадр на каждом из устройств. Еще нас приятно удивил и оказался полезен ручной режим настройки фокусировки.
Все эти настройки телефоны получали также от сервера».
Дальше команде предстояло наладить взаимодействие устройств и сервера:
«Довольно быстро мы настроили автоматическую отправку фото обратно на сервер. К этому моменту у нас был готовый прототип приложения, который можно было начинать тестировать на большем количестве телефонов.
Все клиент-серверное взаимодействие мы организовали по принципам REST API. В NodeJS (точнее, в Express) это делается довольно быстро и просто. Интерфейс управления мы сделали в виде простой веб-странички которая открывается с локального сервера. Обмен данными реализовали с помощью вебсокетов. Благо, о кроссбраузерности нам беспокоиться не пришлось».
Склейка и размещение в сети
Параллельно с написанием приложения для телефонов команда занималась работой с утилитами для склейки фотографий в один видеоролик с последующим их размещением в сети. Как было ясно из количества устройств, задействованных в проекте, на вход утилиты должны были получать набор из 60 фото.
«Мы решили не изобретать велосипед и для склейки и ресайза фотографий использовали ffmpeg. Он приятно удивил нас тем, что мог сделать все что нам нужно: склеить фото в видео с изменением качества сжатия и fps;, изменить размер фотографии, наложить водный знак».
Важной задачей проекта была возможность автоматического размещения в сети получившихся видео. Для нас была приоритетной социальная составляющая данного проекта, поэтому от команды требовалось научить фотомашину автоматически загружать видео в публичный поток, отправлять ссылки на почту и давать возможность гостям MSND поделится видео в соцсетях.
«В качестве
От предудщего проекта у нас остался подходящий скрипт на Python. Он работал довольно просто: сканировал нужную папку и загружал каждый новый видеофайл, после чего он создавал меленький текстовый файл с адресом видео и его статусом. Мы специально отказались от использования баз данных в пользу гибкости скрипта и переносимости в любой другой проект. Также этот скрипт умел отправлять видео на почту».
Мы также попросили добавить возможность загрузить видео к себе на устройство посредством сервиса OneDrive:
«У OneDrive есть понятное и удобное API. Поэтому наш скрипт мы просто дополнили модулем для заливки видео в «облако». Сначала он проходил стандартную OAuth авторизацию, затем заливал файлы в наш аккаунт и получал ссылку для просмотра и скачивания. Эта ссылка сохранялась в тот же небольшой файл».
Важным аспектом работы всех утилит была поддержка оффлайн-режима работы. Если закачка файлов по тем или иным причинам не удавалась, скрипты тихо пытались повторить ее через некоторое время.
Планшет
В качестве устройства, на котором гости могли бы посмотреть свои 360° снимки, был выбран планшет на Windows RT – Lumia 2520. Разработчики написали приложение, которое также обращалось к серверу и получало от него список всех видео. В приложении пользователи могли ввести почту, а также получить QR код со ссылкой на OneDrive или Coub.
Сетевая архитектура
Когда софт был готов, пришло время перейти к полевым испытаниям. Для начала все 60 смартфонов и сервер были объединены в одну сеть. Для того, чтобы команда не запуталась при финальной сборке и дальнейшей работе с контентом, серверу был присвоен 254 адрес, а смартфонам с 1 по 60. Все устройства были строго пронумерованы, а в роутере каждому MAC-адресу присвоен свой IP.
Однако единовременное подключение 60 телефонов в одну Wi-Fi сеть оказалось не такой простой задачей:
«Все 60 смартфонов мы получили за 5 дней до запуска, и тут начались самые веселые «танцы с бубном» в этом проекте.
Мы начали тесты на одном из самых топовых роутеров (здесь и далее в тексте фирмы-производители и модели роутеров не упоминаются во избежание нанесения какого-либо репутационного ущерба, прим. автора). Он спокойно выдержал подключение всех 60 Lumia, но при попытке получить снимки с устройств файлы начинали теряться. Мы к этому были готовы и имели наготове «тарелочки» от другого известного производителя, чтобы равномерно распределить клиенты по трем роутерам».
Однако и в этом случае команда потерпела неудачу: передача первого пакета фотографий происходила без особых проблем, но остальные терялись при передаче или приходили с задержкой в несколько минут.
«Мы начали паниковать — 4 дня до запуска, а с Wi-Fi все плохо. Попробовали развести все по разным непересекающимся каналам. Cтало лучше, но не намного. При том, что «вес» одного фото — всего 500 килобайт, то есть общий размер 60 фотографий составлял 30 мегабайт + служебный траффик ».
Начался долгий этап тестирования. Инженеры пытались понять, как изменяется ситуация при отключении того или иного количества телефонов.
«Наверное, выводы, к которым мы пришли, покажутся логичными для специалистов, но мы столкнулись с такими проблемами впервые. Поэтому их решение стоило нам немало времени.
Ключевой ошибкой для нас стало то, что мы пытались передавать все фото одновременно. Сигналы мешали друг другу, поэтому файлы передавались очень медленно. Проблему мы смогли решить выставлением задержки в 2 секунды для каждого следующего устройства в цепочке».
В итоге мы пришли к схеме, в которой каждые 20 устройств были разнесены на отдельный роутер и свой отдельный канал. Это позволило передавать одновременно по 1 файлу на каждый роутер с учетом двухсекундной задержки без особых проблем. В такой архитектуре на отправку одного снимка уходило от 0,5 до 2 секунд (иногда возникали задержки до 10 секунд), но потеря файлов уже была исключена из списка проблем.
«Таким образом сбор всех фотографий с устройств у нас занимал порядка 45 секунд. Наверное, этот процесс можно было сделать быстрее, но в условиях жесткого дедлайна на дальнейшие эксперименты не было времени. Да и такая скорость, в принципе, всех устраивала: смена гостей внутри «фермы» (внутреннее название инсталляции среди разработчиков, прим. автора) и подготовка к съемке занимали примерно столько же времени».
«Ферма»
В основу «фермы» легла классическая конструкция для съемки видео в формате bullet time: изогнутая спиралеобразная рама, на которую крепятся устройства для съемки. По ходу обсуждения проекта были предложены некоторые декоративные улучшения. Одним из них стал, например, подходящий для тематики мероприятия декоративный костер в центре инсталляции, через который должны были прыгать гости в момент съемки.
Экспериментируя с формой рамы команда остановилась на четырехметровом радиусе и вертикальном расположении телефонов. Это объяснялось как особенностями съемки самих смартфонов, так и рамками бюджета: увеличение радиуса до 6 или 8 метров привело бы к значительному удорожанию проекта.
«Главной инженерной задачей на данном этапе была разработка крепления, которое позволило бы очень точно настраивать положение телефонов в 2 плоскостях вращения. В итоге мы остановились на пластиковом креплении с металлическими зажимами. Единственное, что оставалось — это произвести и смонтировать все в срок».
День икс: монтаж
На последнем этапе команде предстояло собрать разрозненные компоненты в одну единую систему. На монтаж оборудования у них оставалось всего два дня. Первый день был полностью отдан на монтаж конструкции и интернет-оборудования, а второй — на установку и настройку смартфонов, технического оборудование и их тестирование.
«Самый сложный и трудоемкий этап — монтаж смартфонов. Заливка софта на все 60 устройств занимает примерно час. А теперь представьте, чего нам стоили любые найденные баги (хорошо, что клиент не согласился на 120 телефонов :)).
На этапе тестирования мы действительно несколько раз сталкивались с ошибками, в результате нам приходилось снова и снова обновлять ПО на всех устройствах. Наверное, можно было бы сделать систему обновления по воздуху, но времени на это уже не было.
Отдельная история — монтаж 60 «Люмий». Смартфоны нужно было смонтировать очень точно, чтобы в итоговых роликах не было скачков. Для этого мы сделали специальный режим настройки, когда смартфоны выводили изображение с камеры на экран с меткой по центру. В центре «фермы» мы установили стойку с яркой мишенью, на которую и наводили смартфоны. На первый взгляд кажется, что это просто, но в реальности у нас ушло на это порядка 4 часов на первичную настройку и еще 3 часа на подгон».
Всю ночь и последующий день, вплоть до начала мероприятия, команда занималась тестированием софта, отладкой модулей и исправлением ошибок ПО.
Планирование
Воплотить в жизнь проект подобного уровня за двухнедельный срок был серьезным вызовом для команды разработчиков.
«Этот проект делался под конкретное мероприятие и имел четкий «дедлайн», поэтому задержка даже на день была бы для нас всех полным провалом. Нам нужно было четко распланировать наши ресурсы.
Мы старались сначала максимально упростить задачу. Сделать сырой минимум, а потом добавлять в него «фичи» и дополнительную функциональность. И так во всех аспектах — от программирования до проектирования конструкции.
Для того, чтобы точно уложиться в срок все процессы пришлось запускать параллельно. Мы старались делать максимально автономные компоненты, чтобы разработчики не зависели друг от друга».
Впечатления
«На самом деле такие проекты очень сильно заряжают. Мы очень сплоченно работали на протяжении всех двух недель. Чувствовалось, что все болели за результат. В том числе и Nokia: клиент шел нам на встречу и оперативно принимал все решения.
В целом, проект удался, и мы все реализовали в срок. Конечно, есть еще масса аспектов, которые можно улучшить.
Например, мы так и не смогли добиться супер точной синхронизации: некоторые люди на видео дергались в прыжке. В этом случае нужно придумывать какое-то более надежное решение. Так же нам предстоит поработать над сетью и улучшить скорость получения фотографий, сделав ее отдельным процессом в фоновом режиме и, возможно, переведя систему на 5 ГГц стандарт.
Что касается установленной в Nokia Lumia 1520 ОС Windows Phone и Windows в планшете, мы в целом остались ими довольны. Не будучи близко знакомыми с разработкой под эти платформы, мы относились к ним со скепсисом. Как оказалось, мало того, что они удобные и приятные в работе, Microsoft и Nokia строят вокруг них хорошую инфраструктуру с инструментами и полной документацией».
Автор: nokiaman