📑

Snapdragon SpacesのハンドトラッキングとMRTK3での利用

2023/02/13に公開

Snapdragon Spacesについては

Snapdragon SpacesはQualcomが進めているARデバイス向けのプラットフォームです。すでにあるARプラットフォームと同様、ポジショントラッキング、ハンドトラッキング、空間認識等を利用できるSDKです。

提供されているSDKとしては以下の3種類になっています。

  • Snapdragon Spaces
  • QCHT Core
  • QCHT Interaction

QCHTはハンドトラッキングの拡張SDKとなっています。Snapdragon Spaces SDKにはハンドトラッキングの基本機能(手の関節情報の取得やイベント制御)が提供されています。あくまで基本機能なのでオリジナルで処理を作る場合にはこの手段を利用できます。
一方でハンドメッシュや手の関節の可視化、ジェスチャー制御といったものはSnapdragon Spaces SDKには存在していません。これを実現するための拡張SDKとしてQCHT(おそらくQualComm Hand Tackingの略)パッケージが提供されてます。QCHTを使うとハンドアバターを使ってトラッキング中の手を可視化したり、デバック中にハンドジェスチャーを利用することができます。
また、QCHT Interactionを活用することで3DオブジェクトへのInteraction(ハンドレイ操作、ピンチアウト等の直接操作)も利用するすることができます。

今回は提供されている以下の手順でQCHTライブラリの設定方法を確認します。また、MRTK3のハンドトラッキング制御をSnapdragon Spaces経由で使えるようにするための方法も考察します。

QCHTライブラリの利用と確認

QCHTライブラリの導入方法などは公式にも以下の提供されています。
https://docs.spaces.qualcomm.com/unity/handtracking/ImportAdditionalPackages.html

今期はこれに沿って実際にサンプルをUnity Editor上で実行します。またコンポーネントの関係については紹介します。

開発環境

開発環境は以下の通りです。

  • Mixed Reality Feature Tool v1.0.2209.0 Preview(MRTK3セットアップ用)
  • Unity Hub 3.3.0
  • Unity 2020.3.42f1
    • Android Build Support一式
    • packages
      • SnapdragonSpaces for Unity v0.9.0
      • QCHT Core Package v3.2.5
      • QCHT Interactions Package v3.4.2
      • OpenXR Plugin
      • Input System
      • XR Management
      • XR Interaction Toolkit

QCHTのサンプルを試す

Snapdragon Spaces for Unityのダウンロード

Snapdragon Spaces for Unityはサイトからダウンロード可能です。
https://spaces.qualcomm.com/sdk/

ダウンロードサイトへ行くとUnity向けとUnreal向けがダウンロードできます。Unity用のものをダウンロードしてください。

空プロジェクトの作成

Unity Hubを起動し、新しいプロジェクトを作成します。

設定値は以下の通りです。バージョンの設定に注意してください。

  • Editor Version : 2020.3.42f1
  • template : 3D
  • Project name : 任意
  • Location : 任意

プロジェクトの設定

次のUnityプロジェクトをHoloLens用に設定していきます。まずは[File]-[Build Settings...]を選択し[Build Settings]を開きます。最低限必要な作業として、[Platform]を[Android]に変更し、[Switch Platform]ボタンを押してプラットフォームを変更します。

Player設定

Meta Quest Pro用に[Project Settings]の[Player]タブの設定を見直します。
[Player]-[Resolution and Presentation]タブの[Android]が選択状態であることを確認して以下の設定を行います。

  • [Orientation]-[Default Orientation]に[Landscape Left]を設定

次に、[Player]-[Other Settings]タブの[Android]が選択状態であることを確認して以下の設定を行います。

  • [Rendering]-[Color Space]に[Linear]を設定
  • [Rendering]-[Auto Graphics API]のチェックを外して[Graphics API]に[OpenGLES3]を設定。
  • [Rendering]-[Multithreaded Rendering]をチェックをはずす
  • [Identification]-[Minimum API Level]に[Android 10.0 (API level 29)]を設定
  • [Identification]-[Target API Level]に[Automatic (highest installed)]を設定
  • [Configuration]-[Install Location]に[Automatic]を設定
  • [Configuration]-[Scripting Backend]に[IL2CPP]を設定
  • [Configuration]-[Target Architectures]に[ARM64]を設定

必要パッケージのインポート

