|
Сенсор 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. Вероятно,
пройдет еще немного времени, и к этой гонке подключатся новые производители,
библиотеки обзаведутся обертками для множества языков, и готовые решения войдут
в повседневную жизнь, а вид человека, машущего руками перед компьютером, станет
обычным делом.
|