Перейти к содержанию

Kinect: разбираемся с новым девайсом и учимся писать для него приложения


Рекомендуемые сообщения

Сенсор Kinect разработан для Xbox 360 и позволяет играть в игры без всяких приспособлений в руках. Появившись в ноябре 2010 года, он стал самым продаваемым электронным устройством в мире: за первые 2 месяца было продано более 10 млн штук. Изначально сенсор работает лишь с консолью, но при помощи ловких движений рук ты сможешь заставить его работать с PC, а он поможет тебе поддерживать физическую форму!

 

Прежде чем втыкать Kinect в компьютер, разберемся с его внутренностями. Наш экземпляр, который дали помучить ребята из xbox-zone.ru, разбирать мы не решились, да и незачем — на сайте ifixit.com опубликовано подробное пошаговое руководство о том, как разобрать его до винтика. Итак, внутри у Kinect’a находятся:

 

Камера видимого диапазона — обычная RGB-камера, похожа на среднестатистическую веб-камеру: 640x480 и 30 кадров в секунду.

Инфракрасный лазерный проектор, который создает в пространстве сетку из точек.

Камера, снимающая в инфракрасном спектре, которая регистрирует изображение этой сетки.

Стереомикрофон с продвинутой системой шумопонижения — для правильного голосового управления.

Мотор, регулирующий положение датчика.

Чип PrimeSensor — творит главную часть магии, обрабатывая картинку с ИК-камеры, дает на выходе — 3D-картинку.

 

 

Подключение

Kinect’ы, продающиеся в коробках, уже имеют все необходимое для работы, их можно подключить к компьютеру напрямую. Если же сенсор из комплекта с новым xbox’ом, то к нему потребуется специальный адаптер, так как разъем USB там нестандартный, с дополнительным питанием 12 В (сенсору слабенького тока от порта недостаточно). Оригинальный блок питания можешь купить в магазине Microsoft за $34,99, а сэкономить получится, заказав китайский клон в три раза дешевле. Теперь можешь подтыкать к компьютеру и начинать возиться с программной частью.

 

Драйвера

Как только Кинект появился, компания Adafruit объявила конкурс с призом в $3000 тому, кто создаст открытый драйвер для сенсора. Не прошло и недели, и денежки уже лежали на счету у победителя — Гектора Мартина, а первый работоспособный драйвер — в репозитории на github.com/OpenKinect/libfreenect. Многого он еще не умел, но главное — выводить карту глубин в окне OpenGL у него уже получалось. Драйвер продолжает развиваться, и у него есть преимущества — он распространяется под лицензией apache 2.0, которая позволяет использовать его в коммерческих проектах, и у него есть обертки для целой кучи языков (java, matlab, python, ruby).

 

Но тебе лучше взять другой драйвер. Сердце Kinect’а разработано не великой и могучей Microsoft, а молодой компанией PrimeSence. Для них Kinect — всего лишь один продукт, использующий их технологию NUI (natural user interface) — естественного пользовательского интерфейса, который позволяет человеку взаимодействовать с системой визуально, при помощи жестов, а также при помощи голосовых команд. Они желают повсеместного распространения своего детища и активно помогают open source-сообществу. В их репозитории на гитхабе лежит драйвер для референсного сенсора. Напрямую с кинектом он не работает, но его допиленная версия справляется с этой задачей отлично!

 

Скачать его можно, например, с сайта проекта Faast. После установки загляни в диспетчер устройств — в разделе PrimeSensor должно быть три устройства: Kinect Camera, Kinect Motor и Kinect Audio. Но кроме самого драйвера, тебе потребуются библиотеки OpenNI и PrimeSense NITE.

 

OpenNI — это некоммерческая организация, которая стремится создать открытый стандарт для "Естественных взаимодействий" (Natural Interactions). Также она разработала OpenNI — одноименный фреймворк с открытым исходным кодом, созданный, чтобы взаимодействовать с одной стороны — с оборудованием, и с более высокоуровневыми программными прослойками — с другой стороны. Развивается он бурно, и тебе потребуется последняя нестабильная его версия, загрузить которую можно здесь.

 

