深度カメラ「intel RealSense D435i」にNode.jsからアクセスする方法(試行錯誤中)

忘年会続きの師走、[aptpod Advent Calendar 2018](https://qiita.com/advent-calendar/2018/aptpod)の20日目。今回で4記事目（笑）とまあまあ頑張ったほうなのですが、実は今回の記事が一番書きたかったネタです:sunglasses:

# 深度カメラ「intel RealSense D435i」とは

![rs-save-to-disk-output-depth.png](https://qiita-image-store.s3.amazonaws.com/0/55103/1b6316c8-b437-d156-d888-b2d1047dc8eb.png)

深度カメラとは、`映像だけでなく物体までの奥行きがセンサーで検出できるカメラ`です。有名所でいうと[Kinect](https://ja.wikipedia.org/wiki/Kinect)も深度カメラの一つです。ですがKinectは2017年11月に生産終了となり（記事「[米マイクロソフトがKinectの生産を終了。販売分についてはサポート継続](https://japanese.engadget.com/2017/10/27/kinect/)」）、Amazonでも定価よりも高い価格で販売されていたりと世の中から確実に数を減らしています。

Kinectの次はどの深度カメラがいいのか？ と世の中がザワザワしている中で、新たな選択肢として[intel RealSense](https://www.intel.co.jp/content/www/jp/ja/architecture-and-technology/realsense-overview.html)が候補として上がってきました。Kinectの生みの親Microsoftも[KinectのSDKページ](https://developer.microsoft.com/ja-jp/windows/kinect)で「`開発者の間では Kinect ハードウェアからの移行が進んでいるため、Microsoft では、開発者の皆様に Intel RealSense デプス カメラを検討することをお勧めしています。`」とおすすめしているほどです。

intel RealSenseにも様々なモデルがあるのですが、2018年11月13日に発表された`D435i`に心奪われ、酔った勢いでポチりました（後悔はしていない）。惹かれたポイントとしては、`IMU（慣性計測ユニット）が初めて搭載された`ことです。これにより、元々の物体までの奥行きに加え、カメラのピッチ、ヨー、ロールの回転を計測できるようになりました。

※intel RealSense D432iはUSB3.0搭載の端末が対象です

![d435i.jpg](https://qiita-image-store.s3.amazonaws.com/0/55103/6c4b48a1-74af-53fe-4cd2-4cbf70a8c364.jpeg)
▲intel ReasSense D435i

そんなintel RealSense D435iを、JavaScript（Node.js）でアクセスできるようになるまでの流れをまとめました（ハマったところがありすぎた...特にWindows...）。

※この記事ではソースコードなどの詳細な解説は含みません。いろいろ試してみてノウハウが貯まってきたら別途記事書きます！

![cap3.gif](https://qiita-image-store.s3.amazonaws.com/0/55103/8efeb20d-6a93-b118-125a-90c5c3b0883d.gif)
▲Windows10でIntel® RealSense™ Viewerを試した様子


# まずは接続確認したい

せっかく手元にあるので1秒でも早く映像出したい！ 手元の端末がWindowsでしたら、GitHubページで公開されているアプリ「Intel® RealSense™ Viewer」をダンロードして確認できます。macOSの場合はSDKをダウンロードして手元でビルドする必要があります。

- [IntelRealSense/librealsense - GitHub](https://github.com/IntelRealSense/librealsense)

![viewer.jpg](https://qiita-image-store.s3.amazonaws.com/0/55103/6fbb8d55-4b42-8994-7c6b-23f525f53e87.jpeg)
▲Intel® RealSense™ Viewer

執筆時点（2018/12/20）では、macOS（Mojave 10.14.2）でうまくビルドできませんでした...:sob: ですが、Node.jsから試すとサンプルは動作したのでこのまま突き進んじゃいます... この件は引き続き調査します...

# Node.jsでアクセス！

Node.jsからintel RealSenseへアクセスするためにはWrapperを使います。Node.jsの他にもPythonやUnity、Unreal Engine 4など様々なWrapperが用意されています。

- [Wrappers for Intel® RealSense™ Technology](https://github.com/IntelRealSense/librealsense/tree/development/wrappers)

Node.jsのWrapperを使ってintel RealSenseへアクセスする方法をmacOS、Windowsの環境で紹介します。

- macOS Mojave 10.14.2
- Windows 10

執筆時点（2018/12/20）でWindows 10でうまくサンプルが動かず... ライブラリのダウンロードまではうまくいったので情報は残しておきます... この件も引き続き調査します...:sob:

## macOS

### ビルド環境を整える

XCode 6.0以上とHomebrewを端末にインストールし、次のコマンドで必要なパッケージをインストールします。

```
brew install libusb pkg-config
brew install homebrew/versions/glfw3
brew install cmake
npm install -g jsdoc
```

### node-librealsenseをダウンロード

作業するフォルダーを任意の場所に用意し、次のコマンドを実行します（`npm init`などで`package.json`は用意していてください）。同時にSDKもビルドされるので少々時間がかかります。

```
npm install --save node-librealsense
```

### サンプルを動かす

`node_modules/node-librealsense/examples/`以下にサンプルファイルが格納されているので深度データをキャプチャするサンプル「nodejs-save-to-disk.js」を試してみます。

```
cd node_modules/node-librealsense/examples
npm install
node nodejs-save-to-disk.js
```

![rs-save-to-disk-output-depth.png](https://qiita-image-store.s3.amazonaws.com/0/55103/1b6316c8-b437-d156-d888-b2d1047dc8eb.png)

▲こんな画像が生成されたら成功です！:tada:

### APIのドキュメント

node-librealsenseのダウンロード時に、`node_modules/node-librealsense/docs/`以下にドキュメントが生成されます。
## Windows

### ビルド環境を整える

#### Python2.7系をインストール

[Python 2.7.15](https://www.python.org/downloads/release/python-2715/)のダウンロードページで、32bitなら`Windows x86 MSI installer`、64bitなら`Windows x86-64 MSI installer`をダウンロードする。ここでのハマりポイントは、3系ではなく2.7系をインストールするということです。インストール時にPATHも通すのを忘れずに。

![python.PNG](https://qiita-image-store.s3.amazonaws.com/0/55103/b9527309-3b2d-a9ba-f164-c7ec2baa86f6.png)

▲`Add python.exe to Path`を忘れずにチェック

#### Visual Studio 2017 Communityをインストール

[Visual Studio 2017 Community](https://docs.microsoft.com/ja-jp/visualstudio/install/install-visual-studio?view=vs-2017)をインストールしPATHを通します。

※`システムの詳細設定 > 詳細設定 > 環境変数 > システム環境変数 > Path`へ`C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin`を追加します

#### CMakeをインストール

インストール時に`Add CMake to the system PATH for all users`か`Add CMake to the system PATH for the current user`を選んでインストールします。

#### 必要なパッケージをインストール

```
npm install -g node-gyp
npm install -g jsdoc
```

### node-librealsenseをダウンロード

作業するフォルダーを任意の場所に用意し、次のコマンドを実行します（`npm init`などで`package.json`は用意していてください）。同時にSDKもビルドされるので少々時間がかかります。

```
npm install --save node-librealsense
```

### サンプルを動かす

ここから怪しい空気に...:sob:

`node_modules/node-librealsense/examples/`以下にサンプルファイルが格納されているので深度データをキャプチャするサンプル「nodejs-save-to-disk.js」を試してみます。

```
cd node_modules/node-librealsense/examples
npm install
```

`npm install`実行時に脆弱性があると怒られた...

```
audited 237 packages in 1.415s
found 6 vulnerabilities (5 moderate, 1 high)
  run `npm audit fix` to fix them, or `npm audit` for details
```

次のコマンドを実行して脆弱性解消

```
npm audit fix
```

サンプルを実行！

```
node nodejs-save-to-disk.js
```

ん？ エラー...

```
Error: Unrecoverable! error native function rs2_pipeline_start: No device connected
```

検索したりいろいろ試行錯誤しましたが解消されることはありませんでした...悔しい:sob:

# Node.jsでやってみたいならmacOSが今の所よさそう...

残念ながらWindowsにてサンプルがうまく動かないという悲しい結果になりました... Node.jsからintel RealSense D435iへアクセスしたいときは今の所macOSがよさそうです... 引き続き調査しますので、解決でき次第本記事を更新します:bow_tone1:。Unityなどの他のWrapperで試すとうまくいくのかな...？

# 参考URL

- [librealsense2 Node.js Wrapper](https://github.com/IntelRealSense/librealsense/tree/master/wrappers/nodejs)
- [Node.js API for Intel® RealSense™ Depth Cameras](https://www.npmjs.com/package/node-librealsense)

# どなたかご存知の方いらっしゃいましたら...

> macOS（Mojave 10.14.2）でうまくビルドできませんでした...:sob:

Node.jsのWrapperではなく本体のintel RealSense SDK2を直接ビルドしてViewerを試してみたかったのですが、XCodeで次のようなエラーが出てしまいビルドを断念しました... 解決方法をご存知の方がいらっしゃいましたらご教示いただけると嬉しいです...

![macOSでのビルド時のエラーキャプチャ](https://qiita-image-store.s3.amazonaws.com/0/55103/2352f28d-78d5-1c24-7f62-3c650ddd438e.png)

> Windows 10でうまくサンプルが動かず...:sob:

今回の一番悔しい思い出... エラーを見た感じだとNode.jsからうまくintel RealSense D435iへアクセスできていないようです。あまり情報がなく悔しい...

```
Error: Unrecoverable! error native function rs2_pipeline_start: No device connected
```