7 октября 2011 г.

Kinect и XNA: обзор

Прошёл почти год с момента начала продаж Kinect  «контроллера без контроллера» от фирмы Microsoft, созданного для увеличения интереса к консолям Xbox 360. В течение первых 60 дней было продано более 8 млн. устройств, таким образом, Kinect попал в Книгу рекордов Гиннеса как «самое быстропродаваемое потребительское электронное устройство в истории».
 
Не удивительно что контроллер стал объектом пристального внимания энтузиастов, решивших использовать сенсор не по инструкциям в руководстве пользователя. Это привело к появлению большого числа различных «хаков», использующих возможности устройства на других платформах при помощи одного из наборов open-source драйверов. Оценив работу энтузиастов и перспективность этого направления, Microsoft решает добавить официальную поддержку работы Kinect с Windows 7 и 16 июня 2011 года выпускает бета-версию SDK, позволяющего .NET разработчикам использовать устройство в своих некоммерческих приложениях на С++/CLI, C# или Visual Basic .NET.

Написано множество обзоров самого контроллера, я постараюсь кратко рассказать о самом интересном. Итак, Kinect это чрезмерно глянцевый (спасибо дизайнерам Xbox) сенсор, объединяющий (слева направо) инфракрасный лазерный проектор, RGB камеру и монохромный CMOS-сенсор. Кроме того, в устройство встроен массив из четырёх микрофонов, а также сервопривод, позволяющий программно (не пытайтесь повернуть руками!) управлять наклоном сенсора по вертикали в пределах от -27 до 27 градусов относительно горизонтально расположенного основания (при этом если поставить сам контроллер под наклоном, значению 0 всё равно будет соответствовать горизонтальное положение сенсора  в Kinect встроен акселерометр). Кстати, активно пользоваться этой фичей не рекоммендуется и благодаря ifixit.com мы можем узнать почему:
Интересно посмотреть процесс полной разборки Kinect  в картинках или на видео с девушкой :)
Контроллер позволяет определять положение шести человек в пространстве, при этом для двоих из них осуществлять трёхмерный захват движения тела с определением 20 точек (joints) скелета  именно эта возможность нас интересует больше всего. На Xbox поддерживается распознавание лиц, однако бета SDK под Windows такой функции к сожалению лишена. Массив микрофонов позволяет использовать голосовое управление, определять положение источника звука в пространстве и подавлять шумы  всё это теоретически должно работать в бете, проверить пока не успел.

Как же Kinect определяет человека и получает положение его тела? Это весело  инфракрасный лазерный проектор излучает большое количество невидимых глазу точек, которые покрывают всё что находится в зоне видимости контроллера. При съёмке камерой с режимом ночного видения это выглядит так:


Ещё более интересное видео, снятое на веб-камеру без инфракрасного фильтра:


Вторым важным элементом технологии является CMOS-сенсор (он справа), который как раз и умеет снимать эти самые точки, получая тем самым информацию о глубине кадра. Именно здесь кроется один неприятный момент, заложенный в конструкцию Kinect — «излучатель» и «приёмник» разнесены на 7.5 см друг от друга, из-за чего «приёмник» может видеть зоны, перекрытые неким объектом с позиции «излучателя». Не знаю насколько возможно было конструктивно расположить эти элементы ближе, но в зависимости от ракурса эти «мёртвые зоны» могут довольно ощутимо проявляться на снимке глубины:
При инициализации контроллера в соответствующем режиме, в снимок глубины добавляется дополнительная информация от системы отслеживания скелета, указывающей определён ли в данном пикселе один из шести возможных одновременно обрабатываемых людей. Отслеживание выполняется при помощи вычислительной мощности компьютера, управляемой используемыми драйверами устройства. В одном из «хаков», основанном на open-source драйверах, демонстрировалось распознавание рук. Как мне кажется, принцип выполняемой на этом этапе работы для простоты понимания можно сопоставить с распознаванием документов в ABBYY FineReader :)
Следующий этап так же представляется для нас чёрным ящиком, где на выходе мы можем получать вычисленные координаты джоинтов для двух скелетов. При этом ось Z направлена из «глаз» контроллера и измеряется в метрах, начало координат расположено в центре кадра (!). Таким образом, получаемые координаты не совсем достоверны, расстояния между логически связанными джоинтами (длина костей) не постоянны, а для управления скелетной анимацией персонажа потребуется нахождение матриц трансформации костей. 
Само строение скелета мне кажется странноватым, хотя наверное это обусловлено алгоритмом его определения.
Ну и в завершение первой статьи хочется отметить ещё несколько особенностей:
  • Для корректной работы Kinect действительно требуется довольно много свободного места  2-3 метра от устройства с возможностью помахать руками и ногами.
  • Контроллер довольно требователен к размещению, экран монитора или телевизора должен быть ориентирован так же.
  • Бета SDK правильно определяет скелеты людей, стоящих лицом к устройству (±35 градусов).
  • При перекрытии части тела другой частью тела или каким-то предметом драйвер пытается додумать положение неопределённых джоинтов (и получается у него плохо, но это можно отлавливать).
  • Несмотря на возможность некоторого сглаживания результата, крайние джоинты конечностей в моих тестах постоянно дёргались.

Продолжение:
Kinect и XNA: дополнение к обзору
Kinect и XNA: установка SDK BETA
Kinect и XNA: первая кровь

Жду ваших отзывов и замечаний в комментариях и на сайте xnadev.ru

Комментариев нет:

Отправить комментарий