Mixed Reality Toolkit  - V2 から読み解くHoloLens 2の機能（ハンドトラッキング編）

 # 実機はないのですが着々と整備が進行中
ですよHoloLens 2に向けていろいろと！
なんて書いてるうちから[RC1](https://github.com/Microsoft/MixedRealityToolkit-Unity/releases/tag/v2.0.0-RC1)がでましたよ！
今回はその中のドキュメントからHoloLens 2できる機能とMRTKで利用する方法についてドキュメントとコードベースを読み解き紹介します。
機能はいくつかあるので、まずは最も個人的に気になる全指使える「ハンドトラッキング」から。
ただ実機が手元にないのでシミュレーションとMRTK V2の機能を見て整理を始めたばかりなのでまだ不確定要素が多いと思います。

## HoloLens 2のハンドトラッキングの計測
HoloLens 2では全指を使ったハンドトラッキングが可能です。その情報をどう管理しているかMRTKの仕様からなんとなーく想像してみます（実際違う可能性があるのでまた正式な情報出たら修正する方向で）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/152548/c51af61b-a06c-4eff-04e3-a1f00c7ddb68.png "引用元：https://github.com/Microsoft/MixedRealityToolkit-Unity/blob/mrtk_development/Documentation/InputSystem/HandTracking.md?fbclid=IwAR2rwnWgVtA1A3ERd2-MG2BaBYqafykY8m2w2c-jy2HSje6nhvmBM9LH8mE")

この図はMRTKを使った場合のハンドトラッキングの状況を可視化した例です。
これからある程度ハンドトラッキングの考え方は見えてきます。
まずハンドトラッキングには以下の要素があるようですね。

* 指関節部分をあらわす「Joint」
* 人差し指の先を表す「Finger Tip」
* 手のひらを表す「Palm」

Finger Tipは一点だけ特別扱いで、人差し指の先を指す部分がFinger Tipになっています。全指トラッキングしているので例えば「ボタンを押す」という行為を人差し指で意図的に押しているかどうかを判断する場合に使うようですね。このことから、MWCのデモであった「ピアノを弾く」が、なぜ人差し指だけでやっていたかがなんとなくわかる気がします。MRTK V2にもFinger Tipに対してボタンを押すための機能が用意されているので実際のデモではこれが使われているのではと考えられます。  
そしていわゆる「つかむ」や「人差し指で押す」等がイベントの発生するジェスチャーのようです。

## MRTKの機能から推測されるハンドジェスチャーの種類

ハンドトラッキング等の機能からHoloLens 2でジェスチャーとして用意されいそうなものが以下のものになってるようです。

* 人差し指でものに触れる/押す
* 手でつまむ動作を行う（以前のエアタップ)
* 手をつかんだままの状態を維持する（以前のホールド）
* ホールド状態で手を動かす（Manipulate）
*  ジェスチャーのない状態でセンサー上で手を認識している状態(Navigate)

おそらくこれに加えて「ブルーム」相当のメニューに戻るものがあると考えられれます。標準で用意されているものについてはそれほど多くないのかも？

## 仮に自分でジェスチャーを生み出すことができるか？
相当難しいと思います。例えば、ドアノブ回してドアを開けるとかを操作として加えたい場合を考えると、まず必要な動作は以下の手順のものになるんじゃないでしょうか。

1. ドアノブをつかむ
2. ドアノブを回す
3. ドアを引くまたは押す

これを実現するためには、計測された情報を監視して一連のジェスチャーの動作を行っているかで判断することになると思います。MRTK V2で書くのだとすると

1. Finger TipまたはJointsでドアノブをつかんでいる状態かを判定する
2. Palm等の回転角を測定し、一定以上回転したかを判定する
3. ドアを引く/押す形で手が動いたかを判定する

となるのですが、同じジェスチャーだということを個人差などを加味して対応できるように
するとなるとかなり難しいので、おそらく独自ジェスチャーを組込むための何かが必要になるのかも
しれないです。手のトラッキング情報を使って機械学習などを活用するというのが解決策になりそうなのですが。。。

このての「独自ジェスチャーを作りたい」は絶対やりたいって人は出てくるし全指ハンドトラッキングが可能になると日常生活に近い動きをイベント制御に取り入れたいってことはごく普通にあると思いますし。。。

### 個人的には「Project Gesture」を導入してほしいなぁ

個人的にはこれの解決策に使えそうなのは[Project Gesture(以前はProject Pragueだった)](https://labs.cognitive.microsoft.com/en-us/project-gesture)なんですけどいずれ対応してくれると嬉しいなと思ってます。
「Project Gesture」って何かというと「Azure Cognitive Services」の中でも研究段階でプレビューにもなっていないようなラボで扱われているテーマです。
このプロジェクトではハンドトラッキング等のジェスチャーをコマンド化し定義を行うことでジェスチャー制御を簡易化する仕組みです。
わかりやすい例でいえば、格闘ゲームの必殺技のコマンドです。
例えば、下->右下->右＋Bボタンのようにコントローラの操作を順に実行するとある処理になるという考え方です。「Project Gesture」はジェスチャーをゲームコントローラーのようにいくつかの要素として定義しています。（45℃手首左回転等）。  
これらの要素は列挙型として定義されており、あらかじめこの列挙値で組合わせを登録しておくと指定した処理がCallBackされます。
利用者は細かい手の制御を考えなくても、ジェスチャーを構成できるため非常に実装が楽になります。ちなみに、現在は以下のデバイスに対応しています。

* Intel® RealSense™ SR300 camera
* Intel® RealSense™ F200 camera
* Kinect for Windows v2

SDKインストールしてアプリを常駐すればなんと「指パッチン」でWindowsのスタートメニューが起動するという無意味にかっこいい体験ができます。
実はこの「Project Gesture」でプリセットされている動作とMWCのデモで使われてたジェスチャーの一部が似ているんですよね（スライダーを操作するときに横から押してるジェスチャー等）。なのでもしかしたら手軽に設定できる仕組みが別に用意されているじゃないかと思ってるんですがどうなんでしょうね。。。

## MRTK V2のハンドトラッキングのサンプルを試してみる
MRTK V2ではすでにハンドトラッキング等のHoloLens 2用の機能が追加されています。
シミュレーションも可能なのでどういう機能を持っているかを見るだけでもかなり役に立つことが多いです。

(継続執筆中...)