凹みTips

C++、JavaScript、Unity、ガジェット等の Tips について雑多に書いています。

RealSense が届いたので Unity で出来ることなどを詳しく調べてみた

はじめに

RealSense 3D カメラの F200 が届きました。

f:id:hecomi:20150223220832j:plain

RealSense は Intel による NUI 用のセンサ・SDK を扱うブランド名で、顔分析、手指・ジェスチャー検出、音声認識、背景除去、AR などが可能です。この前身として本ブログでも紹介したことのある Perceptual Computing という名称がありましたが、こちらを改めた形となるようです。

確かに「パーセプチュアル・コンピューティング」は技術視点な名前な気がするので、「リアル・センス」の方が短くコンセプト的なので分かりやすい改名だな、と思いました。

個人的にはインタラクションデモでの利用を想定していることから、Unity での活用を主軸に据えて調査してみました。本エントリでは、その調べた内容を共有したいと思います。

デモ

以前の空間図形認識モジュールを利用して魔法を描いてみました。

手のトラッキングを利用しています。例としては微妙かもしれませんが、RealSense 部分に関してはノンコーディングで出来ます。

背景

CES 2014 にて公開され、その後にも GDC 2014 や IFA 2014、都内のイベント等で発表されています。

RealSense モジュールを搭載したカメラとしては 3 種類準備しているようです。

今回届いたフロント用カメラの F200 の他に、タブレット用の Snapshot やリアカメラ用の R200 があるようです。Snapshot に関しては、先月発売の DELL Venue 8 7000(Android タブレット)に搭載していて、カメラ撮影時にデプス画も保存することで、Lytro のようにリフォーカスしたり、長さの計測などが撮影後に出来るようです。

また、SDK 自体は昨年にリリースされており、総額 100 万ドルの賞金のかかった App Challenge も行われていたようです。

未だ数は少ないですがアプリショーケースも公開されていて、いくつかのアプリを試すことが出来ます。

その他に RealSense でできることに関しては、Youtube にたくさん動画が上がっていますので、見ると何が出来そうなのか色々とつかめると思います。

スペック概要

見た目

F200 は PCSDK の頃のカメラ(Senz 3D)と同じく Creative 製で、Senz3D と比べると少し横に長いですが重さはそれほど変わりません。Leap Motion も並べて写真を撮ってみました。

f:id:hecomi:20150223221017j:plain

スペック

  • VGA(640x480 60fps) デプスカメ
    • 640x240 であれば 110 fps
    • 0.2 – 1.2 m の範囲
  • 1080p(30 fps) RGB カメラ
    • 848x480 以下は 60 fps

ラッキングについて

購入 / SDK のダウンロード / 開発に必要なスペック

購入

購入は以下から可能です。

価格は $99 で、送料は $24.81、総額 $123.81 で、Paypal で決済しました。キャンセルされていると勘違いして 2 個購入してしまったのですが、2個目は 2/3 に注文し、不在票が 2/20 に投函されていたので、2 週間ちょっとで届いた形になります。

必要マシンスペック

必要なスペックとしては、第4世代(Haswell)以降のインテル Core プロセッサ搭載の Windows 8.1 64bit PC が必要で、USB 3.0 ポートが必要です。また、Unity での開発には Pro 版が必要です。

SDKのダウンロード

SDK はこちらからダウンロードできます*1

ポチポチと進めていけば大丈夫ですが、1点、音声認識用に日本語用の辞書をチェックして入れておくことをおすすめします。

f:id:hecomi:20150223223313p:plain

これとは別に「F200 Depth Camera Manager」もダウンロード、インストールします。これをインストールしないと、デプス画が取得できません。

f:id:hecomi:20150223232738p:plain

サンプルの実行

Capture Viewer を起動すると、利用できるストリーム一覧が表示されます。

f:id:hecomi:20150224005921p:plain

Depth 640x240 110fps とか IR 640x480 300fps とかスゴイものたちも見えます。デプス画はこんな感じです。

f:id:hecomi:20150224010858p:plain

