たるこすの日記

たるこすの日記

リアルからバーチャルへ、バーチャルからリアルへ

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) を作成しました。

BodySender

シーンに空の GameObject を作成し、上記 BodySender.cs を付け加えます。
Inspector で Network Manager には ClientManager を設定、Body Source Manager には BodyManager を設定します。

これで、PC 側アプリケーションは完成です。

HoloLens 側アプリケーション作成

Unity で新規プロジェクトを作成し、以下のパッケージをインポートします。

Camera を削除し、Assets/HoloToolkit/Input/Prefabs/HoloLensCamera を追加するなどの HoloLens 用の設定を行います。

Assets/UnetLLAPISample/Prefabs に含まれる ServerManager をシーンに追加します。

データを受信するコード (KinectReceiver.cs) を作成します。

KinectReceiver

空の 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 がある場所が原点となっています。
これら座標系を何らかの方法で合わせなければいけません。
この方法については次回のブログで紹介します。

次回: HoloLens と Kinect v2 を連携させる -その2- - たるこすの日記