den_prox 0 Опубликовано 25 сентября, 2011 Share Опубликовано 25 сентября, 2011 Сенсор 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. Вероятно, пройдет еще немного времени, и к этой гонке подключатся новые производители, библиотеки обзаведутся обертками для множества языков, и готовые решения войдут в повседневную жизнь, а вид человека, машущего руками перед компьютером, станет обычным делом. Цитата Ссылка на сообщение Поделиться на другие сайты
ЗЛОЙДЕД 333 Опубликовано 25 сентября, 2011 Share Опубликовано 25 сентября, 2011 Прогресс не стоит на месте. Сейчас с обычным управлением все хорошо получается, а с сенсорным будет получаться управлять еще лучше. Цитата Ссылка на сообщение Поделиться на другие сайты
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.