openFrameworksでジェスチャ認識

最近いろいろと試しているGRTというジェスチャ解析ライブラリの紹介です。

ジェスチャ認識とはなんぞや

理系じゃないので、正しくはないですが、ふんわりこんな感じなのかな↓

ジェスチャ認識とは

1.パソコンに正解パターンを沢山教える。→ Classfication  
2.入力した信号が、どのパターンに似ていたか判定する。→ Recognition  

この2つのフェーズに別れてやるらしい。論文を読むと妙に難しい単語で挫けそうになるのだけど。 学習フェーズ、判定フェーズの2つがあるってことを知っておけば、わかりやすくなります。

その上で、素敵なスライドのご紹介。流石MIT
IAP Workshop: A Hands-On Introduction to Gesture Recognition & Machine Learning

そしてこのPDFがとてもまとまっている。 [IAP Session 1] (http://www.nickgillian.com/archive/teaching/workshops/mitiap2013/IAP_Session1.pdf)

本当は検出器に掛ける前に、
カルマンフィルタ、ローパスフィルタやら入力する信号の特性に応じてフィルタリングかけたり、FFTに変換とかいろいろ下ごしらえをするらしい。

アルゴリズムも色いろある。
AdBoostとか、SVMとか…ふむふむ分からん。
僕がよくやりたいパターンだと、9軸センサからジェスチェ認識とかやりたいので、Dynamic Time Warpingがよさげ。

やってみる。

ジェスチャ認識のライブラリは他にWiigeeとか見つかったのですが、アルゴリズムが一種類HMM(隠れマルコフモデル)だけ。上記でも使っているGRTを使ってみます。

GRTソースコードはこちらから。
https://code.google.com/p/gesture-recognition-toolkit/source/checkout

今回実行したプログラムはこちら。
http://www.nickgillian.com/wiki/pmwiki.php/GRT/OpenframeworksDTWExample

Rキーで、レコード開始。正解パターンを教えます。一文字につき5~10回繰り返す。
スクリーンショット 2013-12-15 19.00.10.pngスクリーンショット 2013-12-15 19.00.17.png

スクリーンショット 2013-12-15 19.00.57.pngスクリーンショット 2013-12-15 19.01.12.png

スクリーンショット 2013-12-15 19.02.38.pngスクリーンショット 2013-12-15 19.02.44.png

Tキーで教えこむ。
ちょっと待つとリアルタイムで解析するようになります。
全部Rとして認識成功!

スクリーンショット 2013-12-15 19.05.10.pngスクリーンショット 2013-12-15 19.05.24.pngスクリーンショット 2013-12-15 19.04.48.png

今回はマウス座標で2次元だったけど、yaw,pitch,rollでの解析とか。加速度での解析とかができそう。

// line:
trainingData.setNumDimensions( 2 ); // こんかいはx,y

おまけ

GRT部分を単体のアプリケーションにして、OSC経由で使える。Processingのサンプルが含まれてますが、OSC経由なら別にiPhoneの加速度センサだって簡単に。面白いことができそう。
http://www.nickgillian.com/wiki/pmwiki.php/GRT/Download

GPSって実際どれほどの精度なのか試してみた

たまたまGPSを使う要件がありまして、
GPSがどこまでいけるのか検証してみました。

結論からいうと、かなりよい。

モジュールはスパークファンから購入した
Adafruit Ultimate 66チャンネル10Hz GPSモジュール Version 3

このライブラリの通りに5Vと、TX/RXをつなぐだけ。

IMG_0313.jpg

ArduinoのSerial MonitorでそのままGPSのログが確認できるようになりますが、
一点だいじな事…
屋内では使えません。
Macと、この怪しげなArduinoむき出しのブレッドボードをもって近所の公園へ出掛けました。
僕が警官なら間違いなく職質します。

↓横浜海辺の公園を、不審者まがいに歩いたログ
GPS LOG

↓高度情報はこちら
height_walk_10fps.png

絶対値のoffsetは2m程東へずれていますが、
相対値の移動はかなり正確だという印象。
車載GPSで次の角を曲がってくださいって言っているんだから当たり前か。自分でやるとえらく感動する。

シリアル通信でこんな感じのフォーマットが流れてくる。(横浜の公園だけどちょっとだけ伏せ字)

$GPGGA,094022.200,35XX.XXXX,N,139XX.XXXX,E,2,11,0.78,-10.4,M,39.5,M,0000,0000*79
$GPRMC,094022.200,A,35XX.XXXX,N,139XX.XXXX,E,0.08,311.14,201113,,,D*6B

これはNMEAフォーマットというものらしい。パーサーも上述のgithubにあるので、ありがたい。
速度方向も結構な精度が出ていた。

ちなみに、GPSログの解析は、
http://www.gpsvisualizer.com/
このサイトを利用。
生のNMEAログファイルをいれるだけで、googlemapでみれるし、png,jpg,svg,さらにgoogleearth用のkmlフォーマットにも変換してくれる。
なんて素敵なサービス。(サクラではありません。ほんとうに素敵です。)

Unityでインタラクティブなプロジェクションマッピングを

プロジェクションマッピングは、2年前は面白いとおもっていたんだけど、
最近はジャンルとしてカテゴライズされちゃいましたて、僕の母親でも知っているくらい。
でも、カテゴライズされたからこそ、表現の面白さで戦うフェーズがあると思う。
プロジェクションマッピングも丁度今そういうフェーズだと思います。

参考になるかどうか分かりませんが、
Unity→プロジェクションマッピングをやった時の構成をシェアします。

今回のまとめ

結論から。Unityで全部はやらないほうがいいです。

Unity -> Syphon -> MadMapper

こういった構成を作ります。

機材機材

今回の記事はMac向けです。windowsの方はゴメンナサイ。
更に言うと、Unityを立ちあげて、テクスチャマッピングして、時としてプロジェクター複数台繋いでとかやると負荷は高いので。イベントで使うときは、Mac Proとか良いマシンを頑張って用意したいです。落ちた時のリスクとかも考えるとなんだかんだお金はかかる。
もちろん開発機/試すだけなら、なんでもいけます。

SyphonをUnityでつかう

Unityはインタラクティブな映像を作ることに集中したほうがいい。
僕も含めて、なんでもかんでもOSCでアプリケーションごと処理を分けていっちゃうことが多いけど、 映像でも似たような物があるようです。

[Syphon サイフォン] (http://syphon.v002.info/)

映像版OSC程度の理解でいいかと。 アプリケーション間で、低負荷、低遅延で、映像の受け渡しを出来る仕組みらしい。ちゃんとしたことは、公式サイトでみてくだしい。
Syphonサーバーにチャンネル名決めて、映像を送る。受信側で同じサーバー名、チャンネル名で受け取る。

1 . ここからダウンロード
2 . UnityPackageを展開
3 . Syphonに映像としてい送りたいカメラに"Syphon Server Textrue"コンポーネントを追加
ちなみに全部のシーンのメインカメラに、EditorスクリプトでSyphonコンポーネントが自動でアタッチされます

a.jpg

キャプチャではUnityからQuartzComposerへ送っています。

MadMapperでマッピング

送信はやったけど、受信側がないと、動いているか分からない。

UVマッピングはUnityでも割と簡単に出来るのだけど、
やっぱり餅は餅屋。マッピングはマッピングソフトにお任せするのがお奨めです。
有料ソフトですが
MadMapper マッドマッパー
がなんだかんだ入って使いやすいと思います。

  1. 左の入力で、syphonチャンネルを選ぶ。

c.jpg

  1. 適当なサーフェスを作って、マッピング! b.jpg

作ったほうがいいシーン

3Dをマッピングするときに
補正テスト用のシーンを用意しておくと良いかと思います。経験談。
変にアニメーションせずに、マッピングするためだけのプレーンなシーン。
何が正しいかわからなくなりがちなので。

Syphon -> Unity

今回はプロジェクションマッピングのために、Unityからサイフォン経由でMadMapperに送る記事だったけど、逆もやりたい。
サイフォン経由でUnityにMovieTextureぽく送る。
例えば、syphon対応しているVJソフトとか、Unityで動いている3DモデルのテクスチャをVJみたいに切り替えてつかう。
などなど。

そんなお仕事ありましたらお知らせくださいw

Unity Editor ⌘+shift+N をオーバーライド

⌘+shift+Nで、毎回変なとこにGameObjectが生成されるのがつらいので、ショートカットをオーバーライドするエディタスクリプト。 GameObjcectを選択して、⌘+shift+Nで、選択中の子階層にGameObjectを作ります。 レイヤー、親と同じ。

ついでに ⌘+option+Nで、選択中のGameObjectを包んだGameObjectを生成します。

作るのがちょっと早くなる。