Xbox 360 kinect linux

Побеждаем Kinect в Linux

Это вторая статья из цикла о разработке C++ приложений, работающих с Microsoft Kinect. В этой части речь пойдет о том, как заставить устройство работать в Linux и как его можно использовать в своих приложениях.

Первую статью о разработке для Kinect можно почитать здесь. Настоятельно рекомендую к прочтению первую часть ибо без нее впечатления от второй будут неполными.

Введение

Как уже было сказано в первой статье, помимо официального SDK от Microsoft существует еще несколько библиотек от сторонних производителей:

  • Проект OpenKinect (libfreenect)
  • Проект OpenNI
  • Проект CL NUI от NUI Group

Альтернативные SDK, в отличии от официального, могут быть использованы для разработки под Linux и Mac OS.
Наиболее простым в использовании является libfreenect (OpenNI, собранный и установленный по официальной документации у меня, например, не захотел работать в последней Ubuntu, вполне возможно что из-за того, что драйвер для Kinect требует unstable версию платформы OpenNI, а unstable такой unstable). Все, что сказано в официальной документации, является правдой и да, таки-работает.

Установка libfreenect

sudo apt-get install git-core cmake libglut3-dev pkg-config build-essential libxmu-dev libxi-dev libusb-1.0-0-dev
git clone github.com/OpenKinect/libfreenect.git
cd libfreenect
mkdir build
cd build
cmake ..
make
sudo make install
sudo ldconfig /usr/local/lib/
sudo glview

Для Ubuntu x64 в предпоследней строке будет /usr/local/lib64/ .
После этого можно погонять примерыв папке build/bin — они вполне неплохо иллюстрируют возможности библиотеки.

Установка wxWidgets в Linux

Для wxWidgets в Ubuntu тоже доступны бинарные пакеты (но только для стабильной ветки 2.8.x, которой, впрочем, вполне достаточно для работы). Устанавливаем пакет libwxgtk2.8-dev и вопрос решен.

Как не делать одну работу дважды

Хороший девиз был в свое время у Qt — Write Once, Run Anywhere. Неплохо было бы организовать такое же, но с wxWidgets. Но ситуация такова, что помимо исходников у нас еще есть файлы проектов (после первой части нам достались проекты от Visual Studio, но в Linux от них толку мало) и вот прежде чем писать платформо-зависимую часть кода для новой ОС, было бы неплохо как-то автоматизировать создание и настройку файлов проектов. В этом нам поможет утилита CMake.
Чем хорош CMake? Во-первых Linux’ы все разные. Если какая-то thirdparty библиотека у вас на машине находится по одному пути, то не факт что у всех ваших коллег или пользователей она будет находиться там же. Даже при использовании выдачи pkg-config, в случае изменения каких-то параметров сборки, в проектах, написанных вручную найдется куча мест, где новые параметры надо будет прописывать руками. Автоматизировав всю эту мелкую работу через CMake, который создает файлы проектов, уже настроенные под конкретную рабочую машину, мы также сможем сэкономить кучу времени.
С Windows история та же — зачем прописывать все параметры руками если CMake сама умеет искать довольно большое количество различных библиотек, если они установлены в системе, после чего генерировать проекты с уже настроенными параметрами.
Помимо, собственно, генерирования проектов, в скрипте для CMake можно указать условные параметры для каждой платформы, например включить/исключить некоторые файлы в проект для конкретной ОС, добавить или убрать зависимости от thirdparty-библиотек, специфичных для конкретной ОС и т.д.
В любом случае, тема использования CMake достойна отдельной статьи. В нашем же случае, дабы не перегружать текст листингами CMake-скриптов, приведу ссылки на них в репозитории:

  • Главный скрипт, в котором прописаны общие настройки и список проектов в решении
  • Скрипт для создания статической библиотеки wxKinectHelper
  • Скрипт для создания проекта тестового приложения
Читайте также:  Теми для windows sp3 zver

Давайте подитожим, что нам досталось с прошлого раза:

  • Решение разделено на два проекта: статическую библиотеку wxKinectHelper и тестовое приложение KinectTest
  • Файлы проектов (Visual Studio для Windows и Makefile/CodeBlocks для Linux) генерируются с помощью утилиты CMake
  • В проекте wxKinectHelper есть класс wxKinectHelper, который умеет возвращать количество устройств Kinect в системе, выдавать имя устройства по его индексу, а также создавать класс граббера
  • Класс граббера умеет выполнять захват изображения (глубина, цветное) с камеры устройства, а также получать положение игроков
  • При получении нового кадра или инофрмации о положении игроков, вызывается событие, на которое можно подписать, например, класс формы
  • Для отрисовки игроков используется класс wxKinectHelper, который использует отдельный класс имплементора для каждой платформы, тем самым реализуя паттерн bridge.
  • Тестовое приложение состоит из одной формы и умеет отображать список устройств, картинку от сенсора глубины, цветную картинку с камеры, а также положение игроков

