C++
RaspberryPi
RealSense
Movidius
MobileNetSSD

デプスカメラRealSenseD435で "紫色のイカ" や "オレンジ色の玉ねぎ" を切り取ったり "金髪の人" を追っかけて距離を測る(1) with Ubuntu16.04

◆ はじめに

小遣いをチマチマ貯めてついに購入してしまった、Intel RealSense D435 (税抜き¥28,350)
360°LiDARの RPLidar A1M8 より ¥5,000 も高い。
スイッチサイエンスさんのWEBショップでは 「6/26時点 入荷時期未定」 となっていたが、楽天では普通に 「在庫有り」 の店舗が何店舗かあったため即購入。
4月に無謀にも 自律走行ロボ作成の決意表明 をしてから、7月まで猛烈に突っ走ってきたので、ちょっとだけ他事に浮気してみる。

尊敬するブロガーさんから マニアック認定 を頂戴していたようなので、今後も張り切ってニッチ路線を邁進していこうと思う。
ギャンブルジャンキーだったヤツが、こうもドップリとハードにハマってしまうものなのだろうか。。。
(最近はタバコとコーヒーを買う以外の小遣いを、世紀末のモヒカンよろしく 「ヒャッハー!!」 と躊躇なく全額ハードへブチ込んでいる。)

セッカチな人はこちらのリンクを踏むと、動きのある画像をすぐに見ることができます。
1."イカ" と "玉ねぎ" の切り抜きサンプルGIF
2.深度測定サンプルGIF
3."金髪の人" を追いかけて距離を測るサンプルGIF

◆ この試行を通して得たいこと

  • 画像解析のニーズがものすごく高いことを実感中
    • 基盤検査
    • 製品ラベルの検査
    • 予知保全
    • etc...
  • どれほどの精度で深度が測定できるのかを検証
  • 庶民感覚のローコストでできる範囲/できない範囲の見極め
  • 過去人間系で行わざるを得なかった作業の効率化への寄与度見極め
  • 小型ロボットへ搭載することへのメリット/デメリットの見極め
  • IntelのGithubのサンプル を見ていたら・・・発想が変かもしれないけど、DNNの アノテーション半自動化 で強力な補助ツールとして使えそうだぞ、コレ・・・
  • やばい、試したいことが増える・・・1日24時間では足りない・・・

◆ 参考にさせていただいた記事、謝辞

【shrimp_fさん】
RealSense D435のROSへの導入でつまづいたところ Qiita

◆ 環境

  1. Ubuntu 16.04 (検証環境)
  2. Windows 10 Pro (Firmwareアップデート用)
  3. RaspberryPi3 + Raspbian Stretch (最終導入環境・次回記事)
  4. Intel RealSense D435
  5. Intel Movidius Neural Compute Stick (次々回記事)
  6. OpenCV3.x

◆ 作業に掛かる前の前提条件

Raspbian Stretch+NCS(Neural Compute Stick)+YoloV2+Webカメラ+ROSによるリアルタイム複数動体検知環境の構築 の記事を参考に、作業を実施済みであることを前提とする。

◆ Intel RealSense D435 の外観

とにかく小さくて衝撃的だった。
三脚とType-CのUSBケーブルが付属する。
9a66d841-060a-621b-2f70-25aa351ced40.png

タバコの箱と比べるとご覧のサイズ感。
名刺やRaspberryPiとほぼ同じ大きさ。そして、すごく軽い。
DSC_0076.png

Intel Movidius NeuralComputeStick と比べるとこんな感じ。
72e25e6a-6d59-88d1-9844-0aa1a6751070.png

作成中のロボットのLiDARの上に載せてみる。
横幅10cmのロボットに収まる感じなので相当小さい。
そういえば、RGB-Dカメラ用のSLAMアルゴリズム を一つだけ試していなかったことを今思い出した。
1b1622ac-7c9d-7c19-85b4-3f21f21448ed.png

◆ 端末側への要求スペック

  • USB 3.1 Gen 1 (USB 2.0でも動作可能)
  • Ubuntu 16.xx / Windows 10
  • 4GB RAM
  • 電源 5V / 700mA

◆ 作業のおおまかな流れ

本記事は下記のような流れで進める。

  1. RealSense D435のキッティング
  2. Ubuntu 16.04 PC環境への導入と味見
  3. RaspberryPi3(Raspbian Stretch) への導入と味見 【次回記事】
  4. RaspberryPi3(Raspbian Stretch) + RealSense D435 で MobileNet-SSD の試行 【次々回記事】

◆ RealSense D435のキッティング

UbuntuPCからはFirmwareアップデートに成功しなかった。
Neural Compute Stickのときも同じだったが、マニュアル記載どおりの手順ではすんなりいかない。
Intelが提供するマニュアルは基本的に品質が低い。

● 【失敗】Ubuntu16.04PCによるFirmwareのアップデート

