RaspberryPiでKinect(360版)を使う

RaspberryPiでKinect(360版)を使う

前回のエントリでリモートデスクトップ接続によってXが使えるようになりました。実はXをつかわないとKinectの動作ができなません。しかも、自分の使用しているRaspberryPi Model BではUSBのポート数が2つと足りないため、Xを起動すると操作に必要なマウスなどをつなげることができなかったので、リモートデスクトップ接続をできるようにしたというのが理由でもあります。

RaspberryPiでWindowsからリモートデスクトップ接続を行う

uepon.hatenadiary.com

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カメラなどで写真などをとるアプリケーションになります。 これで表示がうまくいけば問題はありません。

f:id:ueponx:20160429155731j:plain

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

f:id:ueponx:20160429163944j:plain

深度センサーの動作の様子

今後はOpenCVの情報をみながらいろいろやってみたいと思います。

/* -----codeの行番号----- */