Отлично, вспомнили все, теперь можно переходить к покорению libfreenect под Linux.

Кодинг

Инициализация и деинициализация библиотеки

FREENECTAPI int freenect_init(
freenect_context **ctx,
freenect_usb_context *usb_ctx);

FREENECTAPI int freenect_shutdown(freenect_context *ctx);

В нашей библиотеке-обертке инициализацией и деинициализацией контекста библиотеки занимается класс wxKinectHelper , для которого, после перехода на Linux, пришлось также реализовать классы-имплементоры отдельно для работы в Windows и Linux.

Получение списка устройств

FREENECTAPI int freenect_num_devices(freenect_context *ctx);

wxString KinectHelperImplFreenect::GetDeviceName(size_t index)
<
wxString name = wxT( «Unknown Kinect Sensor» );
if (m_Context)
<
name = wxString::Format(wxT( «Kinect %u» ), index);
>
return name;
>

Захват изображения с Kinect

Для захвата изображений с Kinect в библиотеке libfreenect есть два способа — использование синхронного или асинхронного варианта API. В случае асинхронного варианта, при поступлении нового кадра будет вызвана callback-функция, в которой можно реализовать обработку пришедшего буфера. Память для буфера можно выделить самостоятельно или же библиотека сама может позаботиться о создании внутреннего буфера и очистке памяти по завершении работы.

Для запуска захвата изображений необходимо вызвать функцию freenect_open_device() , которая в качестве параметров принимает:

  • Указатель на контекст библиотеки
  • Указатель на переменную, которая будет содержать контекст устройства, в случае успешного завершения работы функции
  • индекс устройства

FREENECTAPI int freenect_open_device(
freenect_context *ctx,
freenect_device **dev, int index);

FREENECTAPI int freenect_close_device(freenect_device *dev);

Получение буфера глубины