下記URLに記載の手順に従い、Firmwareをアップデートする。
ハードウェアが動かなくなるのは嫌なのでメーカー推奨環境で実施する。
2018/06/30時点の最新FirmwareVerは「5.9.13」
【参考】 Intel® RealSense™ SDK 2.0 (Build 2.12.0) Github
【参考】 Device Firmware Update (DFU) for Linux
【参考】 Downloads & Tools

1.ターミナルを起動し、下記を実行する。

UbuntuPCで実施、リポジトリのリストへIntelサーバーの追加とDFUツールインストール
$ sudo sh -c 'echo "deb http://realsense-hw-public.s3.amazonaws.com/Debian/apt-repo xenial main" | sudo tee /etc/apt/sources.list.d/realsense-public.list'
$ sudo apt-key adv --keyserver keys.gnupg.net --recv-key 6F3EFCDE
$ sudo apt update;sudo apt upgrade
$ sudo apt install intel-realsense-dfu*
$ cd ~;mkdir IntelRealSenseFirmware;cd IntelRealSenseFirmware

$ wget -O IntelRealSenseFirmware.zip https://downloadmirror.intel.com/27924/eng/Intel%C2%AE%20RealSense%E2%84%A2D400%20Series%20Signed%20Production%20Firmware%20v5_9_13.zip
又は
https://downloadcenter.intel.com/download/27924/Latest-Firmware-for-Intel-RealSense-D400-Product-Family?v=t からブラウザ経由で最新版をダウンロード

$ unzip IntelRealSenseFirmware.zip
又は
$ unzip (ブラウザ経由でダウンロードしたファイル名)

$ rm IntelRealSenseFirmware.zip

masked.png

2.RealSense D435 を付属のType-CケーブルでPCと接続する。
3.ターミナルで下記を実行し、Bus番号とDevice番号を記憶する。

USBのBus番号とDevice番号を確認
$ lsusb

masked.png

4.ターミナルで下記を実行し、Firmwareをアップデートする。-b-d は 3. で記憶した番号を指定する。 Bus → -bDevice → -d

Firmwareのアップデート
$ intel-realsense-dfu -b 003 -d 007 -f -i Signed_Image_UVC_5_9_13_0.bin

んで、見事にエラーになる。 って、おいっ!!
masked.png

● 【成功】Windows10PCによるFirmwareのアップデート

気を取り直してWindows10環境を使用してFirmwareをアップデートする。
1.ZIP 2種類 (1) Windows10用Firmwareアップデートツール (2) 最新ファームウェアbinファイル をダウンロードして解凍
2.Signed_Image_UVC_5_9_13_0.bin を intel-realsense-dfu.exe と同じフォルダへコピーする
3.RealSenseD435をUSBポートに接続
4.デバイスドライバのインストール完了を待つ
5.intel-realsense-dfu.exe を実行
6.「1」を入力してEnter入力し、画面の指示に従ってアップデート
7.ファームウェアのバージョン確認「2」
7c5d60e3-4454-a39d-0a46-32bc359fc3aa.png

うまくいったようだ。
d0ff4ac6-c16f-2638-0cc9-df9ec72932c1.png

◆ Ubuntu 16.04 PC環境への導入と味見

まずはありきたりなUbuntu環境へ導入して動作を味見する。
以下、サンプルの動作確認は、Ubuntu16.04PCUSB2.0ポート にて実施。
【参考】 librealsense Linux Ubuntuへのインストール

● Ubuntuのudevルール更新

udevルールの更新
$ cd /etc/udev/rules.d/
$ sudo wget https://raw.githubusercontent.com/IntelRealSense/librealsense/master/config/99-realsense-libusb.rules
$ sudo udevadm control --reload-rules && udevadm trigger
$ sudo reboot

● Ubuntu16.04のカーネル更新

★注意★ Ubuntu16.04の起動が明らかに遅くなる。 必要に迫られない限り実施しないのも一手。

Ubuntu16.04カーネルにパッチを充てる
$ cd ~
$ git clone https://github.com/IntelRealSense/librealsense.git
$ cd librealsense
$ sudo chmod 777 ./scripts/patch-realsense-ubuntu-lts.sh
$ ./scripts/patch-realsense-ubuntu-lts.sh

● Intel® RealSense™ SDK 2.0のインストール

SDKをインストールする。

1.ターミナルを起動し、下記コマンドを実行する。

Ubuntu16.04PCへSDKのインストール
sudo apt install -y librealsense2-dkms librealsense2-utils librealsense2-dev librealsense2-dbg libglfw3-dev

● RealSenseの素の動作を味見

デモを実行
$ realsense-viewer

ezgif.com-optimize (19).gif

● RealSenseとOpenCVの連携サンプルをビルド

【参考】 OpenCV Samples for Intel® RealSense™ cameras
【参考】 Sample Code for Intel® RealSense™ Python Wrapper

あとから改造する気満々なので、ソースコードを落として手元でビルドしておく。
なお、ソースコードのビルド時には cmake3.8.x以上 を要求されるため、一時的にcmakeのバージョンを上げる。
Ubuntu16.04のデフォルトのcmakeバージョンは「3.5.1」?

