Интерактивный Пол На Android

Многие из вас наверняка видели интерактивные игры для детей в торговых центрах.

Где динамическая сцена проецируется на пол, а установленный рядом датчик определяет точки контакта с поверхностью и преобразует их в события для применения на управляющем компьютере.

Поискав в Интернете информацию об этом устройстве, оказалось, что это довольно дорогая игрушка.

Например, китайские клоны начинаются с ценника от $1200, а что-то более оригинальное стоит $10 тысяч.

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

Аппаратное обеспечение проекта состоит из трех частей:

  • Датчик глубины (первоначально ASUS Xtion);
  • Управляющий компьютер (Cubieboard A80, ODROID-U3);
  • Проектор.



Интерактивный пол на Android

В идеале все оборудование вместе не должно стоить более 700 долларов.

Предполагалось, что собрать все три части вместе должно быть относительно легко, поскольку в Интернете есть такие библиотеки, как OpenNI и libfreenect, которые работают как на Android, так и на Linux. Из-за отсутствия опыта на начальном этапе казалось, что есть выбор как в оборудовании, так и в ОС; Есть примеры открытого исходного кода, и собрать все воедино не составит большого труда.

Спустя некоторое время после старта проекта выяснилось, что это не так.

Интеграция всех частей и даже запуск библиотек на целевом устройстве — самая сложная задача.

Пришлось выбирать между доступностью информации по настройке Linux и обилием приложений на рынке для платформы Android. Однако обо всем по порядку.

Чтобы сразу приступить к экспериментам с железом, были приобретены б/у сенсор Microsoft Kinect и проектор.

Затем из квадратной профилированной трубы было изготовлено следующее крепление для проектора и сенсора:

Интерактивный пол на Android

В верхней части крепления приварен небольшой кусочек уголка для крепления к потолку.

В местах изгиба трубы привариваются пластины в виде косынок для усиления конструкции.

Проектор крепится к креплению через треугольный кусок фанеры.

Для подключения сенсора к креплению используется специальный аксессуар для Kinect, который легко найти на ebay. Для удешевления в качестве управляющего компьютера была выбрана плата.

Кубиборд А10 , который также можно легко найти на eBay. На момент написания статьи уже выпущены Cubieboard A20 и A80, двух- и восьмиядерные аналоги соответственно.

Если позволяет бюджет, то желательно купить А80, чтобы у системы были запасы мощности для одновременной работы пользовательских приложений и сервиса по захвату и обработке данных с датчика глубины.

Отвечает за питание платы и датчика.

USB-источник питания с выходным током 4А.

Проектор и сенсор подключаются к креплению так, чтобы камера глубины находилась в одной плоскости с объективом проектора:

Интерактивный пол на Android

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

На этом описание железной части закончено.

Теперь о программном обеспечении.

Операционная система представляла собой сборку Android для Cubieboard с забавным заставка на рабочем столе.

Пришлось немного подправить конфигурационные файлы и собрать сборку самому из-за того, что в Android нельзя изменить последовательность загрузки модулей; точнее можно, но до следующей перезагрузки системы.

Для реализации событий требовался модуль драйвера тачскрина sun4i-ts. По сути, тестовое приложение реализует клиент TUIO, но как оказалось, даже с драйвером тачпада существующий сервер TUIO для Android не поддерживает события мультитач.

Это может быть связано с самим драйвером тачпада sun4i-ts под Allwinner. На основании этих фактов был выбран вариант непосредственного введения событий.

Легкая и быстрая библиотека libfreenect используется для сбора данных о глубине, которая, в свою очередь, использует libusb для передачи данных через USB. Полученные данные о глубине обрабатываются с помощью OpenCV для Android. Суть обработки довольно проста: карту глубины необходимо преобразовать в замкнутые контуры длиной не меньше порога, чтобы исключить ложные срабатывания — и найти их геометрические центры.

В самом начале работы, когда в сцене нет объектов, приложение строит карту глубины фона, затем в процессе работы карта используется для отделения целевых объектов от фона.

Приложение представляет собой управляющую часть и сервис с кодом на C/C++.

Вся логика обработки и сбора данных о глубине реализована на C/C++.

Часть кода для работы с TUIO и OpenCV была взята отсюда проект на гитхабе.

Давайте рассмотрим код более подробно.

Код, как я уже сказал, использует OpenCV. В самом начале работы приложение строит карту глубины:

   

1 void STouchDetector::process(const uint16_t& depthData) { 2

Теги: #Android Kinect Libfreenect #Разработка Android
Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.