Intel RealSense SDK Sample Browser を起動すると、様々な言語のサンプルを試すことが出来ます。Unity のサンプルも含まれており、起動すると Unity のプロジェクトが立ち上がって動作させることが出来ます。以下は一例です。

FF がついたものが Front-Facing、前面カメラ用で、RF がついたものが Rear-Facing、背面カメラ用、DF がついたものが Dual-Facing で両面対応のサンプルになります。ここでは RF が

SDK の概要

概要

f:id:hecomi:20150223224914p:plain

SDK の構成としては、I/O や マルチモーダルな NUI 認識アルゴリズムのレイヤが最下層にあり、その上に C++ による SDK のインターフェースレイヤがあります。ユーザは、この SDK のレイヤを直接触るか、別の言語へのバインディングを通じて利用する形になります。

Unity の場合は、Web Player も考慮して、更に一層レイヤが積まれています。

f:id:hecomi:20150223225944p:plain f:id:hecomi:20150223230112p:plain

Web Player では Native プラグインの利用ができないので、JavaScript と同様にサーバ・クライアント方式で情報を取ってくるようです。Leap Motion とかと同じ一般的な方法ですね。

インターフェースには接頭辞として PXC[M] がついています。PXC はおそらく Perceptual(PX) Computing(C) の略で、M は Managed です。

f:id:hecomi:20150223225300p:plain

なお、デプスを利用しない一部の機能(顔検出や音声認識)については、F200 を持っていなくても利用できるようです。このアーキテクチャならプロ版じゃなくても出来そうですが...。

Unity Toolkit

上記の一層積まれたレイヤは、Unity Toolkit という層になっていて、Unity の Editor スクリプトの力を借りて RealSense SDK を簡単に扱えるようにした Script / Prefab 群になります。これについては後述します。

.unitypackage の場所

Unity Toolkit は、RealSense SDK をインストールしたディレクトリ下の RSSDK\framework\Unity にある RSUnityToolkit.unitypackage をインポートすることで自分のプロジェクトに加える事が出来ます。ここには Sample Browser で見た Unity のサンプルシーンが一通り含まれています。

なお、同ディレクトリにある Unity.PCStandalone.unitypackage は Unity Toolkit やサンプルを除いた C# バインディングの DLL(Native および Managed)、Unity.WebPlayer.unitypackage は Web Player 用の DLL(Managed)が含まれたパッケージになります。試してないですが、Web Player 用のパッケージを使えば Pro 版じゃなくても出来るかも...。

Unity でアプリを作ってみる

ではいよいよ Unity でのアプリを作成してみます。

Unity Toolkit の利用

Unity Toolkit は先述のように、最小限のコードのみで RealSense の機能を利用可能にできるよう、Unity のエディタ拡張を利用して便利にした Script / Prefab 群になります。Actions Triggerというものが用意されており、Trigger が手を検出した、トラッキングしてる、顔をロストした、みたいなイベントで、Actions がその結果として、GameObject を Active にしたり、動かしたりといったことをするものになります。Actions がスクリプト単位で分かれていて、ここにエディタ拡張で作られたメニューを通じてポチポチと Trigger と、その中に記述する Rule を設定していく形になります。

例えば、手のトラッキングのサンプル(Full Hand tracking-right Prefab)を見てみます。

f:id:hecomi:20150225005637p:plain

ルート要素には Activate ActionDeativate Action という Action がアタッチされています。これはその名の通り Trigger に応じて指定したオブジェクトの表示 / 非表示を担当するもので、Activate Action では Hand Detected Trigger によって hands joint を表示し、Deativate Action では Hand Lost Trigger で hands joint を非表示にするよう指定されています。Trigger の中を見ると、例えば Activate Action では、Which HandACCESS_ORDER_RIGHT_HANDS と右手が指定されており、Hand Index で 0 となっているので、最初の右手を見つけたら、という Rule が設定されています。

なんとなく掴めたと思いますので、同様に指のトラッキングを見てみます。

