Azure KinectのBodyTracking公式サンプルをUnityで動かしてみる

# はじめに

Azure Kinectを使ってUnity上でBodyTrackingをする方法を解説しようと思います。
実は前にこの内容のLTをしたのですが、リポジトリに色々変更が入ったりして、せっかくなので記事にもまとめようと思いました。

LTスライド：[Azure Kinect+Unityで軽率にBodyTrackingする](https://speakerdeck.com/drumath2237/azure-kinect-plus-unitydeqing-lu-nibody-trackingsuru)

## TL;DR

結果的に、下の動画のように人の骨格を認識してUnityのオブジェクトに反映させるまでができます。

![ezgif-7-7554c637cf9f.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86191/3b8b6954-a63c-6956-1c86-f31a44a04f3d.gif)


## 対象の読者

基本的に以下のような方をターゲットにしていますが、以下に当てはまらなくてもわかりやすいように解説するつもりです。

- AzureKinectでボディトラッキングしてみたいひと
- UnityでAzureKinectを触ることに興味がある人
- AzureKinectで何ができるのかを知りたいひと
- VTuberなどのトラッキング技術に興味がある人

## 扱わないこと

本記事は、公式サンプルを使ってボディトラッキングを動かすまでを目的としていますので、特にサンプルを発展させて何かをするようなことはしません(いずれ別記事にしたいですが)

- AzureKinectSensorSDKやBodyTrackingSDKのインストール
- キャラクターモデルを動かす方法
- 点群を扱う方法
- Windowsフォームアプリケーションでの実装(WPFとかUWPとかC++とか)

## 検証環境

今回の記事の内容は以下の環境で動作したものになります。

|環境||
|:--:|:--:|
|OS|Windows 10 Home|
|CPU|Intel Core i7-7700|
|GPU|GeForce GTX 1060 3GB(k4a動作非推奨)|
|Unity|2019.1.2|
|Sensor SDK|1.4.0|
|BodyTracking SDK|1.0.1|

また、今回の動作を確認したのは[microsoft/Azure-Kinect-Samples]
(https://github.com/microsoft/Azure-Kinect-Samples)の7/20現在のmasterブランチのコミット[04b874...](https://github.com/microsoft/Azure-Kinect-Samples/commit/04b87408ec11dddbf9c01321f63a88ad4f654063)になります

# AzureKinectのBodyTrackingをUnityで

## AzureKinectとは？

一応AzureKinectとはいったい何なのかを簡単にご紹介しておきます。
AzureKinectとはMicrosoftが開発しているセンサーデバイスです。通常のカメラのようにRGB画像の取得に加え、深度情報の取得や骨格認識を可能にします。もともとKinectというデバイスをご存知の方は多いかもしれませんが、AzureKinectは一番新しいバージョンになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86191/078eb5ff-8d5e-beaf-9d5a-d4e6137eaf8f.png)
[Microsoft Windows公式ブログ](https://blogs.windows.com/japan/2020/04/02/akdk-japan-launch/)より

## AzureKinectのイマ

AzureKinectは2020年7月現在SensorSDKは1.4.1、BodyTrackingSDKは1.0.1がリリースされています。従来のKinectよりも高解像度のセンサ、高性能の推定エンジンを備えており、もともとXboxのセンサデバイスとして開発を始められたKinectですが、いまは汎用分野の開発向けにSDKが公開されています。(AzureKinectのXBox対応はまだ実装されていなかった気がします。いつの間にかターゲットが逆転していて面白いですね)
現状ネットの記事などはまだ少ないですが、MS公式のドキュメントは結構充実していていい感じです。(ホンマか？)
あと、ハイスペックPCでの動作が推奨されています。基本的にはGPUを積んでいるPCで、推奨はGTX1070以上のスペックを要求されています。(この時点で私の環境(GTX1060)は非推奨なのですが...)
ただ、前に上がったissueで「ロースペックマシンでも動作するようにしよう！」みたいな構想があるらしく、今後の開発に期待です！

## Microsoft公式のサンプル環境を整える

ここではAzure Kinect Sensor SDKやAzure Kinect Body Tracking SDKの環境構築は終わっていることを前提とします。これが終わってない方は[こちら](https://docs.microsoft.com/ja-jp/azure/kinect-dk/sensor-sdk-download)や[こちら](https://docs.microsoft.com/ja-jp/azure/kinect-dk/body-sdk-download)のドキュメントを参照しながら環境構築を行ってください。公式のViwerがございますのでそれが動いたら大丈夫です。
さてではサンプル環境を整えていきましょう。以下の手順で実行できます。

1. GiHubからサンプルリポジトリをcloneする
2. NuGetパッケージをインストールする
3. ファイルを移動する
4. ビルドする

実は今から説明する手順は[こちらのREADME(英語)](https://github.com/microsoft/Azure-Kinect-Samples/blob/master/body-tracking-samples/sample_unity_bodytracking/README.md)にすべて書かれていますので、そちらを確認してしていただいても大丈夫です。

まずこちらの[microsoft/Azure-Kinect-Samples](https://github.com/microsoft/Azure-Kinect-Samples)というリポジトリをcloneします。このリポジトリにはUnity以外のサンプルも同梱されておりますので、そのままUnityHubでは開けません。Unityプロジェクトの場所は`Azure-Kinect-Samples/body-tracking-samples/sample_unity_bodytracking/`になります。現時点でUnityのバージョンは2019.1.2で開発されているみたいです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86191/a4f9a9ba-0fce-7573-a55d-23500a772af2.png)



開いてみると以下のような画面になると思います。コンソールを見てみると何やらエラーが出ているみたいですが、パッケージの依存関係によるものなのでそれを解決していきましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86191/a01fa7e2-5525-409e-6105-8010eb07e150.png)

Azure Kinect SDKのパッケージはNuGetからインポートできます。
NuGetからパッケージをインストールするためにUnityプロジェクトをVisual Studioで開きましょう。デフォルトのIDEがVSになっている方はそのままで結構ですが、そうでない方は[Eidt]->[Preference]->[External Tool]からエディタをVisual Studioに変更し、[Assets]->[Open C# Project]を選択し、Visual Studioを開きます。
Visual Studioを開いたらNugetパッケージをインストールしましょう。公式のREADMEではパッケージコンソールからコマンドをたたくよう指示されていますが、ソリューションを右クリックして[NuGetパッケージの復元]を選択すれば依存関係がインストールされるので、そうする方が簡単です。パッケージのインストールが完了したらVisual Studioは閉じてもらっても構いません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86191/43825de5-ddea-5682-fd9a-fa08414f791b.png)

そしたら、次にdllの移動を行います。とはいえバッチファイルを実行すれば良しなにしてくれるので、プロジェクトのルートディレクトリにあるMoveLibraryFiles.batを実行してください。
ここまでくればコンソールのエラーが消えているはずです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86191/31a9922a-6239-4897-ae00-83ba383e66c2.png)

それでは`Assets/Scenes/Kinect4AzureSampleScene`を開いて再生してみましょう。すると赤い棒人間みたいなものが自分の動きに追従しているのがわかるでしょうか？
見事Unity上でAzure Kinect のボディトラッキングを実行できました！
ｼｪｰ(特に世代とかではないです)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86191/b4aea289-7a32-63e2-76da-67b9868c438f.png)

### トラブルシュート１：NuGetForUnityでインストールした

NuGetパッケージと聞いて、NuGetForUnityを思い浮かべる方もいると思います。自分は最初パッケージをNuGetForUnityを使っていストールした結果、動きませんでした。かならずVisual Studioからインストールするようにしましょう。

### トラブルシュート２：nugetパッケージのインストールに失敗する

Azure Kinect BodyTracking SDKはそれ自体の名前空間の階層が深いせいで、ちょっと階層の深いディレクトリにUnityプロジェクト本体があった場合インストールに失敗するケースがあります。自分はいつものワーキングディレクトリで実行したらダメでした。

## ビルドしてみる

それではプロジェクトをビルドしてみましょう。とりあえず通常のWindowsのスタンドアロン向けにビルドします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86191/c6a48dca-58b5-88da-9ec5-f5c91c71ec6f.png)

そのあとにビルド先のフォルダに、以下のファイルをコピーしてください。これらはプロジェクトの直下にあったものと同じです。

- cublas64_100.dll
- cudart64_100.dll
- cudnn64_7.dll
- dnn_model.onnx
- onnxruntime.dll

画像のようになると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86191/7ce5ab53-0b69-0598-01b7-fb3269f0bdfb.png)


