Kinect розбираємося з новим девайсом і вчимося писати для нього програми

  1. Камера видимого діапазону - звичайна RGB-камера, схожа на середньостатистичну веб-камеру: 640 × 480 і 30 кадрів в секунду.
  2. Інфрачервоний лазерний проектор, який створює в просторі сітку з точок.
  3. Камера, що знімає в інфрачервоному спектрі, яка реєструє зображення цієї сітки.
  4. Стереомикрофон з просунутою системою зменшення шумів - для правильного голосового управління.
  5. Мотор, який регулює становище датчика.
  6. Чіп PrimeSensor - творить головну частину магії, обробляючи картинку з ІК-камери, дає на виході - 3D-картинку.

підключення

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

Але тобі краще взяти інший драйвер. Серце 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 з папки KinectXMLsOpenNI в папку Data всередині каталогу OpenNI (найімовірніше, він всередині папки C: Program Files), а файли з папки KinectXMLsNITE - в C: Program FilesPrime SenseNITEData.

Руки вгору, в позу Псі!

Все готово, тепер можна пробувати кінект в справі. Для початку подивися, якими готовими програмами ти можеш скористатися. 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

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

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

Ultraseven

В здоровому тілі здоровий дух

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

Тепер розберемося з роботою сенсора. В описі форми MainWindow.xaml виставив розмір 662 × 520 і додай до неї зображення, в яке буде виводитися картинка з сенсора, і полотно, на який буде виводитися додаткова інформація:


Далі в коді форми MainWindow.xaml.cs оголоси використання необхідних просторів імен:

using System.ComponentModel; // потрібен для обробки в тлі
using Nui.Vision; // робота з кінект

Потім оголоси новий об'єкт NuiUserTracker і не започатковано його в конструкторі. Так, потрібно не забути скопіювати файл SamplesConfig.xml з директорії OpenNI в папки Debug і Release твого проекту.

У класі форми оголоси всі змінні:

У конструкторі Ініціалізується обробник подій:

// инициализируем об'єкт і довантажувати конфіги кінект
_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 // ставимо прапорець нижнього положення
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 в якості точки входу в програму. У код цієї форми потрібно додати неймспейс роботи з таймерами:

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. Ймовірно, пройде ще трохи часу, і до цих перегонах підключаться нові виробники, бібліотеки обзаведуться обгортками для безлічі мов, і готові рішення увійдуть в повсякденне життя, а вид людини, що махає руками перед комп'ютером, стане звичайною справою.

Покажи цю статтю друзям: