HoloLens 2 QRコードトラッキング (追跡) サンプルを試してみる 【 Unity 】


Overview

HoloLens 2 からサポートされている QR Code トラッキング ( HoloLens 1st gen 非対応 ) に関して調査する機会があったので、調べた内容をまとめておきます。

Support Devices

機能 HoloLens (1st gen) HoloLens 2 Immersive Headset (没入型HMD)
QRコードの検出 ×

没入型 Windows Mixed Reality (WMR) ヘッドセット と デスクトップPC を使った QRコード(追跡)トラッキングは、 Windows 10 Version 2004 以降 で利用することができます。

Microsoft.MixedReality.QRCodeWatcher.IsSupported() API を使って、使用デバイスでQRコード(追跡)トラッキングが可能かどうか判定することができます。

Detecting QR codes in Unity / QRコードの検出

QRコード検出を行うためには、webcam capability が必要です。※これは Unity もしくは Visual Studio で設定する必要があります。

【 メリット 】

QRコードの検出はデバイスの環境認識カメラ ( HoloLens 2 の場合、4つの環境認識カメラ ) で行われています。これに伴って、より広範囲の視野角 ( FOV ) で検出可能となり、 ( 写真/動画撮影用カメラを使用時と比べて ) バッテリーの寿命を延ばすことができます。

QRコード検出APIは Unity上でMRTKに依存することなく使用することも可能です。
これを実現するためには、NuGet for Unity を使って、対象の NuGet パッケージをインストールしなければいけません。QR code detection ( QRコード検出 ) のための Nuget パッケージはこちらからダウンロードすることができます。

【 デメリット 】

デバイス左右に各2つ、計4つの環境認識カメラを使用してQRコードを検出するため、QRコードのサイズがある程度大きくないと認識精度が上がらないというデメリットもあります。

ホロラボ CEO の中村薫さんも Twitter で言及されていたので、補足情報として引用させていただきます。ありがとうございます。

公式サンプル

公式ドキュメント上に MRTKを使った Unity 向けのサンプル ( GitHub ) が公開されていました。

GitHub ページ : QRTracking/SampleQRCodes

今回はこちらのサンプルを動作させる手順についてご紹介したいと思います。

概要 / Overview

QRコードを検出した際、QRコードの上に白い四角のCGが表示されます。
その他にQRコードから読み取った関連情報も表示されます。

  • GUID ( Globally Unique Identifier : グローバル識別子 )
  • Physical size
  • Timestamp
  • decode data

検証環境

  • 開発用PC ( Windows 10 Pro / ビルド番号 : 19041.207 )

    • Unity 2019.4.11f1
    • Visual Studio 2019 ( 16.6.2 )
    • Windows SDK 10.018362.0
  • Microsoft HoloLens 2 ( OSビルド番号 : 10.0.19041.1106 )

手順解説

1. GitHub から サンプルプロジェクト を Clone します。
git clone https://github.com/chgatla-microsoft/QRTracking.git
2. Unity Hub で対象プロジェクトを追加 ( ADD ) します。

2020年9月28日現在、Unity 2019.4.0f1 を使用したプロジェクトファイルとなっています。本記事では、Unity 2019.4.11f1 (LTS) で代替し、検証を進めることとします。

3. 対象プロジェクトを Unity で開きます。

QRTracking > SampleQRCodes ディレクトリ

4. 対象シーン ( QRCodesSample.unity ) を開きます。

Assets > Scenes > QRCodesSample.unity

以下、MRTK 基本コンポーネントの他に Axis, QRCodesManager という GameObject
ヒエラルキー内に存在していることを確認できると思います。

Axis : QRコードを検出した際に表示する3軸 (x,y,z) のプレハブ
QRCodesManager : QR Code を検出するためのスクリプト (2つ) がアタッチされたゲームオブジェクト

