- PVSM.RU - https://www.pvsm.ru -

Танцуют ли роботы Tango

Project Tango [1] от Google — проект по созданию мобильных устройств, способных анализировать пространство вокруг себя в трёх измерениях. Благодаря проекту Device Lab [2] мне удалось поиграться одним из таких устройств.

Танцуют ли роботы Tango - 1
Статья автора Сергея Мелехина, в рамках конкурса «Device Lab от Google [3]».

Мне показалось интересным сделать робота, который будет использовать Tango для ориентирования в пространстве и избежания столкновений с препятствиями.

Три базовые функции Tango

Motion tracking

Определение изменения положения устройства в пространстве.

Танцуют ли роботы Tango - 2

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

Depth perception
Благодаря наличию специальных датчиков — инфракрасной камеры и инфракрасного лазера, проецирующего двумерную сетку на пространство перед устройством, Tango может получать облако точек, то есть трёхмерную картинку пространства, находящегося перед устройством.

Танцуют ли роботы Tango - 3

Area learning
Объединив motion tracking, depth perception и добавив чёрной алгоритмической магии, в реальном времени объединяющей point cloud на манер панорамы, мы получаем возможность строить полную модель окружающего пространства в памяти устройства и затем точно определять своё положение внутри этой модели.

Танцуют ли роботы Tango - 4

Основные применения

  • Дополненная реальность (виртуальные объекты действительно «прилипают» к реальным поверхностям, а не парят над ними или погружаются внутрь, как это бывает без Tango)
  • Точная навигация в помещениях
  • Игры
  • Картографирование помещений
  • Создание 3D моделей (пока довольно грубых, но всё же)

На самом деле, лучший способ понять что может Tango не имея устройства — посмотреть на существующие приложения в Play Market [5]:

Танцуют ли роботы Tango - 5

Танцуют ли роботы Tango - 6

TangoBot

В понедельник я получил долгожданное устройство. Конечно оно было разряжено в ноль. Я зарядил до 100% и включил.

Танцуют ли роботы Tango - 7

Сначала перепробовал всё, что было уже установлено на устройстве, потом понаскачивал в Play Market всего подряд. Наибольший восторг вызвал Tango Constructor, позволяющий сканировать окружающее пространство и сохранять текстурированную 3D модель.

Но поиграли и хватит — у меня всего 3 дня на то, чтобы сделать робота и научить его ориентироваться в пространстве.

Первым делом — документация. На https://developers.google.com/tango/ [6] есть всё что нужно для того, чтобы начать разрабатывать для Tango в кратчайшие сроки. Я начал с изучения стандартных примеров здесь [7].

Для моего проекта я решил не углубляться в Area Learning а просто анализировать Point Cloud в реальном времени. Конечно первый вариант был бы намного интересней, но я боялся не уложиться в срок.

Для «тушки» робота я взял Arduino Mega с Motor Shield и двумя моторами. Запрограммировал Arduino так, чтобы она слушала и выполняла команды, приходящие по последовательному порту (который эмулируется на USB). Платформу вырезал из 3мм фанеры лазером, само по себе — увлекательно.

Танцуют ли роботы Tango - 8

Скетч для ардуинки можно взять тут [8]. Само устройство Tango несёт на борту Android 4.4, поэтому управляющая программа будет приложением Android. Для общения с Arduino я использовал библиотеку usb-serial-for-andoid [9].

Протокол общения с 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 уже для второй точки. Ну и так далее.

Я не силён в робототехнике и геометрии, поэтому алгоритм анализа карты глубин высосал из пальца. Кхм, ну то есть вывел эмпирически.

К препятствию я отношу точки, попадающие в параболическую область перед устройством, заданную квадратичной формулой:

Танцуют ли роботы Tango - 9

Коэффициенты подобраны так, чтобы парабола была вытянута вглубь и в ширь (по у), немного сдвинута вниз (на 10 см).

И при этом эти точки должны находиться ближе 50 см. Если этих точек не менее пяти, и мы видим их два «кадра» подряд (пытаюсь избежать ложных срабатываний) — то поворачиваем робота влево.Простой алгоритм, но он прилично работает для пространств не сильно сложной конфигурации (например в офисе).

Чтобы иметь возможность управлять роботом удалённо, я добавил в проект поддержку Firebase [10] и при изменении параметра stateString на сервере посылаю соответствующую команду Arduino.

Танцуют ли роботы Tango - 10

Робот катается, уворачивается от стен и мебели, управляется удалённо, чем очень меня радует.

Вот так он катается:

Меня порадовала простота разработки — на софт у меня ушло два дня, при том что я не Android и даже не Java разработчик — тратил время на войну с gradle и не понимал, почему нельзя итерировать по итератору.

Так что могу констатировать, что будущее наступило — порог входа в разработку продуктов на базе Tango крайне низок. Tango SDK весьма прост и логичен, на рынке появляются уже обычные пользовательские устройства с поддержкой Tango [11].

Проект можно сделать интересней, если использовать не облако точек, а модель, построенную с помощью Area Learning. Можно попытаться классифицировать окружающие предметы с помощью TensorFlow, благо 192 ядра Cuda на устройстве позволяют.

Спасибо за внимание, и поменьше вам препятствий на пути!

Автор: Google

Источник [15]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/java/199115

Ссылки в тексте:

[1] Project Tango: https://get.google.com/tango

[2] Device Lab: https://special.habrahabr.ru/google/lab/

[3] Device Lab от Google: http://special.habrahabr.ru/google/lab

[4] проблематично: https://en.wikipedia.org/wiki/Inertial_navigation_system#Error

[5] Play Market: https://play.google.com/store/apps/collection/promotion_3001310_project_tango_featured

[6] https://developers.google.com/tango/: https://developers.google.com/tango/

[7] здесь: https://github.com/googlesamples/tango-examples-java

[8] тут: http://goo.gl/1B5A9g

[9] usb-serial-for-andoid: https://github.com/mik3y/usb-serial-for-android

[10] Firebase: https://firebase.google.com

[11] Tango: http://shop.lenovo.com/ru/ru/tango/

[12] Исходный код программы: https://github.com/C-Pro/TangoBot

[13] “пульта управления”: https://github.com/C-Pro/TangoBotRemote

[14] Скетч для Arduino: https://github.com/C-Pro/arduino_sketches/blob/master/Android/android_dumb.ino

[15] Источник: https://habrahabr.ru/post/310488/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best