Raspberry Pi3 Model B aeroTAP 3Dカメラ接続環境構築手順

# はじめに
最近、改めてRaspiberry pi3 Model Bに3Dカメラを接続したので、最新情報での簡単構築手順について説明します。最新版OSでRaspberry pi3を設定」していると、問題もあり、また多くの時間がかかったのでここで設定した環境のイメージをアップしておきました。
早速　aeroTAP 3D USBカメラを接続して使っていたい方は、イメージをダウンロードしてご利用ください。

Raspberry Pi3 aeroTAP 3D USBカメラキットはこちらから購入できます。

https://www.amazon.co.jp/%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF-Raspberry-aeroTAP-USB%E3%82%B1%E3%83%BC%E3%83%96%E3%83%AB3-0%E4%BB%98%EF%BC%89-%E3%82%B9%E3%82%A4%E3%83%83%E3%83%81%E4%BB%98%E3%81%8D%E9%9B%BB%E6%BA%90/dp/B0B7G9RVRK/ref=sr_1_3?crid=2REY1HT2QBYOC&keywords=aerotap&qid=1660558666&sprefix=aerotap%2Caps%2C205&sr=8-3

https://www.aerotap.com

# できること
環境設定ができると、Raspberry pi3上でaeroTAP 3D USBカメラ用のサンプルプログラムを実行したり、3Dカメラをネットワーク3Dカメラサーバーとして稼働したりすることができます。

また、aeroTAP 3D USBカメラを使うためのpythonの環境も構築し、サンプルを実行します。

# 準備するのも

- Raspberry Pi3 Model B (Raspberry Pi4でもほとんど同様の手順となります)
- aeroTAP 3D USBカメラ ( G1, GSまたはG2 ) 
- ネットワーク( Wifiなど )
- aeroTAP SDKおよび cam2webは、下記からダウンロード

https://github.com/Taisuke-S/aeroTAP-SDK

https://github.com/Taisuke-S/cam2web-aeroTAP


