Project Tango от Google — проект по созданию мобильных устройств, способных анализировать пространство вокруг себя в трёх измерениях. Благодаря проекту Device Lab мне удалось поиграться одним из таких устройств.
![](https://habrastorage.org/files/af5/8f8/ada/af58f8ada4d042709e9c7e7606f131ea.jpg)
Статья автора Сергея Мелехина, в рамках конкурса «Device Lab от Google».
Мне показалось интересным сделать робота, который будет использовать Tango для ориентирования в пространстве и избежания столкновений с препятствиями.
Motion tracking
Определение изменения положения устройства в пространстве.
![](https://habrastorage.org/getpro/habr/post_images/410/cca/03c/410cca03cedc71ddfecb7354103946f4.gif)
Во всех современных смартфонах есть акселерометр и гироскоп, которые позволяют определять изменение положения устройства, но они крайне не точны и определять абсолютное положение устройства с их помощью проблематично.
Depth perception
Благодаря наличию специальных датчиков — инфракрасной камеры и инфракрасного лазера, проецирующего двумерную сетку на пространство перед устройством, Tango может получать облако точек, то есть трёхмерную картинку пространства, находящегося перед устройством.
![](https://habrastorage.org/getpro/habr/post_images/09f/b51/f36/09fb51f36b22a5d9b14b2d4d1fa53547.gif)
Area learning
Объединив motion tracking, depth perception и добавив чёрной алгоритмической магии, в реальном времени объединяющей point cloud на манер панорамы, мы получаем возможность строить полную модель окружающего пространства в памяти устройства и затем точно определять своё положение внутри этой модели.
![](https://habrastorage.org/getpro/habr/post_images/ae5/9e2/e7c/ae59e2e7c3d1387158921c66846b4d1b.gif)
На самом деле, лучший способ понять что может Tango не имея устройства — посмотреть на существующие приложения в Play Market:
![](https://habrastorage.org/files/7ce/cd6/2fa/7cecd62fab06465c9542c4e0846a89b5.png)
![](https://habrastorage.org/files/9a7/9fc/169/9a79fc169c4643d4a80f6e395731ec86.png)
В понедельник я получил долгожданное устройство. Конечно оно было разряжено в ноль. Я зарядил до 100% и включил.
![](https://habrastorage.org/files/05c/413/935/05c413935e96407ab11683172b99a609.png)
Сначала перепробовал всё, что было уже установлено на устройстве, потом понаскачивал в Play Market всего подряд. Наибольший восторг вызвал Tango Constructor, позволяющий сканировать окружающее пространство и сохранять текстурированную 3D модель.
Но поиграли и хватит — у меня всего 3 дня на то, чтобы сделать робота и научить его ориентироваться в пространстве.
Первым делом — документация. На https://developers.google.com/tango/ есть всё что нужно для того, чтобы начать разрабатывать для Tango в кратчайшие сроки. Я начал с изучения стандартных примеров здесь.
Для моего проекта я решил не углубляться в Area Learning а просто анализировать Point Cloud в реальном времени. Конечно первый вариант был бы намного интересней, но я боялся не уложиться в срок.
Для «тушки» робота я взял Arduino Mega с Motor Shield и двумя моторами. Запрограммировал Arduino так, чтобы она слушала и выполняла команды, приходящие по последовательному порту (который эмулируется на USB). Платформу вырезал из 3мм фанеры лазером, само по себе — увлекательно.
![](https://habrastorage.org/files/e2d/0d0/4d8/e2d0d04d86224914827b18ea0705870e.png)
Скетч для ардуинки можно взять тут. Само устройство Tango несёт на борту Android 4.4, поэтому управляющая программа будет приложением Android. Для общения с Arduino я использовал библиотеку usb-serial-for-andoid.
Протокол общения с Arduino выбрал наипростейший — всего 5 однобайтных команд:
В конфигурации Tango задаю, что мне требуется point cloud «KEY_BOOLEAN_DEPTH»:
Tango возвращает карту глубин (point cloud) в виде одномерного массива чисел с плавающей запятой. Первый по счёту (а по индексу — нулевой) элемент массива — координата x первой точки, второй — у первой точки, третий — координата z первой точки. Четвёртый элемент — это координата x уже для второй точки. Ну и так далее.
Я не силён в робототехнике и геометрии, поэтому алгоритм анализа карты глубин высосал из пальца. Кхм, ну то есть вывел эмпирически.
К препятствию я отношу точки, попадающие в параболическую область перед устройством, заданную квадратичной формулой:
![](https://habrastorage.org/files/fa0/e6f/e30/fa0e6fe30d044823840aa1309d7766b2.png)
Коэффициенты подобраны так, чтобы парабола была вытянута вглубь и в ширь (по у), немного сдвинута вниз (на 10 см).
И при этом эти точки должны находиться ближе 50 см. Если этих точек не менее пяти, и мы видим их два «кадра» подряд (пытаюсь избежать ложных срабатываний) — то поворачиваем робота влево.Простой алгоритм, но он прилично работает для пространств не сильно сложной конфигурации (например в офисе).
Чтобы иметь возможность управлять роботом удалённо, я добавил в проект поддержку Firebase и при изменении параметра stateString на сервере посылаю соответствующую команду Arduino.
![](https://habrastorage.org/files/ddb/9ce/4f1/ddb9ce4f1f4741ea80b9411fd2512565.png)
Робот катается, уворачивается от стен и мебели, управляется удалённо, чем очень меня радует.
Вот так он катается:
Меня порадовала простота разработки — на софт у меня ушло два дня, при том что я не Android и даже не Java разработчик — тратил время на войну с gradle и не понимал, почему нельзя итерировать по итератору.
Так что могу констатировать, что будущее наступило — порог входа в разработку продуктов на базе Tango крайне низок. Tango SDK весьма прост и логичен, на рынке появляются уже обычные пользовательские устройства с поддержкой Tango.
Проект можно сделать интересней, если использовать не облако точек, а модель, построенную с помощью Area Learning. Можно попытаться классифицировать окружающие предметы с помощью TensorFlow, благо 192 ядра Cuda на устройстве позволяют.
Спасибо за внимание, и поменьше вам препятствий на пути!
![](https://habrastorage.org/files/af5/8f8/ada/af58f8ada4d042709e9c7e7606f131ea.jpg)
Статья автора Сергея Мелехина, в рамках конкурса «Device Lab от Google».
Мне показалось интересным сделать робота, который будет использовать Tango для ориентирования в пространстве и избежания столкновений с препятствиями.
Три базовые функции Tango
Motion tracking
Определение изменения положения устройства в пространстве.
![](https://habrastorage.org/getpro/habr/post_images/410/cca/03c/410cca03cedc71ddfecb7354103946f4.gif)
Во всех современных смартфонах есть акселерометр и гироскоп, которые позволяют определять изменение положения устройства, но они крайне не точны и определять абсолютное положение устройства с их помощью проблематично.
Depth perception
Благодаря наличию специальных датчиков — инфракрасной камеры и инфракрасного лазера, проецирующего двумерную сетку на пространство перед устройством, Tango может получать облако точек, то есть трёхмерную картинку пространства, находящегося перед устройством.
![](https://habrastorage.org/getpro/habr/post_images/09f/b51/f36/09fb51f36b22a5d9b14b2d4d1fa53547.gif)
Area learning
Объединив motion tracking, depth perception и добавив чёрной алгоритмической магии, в реальном времени объединяющей point cloud на манер панорамы, мы получаем возможность строить полную модель окружающего пространства в памяти устройства и затем точно определять своё положение внутри этой модели.
![](https://habrastorage.org/getpro/habr/post_images/ae5/9e2/e7c/ae59e2e7c3d1387158921c66846b4d1b.gif)
Основные применения
- Дополненная реальность (виртуальные объекты действительно «прилипают» к реальным поверхностям, а не парят над ними или погружаются внутрь, как это бывает без Tango)
- Точная навигация в помещениях
- Игры
- Картографирование помещений
- Создание 3D моделей (пока довольно грубых, но всё же)
На самом деле, лучший способ понять что может Tango не имея устройства — посмотреть на существующие приложения в Play Market:
![](https://habrastorage.org/files/7ce/cd6/2fa/7cecd62fab06465c9542c4e0846a89b5.png)
![](https://habrastorage.org/files/9a7/9fc/169/9a79fc169c4643d4a80f6e395731ec86.png)
TangoBot
В понедельник я получил долгожданное устройство. Конечно оно было разряжено в ноль. Я зарядил до 100% и включил.
![](https://habrastorage.org/files/05c/413/935/05c413935e96407ab11683172b99a609.png)
Сначала перепробовал всё, что было уже установлено на устройстве, потом понаскачивал в Play Market всего подряд. Наибольший восторг вызвал Tango Constructor, позволяющий сканировать окружающее пространство и сохранять текстурированную 3D модель.
Но поиграли и хватит — у меня всего 3 дня на то, чтобы сделать робота и научить его ориентироваться в пространстве.
Первым делом — документация. На https://developers.google.com/tango/ есть всё что нужно для того, чтобы начать разрабатывать для Tango в кратчайшие сроки. Я начал с изучения стандартных примеров здесь.
Для моего проекта я решил не углубляться в Area Learning а просто анализировать Point Cloud в реальном времени. Конечно первый вариант был бы намного интересней, но я боялся не уложиться в срок.
Для «тушки» робота я взял Arduino Mega с Motor Shield и двумя моторами. Запрограммировал Arduino так, чтобы она слушала и выполняла команды, приходящие по последовательному порту (который эмулируется на USB). Платформу вырезал из 3мм фанеры лазером, само по себе — увлекательно.
![](https://habrastorage.org/files/e2d/0d0/4d8/e2d0d04d86224914827b18ea0705870e.png)
Скетч для ардуинки можно взять тут. Само устройство Tango несёт на борту Android 4.4, поэтому управляющая программа будет приложением Android. Для общения с Arduino я использовал библиотеку usb-serial-for-andoid.
Протокол общения с Arduino выбрал наипростейший — всего 5 однобайтных команд:
- F — едем вперёд
- B — едем назад
- L — поворачиваем влево
- R — поворачивам вправо
- S — останавливаемся
В конфигурации Tango задаю, что мне требуется point cloud «KEY_BOOLEAN_DEPTH»:
private TangoConfig setupTangoConfig(Tango tango) {
// Create a new Tango Configuration and enable the Depth Sensing API.
TangoConfig config = new TangoConfig();
config = tango.getConfig(config.CONFIG_TYPE_DEFAULT);
config.putBoolean(TangoConfig.KEY_BOOLEAN_DEPTH, true);
return config;
}
Tango возвращает карту глубин (point cloud) в виде одномерного массива чисел с плавающей запятой. Первый по счёту (а по индексу — нулевой) элемент массива — координата x первой точки, второй — у первой точки, третий — координата z первой точки. Четвёртый элемент — это координата x уже для второй точки. Ну и так далее.
Я не силён в робототехнике и геометрии, поэтому алгоритм анализа карты глубин высосал из пальца. Кхм, ну то есть вывел эмпирически.
К препятствию я отношу точки, попадающие в параболическую область перед устройством, заданную квадратичной формулой:
![](https://habrastorage.org/files/fa0/e6f/e30/fa0e6fe30d044823840aa1309d7766b2.png)
Коэффициенты подобраны так, чтобы парабола была вытянута вглубь и в ширь (по у), немного сдвинута вниз (на 10 см).
И при этом эти точки должны находиться ближе 50 см. Если этих точек не менее пяти, и мы видим их два «кадра» подряд (пытаюсь избежать ложных срабатываний) — то поворачиваем робота влево.Простой алгоритм, но он прилично работает для пространств не сильно сложной конфигурации (например в офисе).
Чтобы иметь возможность управлять роботом удалённо, я добавил в проект поддержку Firebase и при изменении параметра stateString на сервере посылаю соответствующую команду Arduino.
![](https://habrastorage.org/files/ddb/9ce/4f1/ddb9ce4f1f4741ea80b9411fd2512565.png)
Робот катается, уворачивается от стен и мебели, управляется удалённо, чем очень меня радует.
Вот так он катается:
Меня порадовала простота разработки — на софт у меня ушло два дня, при том что я не Android и даже не Java разработчик — тратил время на войну с gradle и не понимал, почему нельзя итерировать по итератору.
Так что могу констатировать, что будущее наступило — порог входа в разработку продуктов на базе Tango крайне низок. Tango SDK весьма прост и логичен, на рынке появляются уже обычные пользовательские устройства с поддержкой Tango.
Проект можно сделать интересней, если использовать не облако точек, а модель, построенную с помощью Area Learning. Можно попытаться классифицировать окружающие предметы с помощью TensorFlow, благо 192 ядра Cuda на устройстве позволяют.
Спасибо за внимание, и поменьше вам препятствий на пути!
Исходники
- Исходный код программы
- Исходный код для “пульта управления”
- Скетч для Arduino
Поделиться с друзьями
BelBES
Area Learning — это они так SLAM обозвали?
CPro
Да, так называется их реализация SLAM в 3D пространстве.