Многие из вас наверняка видели интерактивные игры для детей в торговых центрах.
Где динамическая сцена проецируется на пол, а установленный рядом датчик определяет точки контакта с поверхностью и преобразует их в события для применения на управляющем компьютере.
Поискав в Интернете информацию об этом устройстве, оказалось, что это довольно дорогая игрушка.
Например, китайские клоны начинаются с ценника от $1200, а что-то более оригинальное стоит $10 тысяч.
Проанализировав техническую составляющую изделия, было решено сделать подобное устройство самому.
Аппаратное обеспечение проекта состоит из трех частей:
- Датчик глубины (первоначально ASUS Xtion);
- Управляющий компьютер (Cubieboard A80, ODROID-U3);
- Проектор.
В идеале все оборудование вместе не должно стоить более 700 долларов.
Предполагалось, что собрать все три части вместе должно быть относительно легко, поскольку в Интернете есть такие библиотеки, как OpenNI и libfreenect, которые работают как на Android, так и на Linux. Из-за отсутствия опыта на начальном этапе казалось, что есть выбор как в оборудовании, так и в ОС; Есть примеры открытого исходного кода, и собрать все воедино не составит большого труда.
Спустя некоторое время после старта проекта выяснилось, что это не так.
Интеграция всех частей и даже запуск библиотек на целевом устройстве — самая сложная задача.
Пришлось выбирать между доступностью информации по настройке Linux и обилием приложений на рынке для платформы Android. Однако обо всем по порядку.
Чтобы сразу приступить к экспериментам с железом, были приобретены б/у сенсор Microsoft Kinect и проектор.
Затем из квадратной профилированной трубы было изготовлено следующее крепление для проектора и сенсора:
В верхней части крепления приварен небольшой кусочек уголка для крепления к потолку.
В местах изгиба трубы привариваются пластины в виде косынок для усиления конструкции.
Проектор крепится к креплению через треугольный кусок фанеры.
Для подключения сенсора к креплению используется специальный аксессуар для Kinect, который легко найти на ebay. Для удешевления в качестве управляющего компьютера была выбрана плата.
Кубиборд А10 , который также можно легко найти на eBay. На момент написания статьи уже выпущены Cubieboard A20 и A80, двух- и восьмиядерные аналоги соответственно.
Если позволяет бюджет, то желательно купить А80, чтобы у системы были запасы мощности для одновременной работы пользовательских приложений и сервиса по захвату и обработке данных с датчика глубины.
Отвечает за питание платы и датчика.
USB-источник питания с выходным током 4А.
Проектор и сенсор подключаются к креплению так, чтобы камера глубины находилась в одной плоскости с объективом проектора:
Модель проектора лучше выбирать такую, чтобы изображение было максимально крупным с небольшого расстояния.
На этом описание железной части закончено.
Теперь о программном обеспечении.
Операционная система представляла собой сборку Android для Cubieboard с забавным заставка на рабочем столе.
Пришлось немного подправить конфигурационные файлы и собрать сборку самому из-за того, что в Android нельзя изменить последовательность загрузки модулей; точнее можно, но до следующей перезагрузки системы.
Для реализации событий требовался модуль драйвера тачскрина sun4i-ts. По сути, тестовое приложение реализует клиент TUIO, но как оказалось, даже с драйвером тачпада существующий сервер TUIO для Android не поддерживает события мультитач.
Это может быть связано с самим драйвером тачпада sun4i-ts под Allwinner. На основании этих фактов был выбран вариант непосредственного введения событий.
Легкая и быстрая библиотека libfreenect используется для сбора данных о глубине, которая, в свою очередь, использует libusb для передачи данных через USB. Полученные данные о глубине обрабатываются с помощью OpenCV для Android. Суть обработки довольно проста: карту глубины необходимо преобразовать в замкнутые контуры длиной не меньше порога, чтобы исключить ложные срабатывания — и найти их геометрические центры.
В самом начале работы, когда в сцене нет объектов, приложение строит карту глубины фона, затем в процессе работы карта используется для отделения целевых объектов от фона.
Приложение представляет собой управляющую часть и сервис с кодом на C/C++.
Вся логика обработки и сбора данных о глубине реализована на C/C++.
Часть кода для работы с TUIO и OpenCV была взята отсюда проект на гитхабе.
Давайте рассмотрим код более подробно.
Код, как я уже сказал, использует OpenCV. В самом начале работы приложение строит карту глубины:
Теги: #Android Kinect Libfreenect #Разработка Android1 void STouchDetector::process(const uint16_t& depthData) { 2
-
Угоны Самолетов В Ссср (Часть 2)
19 Oct, 24 -
Тест Производительности Аккумулятора Macbook
19 Oct, 24 -
Группа Пользователей Atlassian В Гостях У 1С
19 Oct, 24 -
Last.fm Отложил Платную Подписку
19 Oct, 24