Мы в компании Redmadrobot в перерывах между игрой в Xbox с интересом наблюдаем за тем, что уже делается и что ещё можно сделать с помощью Microsoft Kinect. Ну и свои эксперименты, разумеется, тоже проводим — об одном таком я и расскажу.
С развитием бескнопочных, беспроводных, а впоследствии и вообще бесконтактных способов взаимодействия с устройствами, интерфейсы предоставляют пользователю все меньше и меньше обратной связи: сначала его лишили прагматической уверенности в переключении переключателей, затем отобрали и без того маленький фидбэк от нажатия на кнопку, а теперь даже тактильные ощущения оходят на второй план.
Интернет постепенно начинает наполняться решениями, распознающими жесты с помощью Kinect, но почти все они не предоставляют вообще никакой информации в процессе выполнения жеста, и лишь когда действие уже завершено, отражают какую-бы то ни было реакцию на него. Именно это мы хотели исправить, и вот что получилось:
Итак, передо мной стояла задача сделать так, чтобы прямо в процессе выполнения жеста руками пользователь видел, что творит.
В выборе жестов я руководствовался теми, которые каждый из нас наблюдает в большинстве мобильных телефонов с тач-скрином: пролистывания в четырех направлениях, клик (причем все это раздельно для каждой руки), pinch-zoom. Также, конечно, есть режим курсора, когда активные элементы выбираются наведением и удержанием.
Вариант распознавать жест постфактум, то есть реагировать тогда, когда пользователь уже «накрутил в воздухе кружок», нам не подходит. Чтобы сделать по-другому, нужно как-то определиться с выбором момента, когда пользователь начинает выполнять жест.
Для таких целей можно использовать определенную «стартовую» позу (про детектор позы и его реализацию можно почитать), можно предварять любой жест «контрольным» (только после которого будет отслеживаться жест рукой и его прогресс), а можно выделить «активную зону» и в ней мониторить действия пользователя.
Я пошёл последним путем, и вот как эта зона схематически выглядит:
![](https://habrastorage.org/r/w780q1/storage1/2c733b49/c6bc9712/285509bd/a49af4b0.jpg)
Оговорюсь, что с этим ещё можно поэкспериментировать: например, сделать сектором диска, или для каждой руки придумать свою собственную зону, а не одну общую. Главное, что эта зона «привязана» к пользователю и перемещается вместе с ним.
Мы снизили размерность и теперь, фактически, имеем дело с движением точек на плоскости. Получаем начальные координаты точки и, динамически, траекторию её движения:
![](https://habrastorage.org/r/w780q1/storage1/94cf42f2/eb0ccddf/dc867e81/7b2a8e42.jpg)
Первым делом нивелируем дрожание руки и погрешность обнаружения координат сенсором — если движение происходит внутри «порога дрожания», то никак на это не реагируем, считаем, что рука не движется. При выходе точки из этой зоны определяем тип жеста по тому, в каком направлении рука смещена от центра.
Можно начинать анимацию интерфейса — мы уже знаем, что пользователь делает, и просто отслеживаем прогресс. Для pinch-жестов измеряем расстояние между руками и динамику его изменения.
Мы сразу ограничили рассматриваемую область требованием определить прогресс жеста в процессе его выполнения. Но если так по этому поводу не заморачиваться, можно прикрутить и скрытые марковские модели, и засекание виртуальных сфер в пространстве, и много чего другого интересного.
Если заинтересовались, смотрите топик с инструкциями, внимайте и участвуйте в конкурсе Microsoft Research по разработке приложений для Kinect.
P.S. Вопросы, в том числе по работе с сенсором, — приветствуются
Проблема с взаимодействием
С развитием бескнопочных, беспроводных, а впоследствии и вообще бесконтактных способов взаимодействия с устройствами, интерфейсы предоставляют пользователю все меньше и меньше обратной связи: сначала его лишили прагматической уверенности в переключении переключателей, затем отобрали и без того маленький фидбэк от нажатия на кнопку, а теперь даже тактильные ощущения оходят на второй план.
Интернет постепенно начинает наполняться решениями, распознающими жесты с помощью Kinect, но почти все они не предоставляют вообще никакой информации в процессе выполнения жеста, и лишь когда действие уже завершено, отражают какую-бы то ни было реакцию на него. Именно это мы хотели исправить, и вот что получилось:
Требования
Итак, передо мной стояла задача сделать так, чтобы прямо в процессе выполнения жеста руками пользователь видел, что творит.
В выборе жестов я руководствовался теми, которые каждый из нас наблюдает в большинстве мобильных телефонов с тач-скрином: пролистывания в четырех направлениях, клик (причем все это раздельно для каждой руки), pinch-zoom. Также, конечно, есть режим курсора, когда активные элементы выбираются наведением и удержанием.
Про процесс
Вариант распознавать жест постфактум, то есть реагировать тогда, когда пользователь уже «накрутил в воздухе кружок», нам не подходит. Чтобы сделать по-другому, нужно как-то определиться с выбором момента, когда пользователь начинает выполнять жест.
Для таких целей можно использовать определенную «стартовую» позу (про детектор позы и его реализацию можно почитать), можно предварять любой жест «контрольным» (только после которого будет отслеживаться жест рукой и его прогресс), а можно выделить «активную зону» и в ней мониторить действия пользователя.
Я пошёл последним путем, и вот как эта зона схематически выглядит:
![](https://habrastorage.org/storage1/2c733b49/c6bc9712/285509bd/a49af4b0.jpg)
Оговорюсь, что с этим ещё можно поэкспериментировать: например, сделать сектором диска, или для каждой руки придумать свою собственную зону, а не одну общую. Главное, что эта зона «привязана» к пользователю и перемещается вместе с ним.
Мы снизили размерность и теперь, фактически, имеем дело с движением точек на плоскости. Получаем начальные координаты точки и, динамически, траекторию её движения:
![](https://habrastorage.org/storage1/94cf42f2/eb0ccddf/dc867e81/7b2a8e42.jpg)
Первым делом нивелируем дрожание руки и погрешность обнаружения координат сенсором — если движение происходит внутри «порога дрожания», то никак на это не реагируем, считаем, что рука не движется. При выходе точки из этой зоны определяем тип жеста по тому, в каком направлении рука смещена от центра.
Можно начинать анимацию интерфейса — мы уже знаем, что пользователь делает, и просто отслеживаем прогресс. Для pinch-жестов измеряем расстояние между руками и динамику его изменения.
Что ещё?
Мы сразу ограничили рассматриваемую область требованием определить прогресс жеста в процессе его выполнения. Но если так по этому поводу не заморачиваться, можно прикрутить и скрытые марковские модели, и засекание виртуальных сфер в пространстве, и много чего другого интересного.
Если заинтересовались, смотрите топик с инструкциями, внимайте и участвуйте в конкурсе Microsoft Research по разработке приложений для Kinect.
P.S. Вопросы, в том числе по работе с сенсором, — приветствуются