次に、Snapdragon Spaces for Unity, QCHTパッケージのインポートを行います。
ダウンロードしたファイルはサンプル含めたZipファイルになっています。まずはこのzipファイルを展開します。

D:.
│  NOTICE.txt
│  README.txt
│  SnapdragonSpacesServices_0_9_0.apk
│
├─Custom Controller Package
│      Controller_Android_Project_0_9_0.zip
│
└─Unity Package
    │  ** SnapdragonSpaces_Package_0_9_0.tgz **
    │  SnapdragonSpaces_Unity_Samples_0_9_0.apk
    │
    └─Hand Tracking
            QCHT_Core_Package_3_2_5.tgz
            QCHT_Interactions_Package_3_4_2.tgz
            QCHT_Interaction_Samples_0_9_0.apk

インポートは[Window]-[Package Manager]を選択しPackage Managerウィンドウを開きます。左上の[+]ボタンを押して、[Add package from taball...]を選択し先ほど展開したZipの中にある[SnapdragonSpaces_Package_0_9_0.tgz]をインポートします。

同じ手順で以下のパッケージもインポートします。

  • QCHT_Core_Package_3_2_5.tgz
  • QCHT_Interactions_Package_3_4_2.tgz

これで、Snapdragon Spacesのハンドトラッキングのフル機能が利用できるようになります。

OpenXRの設定

[Edit]-[Project Settings]を開き[XR Plug-in Management]を選択します。タブがAndoroidになっていることを確認の上OpenXRを有効化します。サブ項目として[Snapdragon Spaces feature group]が追加されるのでここにもチェックをします。この際エラーが出ます。OpenXRはARM64にしか対応していないため、ビルド時の設定でArm64を対象にビルドする必要があります。

[Project Settings]-[Player]から変更可能ですが、さきほど使った[Project Validation]で修正することも可能です。

次に[XR Plug-in Management]-[OpenXR]を選択します。[Interaction Profile]については[Khronos Simple Controller Profile]を追加します。また、[OpenXR Feature Groups]の設定で[Snapdragon Spaces]がチェックされていることを確認してください。 今回はハンドトラッキングも使用するので[Hand Tracking]のチェックも忘れずに。

Hand Trackingのサンプルのインポート

ハンドトラッキングのサンプルは[Window]-[Package Manager]を開き、[QCHT Unity Interaction]パッケージのサンプルをインポートします。

インポート後シーンの準備を行います。[Assets/Samples/QCHT Unity Interactions/3.4.2/QCHT Interaction Samples/Menu/Scenes/QCHT Sample - Menu]を開き[Hierarchy]に[AR Session][AR Session Origin]を追加します。さらに追加した[AR Session Origin]に[Spaces Hand Manager]コンポーネントと追加します。

この状態でUnity Editor上でPlay ModeにするとSnapdragon Spacesのハンドトラッキングおよび、Interactionをチェックすることができます。ハンドトラッキングはキーボード操作でエミュレートします。チートシートは以下の公式サイトに記載されています。

https://docs.spaces.qualcomm.com/unity/handtracking/BasicSceneSetup.html#interact-in-editor-mode

また、Think Reality A3等実機にデプロイしたい場合はBuild Settingsのscenes In Buildsにサンプルに入っているすべてのシーンを追加します。起動時に使うシーンは[Menu]になります。

  • Samples/QCHT Unity Interactions/3.4.2/QCHT Interaction Samples/Menu/Scenes/QCHT Sample - Menu
  • Samples/QCHT Unity Interactions/3.4.2/QCHT Interaction Samples/Proximal/Scenes/QCHT Sample - Proximal
  • Samples/QCHT Unity Interactions/3.4.2/QCHT Interaction Samples/Distal/Scenes/QCHT Sample - Distal
  • Samples/QCHT Unity Interactions/3.4.2/QCHT Interaction Samples/UI Elements/Scenes/QCHT Sample - UI Elements
  • Samples/QCHT Unity Interactions/3.4.2/QCHT Interaction Samples/Drawing/Scenes/QCHT Sample - Drawing

MRTK3でSnapdragon Spacesのハンドトラッキングの利用

