MRが楽しい

MRやVRについて学習したことを書き残す

HoloLens2-ResearchMode-Unityに遠距離(LongThrow)のDepthセンサのAPIを追加する

本日は HoloLens2 の技術調査枠です。
HoloLens2-ResearchMode-Unityに遠距離(LongThrow)のDepthセンサのAPIを追加した手順を記事にします。
f:id:bluebirdofoz:20210606044700j:plain

2021/06/07追記

本記事で行った修正をプルリクエストしたところ、取り込んで頂けました。
現在では以下のオリジナルのリポジトリを利用すると、修正不要で遠距離(LongThrow)のDepthセンサ情報が取得可能です。
github.com

前提条件

以下の記事の続きになります。
bluebirdofoz.hatenablog.com

HoloLens2-ResearchMode-Unity

HoloLens2-ResearchMode-Unity では現在以下のカメラ情報が取得できます。
・近距離(AHAT)のDepthセンサ
・左右の環境認識カメラ
github.com

HoloLens2 の ResearchMode は更に遠距離(LongThrow)のDepthセンサ映像も取得可能です。
今回は HoloLens2-ResearchMode-Unity をカスタマイズして遠距離(LongThrow)のDepthセンサ映像も取得してみます。

プラグインのカスタマイズ

プラグインをカスタマイズするにはフォルダ直下の HL2UnityPlugin.sln を開きます。
f:id:bluebirdofoz:20210606044810j:plain

遠距離(LongThrow)のDepthセンサの情報は ResearchModeSensorType 型に DEPTH_LONG_THROW で定義されています。
このため、以下の初期化APIを追加することでセンサ情報の取得が可能になります。
・HL2ResearchMode.cpp

次にテクスチャの取得APIを追加します。
遠距離(LongThrow)の深度をグレースケールに変更する際には AHAT と有効距離が異なるため、変換の際の係数を調整します。
更に深度の有効性をチェックする必要がある多ため、シグマバッファの最上位ビットが 1 か否かをチェックしています。
・HL2ResearchMode.cpp

以下の公式サンプルの SensorVisualization の SlateCameraRenderer.cpp を参考に画像への変換ロジックを調整しています。
github.com

上記の修正に合わせてその他、バッファの取得APIや利用可能なAPIの登録を追記しました。
詳細は以下の fork してカスタマイズした GitHub プロジェクトの Add_LongThrowAPI ブランチを参照ください。
github.com

コードを修正したらプラグインをビルドします。
設定を[Release][ARM64]に設定し、[ビルド]を実行します。
f:id:bluebirdofoz:20210606044917j:plain

これでカスタマイズされたプラグインを作成できました。
f:id:bluebirdofoz:20210606044926j:plain

サンプルプロジェクトのカスタマイズ

次にサンプルプロジェクトをカスタマイズして遠距離(LongThrow)のDepth映像をアプリで確認してみます。

前回と同様に UnitySample のプロジェクトを開きます。
f:id:bluebirdofoz:20210606044937j:plain

プラグインの差し替え

最初にプラグインを差し替えます。
Assets/Plugins/WSA/ARM64 配下にある以下の2つのファイルを削除します。
・HL2UnityPlugin.dll
・HL2UnityPlugin.winmd
f:id:bluebirdofoz:20210606044949j:plain

先ほどカスタマイズしたプラグインをコピーして差し替えます。
f:id:bluebirdofoz:20210606045002j:plain

差し替えた HL2UnityPlugin.dll の Inspector ビューを開き、以下の通り設定して[Apply]します。

IncludePlatforms:WSAPlayerのみ
CPU:ARM64

f:id:bluebirdofoz:20210606045013j:plain

描画パネルの作成

次に遠距離Depthの映像を描画するパネルをシーンに追加します。
Hierarchy から MixedRealityPlayspace/MainCamera 配下のオブジェクトを開きます。
f:id:bluebirdofoz:20210606045023j:plain

PreviewPlaneDepth オブジェクトをコピーして遠距離Depthの映像を描画する PreviewPlaneLongDepth オブジェクトを作成しました。
遠距離Depthで取得できる解像度(320x288)に合わせて以下の通り、Scale 値を設定しています。

Scale X:0.096, Y:-0.0864, Z:1.0

f:id:bluebirdofoz:20210606045037j:plain

スクリプトの編集

Assets/Scripts 配下の ResearchModeVideoStream.cs を編集して遠距離Depthを取得して描画する処理を追加します。
f:id:bluebirdofoz:20210606045048j:plain

以下の通り、新たに追加した遠距離Depthの初期化/取得APIを使ってテクスチャに映像を描画する処理を追記しました。
HoloLens2 の遠距離Depthの解像度は 320x288 であるため、テクスチャサイズを合わせる必要があることに注意します。
・ResearchModeVideoStream.cs

ResearchModeVideoStream スクリプトがアタッチされている ResearchModeController オブジェクトの Inspector ビューを開きます。
新たに追加された遠距離用のフィールドに先ほど作成した PreviewPlaneLongDepth の参照を設定します。
f:id:bluebirdofoz:20210606045111j:plain

ビルドと動作確認

これでサンプルプロジェクトのカスタマイズは完了です。
プロジェクトのビルドを行います。
f:id:bluebirdofoz:20210606045120j:plain

前回記事の手順と同様にビルド設定とマニフェストの編集を行い、プロジェクトを HoloLens2 にインストールします。
f:id:bluebirdofoz:20210606045130j:plain

HoloLens2 でアプリを起動して確認します。
遠距離Depthの映像が追加で表示されていれば成功です。
f:id:bluebirdofoz:20210606045139j:plain