HoloLens と kinect v2 を連携させる -その1-
こんにちは、たるこすです。
今回は HoloLens と kinect v2 を連携させてみます。
まずは kinect で認識した Body (骨格情報) を HoloLens で表示させることを目指します。
全体構成
当然ながら HoloLens に kinect を直接接続することはできないので、 kinect を接続した PC で取得した kinect のデータを HoloLens に送信します。
以前 PC と HoloLens の通信を Unity Unet の LLAPI を使って行ったので、
今回もそれを使います。
PC 側アプリ、HoloLens アプリはそれぞれ Unity を使って作成します。
また、データ送信時のシリアライズは Json + gzip を使います。
本当は MessagePack を使いたかったのでライブラリをいくつか試したのですが、うまく動作させることができませんでした。
HoloLens アプリは UWP のため、Unity 上で動くコードが HoloLens 上で動かないことがあり、なかなか難しいです。
PC側アプリ作成
kinect SDK, unitypackage のダウンロード、インストール
まずは、kinect v2 の SDK をインストールします。
以下のページを開き、青い「Download the SDK」ボタンを押して SDK をダウンロードし、インストールします。
次に、Unity 用パッケージをダウンロードします。
以下のページの中央あたりにある、「Unity Pro packages」をダウンロードします。
Unity Pro となっていますが、Personal 版でも使えました。
zip を展開すると、unitypackage やサンプルシーンが複数含まれています。
Unity アプリケーションの作成
Unity で新規プロジェクトを作成し、以下の unitypackage とフォルダをインポートします。
- Kinect.2.0.1410.19000.unitypackage
- KinectView フォルダ
KinectView に含まれる MainScene を開き、実行すると以下のように RGB画像、赤外線画像、骨格情報、3D データ が表示されました。
このシーンに新しい名前を付けて保存し、骨格情報を送るコードを付け加えていきます。
まずは、以前作成した UnetLLAPISample の unitypackage をインポートします。
以下のページからダウンロードできます。
インポートしたら、Assets/UnetLLAPISample/Prefabs に含まれる ClientManager をシーンに追加します。
Inspector で Server Address の欄に HoloLens の IP アドレスを入力します。
開発時に HoloLens 側アプリケーションを PC 上で実行する場合には 127.0.0.1 を入力します。
さらに、gzip を使えるようにするために、以下のアセットをインポートします。
次に、骨格情報を送るコードを作成します。
BodySourceView.cs を参考にして、以下のようなスクリプト (BodySender.cs) を作成しました。
シーンに空の GameObject を作成し、上記 BodySender.cs を付け加えます。
Inspector で Network Manager には ClientManager を設定、Body Source Manager には BodyManager を設定します。
これで、PC 側アプリケーションは完成です。
HoloLens 側アプリケーション作成
Unity で新規プロジェクトを作成し、以下のパッケージをインポートします。
- HoloToolkit-Unity
- Kinect.2.0.1410.19000.unitypackage
- UnetLLAPISample_v0.1.unitypackage
- GZipStream + DeflateStream - Unity.IO.Compression
Camera を削除し、Assets/HoloToolkit/Input/Prefabs/HoloLensCamera を追加するなどの HoloLens 用の設定を行います。
Assets/UnetLLAPISample/Prefabs に含まれる ServerManager をシーンに追加します。
データを受信するコード (KinectReceiver.cs) を作成します。
空の GameObject を作成し、上記 BodySourceView.cs を付け加えます。
Inspector で Network Manager の欄に ServerManager を設定、Joint Prefab には関節位置に表示するオブジェクトを設定します。
今回は scale 0.02 の sphere をプレハブにしたものを設定しました。
HoloLens 側アプリケーションはこれで完成です。
実行
作成した PC 側アプリケーション、HoloLens 側アプリケーションをそれぞれ Unity 上で実行してみると、 HoloLens 側アプリケーション上でオブジェクトが人型に表示されます。
しかし、これだけではアプリケーションを HoloLens 上で実行した際に、オブジェクト表示位置と自分の位置は一致しません。
それは、HoloLens で実行されるアプリケーションの座標系と Kinect で取得した関節位置の座標系が異なっているからです。
HoloLens アプリケーションではアプリ実行時の HoloLens の位置が原点、Kinect で取得した関節位置は Kinect がある場所が原点となっています。
これら座標系を何らかの方法で合わせなければいけません。
この方法については次回のブログで紹介します。