cmake3.11.xのビルドとインストール
$ cd ~
$ wget https://cmake.org/files/v3.11/cmake-3.11.4.tar.gz
$ tar -zxvf cmake-3.11.4.tar.gz;rm cmake-3.11.4.tar.gz
$ cd cmake-3.11.4
$ ./configure --prefix=/home/<username>/cmake-3.11.4
$ make
$ make install
$ export PATH=/home/<username>/cmake-3.11.4/bin:$PATH
$ source ~/.bashrc
$ cmake --version
深度を利用した背景透過サンプルを含むOpenCV系サンプル一式の一括ビルド
$ cd ~/librealsense/wrappers/opencv;mkdir build;cd build
$ cmake ..
$ nano latency-tool/CMakeLists.txt

target_link_libraries(rs-latency-tool ${DEPENDENCIES})
↓下記のように変更して保存
target_link_libraries(rs-latency-tool ${DEPENDENCIES} pthread)

$ make -j $(($(nproc) + 1))
$ sudo make install

● 深度を利用した背景透過サンプルを味見

深度を利用した背景透過サンプルの味見
$ cd ~/librealsense/wrappers/opencv/build/grabcuts
$ rs-grabcuts

一定距離以外の部分が透過する。
かなり綺麗にエッジが抽出されている。
エクセレント!!
【YouTube動画】 https://youtu.be/ihJvynmClqk
ezgif.com-optimize (17).gif

消費電力
DSC_0091-.png

● 深度カメラ画像をUIに表示するだけのサンプルを味見

深度カメラ画像をUIに表示するだけのサンプルの味見
$ cd ~/librealsense/wrappers/opencv/build/imshow
$ rs-imshow

赤:近い 青:遠い 黒:測定不能 という感じでグラデーション表示される。
実際のレスポンスは下図の3倍。
【YouTube動画】 https://youtu.be/mMImsKPb7qg
ezgif.com-optimize (16).gif

消費電力
DSC_0092-.png

● MobileNet-SSD+物体までの距離測定のサンプルを味見

MobileNet-SSD+対象物までの距離測定
$ cd ~/librealsense/wrappers/opencv/build/dnn
$ rs-dnn

こちらの記事(RaspbianStretch+MobileNet-SSD) の動きに加え、 対象物までの距離 も計算される。
実際のフレームレートは下図の5倍。
そうです、ごめんなさい。
別に金髪の人を探し出して追っている訳ではないのです。
ちなみに、悟空はちゃんと「人」でした。
【YouTube動画】 https://youtu.be/StCPRJb5xlg
ezgif.com-optimize (18).gif

消費電力
DSC_0090-.png

◆ 本日のまとめ

  • "深度" の測定精度、高からず低からず
  • 物体表面の1cmほどの凹凸があれば見分けがつきそう
  • 穴ボコになっている部分を埋めたり、エッジを平滑化するサンプルも公開されているため、かなり綺麗に被写体を切り抜けそう
  • ハンパなUSB-Webカメラを買うぐらいなら、RealSenseを1台買ったほうがコストメリットが有りそう
  • 大したことをしなければ、データシートに記載されている消費電力700mAを大きく下回る200mA前後で動作する
  • USB2.0で普通に動くやん
  • モーター駆動しない分、LiDARより低消費電力でエコ
  • LiDARより圧倒的に軽い!!
  • うまい棒ぐらいのサイズをイメージしていて完全にナメていた、想像以上に小さい
  • 地図を作る用途では精度が思うように出なさそう
  • 視野角は広めだが、360°探索には敵わない
  • DNNのアノテーション地獄、ちょっとは楽できそうなほど綺麗にエッジが取れる
  • Mask-RCNNのアノテーションや、Yolo、SSDのアノテーション作業でも結構使えそうな予感、あくまで予感
  • 人間系の工数削減目的なら、 絶対買い と判断
  • 素の解像度は普通
  • 背景透過のサンプルとMobileNet-SSDをうまく組み合わせることができれば、特定の物体以外をまとめて透過できるのかもしれない

◆ おまけ

こんなこともできるらしい。
実用イメージは沸かないけど、シンプルに面白い。
【YouTube】 Intel RealSense - Face tracking use
【YouTube】 Face Tracking with Intel Real Sense
【YouTube】 スイッチサイエンス RealSense D435 with 顔認識
【Github】 RealSense SDK 2.0 demo with Dlib and OpenCV

◆ 次回予告

RaspberryPi3 + Raspbian Stretch へ導入し、Intel Movidius Neural Compute Stick との組み合わせを試行してみようと思う。

◆ 次回記事

デプスカメラRealSenseD435で "紫色のイカ" や "オレンジ色の玉ねぎ" を切り取ったり "金髪の人" を追っかけて距離を測る(2) with RaspberryPi3(Raspbian Stretch) へ続く