(Updated )

メモリ2GB版Jetson NanoでDocker内のROSを使うまで

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-inferencedusty-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コマンドを使えるようになります。

Terminal window
sudo -H pip install -U jetson-stats

Jetson NanoのDockerの初期設定

CUDAコンパイラを扱えるようにするため、 以下のページを見ながら/etc/docker/daemon.jsonを編集し、 docker build時にもGPUへのアクセスを有効にします。

Jetson Nano用にDockerイメージを作成&起動

ROSがインストールされたDockerイメージを作成します。

Dockerfileは以下のリポジトリに公開しています。

ROSがインストールされたDockerイメージ(ベースイメージ)

今回はROS Melodicのイメージをビルドすることにします。 インターネットの回線速度やmicroSDの読み書き速度にもよりますが多少時間がかかります。 20分程度かかったような気がします。

Terminal window
cd ~/
git clone https://github.com/Tiryoh/jetson-nano-containers.git
cd ~/jetson-nano-containers/l4t-r32.4.4/ros-melodic
sudo docker build -t ros:melodic-ros-base-l4t-r32.4.4 .

無事にビルドできたらDockerコンテナを起動します。

Terminal window
sudo docker run --network host -v /tmp/argus_socket:/tmp/argus_socket --runtime nvidia --rm -it ros:melodic-ros-base-l4t-r32.4.4

Dockerコンテナ内でroscoreを無事を起動できることを確認できると思います。

ここで少しdocker runのオプションについて補足します。

  • --network host

ホストマシン(Jetson Nano)とネットワークを共有するためのオプションです。これを有効にすることにより、ROS_IPROS_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イメージを作成します。

Terminal window
cd ~/jetson-nano-containers/l4t-r32.4.4/ros-deep-learning-melodic
sudo docker build -t ros-deep-learning:melodic-l4t-r32.4.4 .

ビルドが終わったらDockerコンテナを起動します。

Terminal window
sudo docker run --network host -v /tmp/argus_socket:/tmp/argus_socket --runtime nvidia --rm -it ros-deep-learning:melodic-l4t-r32.4.4

Dockerコンテナ内で以下のコマンドを実行すると、ROSノードが起動します。 video_source.ros1.launchを起動することで/video_source/rawと言う名前でsensor_msgs/Image形式のROSトピックが配信されます。

Terminal window
catkin source
roslaunch ros_deep_learning video_source.ros1.launch input:=csi://0

ノートパソコンのROS_MASTER_URIROS_IPを適切に設定すると、以下の図のようにrqt_image_viewでノートパソコンからカメラ映像を確認できます。

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

以下のようなエラーが出て映像が配信できない場合は(Dockerコンテナ内ではなく)Jetson Nano上でnvargus-daemon.serviceをリスタートすると解決する場合があります。

Terminal window
[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は以下のコマンドでリスタートできます。

Terminal window
sudo systemctl restart nvargus-daemon.service

今回はDockerコンテナ内でコマンドを実行してROSノードを起動しましたが、コンテナ起動時に直接ROSノードを起動することもできます。

Terminal window
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を起動して、

の作成方法とそのイメージの起動方法を紹介しました。

その他、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がデフォルトのデスクトップ環境となっているようです。

Share — X · Bluesky · はてブ ·