Kinectで獅子舞ロボをコントロール

2年前に子供が作った獅子舞ロボをKinectでコントロールできるようにしてみました。

f:id:studio_k:20120506175821j:image:w480

獅子舞ロボはArduinoとサーボ×2でできています。
PCに接続したKinectで関節(Kinectではスケルトンと呼んでいます)を認識して、PCからシリアルで接続したArduinoに前後・左右の角度を送っています。

2自由度ですが、思ったよりも良く動くので、人型ロボットで動かしたくなりました。

自走BeagleBoard(その7:カメラにサーボをつけた)

f:id:studio_k:20120418220323j:image:w480
BeagleBoard台車のカメラが上下するようにサーボをつけてみました。
これで高い位置にある熱帯魚の水槽の様子も確認できます。(笑)

また、子供のラジコンのタイヤをもらったので付けてみました。
少しの段差なら乗り越えられるようになりました。

■自走BeagleBoardシリーズ
自走BeagleBoard (その1)
自走BeagleBoard (その2:ブラウザで操縦)
自走BeagleBoard (その3:OpenCVで顔画像認識)
自走BeagleBoard (その4:OpenCVでボール認識)
自走BeagleBoard (その5:OpenCVで顔画像認識2)
自走BeagleBoard (その6: ~テニスボール追跡~)

自走BeagleBoard (その6: ~テニスボール追跡~)

自走BeagleBoardでテニスボールを追いかけるようにしてみました。

すでに半年以上前になってしまいましたが、前の記事でボールを認識するところまでできていたので、ボールの位置を元に機体の向きを変えて、ボールが正面にある場合は前に進むようにしています。
ボールが近くにある時に自機の陰になって見えなくなってしまうため、カメラの位置を高くして、上から見下ろすようにしてみました。

また、最近購入したAndroidタブレットからでもコントロールできました。
f:id:studio_k:20120226202259j:image:w320

■自走BeagleBoardシリーズ
自走BeagleBoard (その1)
自走BeagleBoard (その2:ブラウザで操縦)
自走BeagleBoard (その3:OpenCVで顔画像認識)
自走BeagleBoard (その4:OpenCVでボール認識)
自走BeagleBoard (その5:OpenCVで顔画像認識2)
自走BeagleBoard (その6: ~テニスボール追跡~)

本格派対局将棋 ぴよ将棋
本格派対局将棋アプリ ぴよ将棋
[Android] [iOS]

かわいい「ひよこ」と対局する将棋アプリ。かわいいけどAIは本格派!
対局後の検討機能や棋譜管理機能も充実!棋譜解析機能も搭載!

OpenCV カメラの遅延の対策

うちの環境(BeagleBoard-xM + Ubuntu11.04 + OpenCV2.3.0)だけの問題かも知れませんが、重い画像処理を行うと、カメラの映像がひどく遅延してしまう現象が発生しています。
例えば、BeagleBoardで顔認識を行うと3FPSぐらいになります。3FPSであれば0.3秒程度遅延するのは分かりますが、実際には2~3秒ぐらい遅延してしまいます。3秒も遅延すると画像認識した結果でロボットを制御するのは難しいと思います。
対策として、

frame = cvQueryFrame (capture);

を数回繰り返して取得したイメージを捨てると遅延は少なくなります。しかし、無駄な処理を行っているようで納得できません。(実際、FPSも下がります。)
これで改善されることから、バッファリング関係の処理が影響していることは分かりました。

OpenCVのcvSetCapturePropertyで設定する、CV_CAP_PROP_POS_FRAMESやCV_CAP_PROP_FPSあたりのパラメータで回避できないかいろいろ試してみましたが、うまくいかず。OpenCVのソースを調べてみると、実装されていませんでした。。。
そこで、最後の手段で、OpenCVのソースを変更してみました。(これが正しい対応方法かどうかはわかりませんし、何か副作用がある可能性は高いです。)

OpenCV-2.3.0\modules\highgui\src\cap_libv4l.cpp の

#define MAX_V4L_BUFFERS 10
#define DEFAULT_V4L_BUFFERS 4

のところを

#define MAX_V4L_BUFFERS 1
#define DEFAULT_V4L_BUFFERS 1

のように変更して、OpenCVをコンパイルしなおしました。
この方法で、FPSは下がらずに、遅延もFPS相当程度(3FPSなら0.3秒ぐらい)になりました。
しかし、処理が速い場合にはFPSが上がらなかったりする副作用があるかもしれません。

自走BeagleBoard(その5:OpenCVで顔画像認識2)

前々回の笑い男ハッキングの画像を変更して、メガネにしてみました。(プログラムの変更はしていません。)

顔の位置に自動的にメガネを描画します。

メガネの通販サイトに売り込みできるかも!(笑)

髪型も同じようにできますね。美容院に売り込みできるかも!(笑)

f:id:studio_k:20110813094915j:image

■自走BeagleBoardシリーズ
自走BeagleBoard (その1)
自走BeagleBoard (その2:ブラウザで操縦)
自走BeagleBoard (その3:OpenCVで顔画像認識)
自走BeagleBoard (その4:OpenCVでボール認識)
自走BeagleBoard (その5:OpenCVで顔画像認識2)
自走BeagleBoard (その6: ~テニスボール追跡~)

ロボット・電子工作・プログラミング