2015年5月18日月曜日

Kinect v2で、RoomAliveを試してみた

RoomAliveって何?

マイクロソフトがBuild2015で披露したKinect v2とプロジェクタを組み合わせたプロジェクションマッピングです。部屋の壁にプロジェクタで映像を投影して、映し出したCGの物体をタッチしたりするとKinectでソレを検出してインタラクティブな操作を可能にする物です。

恐らくこの映像を見ていただくのが分かりやすいと思います。


自分の部屋がAR空間になって、とてもすばらしですね。私はコレを見て物凄くワクワクしました。部屋をゲーム世界にするRoomAlive、マイクロソフトがプロジェクションマッピング自作ツール公開でも紹介されています.

必要な物

  • Kinect v2 (Windows PCに接続できる) 1台以上
  • プロジェクタ 1台以上
  • Windows 8 のPC
  • Visual Studio 2013
  • Kinect2 SDK

Kinect v2はXbox One Kinectセンサーと等価ですが、ここではKinect v2と表記します。

Kinect v2と接続ケーブル

私は、RoomAliveのデモを見てKinect v2とプロジェクタをそれぞれ1台ずつ購入しました。
(これまで、Kinect v1は持っていたのですがv2は持っていませんでいた。)

Xbox One Kinect センサー (DANCE CENTRAL SPOTLIGHT (ご利用コード) 同梱)
Xbox One Kinect センサー


初期のKinect v2では、Xboxゲーム用のKinectの物と、Windows開発用の物と2種類ありましたが、現在ではXboxゲーム用のKinect v2に一本化されているようです。

ただし、このXbox One Kinect センサーを買えばXboxでゲームを楽しむことはできるのですが、PCに接続して開発するには次の接続ケーブルを購入する必要があります。
若干価格が高いですが、これはWindows開発のためにライセンス料も含まれていると考えるわけです。(元々、Windows向けのKinect v2は2万円くらいしていた。)

マイクロソフト Xbox One Kinect センサー用 Windows PC アダプター 9J7-00001
マイクロソフト Xbox One Kinect センサー用 Windows PC アダプター


プロジェクタ


プロジェクタも買ってしまいました。フルHDが良かったのですが、エプソンのEB-X8と言う機種を中古購入しました。新品でプロジェクタを購入するとお高いので、今回はヤフオクで落札しました。

開発環境


無料で利用できるVisual Studio 2013 Communityを使いました。
iMac 5K RetinaにBootcampで構築したWindows8.1 64bit を使用します。
Kinect2 SDKをダウンロード&インストールします。

RoomAlive Toolkit


プロジェクタとKinect v2各1台からRoomAliveができるツールキットがGithubで公開されています。
また、このツールキットを使った解説ビデオが公開されています。リスニング力がない私には厳しい、、、が参考になります!


アウトライン

  1. GithubからRoomAlive Toolkitのソリューションをcloneして、ビルドする。
  2. PCにKinect v2とプロジェクタを接続&設置する。
  3. CalibrateEnsembleで設置したKinect v2とプロジェクタのキャリブレーションを行う。
  4. ProjectionMappingSampleを試してみる.

GithubからRoomAlive Toolkitをcloneして、ビルドする

https://github.com/Kinect/RoomAliveToolkitにリポジトリがあるわけですが、2015年5月16日現在まだまだ完成と呼ぶには遠い開発途中のプログラムになっています。特に、マスターブランチではキャリブレーションなどに失敗した際の例外がキャッチされず、そのままアプリケーションがクラッシュしてしまいます。developブランチではある程度改善されていますが、いくつか間違いが見受けられました。
そこで、私は自分で最低限修正したコードを使用しました。developブランチを変更したコードをhttps://github.com/hiroyky/RoomAliveToolkit/tree/developにフォークして公開しています。
ここではこれをクローンすることにします。その後、developブランチに切り替えます。

$git clone git@github.com:hiroyky/RoomAliveToolkit.git
$git  git checkout -b develop origin/develop

ただし、本屋RoomAliveリポジトリは今後開発が進められていくと思います。実際、本屋RoomAliveのdevelopブランチはかなりの頻度でコミットされているようです。(私は本屋にpull requestするつもりは恐れ多くてありません。。。)

ソリューションの中身は6つのプロジェクトから構成されています。
プロジェクト群
ひとまず、まずはソリューション全体をビルドしてみましょう。追加で必要なパッケージは適宜NuGetでダウンロードされます。

PCにKinect v2とプロジェクタを接続&設置する

Kinect v2とプロジェクタをPCに接続します.プロジェクタの投影がKinect v2で捉えられれば位置関係はOKだと思います.今回は,プロジェクタの上にKinect v2を設置しました.
 
通常の投影とは異なり,平面ではないところに投影する必要があります.
投影したところ,このように部屋の端などが良いベスト??(生活感アリアリですいません)
プロジェクタ画面と2画面拡張にします(ミラーリングではありません).

CalibrateEnsembleで設置したKinect v2とプロジェクタのキャリブレーションを行う


まず,KinectServer.exeとProjectorServer.exeを起動します.Visual Studioのデバッグモードではなく,直接binディレクトリを開いて起動しましょう.ProjectorServerのウィンドウをプロジェクタの画面に移動させます.
ProjectorServerのウィンドウを投影画面に移動