NITE — это промежуточное ПО, которое решает задачи определения жестов для управления компьютером и играми и работает в связке с OpenNI. Хотя это и коммерческий продукт, но его разработчик, PrimeSence, распространяет бесплатный ключ, которым может пользоваться кто угодно. Вот этот ключ — 0KOIk2JeIBYClPWVnMoRKn5cdY4=. Его надо ввести при установке. Загрузить NITE можно по ссылке.

 

После нужно изменить конфигурационные xml-файлы.

 

Правильные версии можно загрузить по адресу.

 

Отличаются они от тех, что уже предустановленны, только указанием серийного ключа. Распакуй архив и скопируй файл SampleConfig.xml из папки KinectXMLs\OpenNI в папку Data внутри каталога OpenNI (вероятнее всего, он внутри папки C:\Program Files\), а файлы из папки KinectXMLs\NITE — в C:\Program Files\Prime Sense\NITE\Data.

 

Руки вверх, в позу Пси!

Все готово, теперь можно пробовать кинект в деле. Для начала посмотри, какими готовыми программами ты можешь воспользоваться. Faast (Flexible Action and Articulated Skeleton Toolkit) — это инструментарий, который позволяет завязать движения пользователя на различные нажатия кнопок, перемещения мыши или действия джойстика. Таким образом можно подобрать набор действий, чтобы весьма правдоподобно играться в любую игру на PC. Загрузить его можно с projects.ict.usc.edu/mxr/faast/.Пользоваться программой нетрудно. Первым делом нужно загрузить файл конфигурации, написать который ты сможешь сам.

 

Например, так он будет выглядеть для World of Warcraft:

 

# связь входного и выходного действия

# Формат:

# название_входного_действия порог тип_выходного_действия действие

left_arm_out 10 key a

left_arm_across 10 key d

lean_forwards 15 key w

lean_backwards 10 key s

left_arm_forwards 20 key tab

right_arm_forwards 20 key 1

right_arm_up 12 key 4

right_arm_across 15 key 2

right_arm_out 15 key 3

 

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

 

Kinemote

Другая программка для универсального управления. Из коробки позволяет управлять мультимедиа-центром XBMC и просто курсором мыши. Приятна она тем, что не требует калибровки и переводится в активный режим заранее выбранным жестом. Новые версии периодически выкладываются на сайте kinemote.net. А после последнего обновления в комплекте появилась еще и программа, позволяющая управлять не всем телом, а пальцами рук, правда, несмотря на все попытки, у меня она так и не заработала.

 

Ultraseven

Ультра Севен — это японский супергерой из конца шестидесятых, который бы мог и потеряться в памяти поколений, если бы не кинект и программка Ultraseven. Благодаря этой маленькой игрушке каждый может предстать в облике этого персонажа. Чтобы одеть его костюм, нужно встать в позу Пси. А уже оказавшись в красном облачении, можешь прикладывать руки к ушам, чтобы стрелять из смертоносного лазера и запускать бумеранг, торчащий из головы в виде ирокеза. Кроме тебя самого, отслеживаются и другие объекты в комнате — лучи будут пролетать за ближе лежащими предметами. Да, важное замечание — игрушка требует достаточно серьезной видеокарты, а на слабом железе работать будет очень нестабильно. Сайт проекта: code.google.com/p/kinect-ultra/.

 

 

 

В здоровом теле — здоровый дух

