【SimpleOpenNI】ProcessingでKinect V2を動かそう！環境構築編【Processing / Kinect V2】

総合コンテンツサークル アドベントカレンダー 1日目 & Nakano Computer Club アドベントカレンダー 1日目
- 総コン→https://adventar.org/calendars/5757
- NCC→https://qiita.com/advent-calendar/2020/ncc

お久しぶりです。研究のためにkinectを使うことになったのですが、新たにC++とかいろいろ手を出すのがしんどいと思ったので、ライブラリ「SimpleOpenNI」を利用し、私が触り慣れているProcessingで動かそうとしたところ、いろいろ苦労したのでやり方とか苦労した点とかまとめます。皆様の参考になれば幸いです。

#はじめに
この記事はMacでkinect v2動かすことを想定して書かれています。
が、kinect v1も動作可能だしWindowsやLinuxでも動作可能...だと思います！(試していないのでうまくいくかわかりません！)

##目次
1. 動作環境
2. libfreenect2をインストールする
3. Processingのライブラリ「OpenSimpleNI」を導入する
4. 最後に必要なひと手間！
5. おわりに
6. 参考記事

#動作環境
- Macbook Pro 2017 13inch
- macOS Catalina 10.15.6 
- Processing3.5.2
- Kinect v2

##Processingのインストール
本題に入る前に、Processingのインストール方法を簡単に説明します。後述のライブラリを導入する際に最新版だとうまく動かないことがあるで、要求に見合ったバージョンを入れる必要があります。

