46
Kinect わくわく on BeagleBoard !? 2011年 5月 22日 第六回 カーネル/VM探検隊 @kei_os

6th kernelvm kei_os

Embed Size (px)

Citation preview

Page 1: 6th kernelvm kei_os

Kinect わくわくon BeagleBoard !?

2011年 5月 22日第六回 カーネル/VM探検隊

@kei_os

Page 2: 6th kernelvm kei_os

自己紹介•Twitter : @kei_os

• 組み込み系エンジニア

• SoC 開発、ドライバ開発 (ITRON 系)

•組み込み Linux/Android に軸足を移し中

• BeagleBoard で Android を動かして修行

Page 3: 6th kernelvm kei_os

LT の経緯

Page 4: 6th kernelvm kei_os
Page 5: 6th kernelvm kei_os

@syuu1228 さんから召喚

Page 6: 6th kernelvm kei_os

@syuu1228 さんから召喚

LT 決定

Page 7: 6th kernelvm kei_os

良い機会なので新しいことをやってみよう

Page 8: 6th kernelvm kei_os

Android フレームワークにKinect をポーティングしてBeagleBoard で動かす

Page 9: 6th kernelvm kei_os

Android の Camera API を使ってKinect の映像/深度データを

使えるようにする

Page 10: 6th kernelvm kei_os

やってみた結果ですが

Page 11: 6th kernelvm kei_os

すいません><USB 2.0 High Speed モードを

甘く見てました...

Page 12: 6th kernelvm kei_os

Android のフレームワークまでKinect のデータがあがってこない

Page 13: 6th kernelvm kei_os

BeagleBoard

Page 14: 6th kernelvm kei_os

http://beagleboard.org/

Page 15: 6th kernelvm kei_os
Page 16: 6th kernelvm kei_os

※ BeagleBoard Revision C4 System Reference Manual から抜粋

今回使ったボードは BeagleBoard Rev.C4

Page 17: 6th kernelvm kei_os

Kinect センサー

Page 18: 6th kernelvm kei_os

Kinect センサー

•RGB カメラ

•深度センサー

•マルチアレイマイクロフォン

•専用ソフトウェアを動作させるプロセッサ

Page 20: 6th kernelvm kei_os
Page 21: 6th kernelvm kei_os

BeagleBoard と Kinect を接続

Page 22: 6th kernelvm kei_os
Page 23: 6th kernelvm kei_os

デバイスが揃ったところで

Page 24: 6th kernelvm kei_os

Android Framework への Kinect ポーティング

Page 25: 6th kernelvm kei_os

Android Framework

※ http://developer.android.com/guide/basics/what-is-android.html から抜粋

Page 26: 6th kernelvm kei_os

Android Framework

HAL (Hardware Abstraction Layer)

※ http://developer.android.com/guide/basics/what-is-android.html から抜粋

Page 27: 6th kernelvm kei_os

Android Framework

HAL (Hardware Abstraction Layer)

※ http://developer.android.com/guide/basics/what-is-android.html から抜粋

カメラやセンサーは

ここに組み込む

Page 28: 6th kernelvm kei_os

Android Framework

HAL (Hardware Abstraction Layer)

※ http://developer.android.com/guide/basics/what-is-android.html から抜粋

ここをいじってKinect を組み込む

Page 29: 6th kernelvm kei_os

Android Framework

HAL (Hardware Abstraction Layer)

※ http://developer.android.com/guide/basics/what-is-android.html から抜粋

frameworks/base/services/camera/libcameraservice

Page 30: 6th kernelvm kei_os

今回使った Android ディストリビューション

Page 31: 6th kernelvm kei_os

• Gingerbread (sola さんメンテナンス版)

• https://github.com/sola-dolphin1/OHA-Android-2.3_r1.0

Android ディストリビューション (1)

Page 32: 6th kernelvm kei_os

• Donut (OESF メンテナンス版)

• https://github.com/OESF/Embedded-Master-ARM

Android ディストリビューション (2)

Page 33: 6th kernelvm kei_os

Kinect 制御ライブラリの組み込み

Page 34: 6th kernelvm kei_os

•組み込むライブラリ

•libfreenect•libusb

Page 35: 6th kernelvm kei_os

libfreenect

• https://github.com/OpenKinect/libfreenect

• RGB/深度カメラデータ取得

•チルト制御

•加速度センサー取得

• Audio は対応していない

Page 36: 6th kernelvm kei_os

libfreenect

├── libfreenect    ├── include    │   └── libfreenect.h    ├── src       ├── cameras.c       ├── core.c       ├── freenect_internal.h       ├── tilt.c       ├── usb_libusb10.c       └── usb_libusb10.h

使用するソースファイル

Page 37: 6th kernelvm kei_os

libusb• http://sourceforge.net/projects/libusb/

• libusb-1.0.8

