Jetson NanoにJetPack 4.4/4.5を入れてTensorFlow・物体検出・姿勢推定・ROS2(Realsense)・ROS1を動かす

# Jetson Nanoに満を持してJetPack 4.4/4.5を入れてみました
　からあげといいます。半年ほど前に「Jetson Nano超入門」という本を共著で書きました。詳しくは以下ブログ記事参照ください。

[共著で書いた本「Jetson Nano超入門」が12/21に発売されます](https://karaage.hatenadiary.jp/entry/2019/11/29/073000)

　ただ、この手の本の宿命として、書いたタイミングと発売するタイミングで基本ソフト（JetPack）のバージョンが異なり、本の通りにやってもうまく動かないということがありました。一応本やサポートサイトでは、古いバージョンのソフトでの動作を推奨しているのですが、気づかない人も多いし、最新のソフトで動かしたいのが人情というものですよね。

　というわけで、ずっと先延ばしにしていたJetPack 4.4を入れて、本に書いてあることを色々試してみました。書籍のサポートという位置付けで記事を書きたいと思います。

追記：JetPack 4.5でも動作確認実施しましたので、JetPack 4.5にも対応しています。

　以下のまとめ記事でも、JetPack 4.4/4.5に関して追記していますが、この記事ではJetPack 4.4/4.5に特化して情報をまとめています。
[Jetson Nano関係のTIPSまとめ](https://qiita.com/karaage0703/items/b14c249aa33112669ee4)

　

# JetPack4.4以降で変わったこと
　JetPackはバージョンごとで、変更が結構あります。、今までJetPack 4.2以前しか使っていなかったのですが、4.2以降の変更として、以下が影響大きそうです。

- TensorFlow 1.x -> 2.x
- OpenCV3.x -> 4.x

 TensorFlowは 1.xをインストールすることも可能です。現状 TensorFlow 2.x系はハマりやすそうなので、TensorFlow 1.xを使った方が無難かもしれません。この記事でも、基本的にTensorFlow 1.x系を前提に説明していきます。
　
# JetPack 4.4でやったこと
　以下を実施しました。順に説明していきます。

- TensorFlowセットアップ
- 物体検出
- 姿勢推定
- ROS2(+Realsense)セットアップ

　使用している画像は、古いJetPackを使用したものもありますが、全部JetPack4.4で動作確認をしています。

## TensorFlowのインストール
　色々変わっていたので、JetPack 4.5用のセットアップスクリプトを作成しました。以下を実行すればセットアップできます。

```sh
$ git clone https://github.com/karaage0703/jetson-nano-tools
$ cd jetson-nano-tools
$ ./install-tensorflow-v45.sh
```

　JetPack 4.4の場合は、最後の1行を以下に変更ください。

```sh
$ ./install-tensorflow-v44.sh
```

 参考にしたのは以下の公式情報です。

[Jetson NanoへのTensorFlowセットアップ方法（公式）](https://docs.nvidia.com/deeplearning/frameworks/install-tf-jetson-platform/index.html)

　JetPackでのTensorFlow2.x系ですが、本記事のコメントにもあります通り、正直挙動が相当怪しいです。

　JetPack 4.4では、当面ver1.x系を使用した方が無難かもしれません。ver1.x系のセットアップ方法に関しては、上記の公式情報を参照ください。

　JetPack 4.5のインストールスクリプトでは、ver1.x系がインストールされます。

## 物体検出
　TensorFlowのObject Detection APIというソフトを使いやすくする、拙作のソフト「Object Detection Tools」を使用します。以下コマンド実行すれば、物体検出がうごきます。

```sh
$ cd && git clone https://github.com/karaage0703/object_detection_tools
$ cd ~/object_detection_tools/models
$ ./get_ssdlite_mobilenet_v2_coco_model.sh
$ cd ~/object_detection_tools
$ python3 scripts/object_detection.py -l='models/coco-labels-paper.txt' -m='models/ssdlite_mobilenet_v2_coco_2018_05_09/frozen_inference_graph.pb' -d='jetson_nano_raspi_cam'
```

　実行結果のイメージ画像です。写真の人物は私ではなく、友人のロンスタさん（[変デジ研究所](https://lab.hendigi.com/)）です。

<img width="600" alt="object_detection_tools.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81919/a6bd2b93-e278-259f-5417-f32ad04a8b83.png">


　Object Detection Toolsに関して詳しく知りたい方は、以下ブログ記事やQiita記事も参照ください。

[TensorFlowの物体検出用ライブラリ「Object Detection API」を手軽に使えるソフト「Object Detection Tools」を作ってみた](https://karaage.hatenadiary.jp/entry/2019/05/27/073000)



## 姿勢推定
　JetPack 4.5の場合は以下でセットアップします。

```sh
$ git clone https://github.com/karaage0703/jetson-nano-tools
$ cd jetson-nano-tools
$ ./install-tensorflow-v45.sh
$ ./install-pose-estimation-v45.sh
```

　JetPack 4.4の場合は以下となります。

```sh
$ git clone https://github.com/karaage0703/jetson-nano-tools
$ cd jetson-nano-tools
$ ./install-tensorflow-v44.sh
$ ./install-pose-estimation-v44.sh
```

　姿勢推定のソフト「[tf-pose-estimation](https://github.com/ildoonet/tf-pose-estimation)」がそのまま動かなかったので、色々ソフト修正しています。基本的にはコメントアウトしまくっただけです。推論だけなら不要なコードが多いので動いています（学習はできなくなっていると思います）。

　ラズパイカメラモジュールを使用する場合は、以下実行してください。

```sh
$ cd ~/tf-pose-estimation
$ python3 run_jetson_nano.py --model=mobilenet_v2_small --resize=320x176
```

　普通のWebカメラの場合は、以下実行してください。

```sh
$ python3 run_webcam.py --model=mobilenet_v2_small --resize=320x176
```

　ラズパイカメラモジュールが接続されている状態でWebカメラを使用する場合は、以下となります。

```sh
$ python3 run_webcam.py --model=mobilenet_v2_small --resize=320x176 --camera=1
```

　実行した結果のイメージ図は以下です。

![openpose.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81919/bbda27fd-6f96-6bfb-2c9c-908d41191de0.gif)

　姿勢推定（骨格検出）に関して、詳細は以下記事参照ください（JetPack4.4に関しても追記してあります）。

[Jetson Nanoに骨格検出を実現するソフト「tf-pose-estimation」をセットアップする方法](https://qiita.com/karaage0703/items/1f6f4f19e623102715bb)

## ROS2のインストールとRealSense D435のセットアップ
　ROS2をセットアップします。ROS1に関しては、この次に記載しますのでROS1が必要な方はそちらを参照ください。ROS2との共存も可能です。

　セットアップスクリプトを用意しましたので、以下コマンドを実行すればインストールできます。

```sh
$ git clone 
$ cd jetson-nano-tools
$ ./install-ros2-dashing.sh
```

　インストールが終わったら、亀のシミュレータを動かします。以下でインストールして起動します。

```sh
$ sudo apt install ros-dashing-turtlesim
$ source /opt/ros/dashing/setup.bash
$ ros2 run turtlesim turtlesim_node
```

![ros2_turtle.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81919/fe47f61e-dd97-e25e-d27a-95ff488a0bda.jpeg)
　亀出ました

　続いて、3DカメラモジュールのRealSense D435を動かしてみます。RealSense D435のROS2ラッパーをインストールします。

　Intelの公式リポジトリのREADME通りでセットアップできました。[intel/ros2_intel_realsense](
https://github.com/intel/ros2_intel_realsense)

　以下はREADMEからの抜粋した、実行したコマンドです。最新のセットアップ方法に関しては、公式のREADMEを確認するようにしましょう。

```sh
$ sudo apt-get install ros-dashing-cv-bridge ros-dashing-librealsense2 ros-dashing-message-filters ros-dashing-image-transport
$ sudo apt-get install -y libssl-dev libusb-1.0-0-dev pkg-config libgtk-3-dev
$ sudo apt-get install -y libglfw3-dev libgl1-mesa-dev libglu1-mesa-dev
$ sudo apt-get install ros-dashing-realsense-camera-msgs ros-dashing-realsense-ros2-camera
```

　あとは、Rvizの設定ファイルもダウンロードしておきます。

```sh
$ wget https://raw.githubusercontent.com/intel/ros2_intel_realsense/master/realsense_ros2_camera/rviz/ros2.rviz
```

　起動は、以下実行すればOKです。

```sh
$ source /opt/ros/dashing/setup.bash
$ ros2 run realsense_ros2_camera realsense_ros2_camera
```

　Rvizというソフトで可視化してみましょう。別のウィンドウを開いて、以下コマンドでダウンロードした設定ファイルを読み込んでRvizを起動します。

```sh
$ source /opt/ros/dashing/setup.bash
$ ros2 run rviz2 rviz2 -d ros2.rviz
```

　ババーンと、カラーカメラ情報、デプス情報、赤外線画像が表示されます。赤外線画像は、奥行き推定のために照射している赤外線のランダムドットパターンが見えますね。

![ros2_realsense.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81919/b2c03831-ac1e-e22b-5236-3b98a1bc0537.jpeg)

　PCL(Point Cloud)をみるときは、少し注意が必要です。何故か、 ROS1では繋がっていた `camera_depth_optical_frame`と`camera_link`のフレームが繋がっていないので、Fixed Frameに`camera_depth_optical_frame`を指定して、`/camera/depth/color/points`を指定する必要があります。

　設定と表示した様子は以下となります。

![rviz2_pcl.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81919/51c970f6-1416-1dc3-f00c-f3bf48f92672.jpeg)

　単純に、リアルセンス単体の動作を確認する場合は、以下のコマンドでもOKです。

```sh
$ rs-capture
```

　また、ファームウェアのバージョンアップに必要なrealsense-viewerが含まれているlirealsenseは、ダウンロードしておいた方がよいでしょう。以下記事も参考にしてみてください。

[Jetson NanoでIntel Realsense D435を使う方法（ROS対応）](https://qiita.com/karaage0703/items/cb9bbe1b4f2504f8ad0d)

[Jetson NanoでRealsenseのPythonラッパーPyRealsenseを使用する方法](https://qiita.com/karaage0703/items/39040f23cbb0611c0a0e)

　今回のセットアップに参考にしたのは、以下のサイトです。

- [Jetson Nano+ROS2上でのIntel RealSenseの動作と注意点](https://rb-station.com/article/jetson-nanoros2%E4%B8%8A%E3%81%A7%E3%81%AEintel-realsense%E3%81%AE%E5%8B%95%E4%BD%9C%E3%81%A8%E6%B3%A8%E6%84%8F%E7%82%B9)
- [Installing ROS 2 via Debian Packages¶](https://index.ros.org/doc/ros2/Installation/Dashing/Linux-Install-Debians/)

## ROS1のインストール
　JetPack 4.4/4.5でROS1もRealsenseも動きました。特に問題なくROS2とも共存できます。

　セットアップ記事は以下参照ください。

[Jetson NanoにROSをインストールする方法](https://qiita.com/karaage0703/items/aa54e086f0a2f165d3e9)

[Jetson NanoでIntel Realsense D435を使う方法（ROS対応）](https://qiita.com/karaage0703/items/cb9bbe1b4f2504f8ad0d)

## JetPack4.4でのハマりどころ
　JetPack4.4でのハマりどころのまとめです。TensorFlow2.xになったことでのハマりどころもたくさんありますが、それはJetPackの問題ではないので割愛しています（エラーメッセージでググりましょう）。

### `tf.__version__`でエラーが発生する
　JetPack4.4で発生しました。Twitterで教えてもらいましたが、`tf.version.VERSION`でバージョンが確認できるようです。何故…Twitter情報だと JetPack4.3では発生しないとのこと。何故…

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">やっぱりそうなんですね。<br>jetpack 4.4のtensorflow2.xの挙動がよくわかりません...<br><br>わかったのは、<br>tf .__ version__ =&gt; NG<br>tf.version.VERSION =&gt; OK<br>でした。<a href="https://t.co/6jwSRl3Yzl">https://t.co/6jwSRl3Yzl</a> <a href="https://t.co/e6DqcEp3hg">pic.twitter.com/e6DqcEp3hg</a></p>&mdash; nb.o (@Nextremer_nb_o) <a href="https://twitter.com/Nextremer_nb_o/status/1266736451200315392?ref_src=twsrc%5Etfw">May 30, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

とりあえず使いたいソフトに`tf.__version__`がある場合は、コメントアウトするなりしましょう。自分のソフトに関しては、tryで囲んでます。

### ラズパイカメラモジュール（RaspiCamV2）が動かない
　いつからかは不明ですが、解像度設定 3280 x 2464ではラズパイカメラが動かなくなっていました。解像度を 1920 x 1080 に落とすことで解決しました。自分で作成したソフトは、解像度1920x1080に修正しています。

参考：[カメラ画像をJetson nanoで表示させたい](https://teratail.com/questions/261690)

### ディープラーニングで推論するとカメラが遅れる
　カメラが数秒遅れます。Twitterで対策をフォロワーさんに教えてもらいました。~~私自身は試せていませんが、参考情報として教えてもらった対策方法を紹介いたします。~~ 試しました。両方とも効果ありです！

　手っ取り早くは、キャプチャのreadを何度か空打ちすれば良いようです。Gstreamerのバッファがたまってしまっているのが問題ではないかとのことです。

```python
    while(cap.isOpened()):
        # ret, frame = cap.read()
        for i in range(5):
            ret, frame = cap.read()
        if ret == False:
            print('VideoCapture read return false.')
            break
```

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ちょっくんに<a href="https://t.co/18fE7Hx4Mf">https://t.co/18fE7Hx4Mf</a>()を数回空打ちしてあげると、遅れないようになったのでやっぱりバッファに溜まっているのですね...<br>うーん...　過去のJetPackはどうだったでしょうかね？思い出せないです。<a href="https://t.co/aJ6bWPrxsh">https://t.co/aJ6bWPrxsh</a></p>&mdash; nb.o (@Nextremer_nb_o) <a href="https://twitter.com/Nextremer_nb_o/status/1267014406489034753?ref_src=twsrc%5Etfw">May 31, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

[参考にしたコード](https://github.com/NobuoTsukamoto/tf_trt_models/blob/6a72ec9840e5584abefb9adab7aa55661994175e/examples/detection/object_detection_capture_opencv.py#L153)

　もしくは、gstreamerのオプション変更でも対応できるそうです。こっちのほうがスマートそうですね。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">（昨日の夜読むと言いながら、子供の寝かしつけでそのままおねんねしていました😅）<br><br>リンクにあるgstreamerの文字列に”drop=true sync=false”を追加したところ遅延がなくなりました。<br><br>こちらのほうがすっきりします。<a href="https://t.co/xPpJjOzI4x">https://t.co/xPpJjOzI4x</a></p>&mdash; nb.o (@Nextremer_nb_o) <a href="https://twitter.com/Nextremer_nb_o/status/1267387086346129408?ref_src=twsrc%5Etfw">June 1, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# まとめ
　Jetson NanoをJetPack4.4に対応してみました。バージョンアップするだけで、ソフトがそのままでは色々動かなくなるのはOSSの宿命とはいえ、なかなか辛いものがありますね。ただ、最新の技術に触れる良い機会でもあります。色々発見もありました（不毛な時間も多いですが）。そこまで理由がなければ、JetPack4.2か4.3を使用した方が良いかなというのが自分の感想です。

　最後に「Jetson Nano超入門」はJetson Nanoの入門書としては有用な数少ない書籍と思いますので、もしよろしければ合わせてご購入検討ください。書籍の紹介や、サポートサイトへのリンクは以下参照ください。

[共著で書いた本「Jetson Nano超入門」が12/21に発売されます](https://karaage.hatenadiary.jp/entry/2019/11/29/073000)

　まあ、本を買わなくても今回の記事の内容は、記事読めば全部できちゃうんですけどね、HAHA！

# 関連記事
[Jetson Nano関係のTIPSまとめ](https://qiita.com/karaage0703/items/b14c249aa33112669ee4)

[「Jetson Nano超入門」サポートページ](https://karaage.hatenadiary.jp/jetson-nano-book)

# 変更履歴
- 2021/02/15 JetPack 4.5に関して追記
- 2020/07/15 微修正・誤記訂正
- 2020/06/05 ROS1のインストールに関して追記
- 2020/06/02 カメラが遅れる問題に関して実機確認結果を追記 / ROS2のPCL表示に関して追記
- 2020/06/01 ディープラーニング使用時にカメラが遅れる問題に対する対策追記