Jetson Nano + Realsense D455 を pyrealsense2で扱えるようにする。

#はじめに
前回、Jetson NanoにJetpack44.1をインストールして使おうとした。現在は使っていない。理由は、Wifiを設定することができなかったからだ。jetpack43で動いていたUSB接続のwifiアダプター、44.1でも認識はする（lsusbにも表示もされる）が、アクティベートできなかった。面倒臭くなったので、jetpackを43に戻した。

ちなみに、前回44.1でtesorflowをインストールして目的の自然言語処理をやらせてみたのだが、PC（i7-4コア）で３時間で済んだ作業が、JetsonNanoでは24時間かかっても終わらなかった。

Jetson NanoをUSB接続のSSDから起動させ、記録領域（ディスク容量）としては128GBを確保してある。他者の記事を参考にしながら、Swapの設定やらも行って、OpenCVのコンパイルもできた。

　　Jetson Nanoの/をUSBドライブにしてSDカードを長生きさせる
　　https://qiita.com/sgrowd/items/87d65383c0b74306ea7d

　　Jetson Nanoにスワップ領域を作成する　ー　とある変人のお道具箱
　　https://www.henjins-toolbox.tech/entry/jetsonnano_make-swap

　　（すんごくありがたい感じで情報が羅列されている掲示板）
　　http://www.neko.ne.jp/~freewing/raspberry_pi/nvidia_jetson_convenience_script/
　　（掲示板の管理人さんのGitリポジトリ）
　　https://github.com/FREEWING-JP/Jetson_Convenience_Script


さらには、書籍も買ってみた。

　　JetsonNano超入門 2019/12 ソーテック社
　　https://www.amazon.co.jp/Jetson-Nano%E8%B6%85%E5%85%A5%E9%96%80-Japan-User-Group/dp/4800712513
　　
以上、先達がいろいろと紹介してはくれるのだ・・・。ありがたいことだ。

さて、いざ、JetsonNanoを使おうとすると「バッテリー駆動できないじゃないか」問題に直面する。

　　JetsonNanoの電源として使えるモバイルバッテリーについて
　　http://kazuki-room.com/mobile_battery_that_can_be_used_as_a_power_source_for_jetson_nano/

上述の記事では、３A出力（急速充電対応）のモバイルバッテリーで起動する、と書いてあるが、起動するものの、USB接続の諸々を動作させるだけの電力が足りないのか、私の環境では数秒でシャットダウンする。Amazonで５V４A出力のモバイルバッテリーなんてみつからず、こいつを駆動させるだけの電力を供給できるモバイルバッテリーを素人は入手できない、と諦めた。

結局、小型で、Arm64なCPUで動き、nvidiaのCudaが使える、メモリ４GBのLinuxマシンで、通常のパソコンより消費電力は低いが、据え置きで使うしかないデスクトップPCとしての運用にする。

結局、私のような半素人では、JetsonNanoの使い道について、”物理的に持ち運び可能なんだけどコンセントが必須のWebサーバー”くらいしか思いつかなくなってしまった。

今回は、”コンセントが必須”という甚だ困った仕様であるが、JetsonNanoをビデオストリーミングサーバーを作って、離れた場所で撮影された映像をPCで見る、という装置を作ってみることにした。


#Jetson Nano に Realsense D455を利用するためのドライバ、ライブラリをインストール
2020年は、格安WEBカメラを見かけなくなった年だった。7月に横浜のド●パラで店員さんに質問した時は「もう、（2000円以下の）安いカメラなんて入手できませんよ、店頭の4000円くらいのを買っておいた方がいいですよ」と言われた。（こんなに優しい表現ではなく、もっと嫌みったらしく”買う気がないなら帰れ”ぐらいの感じで言われたが、若気の至であろうと見逃して差し上げた。そういえば、11月に新橋のじゃ●ぱらでiPadMiniを中古で売ろうとしたら、先輩店員が後輩店員に”ここに傷があるので9000円ほど査定が下がりまして●千円になります”と言わせていた。後輩店員が「震えながら」私に説明したので、何かあると思って売らずに帰った（その後、このアイテムは、別の店で倍以上の値段で売れた）。都会のPCパーツ屋の若者は人を騙すに親切を装うことすらできず、また後輩の心を荒ませるような上下関係もあるらしい・・・と、2020年は人心の荒廃を目の当たりした年でもあった。）