クラス名 概要
QRCodesManager QR Code のトラッキング状況などを管理するクラス
Auto Start QR Tracking チェックボックスで
QRコードトラッキング 自動開始有無を指定できます。
QRCodesVisualizer トラッキング済みの QR Code を可視化するためのクラス
5. ビルドプラットフォームを UWP に切り替えます。

ショートカット : [ Ctrl + Shift + B ] で Build Settings を開きます。
Platform [ Universal Windows Platform ] を選択し、Switch Platform ボタンを押下します。

ターゲットプラットフォーム : UWP でビルドを実行します。

※ Scenes In Build リスト内で対象シーンにチェックが入っていることを確認してください。

Unity で Export したソリューションファイル ( .sln ) を Visual Studio 2019 で開きます。

以上でサンプルを試す手順は完了です。

ベストプラクティス

HoloLens 2 で QR Code を扱う際の注意点、ベストプラクティスの抄訳を以下まとめておきます。英語を読める方は公式ドキュメントをお読みになられることをお勧め致します。

1. QRコード周りのスペース / Quit zones around QR Codes

QRコードを正しく読み取るためには、QRコード4つの側面全てで余白が必要となります。

余白 には印刷された他のコンテンツが含まれてはならず、QRコード内の (一番小さい) 黒い四角4つ分の広さ、もしくはそれ以上の大きさが求められます。

QR Code.com」 より画像を引用

( 詳しくはQRコードの仕様は QR Codes.com をご参照ください。)


2. 照明 と 背景 / Lighting and backdrop

QRコードの検出の精度は、様々な照明や背景に影響を受けやすい性質があります。

特に明るい照明の場所 では、灰色の背景に黒色のQRコードを印刷するようにしてください。
それ以外の場合は、白色の背景に黒色のQRコードを印刷してください。

QRコードを配置する環境が特に暗い場合、検出率が低い場合 は、灰色の背景に黒色のQRコードを試してください。( QRコードの検出率が低い場合も同様 ) QRコードを配置する場所が比較的明るい場合は、通常の白背景に黒色のQRコードで問題無く動作するはずです。


3. QRコードのサイズ / Size of QR codes

Windows Mixed Reality (WMR) デバイス では、1辺が5cm未満の QRコードを検出できません。

QRコードの一辺の長さが 5cm ~ 10cm の場合、QRコードを検出するためにかなり近づく必要があります。またこの大きさのQRコードを認識するためには、より長い時間が必要となります。QRコードを検出する正確な時間は、QRコードのサイズだけでなく、QRコードと (デバイスを装着した) ユーザーの距離によっても異なります。QRコードに近づくと、QRコードサイズの問題を解消することができます。


4. QRコード読み取り時の距離と角度 / Distance and angular position from the QR code

( QRコード認識に使用されている ) 環境認識カメラでは、特定のレベルの詳細しか検出することができません。QRコードの1辺の長さが10cm未満の非常に小さいQRコードの場合、QRコードにかなり近づく必要があります。1辺が10cm ~ 25cm の QRコード (バージョン1) を使用した場合、最小検出距離は 15cm ~ 50cm の範囲となります。

QRコードのサイズと検出距離は直線的に増加していきます。

QRコード検出は、±45度の範囲で動作が保証されています。これはQRコードを検出するために必要となる適切な解像度を確保するためです。


5. QRコードを含むロゴ / QR codes with logos

ロゴの中に含まれるQRコードは検出テストが行われておらず、現在サポート対象外 となっています。


6. QRコードデータの管理 / Managing QR code data

Windows Mixed Reality (WMR) デバイスはドライバー内のシステムレベルでQRコードを認識します。デバイスを再起動した際には、検出したQRコードは無くなり、次回以降新しいオブジェクトとして認識されます。

アプリで特定のタイムスタンプより古いQRコードを無視する構成にすることを推奨します。
現在、この QR API ではQRコード読取履歴の削除はサポートされていません。


7. QRコードの配置場所 / QR code placement in a space

QRコードを配置する場所と方法についての推奨事項は、公式ドキュメント「Environment considerations for HoloLens」をご覧ください。


Reference