それができたら起動してみましょう。ビルドしても実行できていることが確認できたと思います。ｺﾛﾝﾋﾞｱ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86191/b03dd3d2-778f-5d6f-0646-d7ff003039fb.png)

## PuppetMasterについて

`Assets/Scenes`の中にはもう一つ`PuppetMaster`というサンプルシーンがあると思います。こちらはHumanoidリギングされたアバターに対してAzureKinectのボディトラッキングを適用してモーションキャプチャさせたように動かしてみよう！みたいなサンプルになっているのですが、こちらのシーンが結構流動的に変わっていて動作も不安定なので今回は触れないでおこうと思います。(自分が触ったときには色々いじらないと動かなかった)

# おわりに

いかがでしたか？(天下無双)
本当はビルドしたプロジェクトが終了時にクラッシュするバグについての対処法とか書こうと思ったんですが、一週間前にfixされていました、残念。（良いこと）
AzureKinectの情報を追っているとモーションキャプチャ利用を視野に入れているようなアナウンスがたびたび見られるので、今後Unityを組み合わせることでVTuberシステムであったりゲームのキャラクターアニメーションであったりを制作できるかもしれません。
そういえば[3tene ProがAzureKinectのモーションキャプチャに対応したという発表](https://twitter.com/3tene2/status/1277958576191885314)もありましたね。今後の開発動向に注目です。
個人的にde:code2020の[「Azure Kinect DKテクニカルTips」](https://www.youtube.com/watch?v=Ti2cn1db4hk&list=WL&index=65&t=15s)というセッションがすごく良かったのでそちらもよかったらご覧ください。


P.S. 自分の環境だけなのかわからないのですが、なぜかこのプロジェクトを実行した時にAzureKinectの白いランプがつきませんでした。動作に影響はないもののちょっと気になります。

## 参考

- [AzureKinectでVTuberになろう！](https://gaprot.jp/2020/04/28/azurekinect-vtuber/)　違うアセット(有料)を使ってキャラクターを動かす記事みたいです。結構よさげ感じがします。
- [Azure Kinectの概要 Microsoft](https://www.microsoft.com/ja-jp/p/azure-kinect-dk/8pp5vxmd9nhq?rtc=1&activetab=pivot:overviewtab)
- [Azure Kinect Samples (GitHub)](https://github.com/microsoft/Azure-Kinect-Samples)
- [Azure Kinectでキャラクターを動かしてみた](https://qiita.com/TakenokoTech/items/44de61da95cc6c30a13a)　すでにそれっぽい記事がありましたね。良記事！