NanoPi NEO3 のネットワーク3Dカメラ化

# はじめに
今回は、NanoPi NEO3を入手れたので、少し調べた結果を記録しておきます。
aeroTAP 3D カメラ（https://www.aerotap.com/) を接続して、簡単にネットワーク3Dカメラ化するための手順を記事にしておきます。
NanoPi NEO3は、ARM Cortex-A53(64ビットクワッドコア RK3328)にUSB3.0ポートが付いた極小で安価なSBCです。さらにギガビット イーサーネットも搭載しているので、3Dネットワークカメラの構築にいいのでは？と思います。

![cam2web.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/568972/5a12d1ed-5bea-2afb-2436-8001b284fe6b.png)


# 方法
ここでは、cam2webを使ってカメラをネットワーク化します。

NanoPi NEO3のような安価な極小SBCでリアルタイムで3Dデータをネットワーク越しで得られると、また新しいアイデアが出て来るのではないでしょうか。


#準備するもの
- NanoPi NEO3 (ネットワークケーブル)
- aeroTAP 3Dカメラ
- PC (Putty, ブラウザ)

![DSC_0112.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/568972/9e15e510-499f-4dd6-e482-859c0d893ae7.jpeg)

# ソフトウェア
- cam2web  http://www.cvsandbox.com/projects/cam2web/
- aeroTAP SDK ( Linux版 ) https://www.aerotap.com/developer.html

GitHubにキットをアップしましたのでご利用ください。

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

#NEO3 セットアップ

Nano Pi NEO3のセットアップは、 https://wiki.friendlyarm.com/wiki/index.php/NanoPi_NEO3 を参照しました。
イメージは、`rk3328-sd-friendlycore-lite-focal-5.10-arm64-20210830.img` を使います。下記のステップで作業しました。

- DiskIamgerでMicro SDにイメージを書き込み
- Nano Pi NEO3をネットワークに接続し、電源Onで起動
- DHCPで起動されるので、Nano Pi NEO3のIPアドレスを探す
- PCからssh (Putty)を使って接続
- ユーザー名/パスワード pi/piでログイン

# OS環境の設定
無事にログインできたら、以下のコマンドを実行して必要な環境を設定します。

```perl:
sudo apt-get update
sudo apt-get upgrade

sudo apt-get intall libudev-dev
sudo apt-get install libv4l-dev
sudo apt-get install libjpeg8 libjpeg8-dev 
```
# cam2web のビルド
cam2web をGitHubからダウンロードして、いくつかのaeroTAP 3Dカメラを使うためにカメラ部分のコードを変更します。
変更したcam2webのコードをGitHubにアップしました。
ダウンロード、展開してビルドします。

```perl:
tar -vxzf cam2web.tar.gz
cd ~/cam2web-aeeoTAP/src/tools/web2h/make/gcc
make
cd ~/cam2web-aeroTAP/src/apps/linux
make
```
# cam2webの実行

ビルドが成功したら、後はaeroTAP 3DカメラをNano Pi NEO3のUSBポートに接続して実行するだけですが、その前に、aeroTAP SDKのライブラリを共有化します。

```perl:
export LD_LIBRARY_PATH=~/cam2web-aeroTAP/src/core/cameras/aeroCAM/lib/linux_aarch64
```

cam2webを実行する前に、コマンドライン パラメータを確認してください。

```perl:
./cam2web -?
```
`-size<0-12>` パラメータでカメラの解像度を選択できます。
利用可能な解像度は、利用する aeroTAP 3Dカメラにより異なります。

|aeroTAP 3D G2 | aeroTAP 3D | aeroTAP 3D GS |
|:-:|:-:|:-:|
| 320x240  |  320x240 | -  |
| 640x480  | 640x480  | 640x480  |
|  -   | 640x400  | -  |
|  1280x720   | -  | 1280x720   |

例えば、aeroTAP 3D G2カメラを使っている場合、`-size:0`, `-size:2`, `-size:3` を選択することができます。
解像度が小さいほど高速で画像が得られます。
  
```perl:
./cam2web -size:0
```

# 結果の表示
エラーなく起動できたら、PCのブラウザから3D画像(Depth Map)をストリーミングしてみましょう。
ブラウザを起動して、URL `http://192.168.1.131:8000` を入力します。
* IPアドレスは、Nano Pi NEO3のIPアドレスです。
結構高速で3Dデータを色で表した画像ストリーミングが得られます。
`-size:3`で1280x720で取得してみましょう。
これをRaspberry pi3で実行すると非常に遅いのですが、さすがNano Pi NEO3です。

# その他拡張
カメラに関するソースコードは、`/cam2web-aeroTAP/src/core/cameras/V4L2/XV4LCamera.cpp` になります。
aeroTAP SDKを使っています。
カラー画像化した3Dデータをストリーミングしています。
カラー画像、グレースケール画像、3D RAWデータに変えたりできます。
3D RAWデータで別のPCで取得して、3D表示/解析するなども可能になります。

```perl:
#define 		_IMAGE_COLOR 0 
#define 		_IMAGE_GRAY 1 
#define 		_IMAGE_DEPTH 2
#define 		_IMAGE_DEPTHRAW 3
...
bool XV4LCameraData::Init( )
{
...
	nImageType = _IMAGE_DEPTH;
```
# Raspberry Pi 3での実験
同じ手順で、Raspberry Pi3のネットワーク3Dカメラ化も可能です。
Raspberry Pi 3では、aeroTAP SDK /linux_arm フォルダのライブラリを使うことに注意してください。
ビルド前に、`cam2web-aeroTAP/src/apps/linux/Makefile` line:95 を編集してください。

```perl:
	$(COMPILER) -o $@ $(OBJ) $(LDFLAGS) -L/home/pi/aeroTAP/lib/linux_arm
```
`cam2web-aeroTAP/src/core/cameras/aeroCAM/lib/linux_arm`フォルダー内のlibaeroTAP-sdk.so を共有化します。 

```perl:
export LD_LIBRARY_PATH=~/cam2web-aeroTAP/src/core/cameras/aeroCAM/lib/linux_arm
```
*Raspberry Pi3では、640ｘ480 が限界でしょうか。1280x720では相当フレームの更新が遅いです。

# その他Linux ( Ubuntu )
Ubuntuでは、aeroTAP SDK /linux64 フォルダのライブラリを使うことに注意してください。同様にMakefileを編集してください。

# 終わりに
今回、aeroTAP 3Dカメラを接続するためにcam2webのL4L2のコードを基に最小限変更してみました。画像の切り替えなどもクライアント側からできるといいのですが、何もしてません。
さらに展開してもらえれば幸いです。