RaspberryPiでKinect(360版)を使う
前回のエントリでリモートデスクトップ接続によってXが使えるようになりました。実はXをつかわないとKinectの動作ができなません。しかも、自分の使用しているRaspberryPi Model BではUSBのポート数が2つと足りないため、Xを起動すると操作に必要なマウスなどをつなげることができなかったので、リモートデスクトップ接続をできるようにしたというのが理由でもあります。
RaspberryPiでWindowsからリモートデスクトップ接続を行う
Kinectの接続
XBOX360版のKinect(以下Kinect)は実はUSBに接続するだけで/dev/video0
などとして認識されます。接続したらデバイスファイルが生成されているか確認します。
~ $ ls /dev/video* /dev/video0
/dev/video
デバイスとしての動作を確認
X上のコンソールで以下のように実行します。
~ $ sudo apt-get install camorama ~ $ camorama -d /dev/video0
camoramaはUSBカメラなどで写真などをとるアプリケーションになります。 これで表示がうまくいけば問題はありません。
Kinectの/dev/video0デバイスとしての動作
とりあえず問題なさそうです。(注意)USBHub経由での接続はやめておいたほうが良いようです。
Kinectらしく使用する
Kinectらしさという表現はいささか謎ですが。
カメラだけならUSB接続のお安いカメラでも実現は可能ですので、できれば赤外線を使った深度センサーとして使用したいところです。
開発環境が微妙なのと新しい言語への挑戦ということでOpenNIではなくfreenect + python + OpenCVを使うことにします。以下のようにコマンドを入力してインストールをします。
参考: github.com
~ $ sudo apt-get install python-opencv ~ $ sudo apt-get install python-freenect
以上。(ドキュメントをみるともっと手間がかかりそうですが)一応、これでpythonからKinectを動作させることができます。 OpenCVはほとんど触ったことがないのですが、以下のソースのような感じでやると深度画像が連続して取得できます。
ソースの説明を簡単にいうとdepthウインドウに画像Kinectから送られるキャプチャ画像をループしながら張り付け・表示をしています。メインウインドウのハンドラはESCキーの入力を検知し、押された段階で終了させる処理をしています。同様にRGB画像も表示ができるのですが、RaspberryPi Model BではUSB帯域が取れないので同時には取得はできないようです。(ESCキーの検出もほとんどうまくいきませんでした。)
ファイルの編集
~ $ vim depth.py
#!/usr/bin/env python # -*- coding: utf-8 -*- import freenect import cv import frame_convert cv.NamedWindow('depth') running = True def display_depth(dev, data, timestamp): global running cv.ShowImage('Depth', frame_convert.pretty_depth_cv(data)) if cv.WaitKey(10) == 27: running = False def body(*args): if not running: raise freenect.Kill print('ESCキーで終了') freenect.runloop(depth=display_depth, body=body)
実行させるにはX上のコンソール(重要)から
~ $ python depth.py
深度センサーの動作の様子
今後はOpenCVの情報をみながらいろいろやってみたいと思います。