そんな2020年中に購入したカメラの一つは、IntelのRealsense D455である。３D点群取得、Depthセンスの機能の着いたカラーカメラがテーマとなっている業務を受託した都合で、研究開発のために購入したものだ。

　　Intel Realsesnse D455
　　https://www.intelrealsense.com/depth-camera-d455/
　　[<img width = 130 src = "https://www.intelrealsense.com/wp-content/uploads/2020/07/depth-camera-d455-intel-realsense.jpg">](https://www.intelrealsense.com/wp-content/uploads/2020/07/depth-camera-d455-intel-realsense.jpg)

これをJetsonNanoで使ってみることにした。
参考となる情報を次のサイトで発見した。

　　Jetson Xavier NXでRealSense D455を使用する際のインストール方法・注意点
　　https://dev.classmethod.jp/articles/use-realsense-d455-with-jetson-xavier-nx/

こちらのサイト、Jetson Xavier（”ザビエル”って読むのかな？）で動かす例なのだが、要点を理解するにはちょうど良い情報量になっている。私にとって重要なポイントは、１）CMakeを更新する必要があることを教えてくれた、２）pythonでrealsenseを制御するpyrealsenseライブラリのJetson Nano用のインストールスクリプトが別サイトにあることを紹介してくれた、３）Jetson Nano用スクリプトをD455で作動するように改造するべき箇所を示してくれた、という３点だ。

余談だが、クラメソはいろんな情報が集まっていてありがたい。一体どんな会社なんだろうと興味はわくが、なんかありがたい人たちの集団なんだろうな、と距離をとっておくことにする。

さて、このクラメソ情報を参考に、次のとおりに作業した。
１）CMakeの更新
　これは、前項で述べたありがたい掲示板サイトの管理人さんのGithubリポジトリにCMakeのインストールスクリプトがあるのでこれを使わせてもらった。ただ、このConvinienceScriptのリポジトリ全部を、git cloneさせてもらってみたら、サイズのデカさ(約150MB）にびっくりする。なお、スクリプトを使わせてもらってCMakeの更新には、1時間弱の時間がかかった。インストールしたらターミナルを再起動またはsshを再接続すること。

```math
\def\textsmall#1{%
  {\rm\scriptsize #1}
}
​​​​
\textsmall{実は以前にCMake更新なしでrealsenseをインストールしたことがあり、CMake 3.10.2 （Jetpack標準）でもいちおうRealsenseを動作させることができたことは（私の環境だけ？かもしれないので）、王蟲にも聞こえない程度の小声程度にしてメモ。}
```

２）Jetson Nano用のlibRealsense, pyrealsense2インストールスクリプトの取得

```
cd （自分の好きなフォルダへ）
git clone https://github.com/JetsonHacksNano/installLibrealsense
cd installLibrealsense
```

参照先のクラメソの人は、installlibrealsense.shを実行した上で、buildlibrealsense.shを実行しているが、私はinstalllibrealsense.shの実行は不要と判断した。udev.ruleが二重にインストールされることになるのが気に入らなかっただけのことだが・・・。

３）スクリプトをJetsonNano＋D455用に書き換える。
参照先には書いてないが、個人的に重要だと感じたのは、このbuildスクリプトを実行させていただくと、scripts/installdependencies.shも実行され、その中で、aptでcmakeをインストールしてくれたりする。せっかく、cmakeを最新版に更新したのに、システム標準を入れ直すのだ。たぶん、クラメソの人も見落としているんだろうと思う。この余計なお世話処理、消えてもらわねばならぬ。

```
vi ./scripts/installDependencies.sh
------------以下のように変更------------
# This is for ccmake
apt-get install build-essential cmake cmake-curses-gui -y
→　（コメントアウト：行頭に # を挿入）
```

さて、いよいよbuildだ。言うまでもなく、ここが本投稿最大のヤマバだ。本稿作成時点でlibrealsenseの最新バージョンは、2.41.0だったので、バージョンをこれに合わせる。また、cmakeは、/usr/local/binにインストールした更新版を使う。

```
vi ./buildLibrealsense.sh
------------以下のように変更------------
LIBREALSENSE_VERSION=v2.31.0
→ LIBREALSENSE_VERSION=v2.41.0
# D455を利用するため。v2.31.0ではサポート外。

"time " を消す
# timeコマンドがあると、not foundという旨のエラーになるらしい。というか、筆者個人的には本件で時間の厳密な計測は不要・・・。

/usr/bin/cmake ../ -DBUILD_EXAMPLES=true -DFORCE_LIBUVC=true -DBUILD_WITH_CUDA="$USE_CUDA" -DCMAKE_BUILD_TYPE=release -DBUILD_PYTHON_BINDINGS=bool:true
→ /usr/local/bin/cmake ../ -DBUILD_EXAMPLES=true -DFORCE_LIBUVC=true -DBUILD_WITH_CUDA="$USE_CUDA" -DCMAKE_BUILD_TYPE=release -DBUILD_PYTHON_BINDINGS=bool:true -DPYTHON_EXECUTABLE=/usr/bin/python3
# Python3用のライブラリを出力させる（デフォルトではpython（Python2.7）用が出力されてしまう）
--------------------------------------

sh ./buildLibrealsense.sh
# 待つ（1時間弱）

# 出力されたライブラリを移動。（もしくはパスを追加しても良いかもしれません）。

sudo cp /usr/local/lib/python3.6/pyrealsense2/py* /usr/local/lib
```

# Jetson Nano に Realsense D455 を接続
USBポートに刺してしまえばいいのだろう、と思う。JetsonNanoのUSBポート、全てがUSB3.0対応なのだそうだが・・・。D455は、USB-C3.1 Gen.1と仕様に書かれている。多分、全力駆動はできないだろう。

## 動作テスト
まずは、realsense-viewerを動かそう。必要に応じて、カメラのファームウェアのバージョンアップもやってくれる。ただし、realsense-viewerはGUIで動作する。リモートでcui接続している場合は、GUIを使えるように設定して実行。

```
$ realsense-viewer
```

私の環境では、エラーが出てカラーカメラの映像が表示されなかった。Jetson Nano + D400シリーズ + realsense-viewer では、発生する現象らしいので、期待せずに改善を待とう。（例えば、https://github.com/IntelRealSense/librealsense/issues/4031）
・・・ここまででわかるとおもうが、JetsonNanoに過度な期待はよくない。同じ費用で扱うならば、raspberypi4の8GBモデルの方が使い勝手がよいかもしれない。

次に、参照先のクラメソ先輩の動作確認スクリプトを動かしてみる。RealSense D455を接続した状態で、以下のPythonスクリプト実行。

```
$ python3

import pyrealsense2 as rs

ctx = rs.context()
devices = ctx.query_devices()
for device in devices:
  print(device)
```
実行結果例：

```
<pyrealsense2.device: Intel RealSense D455 (S/N: xxxxxxxxxxxxxxxx)>
```
このように、デバイスが列挙表示されたら成功だ！

# まとめ
先達たちの情報を活用して、Jetson Nano Jetpack43に Realsense D455 を接続して、python3 で扱えるようになった。

Jetpack44で新機能にくらいつけたり、モバイルバッテリー駆動させたりすることができれば、とは考えないようにすることも重要であると合わせて学んだ。