Победители Google Device Lab: исследуем Project Tango
Статья-победитель автора Александра Лаврова, в рамках конкурса «Device Lab от Google».
В связи с этим мы постоянно пробуем новое оборудование с прицелом на его использование в проектах. Сегодня мы хотим рассказать о таком уже знаменитом, но малоосвещенном в русскоязычном интернете устройстве как Project Tango. Совсем недавно он стал просто Tango ознаменовав переход в коммерческий этап своей жизни и начали появляться устройства для конечных пользователей.
Наше знакомство с Project Tango началось весной этого года, когда возникла идея попробовать безмаркерный трэкинг для ряда наших проектов.
Оказалось, что заполучить устройство для экспериментов очень непросто. Нам помог фонд Сколково познакомив с русским офисом Google. Ребята оказались очень отзывчивыми и выдали столь желаемое устройство на руки.
Мы смогли достаточно быстро достичь нужных нам результатов, показали наши тесты на Startup Village и с чувством выполненного долга вернули устройство в Google.
Пару месяцев назад мы узнали, что стартовал Google Device Lab, и мы решили, что нужно отплатить добром за добро — поделиться нашим опытом с другими разработчиками и сели писать данную статью. В процессе написания статьи её концепция несколько раз менялась. Хотелось как обычно сделать что-то полезное, а не описать наш очередной проект. В итоге посовещавшись мы решили, что наиболее полезным будет написать русскоязычный полный обзор по Project Tango с учетом всех набитых нами шишек. Тогда мы начали объединять разрозненные источники, что бы у читателя создалась достаточно полная картина по прочтении данной статьи.
А чтобы нам было повеселее это делать мы использовали в качестве контента анимированные миниатюрные модели военной техники из одного из наших прошлых проектов.
Аппаратная часть
Для начала давайте посмотрим что же представляет из себя само устройство.
На момент тестирования существовало 2 доступные модификации:
- Планшет «Yellowstone». Обычно когда люди говорят про Tango, то подавляющее большинство представляет себе именно его.
- Телефон «Peanut». Честно говоря не знаем никого из тех, кто реально его держал в руках.
Нам достался для экспериментов 7 дюймовый планшет «Yellowstone», входящий в состав Project Tango Tablet Development Kit.
Сам базовый планшет в принципе удивления не вызывает. Устройство содержит 2.3 GHz quad-core Nvidia Tegra K1 processor, 128GB flash memory, 4 мегапиксельную камеру, сенсорный экран разрешением 1920×1200 и 4G LTE.
В качестве операционной системы используется Android 4.4 (KitKat). Мы уже порядком отвыкли от систем младше 5.0. Последний год минимальным требованием клиентов была поддержка устройств с Android 5.0.
Следует помнить, что устройство является частью Development Kit, а не устройством для конечного пользователя. Для прототипа оно выглядит отлично и даже удобно в использовании! Начинка устройства далеко не самая современная, но устройство отлично функционирует. Очевидно, что в серийных устройствах конечные производители, использующие платформу Tango, легко смогут использовать новейшее железо и ОС.
Значительно интереснее выглядит набор встроенных сенсоров. Похоже, что на данный момент это самый «прокаченный» планшет. Как именно они используются мы рассмотрим далее.
- Fisheye камера для отслеживания движения
- 3D датчики глубины
- Акселерометр
- Датчик окружающего света
- Барометр
- Компас
- GPS
- Гироскоп
На схеме ниже вы можете рассмотреть расположение внешних датчиков на устройстве.
Для любителей посмотреть «что там на самом деле у него внутри» прилагаем фотографию устройства в разобранном виде. Разбирали не сами. Спасибо, коллегам с портала slashgear.com за интересное фото.
Google предупреждает, что Tango и Android не являются аппаратными системами реального времени. Основной причиной является то, что Android Linux Kernel не может предоставить гарантий времени исполнения программы на устройстве. По этой причине Project Tango можно считать программной системой реального времени.
Прицип действия устройства
Чтобы было понятно о чем речь пойдет далее во время разработки давайте разберемся в принципе действия устройства.
Во-первых следует понимать, что Tango — это не просто экспериментальный планшет, который демонстрируется повсеместно, а новая масштабируемая платформа, которая использует компьютерное зрение, чтобы дать устройствам возможность понять их положение по отношению к окружающему их миру. То есть предполагается, что к привычным сенсорам в смартфоне или планшету будут добавлены сенсоры компьютерного зрения.
Устройство работает похоже на то, как мы используем наш человеческий зрительный аппарат, чтобы найти свой путь в комнату, а затем, чтобы знать, где мы находимся в комнате, где пол, стены и предметы вокруг нас. Эти понимание являются неотъемлемой частью того, как мы двигаемся через пространство в нашей повседневной жизни.
Tango дает мобильным устройствам возможность определения их положения в окружающем мире с использованием трех основных технологий: Motion Tracking (отслеживание движения), Area Learning (изучение областей пространства) и Depth Perception (восприятие глубины). Каждый из них по отдельности имеет свои уникальные возможности и ограничения. Все вместе же они позволяют достаточно точно позиционировать устройство в окружающем мире.
Motion Tracking
Данная технология дает возможность устройству отслеживать свое собственное движение и ориентацию в 3D-пространстве. Мы можем походить с устройством как нам будет нужно и оно покажет нам, где оно находится и в каком направлении происходит движение.
Результатом работы данной технологии являются относительная позиция и ориентация устройства в пространстве.
Ключевым термином в технологии Motion Tracking является Pose (поза) — сочетание позиции и ориентации устройства. Термин звучит, честно говоря, довольно специфически и, вероятно, Google решил подчеркнуть им свое стремление к совершенствованию человеко-машинного интерфейса. Обычно под позой подразумевается положение, принимаемое человеческим телом, положение тела, головы и конечностей по отношению друг к другу.
Tango API предоставляет положение и ориентацию устройства пользователя с шестью степенями свободы. Данные состоят из двух основных частей: вектор в метрах для перемещения и кватернион для вращения. Позы указываются для конкретной пары точек траектории. При этом используется система отсчёта — совокупность тела отсчёта, связанной с ним системы координат и системы отсчёта времени, по отношению к которым рассматривается движение каких-либо тел.
В контексте Tango это значит, что при запросе конкретной позы мы должны указать целевую точку, к которой совершаем движение по отношению к базовой точке движения.
Танго реализует Motion Tracking с помощью визуально-инерционной одометрии (visual-inertial odometry или VIO).
Одометрия — это метод оценки положения и ориентации робота или иного устройства с помощью анализа последовательности изображений, снятых установленной на нем камерой (или камерами). Стандартная визуальная одометрия использует изображения с камеры для определения изменения в положении устройства, с помощью поиска относительного положения различных визуальных признаков в этих изображениях. Например, если вы взяли фотографию здания издалека, а затем взяли другую фотографию с более близкого расстояния, можно вычислить расстояние, на которое камера перемещается на основе изменения масштаба и положения здания на фотографиях. Ниже вы можете увидеть изображения с примером такого поиска визуальных признаков.
Изображения являются собственностью NASA.
Визуально-инерциальная одометрия дополняет визуальную одометрию инерциальными датчиками движения, способными отслеживать вращение устройства и его ускорение в пространстве. Это позволяет устройству рассчитать его ориентацию и движение в 3D-пространстве с еще большей точностью. В отличие от GPS, отслеживание движения с помощью VIO работает и в закрытом помещении. Что стало поводом для появления большого количества идей по созданию относительно недорогих indoor навигационных систем.
Визуально-инерциальная одометрия предоставляет улучшенное определение ориентации в пространстве по сравнению со стандартным Android Game Rotation Vector APIs. Она использует визуальную информацию, которая помогает оценить вращение и линейное ускорение более точно. Таким образом мы наблюдаем удачное комбинирование известных ранее технологий для устранения их известных проблем.
Все вышеперечисленное нужно для того, чтобы при объединении вращения и отслеживания положения в пространстве, мы смогли использовать устройство в качестве виртуальной камеры в соответствующем 3D-пространстве вашего приложения.
Motion tracking является базовой технологией. Она проста в использовании, но имеет ряд проблем:
- Технология не разбирается сама по себе, что именно находиться вокруг пользователя. В Tango за эту задачу отвечают другие технологии: Area Learning и Depth Perception.
- Motion Tracking не «помнит» предыдущие сессии. Каждый раз, когда вы начинаете новый сеанс отслеживания движения, отслеживание начинается снова и сообщает свою позицию по отношению к её стартовой позиции в текущей сессии.
- Так же, судя по экспериментам, тряска устройства приводит к потере трэкинга. Это очень явно проявлялось при его использовании в автомобиле.
- При перемещении устройства на большие расстояния и в длительные периоды времени происходит накопление мелких ошибок, что может привести в итоге к большим ошибкам в абсолютном положении в пространстве. Произойдет так называемый «drift» (дрейф). Это еще один термин заимствованный из реального мира. Обычно под этим требованием подразумевается отклонение движущегося судна от курса под влиянием ветра или течения, а также движение льдов, несомых течением. Для борьбы с дрейфом Tango использует Area Learning для коррекции данных ошибок. Этот аспект мы подробно рассмотрим в следующей части статьи.
src=«habrastorage.org/files/72c/374/358/72c37435811a46ecbce09b4ce4952b6c.png» align=«right»/> Area Learning
Люди умеют распознавать, где они находятся, заметив известные им признаки вокруг себя: дверной проем, лестницу, стол и т.д. Танго предоставляет мобильному устройству ту же способность. С помощью одной лишь технологии motion tracking, устройство через камеру «видит» визуальные особенности района, но не «помнит» их. С помощью area learning, устройство не только «помнит», что оно «увидело», но может также сохранять и использовать эту информацию. Результатом работы данной технологии являются абсолютные позиция и ориентация устройства в уже известном ему пространстве.
Tango использует метод одновременной локализации и построения карты (SLAM от англ. Simultaneous Localization and Mapping) — метод, используемый в мобильных автономных средствах для построения карты в неизвестном пространстве или для обновления карты в заранее известном пространстве с одновременным контролем текущего местоположения и пройденного пути.
Опубликованные подходы уже используются в самостоятельном вождении автомобилей, беспилотных летательных аппаратов, автономных подводных аппаратов, планетоходов, домашних роботов и даже внутри человеческого тела.
В контексте Tango Area learning решает 2 ключевые задачи:
- Повышение точности траектории полученной с использованием motion tracking. Данный процесс получил название «Коррекция дрейфа».
- Ориентация и позиционирование самого устройства внутри ранее изученной области. Данный процесс назван «Локализация».
Давайте рассмотрим подробнее как именно решаются эти задачи.
Коррекция дрейфа
Как уже было сказано ранее, area learning запоминает визуальные признаки в областях реального мира, которые устройство «видело» и использует их, чтобы исправить ошибки в его позиции, ориентации и движении. Когда устройство видит место, которое оно видел ранее в вашей сессии, то оно понимает и корректирует свой путь, чтобы он соответствовал его предыдущим наблюдениям.
На приведенном ниже рисунке показан пример коррекции дрейфа.
Как только мы начнем ходить через известную Tango область, то мы получаем на самом деле две различные траектории, происходящие одновременно:
- Путь по которому вы идете («Реальная траектория»)
- Путь вычисляемый устройством («Вычисляемая траектория»)
Зеленая линия является реальной траектории, по которому устройство движется в реальном пространстве; красная линия показывает, как с течением времени вычисляемая траектория отдалилась от реальной траектории. Когда устройство возвращается в начало координат и понимает, что оно уже видело данную область раньше, оно исправляет ошибки дрейфа и корректирует вычисляемую траекторию, чтобы лучше соответствовать реальной траектории.
Без коррекции дрейфа, игра или приложение с использованием виртуального 3D пространства в соответствии с реальным миром может столкнуться с неточностью в отслеживании движения после длительного использования. Например, если дверь в игровом мире соответствует дверной раме в реальном мире, то ошибки могут привести к тому, что в игре дверь появляться в стене, а не в реальной дверной коробке.
Локализация
После того, как мы прошли через нужную вам область с включенным area learning, мы можем сохранить в Area Description File (ADF) то, что устройство «увидело».
Изучение области и загрузка ее в качестве ADF имеет ряд преимуществ. Например, вы можете использовать его, чтобы выровнять систему координат устройства с ранее существовавшей системой координат, чтобы в игре или приложении вы всегда появлялись в том же физическом месте. На изображении ниже показан цикл поиска известной устройству области.
Существует два способа создания ADF. Проще всего использовать приложение TangoExplorer, а затем уже ваше приложение загружает полученный ADF.
Также мы можем использовать Tango API, для изучения пространства, сохранения и загрузки ADF в пределах нашего приложения.
Следует отметить ряд особенностей, о которых следует помнить при использовании area learning:
- Tango зависит от визуального разнообразия области, которую мы собираемся локализовать. Если мы находимся в здании с множеством одинаковых комнат или в совершенно пустой комнате с пустыми стенами, то устройству будет трудно локализовать себя.
- Среда может выглядеть совершенно иначе с разных точек зрения и позиций, а также может меняться с течением времени (мебель можно перемещать, освещение будет отличаться в зависимости от времени суток). Локализация имеет больше шансов на успех, если условия локализации аналогичны условиям, которые существовали, когда был создан ADF.
- Поскольку среда измениться, мы можем создать несколько ADF для одного физического местоположения в различных условиях. Это дает нашим пользователям возможность выбрать файл, который наиболее точно соответствует их текущим условиям. Можно также добавить несколько сессий в один ADF, чтобы захватить визуальные описания окружающей среды из каждого положения, угла и при каждом изменении освещения или изменения окружающей среды.
Depth Perception
С помощью данной технологии устройство может понять форму нашего окружения. Это позволяет создавать «дополненную реальность», где виртуальные объекты не только является частью нашей реальной среды, они могут также взаимодействовать с этой средой. Например, многие уже пророчат компьютерные игры в реальном пространстве.
Tango API обеспечивает получение данных о расстоянии до объектов, которые снимает камера, в виде облака точек. Этот формат дает (х, у, z) координаты максимальному количеству точек в сцене, которое можно вычислить.
Каждое измерение представляет собой значение с плавающей точкой записывающее позицию каждой точки в метрах в системе отсчета камеры сканирующей глубину сцены. Облако точек ассоциировано с цветовой информацией, получаемой с RGB камеры. Эта ассоциация дает нам возможность использовать Tango в качестве 3D сканера и открывает много интересных возможностей для разработчиков игр и творческих приложений. Степень точности сканирования конечно нельзя сравнивать со специальными 3D сканерами, дающими точность в доли миллиметра. По опыту коллег максимальная точность Intel RealSense R200 (используется в Tango) составляет 2 миллиметра, но может быть значительно хуже, т.к. сильно зависит от расстояния до предмета, от условий съёмки, от отражающих свойств поверхности, от движения. Так же нужно понимать, что увеличение точности изображения глубины приводит к увеличению шумов в сигнале, это неизбежно.
Однако следует отметить, что для построения коллизий в игре, расстановки виртуальной мебели в реальной квартире, измерения расстояний текущей точности получаемого 3D облака точек вполне достаточно.
Для реализации восприятия глубины, мы можем выбрать одну из распространенных технологий восприятия глубины. Напомним, что Tango — это платформа и включает в себя 3 технологии.
Описание каждой из них — это тема для отдельной большой статьи. Давайте пройдемся по ним вкратце, чтобы было понимание их роли в Tango и общих принципов их функционирования.
Structured Light
Структурированный свет осуществляет проецирование известного паттерна (обычно решетки или горизонтальных полос) на реальные объекты. Таким образом, что деформация этого известного паттерна при наложении на поверхность позволяет системе компьютерного зрения получить информацию о глубине и поверхности объектов в сцене относительно устройства. Широко известный пример использования структурированного света — это 3D-сканеры.
Невидимый структурированный свет используется, когда видимый паттерн создает помеху для остальных методов компьютерного зрения используемых в системе. Это как раз случай Tango, в котором используется инфракрасный излучатель.
Time of Flight
Данная технология базируется на определении времени, которое требуется инфракрасному излучению, чтобы долететь от источника излучения до объекта и вернуться в камеру. Чем дальше дистанция до поверхности, тем большее время требуется.
Stereo
Мы не нашли точной информации как именно устроена данная технология в Tango. Видимо реализация достаточно стандартная и разработчики не стали заострять внимание на этом. В один момент времени производиться 2 снимка, так называемая стереопара. На их основе при помощи фотограмметрии определяется расстояние до поверхностей. Таким образом, например, производится спутниковая съемка высоты рельефа Земли.
Важно иметь в виду, что Structured Light и Time of Flight требуют наличия в устройстве одновременно инфракрасного (ИК) излучателя и ИК-камеры. Stereo технологии достаточно 2х камер и не требуется ИК-излучатель.
Отметим, что текущие устройства фактически предназначены для работы в закрытом помещении при умеренных расстояниях до объекта сканирования (от 0,5 до 4 метров). Такая конфигурация дает достаточно большую глубину на среднем расстоянии, при этом не предъявляет излишних требований к питанию для ИК-излучателя и производительности самого устройства при обработке глубины. По этой причине не рассчитывайте на сканирование очень близких объектов и распознавание жестов.
Следует помнить, что для устройства, которое воспринимает глубину с помощью ИК-камеры есть некоторые ситуации, когда точная работа затруднена.
- При слишком быстром движении Tango может не успевать строить глубину и вежливо просит двигаться помедленнее.
- При слишком быстром движении Tango может не успевать строить глубину и вежливо просит двигаться помедленнее.
- При слишком быстром движении Tango может не успевать строить глубину и вежливо просит двигаться помедленнее.
Наш проект с Tango
Принципы работы устройства мы рассмотрели достаточно подробно. Теперь давайте перейдем от теории к практике. Попробуем создать наш первый проект.
Танго предоставляет SDK для игрового движка Unity3D и поддерживает OpenGL и других 3D-системах через C или Java. Мы используем в своей работе в основном Unity3D и все примеры далее будет создаваться именно в его среде разработки.
Интерграция с unity3D
Для разработки приложений в Unity3D для Project Tango нам потребуются:
- Установленный Android SDK 17+
- Unity (5.2.1 или выше), со средой настроенной для Android разработки.
- Tango Unity SDK.
- Для ОС Windows следует установить Google USB Driver если устройство не было распознано автоматически.
Описание проекта
Мы решили реализовать расстановку миниатюр военной техники с использованием Tango. Была запланирована следующая не замысловатая последовательность действий:
- Пользователь берет в руки планшет Tango;
- На экране в тех местах, где возможно расставить технику — рисуется зеленый маркер, там, где невозможно — красный:
- Предлагается следующий выбор военной техники:
- Расставленную технику можно перемещать в плоскости экрана с помощью touch интерфейса, и она будет перемещаться по физической поверхности.
- Можно удалить расставленную технику.
- Введено ограничение — 10 расставленных экземпляров техники, при достаточной оптимизации моделей это число можно увеличить. Если моделей более 10, то заменяется самая первая расставленная модель и далее по циклу.
Интерфейс для демо решили сделать минималистичным, но понятным для пользователя.
Реализация
За основу мы взяли ресурсы из TangoSDK/Examples/AugmentedReality с github и наши модели из уже реализованного проекта.
Описание реализации
Для того, чтобы реализовать задуманное, опишем по шагам наши действия:
— Вывод изображения из камеры устройства на экран, в этом нам поможет Tango AR Camera
— Далее необходимо обеспечить повторение реального перемещения устройства в виртуальной сцене. За это отвечает технология Motion Tracking и в сцене юнити необходимо настроить Tango Application, включить галочку Enable Motion Tracking.
Так как мы хотим, чтобы технику можно было расставлять по реальной поверхности, имеющей представление в виртуальной сцене, можно предположить, что должны присутствовать данные, описывающие виртуальное пространство. В Tango за это отвечает Tango Point Cloud, поэтому разместим его на сцене.
— Общее представление иерархии сцены должно выглядеть следующим образом:
- Нам потребуется интерфейс, поэтому разместим и настроим структуру интерфейса — объект UI, и для корректной работы интерфейса добавим EventSystem.
- Также нам понадобятся данные, которые мы будем расставлять, то есть непосредственно модели техники. Шаблоны мы разместили в сцене, в объекте Prefabs.
- Чтобы связать кнопки интерфейса с моделями, на каждую кнопку мы добавили скрипт
ViecleSpawnScript
и сделали ссылку в скрипте на модель. Теперь наши кнопки «знают» какая модель с ними связана.— Теперь нам необходимо реализовать логику, которая позволит расставлять объекты, их перемещать, удалять. Логику мы реализовали в классе
VehicleSpawnRoot
Ниже вы можете увидеть его настройки:Instances Limit — максимальное количество расставленных моделей;
Model Scale — масштаб моделей при расстановке;
Point Cloud — ссылка на объект Tango Point Cloud;
Placing Mark — ссылка на префаб маркера;
Trace Layer Mask — настройка слоев, по которым возможна расстановка;
Selection Info — ссылка на элемент интерфейса для отображения названия техники, которую выделили.— Наше приложение в процессе работы постоянно должно рисовать маркер, маркер в обычном режиме будет располагаться там, где заканчивается луч из центра экрана к поверхности. Маркер представлен объектом в сцене PlacementMarker.
— Нам необходимо иметь данные — точку пересечения луча и результат пересечения. Получение координаты и результата трейса мы сделали через асинхронное получение, запущена Coroutine с функцией
LazyUpdate
В этой функции происходит определение пересечения луча с облаком точек Point Cloud Tango. Point Cloud Tango перестраивает сам Tango, поэтому мы имеем актуальное облако точек и можем брать из него данные.
Результат трейса может иметь следующие значения:
enum ETraceResults
{
Invalid, // результаты трейса недоступны
NotFound, // результаты трейса доступны, но пересечения с плоскостью не найдено
NotGround, // плоскость не выровнена по горизонтали.
ExistingObjectCrossing, // обнаружено пересечение с расставленным объектом дополненной реальности
Valid, // подходящее положение для расстановки
}
Чтобы модель по нажатию на кнопку ставилась на поверхность в классе:
VehicleSpawnRoot
создадим функцию:
public void Spawn( GameObject prefab )
В функцию передается префаб с моделью для расстановки. В функции проверяется возможность расстановки и в случае успеха — создается модель в заданных координатах.
— Нам необходимо создать функционал для возможности перемещения расставленной модели. За перемещение модели отвечает функция:
private void UpdateTouchesMove()
Кратко опишем как это работает: в функции получаем данные касания через
Input.GetTouch( 0 );
Ищем пересечение с расставленными объектами в сцене, и в случае успеха помечаем объект как:
Selected
Также отправляем в функцию расчета пересечения с облаком точек позицию начала луча, она будет совпадать с позицией пальца на экране.
Далее в процессе перемещения по экрану, модель устанавливается в новую позицию, если результат трейса позволяет это сделать, напомню, трейс делается в асинхронном методе
LazyUpdate
Осталось дописать функцию по удалению расставленных моделей. В целом все готово, можно запускать!
Более подробно можно ознакомиться с кодом проекта на gitHub.
Публикация приложения в Google play
Публикация приложений, использующих Tango framework требует совершения одного дополнительного действия в дополнение к стандартному процессу публикации Android приложений. Для того чтобы приложение могло быть установлено только на Tango совместимых устройствах необходимо добавить следующие строки в файл манифеста приложения.
...
В случае если вы хотите получить единый APK для устройств с поддержкой Tango и без нее, то вы можете определять в рантайме наличие возможностей Tango и использовать их возможности уже в самом приложении.
Резюме
Вот мы и прошли вместе с вами путь от теоретических основ до публикации приложения.
Смело можно сделать вывод, что платформу уже можно применять в коммерческих целях. Она работает достаточно стабильно. Включенные в нее технологии не конфликтуют между собой и хорошо дополняют друг друга, решая заявленные задачи.
К тому же начали выходить коммерческие устройства у крупных вендоров. Единственная ложка дегтя в большой бочке мёда — это проблемы при работе устройства на ярком освещении. Очень хочется верить, что эту задачу Google и Intel будут решать в следующие годы или возможно уже решают. Спасибо за внимание и надеемся, что статья оказалась для вас интересной.