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

**MobileNet-SSD-RealSense**　[![GitHub stars](https://img.shields.io/github/stars/PINTO0309/MobileNet-SSD-RealSense.svg?style=social&label=Stars)](https://github.com/PINTO0309/MobileNet-SSD-RealSense)
#<font color="#08088A">◆ 前回記事</font>
[デプスカメラRealSenseD435で "紫色のイカ" や "オレンジ色の玉ねぎ" を切り取ったり "金髪の人" を追っかけて距離を測る（１） with Ubuntu16.04](https://qiita.com/PINTO/items/73b341a3661367a0dc61)　の続き

#<font color="#08088A">◆ はじめに</font>
**`[2018/07/05]　手順を大幅に更改`**

どうも。 ギャンブルジャンキー改め、ハードウェアジャンキーです。

前回は、ありきたりな **`Ubuntu16.04 ＋ C++`** で環境を構築して味見をした。
今回はエッジコンピューティングを見越して **`RaspberryPi3 ＋ Raspbian Stretch ＋ Python`** の環境を構築する。
Raspbianでは、aptコマンドで導入できないため、ソースをビルドして導入する。
やっていることは前回と変わらないので、うまくいった手順を簡潔に記載。
なお、MobileNet-SSDの実装は更に次回取り組もうと思う。

**※ 海外の方からヘルプのコメントをいただいたため、急いで仕上げた。**

<font color="red">**【注意点】 OpenGL Driver を有効にすると、OpenCVの 「imshow」 メソッドが正常に動作しなくなる点を受け入れる必要がある。 [こちらの記事の実装](https://qiita.com/PINTO/items/b97b3334ed452cb555e2) のように、OpenCVの 「imshow」 メソッドに頼らないでOpenGLの描画系メソッドだけで描画処理を実装しなくてはならない点に注意。**</font>

#<font color="#08088A">◆ 参考にさせていただいた記事、謝辞</font>
**[【Intel公式】 RaspberryPi3 Install (Ubuntu MATE)](https://github.com/IntelRealSense/librealsense/blob/master/doc/RaspberryPi3.md)**

#<font color="#08088A">◆ 環境</font>
１．RaspberryPi3 + Raspbian Stretch (with USB2.0 Port)
２．Intel RealSense D435
３．~~Intel Movidius Neural Compute Stick~~ (展開スピードを優先するため、一旦保留)
４．OpenCV3.4.x
５．TBB (Intel Threading Building Blocks)
６．OpenGL Driver
７．HDMIディスプレイ

#<font color="#08088A">◆ 作業に掛かる前の前提条件</font>
**[Raspbian Stretch+NCS(Neural Compute Stick)+YoloV2+Webカメラ＋ROSによるリアルタイム複数動体検知環境の構築](https://qiita.com/PINTO/items/b084fe3dc716c42e2867)** の記事を参考に、作業を実施済みであることを前提とする。

#<font color="#08088A">◆ RaspberryPi3 + Raspbian Stretch環境への導入</font>

１．HDMIディスプレイを接続する
２．RealSense D435はプラグアウトしておく
３．必要なパッケージのバージョンを確認する

```shell:[Example]カーネルのバージョンとパッケージのバージョンを確認
$ uname -a
Linux raspberrypi 4.14.34-v7+ #1110 SMP Mon Apr 16 15:18:51 BST 2018 armv7l GNU/Linux

$ sudo apt update;sudo apt upgrade
$ sudo reboot
$ uname -a
Linux raspberrypi 4.14.50-v7+ #1122 SMP Tue Jun 19 12:26:26 BST 2018 armv7l GNU/Linux

$ gcc -v
gcc version 6.3.0 20170516 (Raspbian 6.3.0-18+rpi1+deb9u1)

$ cmake --version
cmake version 3.7.2
```

４．SWAP領域を最大の2GBまで拡張する

```shell:SWAP領域の拡張(2GB)
$ sudo nano /etc/dphys-swapfile
CONF_SWAPSIZE=2048

$ sudo /etc/init.d/dphys-swapfile restart swapon -s
```

５．追加パッケージのインストールとudevルールの更新

```shell:追加パッケージのインストールとudevルールの更新
$ sudo pip3 install pillow lxml jupyter matplotlib cython
$ sudo apt install -y git libssl-dev libusb-1.0-0-dev pkg-config libgtk-3-dev \
libglfw3-dev at-spi2-core libdrm* python-tk libjpeg-dev libtiff5-dev \
libjasper-dev libpng12-dev libavcodec-dev libavformat-dev \
libswscale-dev libv4l-dev libxvidcore-dev libx264-dev qt4-dev-tools \
autoconf automake libtool curl libatlas-base-dev mesa-utils* \
libglu1* libgles2-mesa-dev libopenal-dev cmake-curses-gui
$ sudo apt update;sudo apt upgrade

$ 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
```

６．cmakeのバージョンが **`3.7.2`** と古かったため、一時的に **`3.11.4`** へバージョンアップする。 ターミナルを閉じると元のバージョンに戻る。

```shell:cmake3.11.4の一時的なインストール
$ 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/pi/cmake-3.11.4
$ make -j1
$ sudo make install
$ export PATH=/home/pi/cmake-3.11.4/bin:$PATH
$ source ~/.bashrc
$ cmake --version
cmake version 3.11.4
```

７．LD_LIBRARY_PATHを登録する

```shell:LD_LIBRARY_PATHの登録
$ nano ~/.bashrc
export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH

$ source ~/.bashrc
```

８．Google の **`protobufパッケージ v3.5.1`** を導入する

```shell:protobuf_v3.5.1の導入
$ cd ~
$ git clone --depth=1 -b v3.5.1 https://github.com/google/protobuf.git
$ cd protbuf
$ ./autogen.sh
$ ./configure
$ make -j1
$ sudo make install
$ cd python
$ export LD_LIBRARY_PATH=../src/.libs
$ python3 setup.py build --cpp_implementation 
$ python3 setup.py test --cpp_implementation
$ sudo python3 setup.py install --cpp_implementation
$ export PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=cpp
$ export PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION_VERSION=3
$ sudo ldconfig
$ protoc --version
```

９．Intel の **`TBB`** を導入する

```shell:TBB導入
$ cd ~
$ wget https://github.com/PINTO0309/TBBonARMv7/raw/master/libtbb-dev_2018U2_armhf.deb
$ sudo dpkg -i ~/libtbb-dev_2018U2_armhf.deb
$ sudo ldconfig
$ rm libtbb-dev_2018U2_armhf.deb
```

１０．古いOpenCVをアンインストールする

```shell:古いOpenCVのアンインストール
$ cd ~/opencv-3.x.x/build
$ sudo make uninstall
$ cd ~
$ rm -r -f opencv-3.x.x
$ rm -r -f opencv_contrib-3.x.x
```

１１．OpenGLやDNNやTBBを有効にした **`OpenCV 3.4.1`** を再導入する（３時間３０分必要）

```shell:OpenCV3.4.1のインストール
$ cd ~
$ wget -O opencv.zip https://github.com/Itseez/opencv/archive/3.4.1.zip
$ unzip opencv.zip;rm opencv.zip
$ wget -O opencv_contrib.zip https://github.com/Itseez/opencv_contrib/archive/3.4.1.zip
$ unzip opencv_contrib.zip;rm opencv_contrib.zip
$ cd ~/opencv-3.4.1/;mkdir build;cd build
$ cmake -D CMAKE_CXX_FLAGS="-DTBB_USE_GCC_BUILTINS=1 -D__TBB_64BIT_ATOMICS=0" \
        -D CMAKE_BUILD_TYPE=RELEASE \
        -D CMAKE_INSTALL_PREFIX=/usr/local \
        -D INSTALL_PYTHON_EXAMPLES=OFF \
        -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib-3.4.1/modules \
        -D BUILD_EXAMPLES=OFF \
        -D PYTHON_DEFAULT_EXECUTABLE=$(which python3) \
        -D INSTALL_PYTHON_EXAMPLES=OFF \
        -D BUILD_opencv_python2=ON \
        -D BUILD_opencv_python3=ON \
        -D WITH_OPENCL=OFF \
        -D WITH_OPENGL=ON \
        -D WITH_TBB=ON \
        -D BUILD_TBB=OFF \
        -D WITH_CUDA=OFF \
        -D ENABLE_NEON:BOOL=ON \
        -D WITH_QT=OFF \
        -D BUILD_TESTS=OFF ..
$ make -j1
$ sudo make install
$ sudo ldconfig
```

１２．Intel® RealSense™ SDK 2.0をインストールする

```shell:Intel®RealSense™SDK2.0のClone
$ cd ~
$ git clone https://github.com/IntelRealSense/librealsense.git
$ cd ~/librealsense;mkdir build;cd build
```

```shell:Intel®RealSense™SDK2.0のcmake
$ cmake .. -DBUILD_EXAMPLES=true -DCMAKE_BUILD_TYPE=Release

又は

$ cmake .. -DBUILD_EXAMPLES=true
```

```shell:Intel®RealSense™SDK2.0のビルド(大量に表示される警告は無視してもよい)
$ make -j1
$ sudo make install
```

１３．RealSenseとOpenCVの連携サンプルをビルドする

```shell:RealSenseと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
```
１４．RealSenseのPythonラッパーをビルドする

```shell:Pythonラッパーをビルド
$ cd ~/librealsense/build

#Python3.x系で使用するとき
$ cmake .. -DBUILD_PYTHON_BINDINGS=bool:true -DPYTHON_EXECUTABLE=$(which python3)

又は

#Python2.x系で使用するとき
$ cmake .. -DBUILD_PYTHON_BINDINGS=bool:true -DPYTHON_EXECUTABLE=$(which python)

$ make -j1
$ sudo make install
```

１５．PYTHONPATH環境変数を追加

```shell:PYTHONPATH追加
$ nano ~/.bashrc
export PYTHONPATH=$PYTHONPATH:/usr/local/lib

$ source ~/.bashrc
```

１６．Python3によるpyrealsense2ライブラリのインポート確認

```shell:Python3によるpyrealsense2のインポート確認、エラーが表示されなければ正常
$ python3
Python 3.5.3 (default, Jan 19 2017, 14:11:04) 
[GCC 6.3.0 20170124] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import pyrealsense2
>>> exit()
```

１７．OpenGLドライバーを有効にする

```shell:OpenGLドライバーの有効化
$ sudo apt-get install python-opengl
$ sudo -H pip3 install pyopengl
$ sudo -H pip3 install pyopengl_accelerate
$ sudo raspi-config
"7.Advanced Options" - "A7 GL Driver" - "G2 GL (Fake KMS)"
```

１８．RaspberryPiを再起動する

```shell:RaspberryPiの再起動
$ sudo reboot
```

１９．SWAP領域をデフォルトサイズに戻す

```shell:SWAP領域の縮小
$ sudo nano /etc/dphys-swapfile
CONF_SWAPSIZE=100

$ sudo /etc/init.d/dphys-swapfile restart swapon -s
```

２０．RealSense D435をUSBポートに接続する


#<font color="#08088A">◆ RealSenseの素の動作を味見</font>

```shell:デモを実行
$ realsense-viewer
```
Corei7 から ARM へ移行したはずなのに、想像していたよりも動きが普通過ぎて拍子抜けですな。
DNN なら Neural Compute Stick が無いと話にならないとは思うけど。
![ezgif.com-optimize (20).gif](https://qiita-image-store.s3.amazonaws.com/0/194769/1f73885b-4332-c8eb-3cb0-e85ca0206e9d.gif)

#<font color="#08088A">◆ 深度を利用した背景透過サンプルを味見</font>

```shell:深度を利用した背景透過サンプルの味見
$ sudo raspi-config
"7.Advanced Options" - "A7 GL Driver" - "G3 Legacy"

$ cd ~/librealsense/wrappers/opencv/build/grabcuts
$ rs-grabcuts
```
こいつは苦しい・・・OpenGLでレンダリングしないとモッサリすぎる・・・。
**【YouTube動画】 https://youtu.be/HZZZUfvAupw**
![ezgif.com-optimize (21).gif](https://qiita-image-store.s3.amazonaws.com/0/194769/a56caacb-1d3a-8ab1-d516-abed3054b065.gif)

#<font color="#08088A">◆ 深度カメラ画像をUIに表示するだけのサンプルを味見</font>

```shell:深度カメラ画像をUIに表示するだけのサンプルの味見
$ sudo raspi-config
"7.Advanced Options" - "A7 GL Driver" - "G3 Legacy"

$ cd ~/librealsense/wrappers/opencv/build/imshow
$ rs-imshow
```
いたって普通。
**【YouTube動画】 https://youtu.be/dMCyTzKQEhk**
![ezgif.com-optimize (22).gif](https://qiita-image-store.s3.amazonaws.com/0/194769/17d3b77f-62b3-34f2-ae82-1eea39f6cf88.gif)

#<font color="#08088A">◆ MobileNet-SSD＋物体までの距離測定のサンプルを味見(Neural Compute Stick無し)</font>

```shell:MobileNet-SSD＋対象物までの距離測定
$ sudo raspi-config
"7.Advanced Options" - "A7 GL Driver" - "G3 Legacy"

$ cd ~/librealsense/wrappers/opencv/build/dnn
$ rs-dnn
```
こいつも苦しい・・・。
**【YouTube動画】 https://youtu.be/OuJ1BnZvgP8**
![ezgif.com-optimize (23).gif](https://qiita-image-store.s3.amazonaws.com/0/194769/a4fb809c-30a6-f241-2636-ba6e86975a49.gif)

#<font color="#08088A">◆ MobileNet-SSD＋物体までの距離測定(with Neural Compute Stick)</font>

Neural Compute Stickの使用準備 と Intel®RealSense™SDK2.0の導入 と OpenGLの導入 は終わったため、またの機会にPythonで実装しようと思う。

#<font color="#08088A">◆ 本日のまとめ</font>

- メーカー非公式のRaspbian環境ながら普通に動いた
- 失敗も無く無事成功
- カーネルの更新は不要
- RaspberryPi上でソースをビルドすることにだいぶ小慣れてきた感
- 作業に着手してから導入完了まで８時間ほど掛かった
- OpenGLで画面描画を実装しつつ Neural Compute Stick に頼らないと、凝ったことをするのは少々厳しい
- ビルドに失敗するのが嫌なら、 **`SWAP領域は最大`** にして、 **`make は -j1`** 指定にしましょう
- Pythonのプログラム組み始める前に、ちょっとだけ一息入れよう。。。 :confounded:

#<font color="#08088A">◆ 次回記事</font>
[RaspberryPi3 (Raspbian Stretch) + Intel Movidius Neural Compute Stick(NCS) + RealSenseD435 + MobileNet-SSD で物体検出しつつ悟空やモニタまでの距離を測る](https://qiita.com/PINTO/items/1828f97d95fdda45f57d)　へ続く