Montag, 9. Januar 2012

2012 & Debian Kinected & NeverKinect

Als aller erstes erst einmal:

Herzlich Willkommen im neuen Jahr 2012!


Und nun zum eigentlichen Thema:
Kinect unter Debian mit OpenNI, NITE und PrimeSensor

Mehrere Tage habe ich mich nun damit beschäftigt dieses Stück Hardware unter Linux zum Laufen zu bringen. Per Plug&Play wurde eigentlich schon alles passend erkannt:
ID 045e:02b0 Microsoft Corp. Xbox NUI Motor
ID 045e:02ad Microsoft Corp. Xbox NUI Audio
ID 045e:02ae Microsoft Corp. Xbox NUI Camera
Der 'gspca_kinect' wurde automatisch geladen und die Kamera konnte zum Beispiel als WebCam benutzt werden. Mit ein wenig Ausprobieren liefen dann auch die 'freenect' Beispiele. 'mrpt' bringt auch 2 Programme mit, die in dieser Verbindung mit der Kinect funktionieren.
Allerdings sollte die Kinect hier mit dem OpenNI Paket funktionieren. Dazu gibt es einige Anleitungen. Aber keine wollte bei mir so recht.
Deswegen möchte ich nun hier kurz darstellen, wie ich es vollbracht habe.

1) Installation von OpenNI
Dazu benötigt man den Code von https://github.com/OpenNI/OpenNI
git clone git://github.com/OpenNI/OpenNI.git
Unter
OpenNI/Platform/Linux/Build
gibt es ein Makefile. Also sollte ein 'make' genügen um alles nötige zu erstellen. Für die Installation sorgt:
sudo make install
Leider ging das bei mir nicht so einfach.
In
OpenNI/Platform/Linux/CreateRedist/
liegen 'install.sh' und 'RedistMaker'. Beide musste ich ausführbar machen:
chmod +x install.sh
chmod +x RedistMaker
Des weiteren konnte das Makefile 'install.sh' in
OpenNI/Platform/Linux/Redist/
nicht finden. Wie auch, wenn dies sich eins tiefer in
OpenNI/Platform/Linux/Redist/OpenNI-Bin-Dev-Linux-x64-v1.5.2.23
befindet. Also habe ich das Makefile an den Zeilen 196 und 200 entsprechend angepasst und aus
../Redist/
../Redist/OpenNI-Bin-Dev-Linux-x64-v1.5.2.23
gemacht.
Damit lief das 'sudo make install' einwandfrei durch.

2) Installation von PrimeSensor
Hierfür habe ich mir den Fork von avin2 von https://github.com/avin2/SensorKinect besorgt:
git clone git://github.com/avin2/SensorKinect.git
Der Aufbau ist dem von OpenNI gleich. Unter
SensorKinect/Platform/Linux/Build
liegt das Makefile.
make
sudo make install
sorgen für die Erstellung von Installation der Komponenten. Wie zuvor musste ich auch hier wieder die 'install.sh' und 'RedistMaker' ausführbar machen und das Makefile um die Zeichen
/Sensor-Bin-Linux-x64-v5.1.0.25
in den Zeilen71 und 75 erweitern.

Bei der Installation wird die Datei
SensorKinect/Platform/Linux/Install/55-primesense-usb.rules
nach
/etc/udev/rules.d/55-primesense-usb.rules
kopiert. Diese Datei ist nicht mehr ganz "aktuell". In allen Zeilen muss "SYSFS" durch "ATTR" ersetzt werden. Bei "OWNER" steht "xxx". Auf den meisten Systemen existiert dieser nicht. Ich habe in diesem Fall meinen eigenen Benutzernamen eingeschrieben. Die Änderungen können dabei vor der Installation an der Originaldatei oder auch anschließend an der installierten Datei gemacht werden. Um die Änderungen an der installierten Datei zu machen, sind allerdings Root-Rechte erforderlich.

Die Gruppe "users" gab es bei mir schon, allerdings war ich, und auch sonst noch niemand, darin. Deshalb habe ich mich mittels kuser (ein Programm zur visuellen Benutzerverwaltung unter KDE) in die Gruppe eingefügt. Per Konsole kann dies z.B. wie folgt geschehen:
sudo usermod -aG users <username>
Anstatt von <username> muss natürlich der entsprechende Benutzername eingefügt werden. Anschließend muss man sich kurz aus- und wieder einloggen damit die Änderung zum Tragen kommt.

3) Der erste Test
Im Ordner
OpenNI/Platform/Linux/Bin/x64-Release
befinden sich mehrere Beispiele.
'NiViewer' sollte für's erste genügen. Nun kann es passieren, dass folgende Fehlermeldung erscheint:
Open failed: Failed to set USB interface!
Wenn bei der Ausführung von
lsmod | grep gspca_kinect
 nun etwas gefunden wird, dann könnte hier schon der Übeltäter liegen. Mittels
sudo modprobe -r gspca_kinect
kann das 'gspca_kinect' Modul entladen werden. Anschließend sollte NiViewer funktionieren. Da bei jedem erneuten Anstecken der Kinect das Modul wieder geladen wird, kann man dies auch auf eine schwarze Liste setzten. Dazu muss eine Datei unter
/etc/modprobe.d/
angelegt werden und folgenden Inhalt enthalten:
blacklist gspca_kinect
Ich habe die Datei der Einfachheit halber 'blacklist_gspca_kinect.conf' genannt. (Das Erstellen und Bearbeiten der Datei erfordert Root-Rechte.)

Hinweis:
Durch die Entladung des gspca_kinect Moduls kann nicht mehr auf die Kamera über /dev/videoX zugegriffen werden. Möchte man also wieder die Kamera z.B. als Webcam benutzen, so muss man das Modul mittels:
sudo modprobe gspca_kinect
laden.

4) Installation von NITE
Dies bekommt man von
http://www.openni.org/Downloads/OpenNIModules.aspx
 Als Download Optionen sind folgende zu wählen:
OpenNI Compliant Middleware Binaries
Unstable
PrimeSense NITE Unstable Build for Ubuntu
(Letzteres entsprechend der eingesetzten 32 oder 64 Bit)
Die tar.bz2 Datei lässt sich einfach entpacken. Darin befindet sich unter anderem die Datei install.sh und uninstall.sh
Für die Installation wird nun einfach nur
sudo ./install.sh
ausgeführt.

Fertig.

Im Unterverzeichnis NITE/Samples/Bin/x64-Release/ befinden sich einige Beispielanwendungen, die nun getestet werden können.

5) NeverKinect

Und da nun alles funktioniert, gleich ein mal ein kleines Spielchen.
Wie wäre es da mit NeverKinect?



Jawohl!
Neverball mit vollem Körpereinsatz.

Er wars => http://blog.bytemuehle.de/?p=19

Die Anleitung dazu findet sich hier:
https://bitbucket.org/schlangen/neverkinect

(Die Punkte unter "Troubleshooting" sollten bei Problemen nicht unbeachtet bleiben ;-) )

Und nun viel Spaß beim Spielen!