VGEL.ME

Setting up PyOpenNI in Linux

Posted

I've had a Kinect for a while. I wrote a few interesting scripts with it, then forgot about it for a while. In between that time and now, I went through several OS upgrades that wiped away my changes. I decided I want to mess with it again, and had to reinstall OpenNI and the python extensions. This is a somewhat tricky process, so here's how it's done.

##Step 1: Installing OpenNI, NITE, and the drivers

These are the drivers and middleware that will do all the heavy lifting for you. I grabbed them from the simple-openni project, which is a Kinect library for Processing. I don't care about processing, but they also conveniently bundle the libraries for you. Just grab the zipfile, and execute sudo ./install.sh in the OpenNI-Bin-Dev-Linux-[platform]-[version] folder, the NITE-Bin-Dev-Linux-[platform]-[version] folder, and the kinect/Sensor-Bin-Linux-[platform]-[version] folder.

##Step 2: Add the library exports to your shell

The installation process generates a file with the location of the library files. You need to source this file for the installing of PyOpenNI. Simply run

source [folder you extracted openni in]/OpenNIDevEnvironment

However if it's not there, simply run

sudo updatedb && locate OpenNIDevEnvironment

Which should find the current location for your to source, though updatedb will take a few minutes to run generally.

##Step 3: Build PyOpenNI

These instructions are on the Github, however I'll copy them here.

git clone https://github.com/jmendeth/PyOpenNI.git
mkdir PyOpenNI-build
cd PyOpenNI-build
cmake ../PyOpenNI
make
<copy to your python modules folder>

##Step 4: Blacklist gspca_kinect

If you're using a newer Linux kernel (I'm using one of the 3.10 series), there is an existing module that only allows you to use the kinect as a generic webcam. This conflicts with OpenNI, so you need to blacklist it.

You can temporarily blacklist the module by running

sudo rmmod gspca_kinect

And permanently blacklist it by adding blacklist gspca_kinect to your blacklist file (google how to do it for your distribution).

##Step 5: Not really a step

You can use OpenNI through Python now. But here's a bit of extra support code for controlling the motor and LED, which PyOpenNI doesn't do (requires pyusb):

import usb

LED_OFF              = 0
LED_GREEN            = 1
LED_RED              = 2
LED_YELLOW           = 3
LED_BLINK_YELLOW     = 4
LED_BLINK_GREEN      = 5
LED_BLINK_RED_YELLOW = 6

_dev = usb.core.find(idVendor=0x045e, idProduct=0x02B0) #The kinect motor device

def set_led_color(color):
    _dev.ctrl_transfer(0x40, 0x06, color, 0x0, [])

def set_motor_angle(degree):
    _dev.ctrl_transfer(0x40, 0x31, degree, 0x0, [])

def set_motor_up():
    set_motor_angle(60)

def set_motor_level():
    set_motor_angle(0)

def set_motor_down():
    set_motor_angle(-60)

Thanks for reading, hope this helps you!