CalibrateEnsembleプロジェクトをスタートアップのプロジェクトに設定して、F5キーを押して、デバッグモードでCalibrateEnsembleを起動しました。(スタートアップのプロジェクトに設定するには、ソリューションエクスプローラのCalibrateEnsembleを右クリック→スタートアッププロジェクトに設定をクリックします。)

ツールバーのFile→Newと進めます。
「Create New Ensemble」のダイアログが表示されたら接続しているKinect v2とプロジェクタの台数を指定します。今回は両方とも1台なのでこのままOKをクリックします。
続いて、キャリブレーション結果を記録するXMLファイルの保存先を指定します。XMLファイルが作成されます。

XMLファイルを編集します.
XMLファイルのCameraとProjector要素の直下にあるname要素の値が初期値は"0"になっていると思いますが、好きな名前に変更しましょう。私はmainとしました。
複数台のカメラとプロジェクタを使うときは、どれがどれを示しているのか分かりやすい名前にする必要がありそうです。
また、projector要素のdisplayindexをプロジェクタが投影している画面の番号にします。大抵はメインのディスプレイが0でプロジェクタが1になるようです。

<projectorcameraensemble xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <name>Untitled</name> ←好きな名前に変更
  <cameras>
    <camera>
      <name>main</name> ←好きな名前に変更
      <hostnameoraddress>localhost</hostnameoraddress>
      <pose>
        <valuesbycolumn>
          <arrayofdouble>
            <double>1</double>
            <double>0</double>
            <double>0</double>
            <double>0</double>
          </arrayofdouble>
          <arrayofdouble>
            <double>0</double>
            <double>1</double>
            <double>0</double>
            <double>0</double>
          </arrayofdouble>
          <arrayofdouble>
            <double>0</double>
            <double>0</double>
            <double>1</double>
            <double>0</double>
          </arrayofdouble>
          <arrayofdouble>
            <double>0</double>
            <double>0</double>
            <double>0</double>
            <double>1</double>
          </arrayofdouble>
        </valuesbycolumn>
      </pose>
    </camera>
  </cameras>
  <projectors>
    <projector>
      <name>main</name> ←好きな名前に変更
      <hostnameoraddress>localhost</hostnameoraddress>
      <displayindex>1</displayindex> ←ここでは0から1に変更
      <width>0</width>
      <height>0</height>
     </projector>
  </projectors>
</projectorcameraensemble>

ProCam Ensemble Calibrationのアプリケーションに戻って、File→Reloadをクリックします。
右側に
Loaded <XMLファイルへのパス>
が出力されます。

ツールバーのSetup→Show Projector Namesから画面の識別を表示します。プロジェクタが適切に選ばれいることを確認します。

キャリブレーションを開始します.
ツールバーのCalibrate→Acquirで開始します.
続いて,Calibrate→Solveします.
キャリブレーション中の様子

終わったらFile→Saveで先ほどのXMLにキャリブレーション結果を追記されます.

Acquir及びSolveで右側の出力で例外が発生していないかを確認します.発生していなければ正常です.
ちなみに,現状のマスターブランチのコードではこのとき,例外がキャッチされずにアプリケーションごと終了してしまいます.
また,平面に投影している場合はキャリブレーションに失敗します.プロジェクタの投影面などを調整してみるのもアリでしょう.

キャリブレーションが終わったらFile→Saveで結果を保存します。先ほどのXMLファイルに追記されます。また、XMLと同じフォルダに撮影した画像ファイルを含むフォルダが作成されます。

再度,File→OpenでXMLファイルを開きなおし,左側の画像をマウスでドラッグしたり、 W, A, S, D, E, Dキーを押したりすることで部屋の3Dモデル(?)を確認することができます。また、ツールバーのRender→Live Viewにするとリアルタイムにそれが確認できます。

ProjectionMappingSampleを試してみる

それでは,プロジェクションマッピングのサンプル動かしてみます.
ただし,その前にプロジェクト内のProperties/Settings.settingsを開いて設定を行います.ここでは便宜上,
  • FullScreenEnabled: False
  • LocalHeadTrackingEnabled: False
に変更しました.FullScreenEnabledはTrueだと映像が表示なかったからです.一方,LocalHeadTrackingEnabledはTrueにするとKinect v2が人物を検出して,人物に合わせてオブジェクトをコントロールします.ただ,若干わかりにくいので最初はFalseにして,2回目移行にTrueにしてみましょう.
このプログラムは引数に,先ほど設定したキャリブレーションのXMLへのパスを取ります.プロジェクトを右クリック→プロパティ→デバッグからコマンドライン引数でパスを指定します.
ここまで出来たら,ProjectionMappingSampleプロジェクトをスタートアッププロジェクトに設定して起動します.
2つのウィンドウが表示されるので,プロジェクタ名の方のウィンドウを投影画面に移動させて最大化しましょう.
サンプルのプロジェクションマッピング
できたーーーー!
部屋の角に投影しているますが,投影されている家の模型(?)オブジェクトはそれを見事に吸収しています.実際,タイトルバーやタスクバーはゆがんでいますが,オブジェクトは角の影響を受けてゆがんでおらず,まっすぐです.

トラブルシューティング


EndpointNotFoundException

ProjectorServer.exeやKinectServer.exeは起動していますか?