Junpei Qawasaki

博報堂アイ・スタジオという会社でテクノロジーをベースに新規事業とかインタラクティブなものとかを色々とやっております

IntelRealSence(D435i/T265)をunityで動かす。

コンピュータビジョン(CV)てご存知でしょうか。
すごい簡単に言うと「機械が見る現実世界」みたいなものです。昨今の自動運転やディープラーニングなどの画像解析が分かりやすいんですが、それ以外にも様々なセンサ類も含めて機械が現実世界で起きてる事を認識して、その情報をトリガーにインタラクションを起こすみたいな用途で使われます。

今回はそんなCVの分野で使うデバイス「RealSence」について。
CV関連はopenCVを自前でカスタマイズしてどんな環境からも呼べるようにするのが一番汎用性高いし、パフォーマンス出やすいっていう理論は分かりつつもゼロから自前CV作るのは大変なのでワタシは機材に頼ります。

これまでCV系センサの代表だったのが「KINECT」で、モーションキャプチャーとかデプス(深度)を使った制作をする事も多かったんですが、2017年にKINECTも生産終了しており、ハードが進化してるのにずっとKINECT使い続けるのも如何なものかと思ってIntelのRealSenceを本腰入れて使おうと思い始めました。RealSence自体は結構昔からあって使った事もあるんですけどね。公式のunityのpackageも出てきたので汎用性高そうと思って。

f:id:jkawasaki:20190421114915j:plain
RealSence(左:D435i 右:T265)

で、両方購入しました。
今ならswitch scienceで在庫もあるですよ。
KINECTより全然小さいし、電源も謎のアダプタ使わなくて良いので使いやすい。

D435iは深度計測が可能なステレオビジョンの深度カメラで、深度センサ×2、RGBセンサ、IR投射器を搭載しつつ、USB給電で動作(KINECTは別途電源が必要だった)するデバイス。T265は深度は搭載されておらず、トラッキングに特化したデバイスでハード側でV-SLAMアルゴリズムを直接実行する事でレイテンシ 6 ms未満を実現するものになってます。

「で、結局何に使うの?」って声が回りから出て来そうなんですが、イベントとかインスタレーションを作るときのinputはコレか画像検出のどちらかで今後は制作して行こうかなと思ってる次第ですよ。


ただし、

unityで使うにはSDKコンパイルしてビルドしてDLL作ってとかの事前準備がいくつかあります。
これについてのWebの情報が少なかったり(または古かったり)win環境に慣れてない人への「優しい情報」がなくて数日、沼にハマったのでこのエントリではその辺りを書き残しておこうと思った次第です。
Windowsや既にRealSenceの開発に慣れてる人にとってはあんまり為にならないので、そういう人はスルーしてください)


1. Macで動かそうと思ってる貴方へ。


僕も普段のunity開発はMacメインでやってるのでMacで動かそうかなと思ったのですが、色んな情報見るとRealSenceのMac SDKは非公式で、結論から言うとハードの全機能も使えないし、cmakeの時点で結構エラー吐くので早々にWindowsに切り替えました。
最近だとHoudiniとかもそうだしグラボだけじゃなくてセンサ系も含めてMacだけで開発やっていくのは難しい時代。



2. Windows環境準備


■RealSence SDKをインストールする
とりあえずはSDKをインストールしましょう。
SDKにはReakSenceViewerも含まれていて、これを使えば別に自分で開発しないでもRealSenceの基本機能を見る事が出来ます。
SDKの.exeはGitHubにあるので、適宜ダウンロード&インストールしてください。この記事を書いてる時(2019年4月21日)の最新はSDK 2.0。
f:id:jkawasaki:20190421154010g:plain
T265 Viewerサンプル。ステレオ魚眼とカメラトラッキング


で、こちらがD435iのデプスサンプル2つ。

f:id:jkawasaki:20190421134450g:plain
2D

f:id:jkawasaki:20190421134530g:plain
3Dもいける


ちなみにD435iはWindows10じゃないとデバイス認識してくれませんでした。
T265はWin8.1でも動くのですが、Dも動かしたい人は先にアップデートした方が良きです


■unityとVisualStudioをインストールする
最終的にこの2つが無いとどうにもならないので、インストールしましょう。
このエントリを書いてる段階では以下のバージョンを使ってます。

unity …2018.3.12f1
visual Studio …2017(2019でも問題ないです、たぶん)
Windows10


■Gitをインストールする
Gitの最新版をインストールします。
これが無いとこの後のcmakeする時にエラーが出ます。


■Cmakeをインストールする
Macではふつーに使えるcmakeですが、Windowsでは以下のツールが必要です。特にカスタム設定の必要は無いので、手順に従ってインストールして下さい。
cmake.org

ちなみにmacでcmakeだけやってdllだけ移せば良くない?って思うかもしれないですがコンパイル時に環境判定が入るのでエラーになるだけです。