Snapdragon SpacesはMRTK3との連携も可能なのですが、公式のサンプルはConpanion Controllerを利用するになっています。
実機での動作未検証ですが、設定を少し変更するだけでSnapdragon Spacesのハンドトラッキング操作でMRTK3を利用することができるようです。QCHTパッケージもXRI(Unity XR Interaction Toolkit)をサポートしています。このため、MRTK3のハンドトラッキングをQCHTパッケージからの入力で操作可能にすることができます。

Snapdragon SpacesのハンドトラッキングをMRTK3の設定に組み込んだものは以下のGithubに公開しています。MRTK3のHand Interaction ExamplesをSnapdragon Spacesのハンドトラッキングで操作可能になるものです。上記のInput ActionやMRTK Profile等もソースに含まれているので必要な方は参考にしてください。

https://github.com/TakahiroMiyaura/MixedRealityToolkit-Unity/tree/mtrk3_snapdragon_spaces

次にMRTK3のHand Interaction ExamplesをベースにSnapdragon SpacesとQCHTに対応する方法を紹介します。

MRTK3のサンプルをGitHubから取得する

MRTK3のサンプルは以下のリポジトリから取得します。使用するブランチは「mrtk3」です。クローンを作ったら、branchの切り替えを行ってください。
https://github.com/microsoft/MixedRealityToolkit-Unity/tree/mrtk3

MRTK3のUnityのサンプルプロジェクトは[UnityProjects/MRTKDevTemplate]にあります。Unity Editorで開きます。

プロジェクト設定及びSnapdragon Spaces, QCHTパッケージをインポートする

QCHTのサンプルを動かす手順の中でも紹介した以下の手順を参考にプロジェクト設定および、パッケージのインポートを実施します。

Hand Interaction ExamplesをSnapdragon Spaces対応する

次にHand Interaction Examplesを修正しSnapdragon Spacesのハンドトラッキングをサポートするように修正します。[Hierarchy]パネルの中から[MRTK XR RIg]-[Camera Offset]を選択します。[Inspector]パネルの[Add Component]ボタンを押して[Spances Hand Manager]を追加します。

次に[Hierarchy]パネルの中から[MRTK XR RIg]-[Camera Offset]-[Main Camera]を選択します。[Inspector]パネルの[Add Component]ボタンを押して[AR Camera Background]と[AR Pose Driver]を追加します(この時自動的に[AR Camera Manager]が依存コンポーネントとして追加されます)。最後に、[Tracked Pose Driver]を削除します。

次に[MRTK InputSimulator]を削除します。[MRTk InputSimulator]はGazeやハンドトラッキング操作をキーボードやマウスでエミュレートすることが可能です。一方、Snapdragon SpacesのQCHTパッケージにもハンドトラッキングのエミューとする機能があります。このため、[MRTK InputSimulator]を削除してQCHTのシミュレータを利用するように変更します。

次に[Hierarchy]パネルを選択し、メニューから[QCHT]-[Manager]を選択して[QCHTManager]を追加します。
合わせて、追加した[QCHTManager]の[Use XR Controller]にチェックを入れます。このプロパティは試験的な機能なのですが、チェックすることでXRIの入力としてハンドトラッキングの情報を扱えるようにすることができます。これによりXRIを経由してSnapdragon Spacesのハンドトラッキング操作をMRTK3につなぐことができます。

そして、[Hierarchy]パネルに[AR Session]を追加してコンポーネント系の設定は完了です。

最後にMRTK3の設定を行います。[Standalone],[Android]パネルに標準のMRTK3Profileを設定します。この時に[Subsystem for Hand Synthesis]にチェックが入っていることを確認してください。

以上で設定は完了です。試しにUnity Editorで実行するとMRTK3のハンドメッシュが表示されます。例えば、Bを押しながら左クリックをすると、左手が操作可能になります。タップ&ホールドはPボタンを押すことで操作可能です。このように、MRTK InputSimulatorではなくSnapdragon Spacesのハンドトラッキングのシミュレータで動作確認が可能になります。手元に実機がないため確認できていないのですが、この方法で作成したアプリをデプロイすることでSnapdragon SpacesのハンドトラッキングをMRTK3でも利用できると考えられます(機会を見て確認してみたいと思います。)

参考資料

https://spaces.qualcomm.com/
https://www.docswell.com/s/m-taka596/K9JEXZ-XRMTG-MRTK3-SnapdragonSpaces_ThinkRealityA3_20230118
https://zenn.dev/miyaura/articles/60eb4d43879df4

Discussion