memorandums

日々の生活で問題解決したこと、知ってよかったことなどを自分が思い出すために記録しています。

realsense 415と435

Sphero Miniが発売されているのをつい先日知りました。。。

Spheroといえば僕的にはSpherotoonなわけで。このブログでも繰り返し宣伝してきました。。。

www.youtube.com

最近、デモすることもなくなりましたが、オープンキャンパス以外で、一般イベントへの出展参加はココが始まりでしたので、忘れられない作品ではあります。個人的に。

Spherotoonは物がデカイことが問題でした。あとSpheroの電池持ちが悪すぎて。。。予備を持っていってもずーっと充電を繰り返さなければならず展示が困難でした。

せっかくMiniが出たなら。。。と4つほど購入し、ついでに、以前から欲しかったIntel社のDepth SensorであるRealSenseも購入しました。これは言わずもがなKinectの代わりです。

Kinectは入手できなくなったことはもとより、サイズが大きいので展示の場所を取ります。RealSenseが使えるなら小さな机の上でも展示できそうです。

ということで、昼過ぎくらいから、開封してセットアップを始めました。

あまり調べずに買ったこともあり、調べていくとどうやらWindowsをターゲットとしている模様。。。ヤバイな。。。と、でも、さらに調べていくと、ソースからビルドすれば他のプラットフォーム(もちろんMac)でも動くようです。この辺の情報は以下を参考にしました。

qiita.com

ちなみにHololensでもKinectでも、そしてRealsenseの本も書かれている方のブログでは2年以上前に同様のことが書かれていました。さすがです。

Intel RealSenseをMax OSやLinuxでも使える librealsense を使ってみた - Natural Software

ちなみにソースはGithubにあって、そのREADMEには丁寧に手順が書かれていますので、それを見ればいいってこともわかりました。

迷うことはほとんどなくビルド成功できました。

で、実行してみると。。。Realsenseのファームが古いのでアップデートしろとのこと。

アップデートツールをダウンロードするとなんとWindowsしか対応していない。。。しかたがないのでVirtualBoxでWin10を立ち上げて。。。ゴニョゴニョやりましたが、最後の最後でデバイスが見つからないと言われます。。。よくわかりません。

しかたがないので、Win10マシンを持ってきて実行するとすんなり動きました😁

アップデートツールは以下。

Download Windows* Device Firmware Update Tool for Intel® RealSense™ D400 Product Family

アップデート用のイメージファイルは以下です。今日現在のところですね。
Download Latest Firmware for Intel® RealSense™ D400 Product Family

で、元に戻って、あれこれサンプルアプリを動かすと、動きました。D415でもD435でも動きました。

c++よりJava(というかProcessing)で作りたいな。。。と探しましたが。。。残念ながらJavaには対応していないようです。以前から各方面から要望があるようですがIntelは対応してくれないようです(というか以前のバージョンのSDKではProcessingに対応していたようですし、そういうまとめブログがいくつかありましたが、バージョン2では未対応らしい)。

しかたがないのでopenframeworksで作りましょうと。いろいろ探した結果、以下のアドオンが見つかりました。先人のお陰です。。。素晴らしい。ありがとうございます。実は、librealsense2をopenframeworksに取り込もうと1時間くらいあれこれやったんですが。。。僕の腕では無理でした。

GitHub - shiyamon/ofxLibRealSense2: librealsense 2.x addon for openFrameworks

最近、openframeworksを使っていなかったので、最新版のソースを持ってきて、addonフォルダにofxLibRealSense2を放り込んで、そのフォルダ内にあるexampleを起動して動かしました。

すぐに動作しました。

f:id:ke_takahashi:20180731214035p:plain

でも。。。なんか辺。深度センサーの画像とは思えません。。。

ソースを読んでみると、IR画像が表示されていることがわかりました。

IRをDepthに書き換えて再実行するものの。。。なんかへん。ときどき白いドットが表示されるだけ。。。

あれこれ調査していると、アドオンのソースに問題があることがわかりました。具体的にはofxLibRealSense2.cppの_depthBuffです。これをここで書いてもよくわからないと思いますが、調査メモとしてテキストを残しておきたいと思います。

_depthBuffはuint16で、これをofTextureのインスタンスのloadDataメソッドを実行することで表示できるようにしています。loadDataするときにGL_LUMINANCEを指定しているのですが、これが何か調べてみると1ピクセル1バイトとして読み込む指定のようです。_depthBuffでは2バイトにも関わらず。。。なのでここでミスマッチになっていることが直感的にわかりました。

そこで、uint8の入れ物を作ってやって、_depthBuffから1ピクセルずつ読み出してセットしました。このときdepthの値を正規化するのですが最大値がよくわかりませんでした。こちらのソースをみると1500で割って255を掛けているので、最大値が1500と思われます。

で、その処理を加えて再実行してみると。。。ビンゴでした!!

f:id:ke_takahashi:20180731221028p:plain

ofxLibRealSense2では最低限のメソッドのみ実装されているようですので、その他のメソッドは自分で拡張する必要がありますが。。。とりあえずこれで何とかなりそうな雰囲気になってきました。

あとは明日にしよう。。。と時計をみると最終バスの時間。

こういうのやるといつもこうなっちゃうんですよね。。。しかたがない。