typedef enum <
FREENECT_RESOLUTION_LOW = 0, /**
FREENECT_RESOLUTION_MEDIUM = 1, /**
FREENECT_RESOLUTION_HIGH = 2, /**
FREENECT_RESOLUTION_DUMMY = 2147483647, /**
> freenect_resolution;

typedef enum <
FREENECT_DEPTH_11BIT = 0, /**
FREENECT_DEPTH_10BIT = 1, /**
FREENECT_DEPTH_11BIT_PACKED = 2, /**
FREENECT_DEPTH_10BIT_PACKED = 3, /**
FREENECT_DEPTH_DUMMY = 2147483647, /**
> freenect_depth_format;

Как видно из описания, в libfreenect, в отличии от официального SDK от Microsoft, для значения глубины используется всего 11 бит, а не 12. Также отсутствует возможность получения индекса игрока.

Получение цветного изображения

В принципе, алгоритм настройки устройства для получения цветного изображения схож с алогоритмом при получении буфера глубины, только используются, соответственно, функции freenect_set_video_callback() , freenect_set_video_buffer() и freenect_set_video_mode() .

Еще немного общих сведений о захвате изображений

freenect_set_depth_callback(m_Device, KinectGrabberFreenect::DepthCallback);
freenect_set_video_callback(m_Device, KinectGrabberFreenect::VideoCallback);
freenect_set_video_mode(m_Device, m_VideoMode);
freenect_set_depth_mode(m_Device, m_DepthMode);
m_VideoBufferLength = m_VideoMode.bytes;
m_DepthBufferLength = m_DepthFrameSize.GetWidth() * m_DepthFrameSize.GetHeight() * 3;
m_VideoBuffer = new unsigned char [m_VideoBufferLength];
m_DepthBufferIndex = 0;
m_GotDepth = false ;
m_DepthBuffers[0] = new unsigned char [
m_DepthFrameSize.GetWidth() *
m_DepthFrameSize.GetHeight() * 3];
m_DepthBuffers[1] = new unsigned char [
m_DepthFrameSize.GetWidth() *
m_DepthFrameSize.GetHeight() * 3];
freenect_set_video_buffer(m_Device, m_VideoBuffer);
DeviceHash[m_Device] = this ;
freenect_start_video(m_Device);
freenect_start_depth(m_Device);

unsigned char KinectGrabberFreenect::GetDepthValue(unsigned short data)
<
// 0x7ff is 0000011111111111 in binary format — max value for 11bit depth;
return ( double )255 * ( double )data / ( double )0x7ff;
>

В результате всех описанных действий был создан новый класс граббера, который вполне неплохо работает в Linux. К сожалению, в libfreenect нет API для получения положения игроков, для этих целей прийдется использовать сторонние (или свои) наработки, например, базирующиеся на OpenCV. Но и того, что есть, вполне достаточно для распознавания, например, движения.

Читайте также:  Hp laserjet pro mfp m125rnw driver windows 10

Источник

Xbox 360 kinect linux

Table of Contents

Driver for Kinect for Windows v2 (K4W2) devices (release and developer preview).

Note: libfreenect2 does not do anything for either Kinect for Windows v1 or Kinect for Xbox 360 sensors. Use libfreenect1 for those sensors.

If you are using libfreenect2 in an academic context, please cite our work using the following DOI:

If you use the KDE depth unwrapping algorithm implemented in the library, please also cite this ECCV 2016 paper.

This driver supports:

  • RGB image transfer
  • IR and depth image transfer
  • registration of RGB and depth images

Watch the OpenKinect wiki at www.openkinect.org and the mailing list at https://groups.google.com/forum/#!forum/openkinect for the latest developments and more information about the K4W2 USB protocol.

The API reference documentation is provided here https://openkinect.github.io/libfreenect2/.

  • USB 3.0 controller. USB 2 is not supported.

Intel and NEC USB 3.0 host controllers are known to work. ASMedia controllers are known to not work.

Virtual machines likely do not work, because USB 3.0 isochronous transfer is quite delicate.

Requirements for multiple Kinects

It has been reported to work for up to 5 devices on a high-end PC using multiple separate PCI Express USB3 expansion cards (with NEC controller chip). If you’re using Linux, you may have to increase USBFS memory buffers. Depending on the number of Kinects, you may need to use an even larger buffer size. If you’re using an expansion card, make sure it’s not plugged into an PCI-E x1 slot. A single lane doesn’t have enough bandwidth. x8 or x16 slots usually work.

Operating system requirements

  • Windows 7 (buggy), Windows 8, Windows 8.1, and probably Windows 10
  • Debian, Ubuntu 14.04 or newer, probably other Linux distros. Recommend kernel 3.16+ or as new as possible.
  • Mac OS X

Requirements for optional features

  • OpenGL depth processing: OpenGL 3.1 (Windows, Linux, Mac OS X). OpenGL ES is not supported at the moment.
  • OpenCL depth processing: OpenCL 1.1
  • CUDA depth processing: CUDA (6.5 and 7.5 are tested; The minimum version is not clear.)
  • VAAPI JPEG decoding: Intel (minimum Ivy Bridge or newer) and Linux only
  • VideoToolbox JPEG decoding: Mac OS X only
  • OpenNI2 integration: OpenNI2 2.2.0.33
  • Jetson TK1: Linux4Tegra 21.3 or later. Check Jetson TK1 issues before installation. Jetson TX1 is not yet supported as the developers don’t have one, but it may be easy to add the support.

Troubleshooting and reporting bugs

When you report USB issues, please attach relevant debug log from running the program with environment variable LIBUSB_DEBUG=3 , and relevant log from dmesg . Also include relevant hardware information lspci and lsusb -t .

  • Joshua Blake joshblake@gmail.com
  • Florian Echtler
  • Christian Kerl
  • Lingzhu Xiang (development/master branch)

Windows / Visual Studio

Install UsbDk driver

  1. (Windows 7) You must first install Microsoft Security Advisory 3033929 otherwise your USB keyboards and mice will stop working!
  2. Download the latest x64 installer from https://github.com/daynix/UsbDk/releases, install it.
  3. If UsbDk somehow does not work, uninstall UsbDk and follow the libusbK instructions.

This doesn’t interfere with the Microsoft SDK. Do not install both UsbDK and libusbK drivers

(Alternatively) Install libusbK driver

You don’t need the Kinect for Windows v2 SDK to build and install libfreenect2, though it doesn’t hurt to have it too. You don’t need to uninstall the SDK or the driver before doing this procedure.

Install the libusbK backend driver for libusb. Please follow the steps exactly:

  1. Download Zadig from http://zadig.akeo.ie/.
  2. Run Zadig and in options, check «List All Devices» and uncheck «Ignore Hubs or Composite Parents»
  3. Select the «Xbox NUI Sensor (composite parent)» from the drop-down box. (Important: Ignore the «NuiSensor Adaptor» varieties, which are the adapter, NOT the Kinect) The current driver will list usbccgp. USB ID is VID 045E, PID 02C4 or 02D8.
  4. Select libusbK (v3.0.7.0 or newer) from the replacement driver list.
  5. Click the «Replace Driver» button. Click yes on the warning about replacing a system driver. (This is because it is a composite parent.)
Читайте также:  Аккаунты games windows live

To uninstall the libusbK driver (and get back the official SDK driver, if installed):

  1. Open «Device Manager»
  2. Under «libusbK USB Devices» tree, right click the «Xbox NUI Sensor (Composite Parent)» device and select uninstall.
  3. Important: Check the «Delete the driver software for this device.» checkbox, then click OK.

If you already had the official SDK driver installed and you want to use it:

  1. In Device Manager, in the Action menu, click «Scan for hardware changes.»

This will enumerate the Kinect sensor again and it will pick up the K4W2 SDK driver, and you should be ready to run KinectService.exe again immediately.

You can go back and forth between the SDK driver and the libusbK driver very quickly and easily with these steps.

Download the latest build (.7z file) from https://github.com/libusb/libusb/releases, and extract as depends/libusb (rename folder libusb-1.x.y to libusb if any).

Download the -vc64.exe installer from http://sourceforge.net/projects/libjpeg-turbo/files, extract it to c:\libjpeg-turbo64 (the installer’s default) or depends/libjpeg-turbo64 , or anywhere as specified by the environment variable TurboJPEG_ROOT .

Download from http://www.glfw.org/download.html (64-bit), extract as depends/glfw (rename glfw-3.x.x.bin.WIN64 to glfw ), or anywhere as specified by the environment variable GLFW_ROOT .

Install OpenCL (optional)

  1. Intel GPU: Download «Intel® SDK for OpenCL™ Applications 2016» from https://software.intel.com/en-us/intel-opencl (requires free registration) and install it.

Install CUDA (optional, Nvidia only)

  1. Download CUDA Toolkit and install it. You MUST install the samples too.

Install OpenNI2 (optional)

Download OpenNI 2.2.0.33 (x64) from http://structure.io/openni, install it to default locations ( C:\Program Files. ).

The default installation path is install , you may change it by editing CMAKE_INSTALL_PREFIX .

Or -G «Visual Studio 14 2015 Win64» . Or -G «Visual Studio 16 2019» .

Run the test program: .\install\bin\Protonect.exe , or start debugging in Visual Studio.

Test OpenNI2 (optional)

Copy freenect2-openni2.dll, and other dll files (libusb-1.0.dll, glfw.dll, etc.) in install\bin to C:\Program Files\OpenNI2\Tools\OpenNI2\Drivers . Then run C:\Program Files\OpenNI\Tools\NiViewer.exe . Environment variable LIBFREENECT2_PIPELINE can be set to cl , cuda , etc to specify the pipeline.

You can download and install libfreenect2 using the vcpkg dependency manager:

The libfreenect2 port in vcpkg is kept up to date by Microsoft team members and community contributors. If the version is out of date, please create an issue or pull request on the vcpkg repository.

Use your favorite package managers (brew, ports, etc.) to install most if not all dependencies:

  • Make sure these build tools are available: wget, git, cmake, pkg-config. Xcode may provide some of them. Install the rest via package managers.
  • Download libfreenect2 source

Note: Ubuntu 12.04 is too old to support. Debian jessie may also be too old, and Debian stretch is implied in the following.

    Download libfreenect2 source

14.04.1 has backported the fix).

  • Install OpenNI2 (optional)
    1. (Ubuntu 14.04 only) sudo apt-add-repository ppa:deb-rob/ros-trusty && sudo apt-get update (You don’t need this if you have ROS repos), then sudo apt-get install libopenni2-dev
    2. (Other) sudo apt-get install libopenni2-dev
  • Build (if you have run cd depends previously, cd .. back to the libfreenect2 root directory first.)

    About

    Open source drivers for the Kinect for Windows v2 device

    Источник

  • Оцените статью