3. librealsenseのダウンロード


セッティングで重要なのが「librealsence」です。
以下、GitHubからダウンロードして任意の場所に解凍(配置)します。面倒だったら"ダウンロード"配下でも問題ないです。
※注
GitHubでデフォルト表示されるリポジトリは最新版のMasterになってます。
最新は安定版とは違う(Pre-release)ので、何が起こるか分からないので避けた方が懸命です。このエントリでは安定版(Latest-Release)のbuild 2.19.0を使ってます。
f:id:jkawasaki:20190420232512p:plain


4. librealsenseのコンパイル


ここまでの手順は詰まる所はなくて、ここからが本題です。
unitypackageが配布されてるとはいえ、そのままインポートしてSceneを実行してもエラーを吐きます。
unityで動かすには自PCの環境で以下2つのdllを作成してAssets/Pluginsの配下に配置する必要があります。

==
Intel.Realsence.dll
・realsence2.dll
==

librealsenseのビルド方法は以下に記載、と言う記事が多いのですが、肝心のページが英語なのでなかなか分かり難いので要点だけ説明します。
github.com


■buildフォルダの作成
ダウンロード・解凍したlibrealsenseは「librealsense 2.19.0」というフォルダになります。で、このrootで以下のコマンドを実行せよ、と説明には書いてあるのですが、実際の解凍フォルダはlibrealsense 2.19.0/librealsense 2.19.0 というディレクトリになっていて、下層の「librealsense 2.19.0」がrootになるので、このフォルダまでコマンドプロンプトで移動します。
移動したら以下のコマンドをコマンドプロンプトから実行します。

mkdir build
cd build
まぁ単純に librealsense 2.19.0/librealsense 2.19.0/build というフォルダを作っただけです。
で、その上でbuild配下で以下のコマンドを打ちます。
cmake .. -DBUILD_CSHARP_BINDINGS=ON -DBUILD_UNITY_BINDINGS=ON -DBUILD_SHARED_LIBS=ON -DDOTNET_VERSION_LIBRARY=3.5 -DCMAKE_GENERATOR_PLATFORM=x64

Gitさえ入ってれば2-3分で問題なくコンパイルが終了します。
記事によってはCMakeのGUIで実行すべき、みたいなのもあって諸々試して見ましたが、別にCMake GUIを使う必要はなさそうです。


4. VisualStudioでビルド


上記コンパイルが完了すると色々なファイルがbuild配下に出来上がります。
realsence2.slnをビルドという情報をたまに見ますが違うのでご注意を。
正確には
librealsense 2.19.0/librealsense 2.19.0/build/wappers/csharp/Intel.RealSence/配下のIntel.RealSence.slnファイルを右クリック「プログラムから開く」→「Visual Studio 2017」で開きます。
f:id:jkawasaki:20190421013212p:plain

開いたら特に設定は変えず[ビルド]→[ソリューションのビルド]でビルドを実行します。
ビルドが完了するとlibrealsense 2.19.0/librealsense 2.19.0/build/Debug配下にIntel.Realsence.dllとrealsence2.dllが出来上がってるはずです(ファイルのタイムスタンプから判断すると分かりやすい)

※エラーについて※
「realsense.libを開くことが出来ません」とか「ソースファイルを開けません "atlstr.h"」みたいなエラーが出る時はそもそもビルドしてるslnが違う可能性があります。binの中にlibとかヘッダーを探しに行くと迷いの森に入ることになります


5. unityのセッティング


セッティングっていうほどでは無いんですが、上記ビルドを完了したら、librealsense 2.19.0/librealsense 2.19.0/build/wappers/unity/Assets/RealSenceSDK2.0/Sceneの下の「StartHere」というunity sceneファイルをダブルクリックしてunityを起動します。

起動してもdllを配置してないとエラーが出るので、Assets直下に「Plugins」という名前のフォルダを新規作成して前行程で作成したIntel.Realsence.dllとrealsence2.dllをドラッグ&ドロップでコピーします。


6. Sceneの実行


お手持ちのIntel RealSence(D435iまたはT265)を接続した上でunityのSceneを実行します。場合によっては以下のように「デバイスが接続されてないエラー」が出るみたいですが、その場合は再起動しつつ、RealSenceViewerで表示されてるかを確認してください。


いざsceneを実行。

f:id:jkawasaki:20190421111224g:plain
unityで動いた。

この画像だけじゃ意味わかんないかもですが、T265の位置をunity側でリアルタイムにトラッキング出来てます。
ちょうどNintendo switchVRが出たので、それと合わせてなんかやろうかな。
ちなみにSDKのunity.packageにはdepthのサンプル6つとSLAMサンプルが1つ入ってます。

今回は動かすところまでが主題なので、ここまで。
サンプル動かしただけじゃないって話ですが、unity側で色々とやっていくのは次回以降に粛々と書きたいと思います。

ではー。