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


はじめに

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

ちなみに、前回44.1でtesorflowをインストールして目的の自然言語処理をやらせてみたのだが、PC(i7-4コア)で3時間で済んだ作業が、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/

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

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

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

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

Jetson Nano に Realsense D455を利用するためのドライバ、ライブラリをインストール

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

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

  Intel Realsesnse D455
  https://www.intelrealsense.com/depth-camera-d455/
  

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

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

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

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

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

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

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

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

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

3)スクリプトを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で新機能にくらいつけたり、モバイルバッテリー駆動させたりすることができれば、とは考えないようにすることも重要であると合わせて学んだ。