f:id:hecomi:20150225011748p:plain

Tracking Action という Continuous Action が設定されています。Continuous Action には Start Event / Process / Stop Event の 3 種類の Trigger を設定する形になっていて、Start Event が起きたら Stop Event が起きるまで Process が周る形になります。ここでは近距離-遠距離間で(どこでも良いので)手が見つかったら開始して、ロストしたら終了する、という Trigger が設定されていて、 Process では Tracked Joint で指定した指の部位に応じて Transform を変化させる形になっています。すべての指にこれを設定することで手のひらが作れる、という形になっているわけですね。

なお、Tracking Action では Hand TrackingFace TrackingObject Tracing がプルダウンリストから選択でき、それぞれインスペクタの項目が変化します。

他にも色々な Action があるのでサンプルを見たり試してみると色々と遊べると思います。

f:id:hecomi:20150225025202p:plain

C# バインディングの利用

Unity Toolkit はおそらく好き嫌いがありそうだな、と思います(個人的にはゴリゴリスクリプト書きたいのでイベントハンドラだけ出して欲しかった)。Unity Toolkit でできること以外に色々やりたい場合には、生の PXCMHogehoge を触れば可能です。例としては映像ソースを取ってくるといったことが挙げられますが、こちらに関しては Image Prefab にアタッチされている DrawImage.cs などを見てみると参考になると思います。より踏み込んだ詳細は Reference をご参照ください。

冒頭の魔法発射デモ

人差し指の Tip の Action / Trigger / Rule を流用して、以前公開した空間図形認識モジュールをそのオブジェクトへアタッチすると魔法が使えるようになります。これが冒頭のデモになります。

参考サイト

Unity を使った先行事例としては、中村 薫さんが Unity での利用方法による詳解や、Unity ちゃんの顔を自分の顔に同期させるデモを紹介されています。

別途ツイートをまとめてくださっている Togetter も参考になります。

所感

性能について

手のトラッキングに関して言えば Leap Motion の方が高速でロストしない印象ですが、こちらは正対した状態や障害物が近くにあってもトラッキングができるので、有利な面も多いと思います。あと辺なステートに入り込まない感じもします。

f:id:hecomi:20150225002058p:plain

代わりにトラッキングは結構遅い感じがしました。速い動きに対して追従性が良くないので、軌跡を利用するようなアプリケーションに使うのは難しそうです。冒頭のデモでは結構重くフィルタをかけています。

デプスに関しては Kinect v2 の方が綺麗なのと遠距離も可能ですが、かなり近接させても平気なので、小さいものの 3D スキャンや、小さな変化を追うような用途には向いてそうです(レゴも認識できそうでした)。

音声認識音声合成、顔の詳細なトラッキング、Metaio を使った AR や物体認識も SDK で使えるので、マルチモーダルなインタラクションデモを作成する、といった点では良さそうです。

その他

Alienware 17 の昨年モデルを使っているのですが、相性が悪いのか、なかなか接続がうまく行かず苦労しました...(未だに未解決)。RGB 画は安定して取れるのですが、IR やデプス画を撮ろうとすると接続が切断される、といった現象です。ワークアラウンドとしては、タスクマネージャから RealSenseDCM.exe(Depth Camera Manager)を Kill したり、FF_HandsViewer.exe とかが動きやすいので、これをまず起動させて止めてから、Unity に移るとやると安定しました(謎)。

おわりに

これだけのセンサ・SDK が 1 万円ちょっとで利用できるのは本当にすごいと思います。今回紹介できなかったオブジェクト認識周りや音声認識も組み合わせて、研究からゲームまで色々な用途に使えると思います。ただ一方で、マルチモーダルなインタラクション設計は相当難しいと思いますので、果たして生活を便利にするようなインターフェースにつながるかは、まだ若干懐疑的です。色々な人がアイディアを出しあって活発に議論されて、いろんな使い道が発掘されたら良いなと思いますので、興味のある方で未購入の方は是非買って試してみてください。

*1:会社情報などの入力が必要です(私は個人としました)