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回繰り返す。






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



今回はマウス座標で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をつなぐだけ。

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

絶対値の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フォーマットにも変換してくれる。
なんて素敵なサービス。(サクラではありません。ほんとうに素敵です。)
picojsonを使ってoF環境設定ファイルを読み書き
ofxXmlSettingが使いにくかったので、picojson使ってみました。
こんな感じ。落ち着いたらクラスにまとめたい。ofxPicojsonに。
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コンポーネントが自動でアタッチされます

キャプチャではUnityからQuartzComposerへ送っています。
MadMapperでマッピング
送信はやったけど、受信側がないと、動いているか分からない。
UVマッピングはUnityでも割と簡単に出来るのだけど、
やっぱり餅は餅屋。マッピングはマッピングソフトにお任せするのがお奨めです。
有料ソフトですが
MadMapper マッドマッパー
がなんだかんだ入って使いやすいと思います。
- 左の入力で、syphonチャンネルを選ぶ。

- 適当なサーフェスを作って、マッピング!

作ったほうがいいシーン
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を生成します。
作るのがちょっと早くなる。