Теперь — самое главное! О том, как написать свою программу, которая будет использовать возможности чудо-сенсора, а заодно и поддерживать бодрость тела: после часа работы за компьютером она заблокирует клавиатуру и мышь и не позволит пользоваться вновь, пока не сделаешь десять приседаний. В уже установленном тобой пакете OpenNI есть примеры проектов (как на C++, так и на C#) для Microsoft Visual Studio 2010, которые можно дописать для своих задач. Но эти примеры несколько запутаны, и будет проще воспользоваться оберткой, которую написал греческий студент Вангос Птернеас. Найти его библиотеку — Nui.Vision.dll — можно на его сайте. С ней строчек кода понадобится гораздо меньше.

 

 

 

Сначала создай в Visual Studio проект WPF Application и добавь в него ссылки на библиотеки OpenNi.net.dll (она находится в той папке, куда установлен OpenNI) и Nui.Vision.dll (ее можно положить в папку проекта).

 

Теперь разберемся с работой сенсора. В описании формы MainWindow.xaml выстави размер 662x520 и добавь к ней изображение, в которое будет выводиться картинка с сенсора, и холст, на который будет выводиться дополнительная информация:

 

<Image Name="imgCamera" />

<Canvas Name="LayoutRoot" />

 

Дальше в коде формы MainWindow.xaml.cs объяви использование необходимых пространств имен:

 

using System.ComponentModel; // нужен для обработки в фоне

using Nui.Vision; // работа с кинектом

 

Затем объяви новый объект NuiUserTracker и инициализируй его в конструкторе. Да, нужно не забыть скопировать файл SamplesConfig.xml из директории OpenNI в папки Debug и Release твоего проекта.

 

В классе формы объяви все переменные:

 

NuiUserTracker _skeleton; // объявление объекта трекера

BackgroundWorker _worker = new BackgroundWorker(); // фоновый обработчик

double topY = 0; // верхнее положение приседания

double bottomY = 0; // нижнее положение приседания

int numOfBobs = 0; // счетчик полуприседаний

bool bottomPosition, topPosition; // биты, в которых фиксируется пересечение линий

Ellipse ellipse = new Ellipse // кружочек на груди

{ Fill = new SolidColorBrush(Colors.AliceBlue), Width = 20, Height = 20 };

 

В конструкторе инициализируй обработчик событий:

 

// инициализируем объект и подгружаем конфиги кинекта

_skeleton = new NuiUserTracker("SamplesConfi g.xml");

// объявляем функцию, которая будет обрабатывать

// событие перемещения пользователя

_skeleton.UsersUpdated += new NuiUserTracker.UserListUpdatedHandler(Skeleton_UsersUpdated);

 

Теперь в переменной NuiUserListEventArgs.Users представлены все обнаруженные пользователи и набор координат всех распознанных частей их тел. Далее напиши обработчик события смены координат пользователя. Как только у тебя появляется ненулевое значение вертикальной координаты шеи пользователя — считай, что он готов приседать. Потом добавь две линии. Одна чуть ниже шеи, а другая — чуть выше пояса. Одним приседанием будет считаться двойное пересечение обеих линий: сначала — сверху вниз, а потом — снизу вверх. Отслеживается пересечение линий шеи (хотя визуально она где-то на груди). Такой вариант не идеальный — можно схалтурить, нагибаясь, или подойдя поближе к сенсору.

 

// проделываем все манипуляции для каждого пользователя

// (хотя приседать они будут под одну гребенку)

 

foreach (var user in e.Users) {

// если впервые нашлась шея

if ((topY == 0) && (user.Neck.Y !=0) )

{

// определяем положение верхней линии

topY = user.Neck.Y+20;

Line topLine = new Line { // определяем верхнюю линию

Y1 = topY,X1 = 0, Y2 = topY, X2 = 662,

Stroke = new SolidColorBrush(Colors.Red),

StrokeThickness = 4 };

// рисуем верхнюю линию на холсте

LayoutRoot.Children.Add(topLine);

// определяем положение нижней линии

bottomY = user.Torso.Y + 20;

Line bottomLine = new Line { // определяем нижнюю линию

Y1 = bottomY, X1 = 0, Y2 = bottomY, X2 = 662,

Stroke = new SolidColorBrush(Colors.Blue),

StrokeThickness = 4 };

// рисуем нижнюю линию на холсте

LayoutRoot.Children.Add(bottomLine);

// рисуем шею на холсте

LayoutRoot.Children.Add(ellipse);

}

 

При каждом изменении координат нужно проверять, не произошло ли приседания:

 

ellipse.Margin= new Thickness(user.Neck.X, user.Neck.Y, 0, 0); //перемещаем кружочек вслед за шеей

// ставим флажок верхнего положения

if (user.Neck.Y+5 < topY) topPosition = true;

// ставим флажок нижнего положения

if (user.Neck.Y + 25 > bottomY) bottomPosition = true;

if (topPosition && bottomPosition)

{ // если оба флага есть

numOfBobs++; // половину приседания в копилку

topPosition = false; // сбрасываем флажки

bottomPosition = false;

}

// если полуприседаний набралось двадцать штук — значит все,

// выключаем программу

if (numOfBobs >= 20)

{

Application.Current.Shutdown(); // выходим из программы

}

 

Осталось разобраться с таймером и блокировкой клавиатуры и мыши. Сперва в App.xaml.cs нужно добавить еще одно пространство имен:

 

// работа с неуправляемым кодом, понадобится для

// блокировки клавиатуры

using System.Runtime.InteropServices;

 

Потом объявить метод блокировки клавиатуры и мыши. Удобно воспользоваться функцией Windows API BlockInput:

 

public partial class NativeMethods

{

[system.Runtime.InteropServices.DllImportAttribute( "user32.dll", EntryPoint = "BlockInput")]

[return: System.Runtime.InteropServices.MarshalAsAttribute( System.Runtime.InteropServices.UnmanagedType.Bool)]

public static extern bool BlockInput(

[system.Runtime.InteropServices.MarshalAsAttribute( System.Runtime.InteropServices.UnmanagedType.Bool)]

bool fBlockIt);

}

 

Для таймера можно создать отдельную форму и указать ее в App.xaml в качестве точки входа в программу. В код этой формы нужно добавить нэймспэйс работы с таймерами:

 

using System.Timers;

 

Объявить таймер:

 

private static System.Timers.Timer TheTimer;

 

А дальше запустить его, например, по нажатию кнопки:

 

private void button1_Click(object sender, RoutedEventArgs e)

{

// ставим таймер на час

TheTimer = new System.Timers.Timer(3600000);

// как пройдет — блокируем комп

TheTimer.Elapsed += new ElapsedEventHandler(BlockPC);

TheTimer.Enabled = true;

}

 

А при срабатывании таймера будет блокироваться пользовательский ввод и открываться окошко с видео с кинекта:

 

void BlockPC(object source, ElapsedEventArgs e)

{

App.NativeMethods.BlockInput(true); // блокируем ввод

// создаем экземпляр формы с картинкой от сенсора

MainWindow w = new MainWindow();

w.Show();

 

}// и показываем ее

 

Осталось не забыть добавить отмену блокировки перед выходом из программы:

 

// возвращаем пользователю клавиатуру и мышь

App.NativeMethods.BlockInput(false);

 

Если что-то не получилось, то полный код проекта и все файлы, необходимые для запуска, ты сможешь найти на диске.

 

Одного кинекта мало

Однако, эксперименты с кинектом одним кинектом ограничиваются! Если к сенсору добавить проектор — то получится система дополненной реальности, хочешь подсвечивай отдельные объекты в комнате, рисуй светом на стенах или создай систему, которая бы интеллектуально гоняла кота за световым пятнышком. Один кинект дает карту глубин с одной стороны, а если их взять 3 или 4 и расставить по углам, то можно получить полную трехмерную картину внутреннего пространства. Настоящий 3d-сканер, работающий в реальном времени!

 

Но не все только людям! Еще Kinect придется по вкусу и роботам — еще бы, раньше трехмерные лазерные дальномеры стоили несколько тысяч долларов, а это устройство реализует те же возможности всего за две сотни. Таким образом, можно собрать мощного робота на недорогих серийных компонентах. Например: iRobot Create в качестве шасси, обычный нетбук с установленной Ubuntu и ROS — в роли мозга системы, а Kinect — в качестве датчиков. Именно так и выглядит Willow Garage Turtlebot. Да похожим образом устроен и Bilibot, к которому прикреплена еще и миловидная красная клешня. Плюс уже доступен для заказа за $1200.

 

Вообще кинект — первый представитель нового класса устройств. Уже готов и его конкурент, изначально нацеленный на работу с PC, — Asus WAVI Xtion. Вероятно, пройдет еще немного времени, и к этой гонке подключатся новые производители, библиотеки обзаведутся обертками для множества языков, и готовые решения войдут в повседневную жизнь, а вид человека, машущего руками перед компьютером, станет обычным делом.

post-22056-1316952177_thumb.png

Ссылка на сообщение
Поделиться на другие сайты

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

Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...