• マクロ定義を追加#define TIMESPEC_TO_TIMEVAL(tv, ts) do { ¥ (tv)->tv_sec = (ts)->tv_sec; ¥ (tv)->tv_usec = (ts)->tv_nsec / 1000; ¥} while (0)

Page 38: 6th kernelvm kei_os

libusb

•Android の init.rc に usbfs マウント処理追加mount usbfs none /proc/bus/usb -o devmode=0666

Page 39: 6th kernelvm kei_os

ここから、ハマった話><

Page 40: 6th kernelvm kei_os

RGB/深度カメラのストリームがすぐに出なくなる><

Page 41: 6th kernelvm kei_os

定期的にコントロール転送をする必要がある

• freenect_update_tilt_state() で実施するとよい

• 全く呼ばないと 300ms 程度で出力停止

• 呼び出し間隔を 10ms 以上空けると

USB パケットがおかしくなる

Page 42: 6th kernelvm kei_os

RGB/深度カメラストリームのUSB パケットを大量にロストする><

Page 43: 6th kernelvm kei_os

...

W/libfreenect( 1197): [Stream 70] Lost 21 packetsW/libfreenect( 1197): [Stream 70] Lost too many packets, resyncing...W/libfreenect( 1197): [Stream 70] Lost 50 packetsW/libfreenect( 1197): [Stream 70] Lost too many packets, resyncing...W/libfreenect( 1197): [Stream 70] Expected 1748 data bytes, but got 1132

W/libfreenect( 1197): [Stream 70] Lost 20 packetsW/libfreenect( 1197): [Stream 70] Lost too many packets, resyncing...W/libfreenect( 1197): [Stream 80] Lost 123 packetsW/libfreenect( 1197): [Stream 80] Lost too many packets, resyncing...W/libfreenect( 1197): [Stream 70] Lost 50 packets

W/libfreenect( 1197): [Stream 70] Lost too many packets, resyncing...W/libfreenect( 1197): [Stream 70] Lost 49 packetsW/libfreenect( 1197): [Stream 70] Lost too many packets, resyncing...W/libfreenect( 1197): [Stream 80] Lost 3 packetsW/libfreenect( 1197): [Stream 80] Lost 196 packets

W/libfreenect( 1197): [Stream 80] Lost too many packets, resyncing...W/libfreenect( 1197): [Stream 70] Lost 49 packetsW/libfreenect( 1197): [Stream 70] Lost too many packets, resyncing...W/libfreenect( 1197): [Stream 70] Lost 1 packetsW/libfreenect( 1197): [Stream 70] Lost 50 packets

W/libfreenect( 1197): [Stream 70] Lost too many packets, resyncing......

全滅...orz ><;

Gingerbread 動作時の logcat

Page 44: 6th kernelvm kei_os

...

W/libfreenect( 1122): [Stream 70] Lost too many packets, resyncing...D/libfreenect( 1122): Got depth frame of size 422400/422400, 242/242 packets arrived, TS 748d9df0D/libfreenect( 1122): Got video frame of size 614400/614400, 323/323 packets arrived, TS 7496228bD/libfreenect( 1122): Got depth frame of size 422400/422400, 242/242 packets arrived, TS 74ac2adbD/libfreenect( 1122): Got depth frame of size 422400/422400, 242/242 packets arrived, TS 74cab7c6

W/libfreenect( 1122): [Stream 80] Lost 1 packetsW/libfreenect( 1122): [Stream 80] Lost 4 packetsW/libfreenect( 1122): [Stream 80] Inconsistent flag 82 with 322 packets in buf (323 total), resyncing...W/libfreenect( 1122): [Stream 70] Lost 7 packetsW/libfreenect( 1122): [Stream 70] Lost too many packets, resyncing...

D/libfreenect( 1122): Got depth frame of size 422400/422400, 242/242 packets arrived, TS 7544eb72D/libfreenect( 1122): Got depth frame of size 422400/422400, 242/242 packets arrived, TS 7563785dD/libfreenect( 1122): Got video frame of size 614400/614400, 323/323 packets arrived, TS 754d1040D/libfreenect( 1122): Got depth frame of size 422400/422400, 242/242 packets arrived, TS 75820548D/libfreenect( 1122): Got depth frame of size 422400/422400, 242/242 packets arrived, TS 75a09233

W/libfreenect( 1122): [Stream 80] Lost 1 packetsW/libfreenect( 1122): [Stream 80] Lost 4 packetsW/libfreenect( 1122): [Stream 80] Inconsistent flag 82 with 322 packets in buf (323 total), resyncing...W/libfreenect( 1122): [Stream 70] Lost 6 packetsW/libfreenect( 1122): [Stream 70] Lost too many packets, resyncing...

D/libfreenect( 1122): Got depth frame of size 422400/422400, 242/242 packets arrived, TS 75fc38f4...

時々フレームデータが取れるけどまだフレームが抜ける

Donut 動作時の logcat

Page 45: 6th kernelvm kei_os

USB パケットの話

Page 46: 6th kernelvm kei_os

ご清聴ありがとうございました