Jetson Nano 2GB Developer Kit(メモリ2GB版Jetson Nano)でROSインストール済みのDockerイメージを用意して、コンテナ内のROSを使うまでをメモします。
この記事はROS/ROS2 Advent Calendar 2020の16日目の記事です。
概要
Jetson Nano 2GB Developer Kit用JetPackでJetson Nanoを起動して、ROSインストール済みのDockerイメージをベースにdusty-nv/jetson-inferenceとdusty-nv/ros_deep_learningをインストールしたイメージを作成します。 メモリ4GB版でも適宜読み替えればそのまま実行できるかもしれませんが、部分的にしかメモリ4GB版では確認していないため、「メモリ2GB版Jetson NanoでDocker内のROSを使うまで」ということにしています。
使用するもの
Jetson Nano 2GB Developer Kit
Jetson Nano用のmicroSD
Dockerイメージを保存するので64GB以上はほしいです。
Jetson Nano用の無線LANアダプタ
2.4GHz帯しか対応していませんが、追加でのドライバインストールせずに使えたのでおすすめです。
Jetson Nano用のUSB Type-Cの電源
ノートパソコンを充電するときに使っているものと同じものを使っています。
Jetson Nanoに接続するカメラ
CSI接続のカメラモジュールを使います。USB接続のWebカメラでも使えると思います。
Jetson NanoへのJetPackのインストール
JetPack 4.4.1を使用します。 NVIDIA DeveloperのJetPack SDKのページ(https://developer.nvidia.com/embedded/jetpack)によると、Jetson Nano 2GBはJetPack 4.4.1以降(JetPack 4.4.1にはL4T 32.4.4とCUDAのライブラリ等が含まれています)でしか動かないようです。
JetPack 4.4.1 includes L4T 32.4.4 with these highlights:
Support for Jetson Nano 2GB Developer Kit
All other features and benefits from L4T 32.4.3
JetPack 4.4 includes L4T 32.4.3 with these highlights:
- Support for upgrading JetPack and L4T using debian package management tool
- Support for Generic Timestamping Engine (GTE) for Jetson AGX Xavier and Jetson Xavier NX
- Support for Dynamic Frequency Scaling (DFS) for Video Image Compositor (VIC) using actmon
- SE (Security Engine) samples to demonstrate hardware backed authentication and encryption capabilities of Jetson TX2 series, Jetson AGX Xavier and Jetson Xavier NX modules
- Utility to fuse multiple Jetson modules simultaneously
- Option to specify APP partition size on the microSD card during initial configuration at first boot of Jetson Xavier NX and Jetson Nano Developer Kits
- Supports Vulkan 1.2
余談ですが、JetPackとL4Tのそれぞれのバージョンの対応リストは以下のページから確認できます。

イメージのダウンロード
以下のページからJetson Nano 2GB用のJetPack4.4.1のイメージファイルをダウンロードします。6.5GBほどありました。

以下の画像はJetPack SDKのトップページのスクリーンショットです。

Jetson Nano 4GB用の jetson-nano-4gb-jp441-sd-card-image.zip とJetson Nano 2GB用の jetson-nano-2gb-jp441-sd-card-image.zip があり、Jetson Nano 2GBでは jetson-nano-4gb-jp441-sd-card-image.zip のイメージではOSが正常に起動しないようです。
また、Jetson Nano 2GBとJetson Nano 4GBではデスクトップ環境が異なるようです。以下の「デスクトップ環境の違い」に書きました。
イメージの書き込み
イメージの書き込みにはbalenaEtcherがおすすめです。 microSDカードを選択して、書き込むイメージファイルを圧縮ファイルのままドラッグ&ドロップし、「Flash」ボタンを押すだけで書き込みができます。 WindowsだけでなくmacOSとLinuxにも対応しています。

NVIDIAのGetting StartedのドキュメントでもbalenaEtcherが紹介されています。
balenaEtcherは以下のページからダウンロードできます。

Jetson Nanoの初期設定
Jetson Nanoの電源を入れ、L4Tを起動します。

最初はEULA(End-User License Agreement)への同意やユーザ名、ホスト名の設定などがあります。 適宜設定を進めてください。
また、jtopを入れておくとJetson Nanoのステータスを確認できるのでおすすめです。
以下のコマンドを実行してから再起動するとjtopコマンドを使えるようになります。
sudo -H pip install -U jetson-statsJetson NanoのDockerの初期設定
CUDAコンパイラを扱えるようにするため、 以下のページを見ながら/etc/docker/daemon.jsonを編集し、 docker build時にもGPUへのアクセスを有効にします。
Jetson Nano用にDockerイメージを作成&起動
ROSがインストールされたDockerイメージを作成します。
Dockerfileは以下のリポジトリに公開しています。
ROSがインストールされたDockerイメージ(ベースイメージ)
今回はROS Melodicのイメージをビルドすることにします。 インターネットの回線速度やmicroSDの読み書き速度にもよりますが多少時間がかかります。 20分程度かかったような気がします。
cd ~/git clone https://github.com/Tiryoh/jetson-nano-containers.gitcd ~/jetson-nano-containers/l4t-r32.4.4/ros-melodicsudo docker build -t ros:melodic-ros-base-l4t-r32.4.4 .無事にビルドできたらDockerコンテナを起動します。
sudo docker run --network host -v /tmp/argus_socket:/tmp/argus_socket --runtime nvidia --rm -it ros:melodic-ros-base-l4t-r32.4.4Dockerコンテナ内でroscoreを無事を起動できることを確認できると思います。
ここで少しdocker runのオプションについて補足します。
--network host
ホストマシン(Jetson Nano)とネットワークを共有するためのオプションです。これを有効にすることにより、ROS_IPやROS_MASTER_URIについてDockerを意識せずに設定することができます。
-v /tmp/argus_socket:/tmp/argus_socket
CSIカメラの映像へDockerコンテナ内部からアクセスできるようにするためのvolumeマウントオプションです(([NVIDIA Jetson プラットフォームでの ROS2 と AI を使用したロボットアプリケーションの実装
NVIDIA Japan - Medium](https://medium.com/nvidiajapan/implementing-robotics-applications-with-ros-2-and-ai-on-jetson-platform-2-20772bb9423c)))。CSIカメラでなくUSBカメラを使う場合は、ここは`--device /dev/video0`とします(ビデオデバイスの番号は環境に応じて変えてください)。
--runtime nvidia
NVIDIA Dockerを明示して実行します(([NVIDIA Docker って今どうなってるの? (20.09 版)
NVIDIA Japan - Medium](https://medium.com/nvidiajapan/nvidia-docker-%E3%81%A3%E3%81%A6%E4%BB%8A%E3%81%A9%E3%81%86%E3%81%AA%E3%81%A3%E3%81%A6%E3%82%8B%E3%81%AE-20-09-%E7%89%88-558fae883f44)))。今回紹介した手順では`/etc/docker/daemon.json`を編集して常にNVIDIA Dockerを使うようにしているのでなくても大丈夫なオプションですが、うっかり初期設定を忘れてても使えるように念のためつけています。
dusty-nv/ros_deep_learningのDockerイメージ
次にNVIDIA社が公開しているHello AI WorldのROSラッパーであるdusty-nv/ros_deep_learningをインストールし、ビルドしてみます。
まずはDockerイメージを作成します。
cd ~/jetson-nano-containers/l4t-r32.4.4/ros-deep-learning-melodicsudo docker build -t ros-deep-learning:melodic-l4t-r32.4.4 .ビルドが終わったらDockerコンテナを起動します。
sudo docker run --network host -v /tmp/argus_socket:/tmp/argus_socket --runtime nvidia --rm -it ros-deep-learning:melodic-l4t-r32.4.4Dockerコンテナ内で以下のコマンドを実行すると、ROSノードが起動します。
video_source.ros1.launchを起動することで/video_source/rawと言う名前でsensor_msgs/Image形式のROSトピックが配信されます。
catkin sourceroslaunch ros_deep_learning video_source.ros1.launch input:=csi://0ノートパソコンのROS_MASTER_URIとROS_IPを適切に設定すると、以下の図のようにrqt_image_viewでノートパソコンからカメラ映像を確認できます。

Dockerコンテナにログインしていない別の端末でjtopを実行すると、以下の図のようにGPUを利用していることを確認できると思います。

以下のようなエラーが出て映像が配信できない場合は(Dockerコンテナ内ではなく)Jetson Nano上でnvargus-daemon.serviceをリスタートすると解決する場合があります。
[ERROR] [1608112817.619973258]: failed to capture next frame[gstreamer] gstCamera -- onPreroll[gstreamer] gstCamera -- map buffer size was less than max size (1382400 vs 1382407)nvargus-daemon.serviceは以下のコマンドでリスタートできます。
sudo systemctl restart nvargus-daemon.service今回はDockerコンテナ内でコマンドを実行してROSノードを起動しましたが、コンテナ起動時に直接ROSノードを起動することもできます。
sudo docker run --rm -t --network host -v /tmp/argus_socket:/tmp/argus_socket ros-deep-learning:melodic-l4t-r32.4.4 \roslaunch ros_deep_learning video_source.ros1.launch input:=csi://0今回紹介したDockerfileでビルドしたDockerイメージについて、他のJetson Nanoで動くかどうかの確認はきちんとしていませんが、手元では動くことを確認したイメージをGitHub Packagesに置いています。
- ghcr.io/tiryoh/jetson-nano/ros
https://github.com/users/Tiryoh/packages/container/package/jetson-nano%2Fros
- ghcr.io/tiryoh/jetson-nano/ros-deep-learning
https://github.com/users/Tiryoh/packages/container/package/jetson-nano%2Fros-deep-learning
まとめ(と関連情報の紹介)
Jetson Nano 2GB Developer Kit用JetPackでJetson Nanoを起動して、
- ROSインストール済みのDockerイメージ
- dusty-nv/jetson-inferenceとdusty-nv/ros_deep_learningをインストールしたイメージ
の作成方法とそのイメージの起動方法を紹介しました。
その他、Jetson Nano上ではなくPC上でDokcerイメージをビルドする方法などをGitHubのREADMEには記載しています。
今回紹介したROSインストール済みのDockerイメージをベースイメージとして使うと、今回紹介したROSパッケージ以外でもDockerコンテナ内で起動できるようになります。 もしよかったら参考にしてみてください。
参考・関連ページ
デスクトップ環境の比較
JetPack 4.4.1 (Jetson Nano 2GB)
LXDEがデフォルトのデスクトップ環境となっているようです。


JetPack 4.4.1 (Jetson Nano 4GB)
Unityがデフォルトのデスクトップ環境となっているようです。


JetPack 4.3 (Jetson Nano 4GB)
Unityがデフォルトのデスクトップ環境となっているようです。


関連記事
- (Updated )osrf/rockerを使ってPC内に複数のROS distroの開発環境を整える方法Dockerを使ってGUIアプリケーションを起動するには、起動にちょっと工夫が必要だったり一筋縄では行かないことが多いです。 osrf/rockerというツールを使うと一筋縄では行かない部分を少しだけ簡単にできるので、その使い方を紹介します。
- Amazon Lightsailでros-desktop-vncを起動する方法2020年11月13日にAmazonが公開したブログでLightsail Containersの紹介がありました。 これを使ってtiryoh/ros-desktop-vncを起動してみたので紹介します。
- docker-composeからRVizを起動するNVIDIAのGPUが有効なLinux環境でdocker-composeからRVizを起動するための設定方法。NVIDIA_VISIBLE_DEVICESとNVIDIA_DRIVER_CAPABILITIESの環境変数設定とdocker-compose.yamlの書き方をdocker-composeバージョン別にまとめた。
- (Updated )ROS/ROS2のGUIをWebブラウザ経由でお手軽に試せるDockerfileを公開しましたROS/ROS 2のGUIをWebブラウザ経由でお手軽に試せるDockerfileとDockerイメージを公開しています。その特徴と使用方法を紹介します。
- [2020年1月版] ROS2の環境構築方法この記事は2019年4月に書いた「[[2019年4月版] ROS2の環境構築方法](/archives/2150)」の改訂版です。