**ダウンロードはこちらから！**
→[https://processing.org/](https://processing.org/)
こちらのページの飛んで「Download Processing」をクリックし、自前のOSにあったやつをインストールしてください。zip形式でダウンロードするので、解凍してアプリケーションに(WindowsはProgram File系に)移動させましょう。

公式ホームページに乗っていないバージョンもあるのでその際はginhubから直接バージョン指定してインストールできます。
→[https://github.com/processing/processing/releases](https://github.com/processing/processing/releases)

#libfreenect2のインストール
詳細はコチラから
→[https://github.com/OpenKinect/libfreenect2](https://github.com/OpenKinect/libfreenect2)

まず、ターミナルを開きましょう。
Macのターミナルは、Application -> ユーティリティー -> ターミナルに存在します。
また、command + space を押し、Spotlight検索を起動し、terminal.appと入力することでも起動します。

githubに書いてある手順を実行する前に、まだ入れてない方はhomebrewをインストールしましょう。homebrewはmac/linux向けのパッケージ管理ツールで、macで何かする際に目にすることも多いと思います。

homebrewについての説明はコチラの記事を参照してください
→[https://qiita.com/zaburo/items/29fe23c1ceb6056109fd](https://qiita.com/zaburo/items/29fe23c1ceb6056109fd)


homebrewのインストールはターミナルで以下のスクリプトを実行してください。

```Bash
/bin/bash -c "$(curl -fsSL　https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```
そして、導入の際に必要なcmakeを入れましょう。

```Bash
brew install cmake
```
cmakeについて詳しくはコチラ
→https://qiita.com/kai_kou/items/df335eb7ee78229ee46f

インストールが終わったら、導入に参りましょう。
まず、以下のコマンドを入力し、libfreenect2を導入しましょう。

```Bash
git clone https://github.com/OpenKinect/libfreenect2.git
cd libfreenect2
```

続いて以下のコマンドを入力し、libusbとGLFWを導入しましょう。

```Bash
brew update
brew install libusb
brew install glfw3
```

続いてTurboJPEGの導入。これは任意らしいがやっておこう。

```Bash
brew install jpeg-turbo
```

さらに続いてOpenNI2の導入。これも任意らしいけどやっておくに越したことはないだろう。

```Bash
brew tap brewsci/science
brew install openni2
export OPENNI2_REDIST=/usr/local/lib/ni2
export OPENNI2_INCLUDE=/usr/local/include/ni2
```

最後に以下のコマンドを打ってビルドしよう。

```Bash
mkdir build && cd build
cmake ..
make
make install
```
これが完了したら、kinectを接続し以下のコマンドを実行してみて動作するか試してみよう。試してみたら第一段階は成功だ！

```Bash
./bin/Protonect
```
Processingでkinectを動かす際は事前に`Protonect`を起動しておく必要があるみたいだ。

今回はmac向けに説明しましたが、Windows、Linuxの方はlibfreenect2のgithubページのInstllationの章にそれぞれのやり方が書いてあります。
→[https://github.com/OpenKinect/libfreenect2](https://github.com/OpenKinect/libfreenect2)

#SimpleOpenNIの導入
Processingのライブラリ「OpenSimpleNI」を導入してみよう。
[SimpleOpenNIのgithub](https://github.com/totovr/SimpleOpenNI)からダウンロードできる。自分のProcessingのバージョンにあったライブラリをダウンロードしよう。

**なお、kinect v2が作動するバージョンは限られているので確認しましょう。**
2020年11月現在では、 V3.5.2、V3.4、V3.3.7、V3.3.6が対応しているようだ。対応していない人はprocessingを入れなおそう！
>The library has compatibility with Kinect V2 just in Processing V3.5.2, V3.4, V3.3.7 and V3.3.6

ダウンロードしたらzipを解凍し、中にある`SimpleOpenNI`フォルダをコピーし、Processingのライブラリがあるフォルダにペーストしよう。デフォルトだと`~/Documents/Processing/libraries/`にある。

正しく入っていれば、Processingで`スケッチ→ライブラリをインポート→SinpleOpenNI`と出るはずだ。

導入がうまくいったら、exampleを動かしてみよう。ここでうまくいかない人も多いかもしれないがご安心。そこで実際に私が体験した問題を次章で解決させします。

#ここでうまくいかないひとのために
私も紆余曲折重ねながらここまできましたが、以下のエラーが吐かれて成功しない。

```
[Info] [Freenect2DeviceImpl] opening…
[Info] [Freenect2DeviceImpl] transfer pool sizes rgb: 2016384 ir: 4128*33792
[Info] [Freenect2DeviceImpl] opened
[Error] [protocol::CommandTransaction] bulk transfer failed: LIBUSB_ERROR_TIMEOUT Operation timed out
[Error] [protocol::CommandTransaction] bulk transfer failed: LIBUSB_ERROR_TIMEOUT Operation timed out
[Error] [protocol::CommandTransaction] bulk transfer failed: LIBUSB_ERROR_TIMEOUT Operation timed out
```

どうすればいいんだ！しかし解決法は存在します。

homebrewで`openNI2`をインストールしたと思いますが、その中の`usr/local/lib/OpenNI2/Drivers`内に`libfreenect2-openni2.0.dylib`と`libfreenect2-openni2.dylib`があると思いますが、その2つをProcessingのライブラリフォルダ内の`SimpleOpenNI/libraries/SimpleOpenNI/library/osx/OpenNI2/Drivers`内にコピペしましょう。

ソース：https://discourse.processing.org/t/use-kinect-1-or-2-sensors-with-processing-2-or-3/86/12

訳はさっぱり分かりませんがこれをやったら動きました。

他にもいろいろなエラーが出ると思いますが、エラー文で検索かけてみると解決法が出てくると思います！めげずにトライしよう！
上記ソースにも全部英語ですがこれに関する問題の解決法があると思うので頑張ってね。これの作成者はSimpleOpenNI制作者のtotovrさんなので信じていいはず（雑）。

#おわりに
いかがでしたか？無事kinectは動きましたか？ここまでたどり着くのに苦労した方も多いと思いますが、その分成功した喜びが大きいと思います。ちなみに私は8時間くらい悪戦苦闘していました。

環境構築が済んだところでどのようなことができるか...は次回のお楽しみ。

文章、内容ともに拙かったと思いますが、最後までお付き合いくださり、ありがとうございました。
(表記揺れ警察の皆様どうか許してください、、、)

#参考リンク

- https://github.com/totovr/SimpleOpenNI
- https://github.com/OpenKinect/libfreenect2
- https://discourse.processing.org/t/use-kinect-1-or-2-sensors-with-processing-2-or-3/86/12
- [Processing](https://processing.org/)
- https://github.com/processing/processing/releases
- [Homebrewのインストール](https://qiita.com/zaburo/items/29fe23c1ceb6056109fd)
- [C++初心者がMacでCMakeを利用してみる](https://qiita.com/kai_kou/items/df335eb7ee78229ee46f)