# Raspberry Pi3の初期設定
[Raspberry pi Imager](https://www.raspberrypi.com/software/ "Raspberry Pi Home")を使ってSDカードを作成します。
Raspberry pi Imagerをダウンロードして、実行します。
![RaspiImager.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/568972/1c3bd05b-c6b7-ae2c-db06-3a017d193ec3.png)

- Release 4.2 Narch 2022

イメージを作成したら、Raspberry Pi3に差し込んで、起動します。
起動後必要な設定を行ってください。
- Wifi設定
- ユーザー作成 (piユーザー)
アップデートが自動的に開始され、再起動します。(約2時間ほどかかりました)

再起動後 [Preference]>[Raspberry Pi Configuration]を起動して、SSHを有効します。
- SSH (ファイル転送に使います)

:::note info
RaspiのIPアドレスを確認しておいてください。ここでは、192.168.3.73とします。
:::

# 環境構築
ダウンロードした aeroTAP SDKおよび cam2web.tar.gzをRaspiにアップロードしてください。

:::note info
ファイルの転送には[FileZilla](https://filezilla-project.org/download.php?type=client,"FileZilla)が便利です。
:::

## 最低必要なライブラリのインストール
aeroTAP-sdk サンプルを実行するために以下のライブラリが必要です。

```ruby:qiita.rb
sudo apt install libusb-dev
sudo apt install libudev-dev freeglut3-dev
sudo apt install libv4l-dev
sudo apt install libpng-dev libjpegp-dev
sudo apt install cmake
```

## サンプルコードのビルド
アップロードした aeroTAP-SDK.tar.gz, cam2webを展開します。
```ruby:qiita.rb
pi@raspberrypi: tar -xvzf aeroTAP-SDK.tar.gz
pi@raspberrypi: tar -xvzf cam2web.tar.gz
```
### RGBDビルド
RGBDは、aeroTAP 3Dカメラからカラー画像を深度マップを取得して表示するサンプルです。
以下の手順でビルドします。
```ruby:qiita.rb
pi@raspberrypi: cd aeroTAP/sample/RGBD
pi@raspberrypi:~/aeroTAP/sample/RGBD $ mkdir build
pi@raspberrypi:~/aeroTAP/sample/RGBD $ cd build
pi@raspberrypi:~/aeroTAP/sample/RGBD/build $ cmake ..
pi@raspberrypi:~/aeroTAP/sample/RGBD/build $ make
```
正常にビルドされているか確認してください。aerotap_RGBD 実行ファイルが作成されます。
実行してみてください。距離を色で表現した深度マップが表示されたWindowが開きます。

```ruby:qiita.rb
pi@raspberrypi:~/aeroTAP/sample/RGBD/build $ ./aerotap_RGBD
```

画像をクリックすると、[カラー画像]>[グレースケール画像]の準備に切り替わります。
| 深度マップ | カラー画像 | グレイスケール画像 |
|:-----------|------------:|:------------:|
| ![depth.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/568972/a74d50ae-e80b-b6d3-4120-09ed45a16169.png) | ![color.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/568972/abff364b-31df-97e2-f45d-14a843423eb0.png)| ![gray.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/568972/c8034cc6-5c84-dc67-ed56-b9a3b8bdd105.png)| 

:::note info
aeroTAP 3D USB G2カメラでの画像
:::
[Esc]キーで終了します。

## 起動パラメータ
ソースコードを確認しても分かりますが、以下のパラメーターが利用可能です。

```ruby:qiita.rb
	std::cout << "Options: -j MJPG,  -u uSB2.0, -f Enable Post Filter \n"
				 "Resolution: -r0 qvga, -r1 VGA, -r2 Wvga, -r3 HD\n" << std::endl;
```
- -j オプションでカラー画像をMJPGモードで取り込みます。FPSを高速化できます。
- -u USB20に接続している場合のオプションです。自動で認識されていない場合のみ指定します。
- -f 深度マップを簡単にPost処理します。
- -rX X:0 320x240, 1 640x480, 2 640x400 or 640x360, 3: 1280x720 ( GS or G2のみ)
:::note info
Raspberry pi 3/4 Nano Pi等のUSB3.0に接続しても aeroTAP 3D USBカメラは、動作しません。USB2.0で接続してください。
:::

### PalmTrackビルド
PalmTrackは、aeroTAP 3Dカメラからのカラー画像/深度マップから手のひらを検出して表示するサンプルです。
以下の手順でビルドします。
```ruby:qiita.rb
pi@raspberrypi: cd ~/aeroTAP/sample/PalmTrack
pi@raspberrypi:~/aeroTAP/sample/PalmTrack $ mkdir build
pi@raspberrypi:~/aeroTAP/sample/PalmTrack $ cd build
pi@raspberrypi:~/aeroTAP/sample/PalmTrack/build $ cmake ..
pi@raspberrypi:~/aeroTAP/sample/PalmTrack/build $ make
```
正常にビルドされているか確認してください。aerotap_PalmTrack 実行ファイルが作成されます。
実行してみてください。
距離を色で表現した深度マップが表示されたWindowが開きます。手のひらをカメラに向け、検出されると矩形が表示されます。

```ruby:qiita.rb
pi@raspberrypi:~/aeroTAP/sample/PalmTrack/build $ ./aerotap_PalmTrack
```

画像をクリックすると、[カラー画像]>[グレースケール画像]の準備に切り替わります。
[Esc]キーで終了します。

# cam2web カメラサーバーの作成
cam2web.tar.gzを展開して、ビルドします。cam2web 実行ファイルが作成されます。
```ruby:qiita.rb
pi@raspberrypi:~/ $ tar -xvzf ./cam2web.tar.gz
pi@raspberrypi:~/ $ cd cam2web/src/apps/linux
pi@raspberrypi:~/ $ cd cam2web/src/apps/make
```
cam2webを実行します。
```ruby:qiita.rb
pi@raspberrypi:~/cam2web/src/apps/ $ ./cam2web
```
:::note info
ライブラリ libaeroTAP-sdk.so が見つからないとエラーが表示される場合は、LD_LIBRAYRY_PATHを設定してください。
export LD_LIBRARY_PATH=/home/pi/aeroTAP/lib/linux_arm.pi3/  
:::

## ブラウズ
PCからブラウスして見てください。3Dカメラからの深度マップ画像をストリーミングできます。

```ruby:qiita.rb
http://192.167.3.73:8000/

直接動画をストリーミングする場合:
http://192.167.3.73:8000/camera/mjpeg

画像を取得する場合:
http://192.167.3.73:8000/camera/jpeg

```

:::note info
IPアドレスは、RaspiのIPアドレスを指定します。ポート番号 8000がデフォルトです。起動オプションにより解像度、表示内容、ポート番号などを変更することができます。以下のコマンドで利用可能なパラメーターを表示できます。
cam2web -?

:::

# 複数のネットワーク3Dカメラからの取得
複数ネットワーク3Dカメラを構築したら、中央PCから同時に参照したくなります。下記のサイトにサンプルプログラムをアップしましたので、お試しください。

https://qiita.com/nextEDGE-aeroTAP/items/3a3cb7b21ccc5fdf43b0

# Pythonで扱う3Dカメラ 
aeroTAP 3D USBカメラを扱うためのPythonライブラリは、aeroTAP/lib/pythonフォルダーにあります。実行するには、Python + Opencvの環境が必要です。

今回、Raspberry Pi3 Model BのOSバージョン
- Debian 11.4
- Python 3.9.2 (default, Mar 12 2021, 04:06:34)
すでに python3, pip3はインストールされているようでした。
その場合、下記のコマンドでnumpy. opencvがpython3で使えるようになるはずですが、import cv2でエラーが発生します。

```ruby
sudo pip3 install numpy
sudo pip3 install opencv-python
sudo pip3 install opencv-contrib-python

python3
>>>import cv2
```

ネットでいろいろ調べたことろ下記の方法で解決できました。

まず、不足しているライブラリのインストール
```ruby
sudo apt-get install libhdf5-dev libhdf5-serial-dev libatlas-base-dev
```

opencv-contribをアンインストールして、3.4.14.51をインストール
```ruby
sudo pip3 uninstall opencv-contrib-python
sudo pip3 --default-timeout=1000 install opencv-contrib-python==3.4.14.51

python3
>>>import numpy
>>>import cv2
```

numpyでエラーがでます。

```ruby
ImportError: numpy.core.multiarray failed to import
```

numpyの更新

```ruby
pip install numpy --upgrade

python3
>>>import numpy
>>>import vc2
```
エラーなく、成功しました。

# pythonサンプルの実行
LD_LIBRARY_PATHを設定(設定していない場合)して、
例
```ruby
export LD_LIBRARY_PATH=/home/pi/aeroTAP/lib/linux_arm.pi3/
```
cd ~/aeroTAP/lib/python

## aerotap.py サンプル
カメラを接続して、pyファイルを実行してください。
```ruby
python3 ./aerotap.py
```
aeroTAP 3D USBカメラからカラー画像と、深度マップをカラー表示します。
デモは、'q'キーで終了、または一定フレーム数で終了します。

## aerotapPalm.py サンプル
こちらは、手のひら検出を使った例です。
```ruby
python3 ./aerotapPalm.py
```
aeroTAP 3D USBカメラからカラー画像、手のひらを検出すると矩形を表示します。
デモは、'q'キーで終了、または一定フレーム数で終了します。

pythonライブラリが正しく実行できたら、pythonライブラリを使って独自のアプリに挑戦し手見てください。


# 作成したRaspberry Pi3用イメージ
久しぶりに最新環境でRaspberry Pi3を設定すると、多くの問題で時間を浪費してしまいました。
ここで設定したRaspberry pi3のSDカードイメージをアップしておきましたので、aeroTAP 3D USBカメラで利用したい場合は、こちらのイメージを使っていただければ簡単い作業に入れます。

[raspi3-March2022-aerotap.rar](https://www.aerotap.com/xfer/raspi3-March2022-aerotap.rar)

ダウンロード、展開後、Win32DiskImagerを使って、SDカードに書き込んでください。

ユーザーID/パスワードは、pi/pi です。

:::note info
起動後、WiFiなどネットワークの設定を行ってください。
:::

:::note info
イメージには、aeroTAP SDK, cam2webがすでに含まれていますが、最新版をGithubからダウンロードしてご利用ください。
:::

# 参考文献
[NumPyとOpenCVのimportでエラーが出る件] https://qiita.com/thinknee/items/9489119c8b85d9323132
[ラズパイ(Raspberry Pi)へのOpenCVのインストール方法・手順] https://python-academia.com/raspberrypi-opencv/