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-stats
Jetson 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.git cd ~/jetson-nano-containers/l4t-r32.4.4/ros-melodic sudo 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.4
Dockerコンテナ内でroscore
を無事を起動できることを確認できると思います。
ここで少しdocker run
のオプションについて補足します。
--network host
- ホストマシン(Jetson Nano)とネットワークを共有するためのオプションです。これを有効にすることにより、
ROS_IP
やROS_MASTER_URI
についてDockerを意識せずに設定することができます。
- ホストマシン(Jetson Nano)とネットワークを共有するためのオプションです。これを有効にすることにより、
-v /tmp/argus_socket:/tmp/argus_socket
- CSIカメラの映像へDockerコンテナ内部からアクセスできるようにするためのvolumeマウントオプションです[1]NVIDIA Jetson プラットフォームでの ROS2 と AI を使用したロボットアプリケーションの実装
NVIDIA Japan – Medium。CSIカメラでなくUSBカメラを使う場合は、ここは--device /dev/video0
とします(ビデオデバイスの番号は環境に応じて変えてください)。
- CSIカメラの映像へDockerコンテナ内部からアクセスできるようにするためのvolumeマウントオプションです[1]NVIDIA Jetson プラットフォームでの ROS2 と AI を使用したロボットアプリケーションの実装
--runtime nvidia
- NVIDIA Dockerを明示して実行します[2]NVIDIA Docker って今どうなってるの? (20.09 版)
NVIDIA Japan – Medium。今回紹介した手順では/etc/docker/daemon.json
を編集して常にNVIDIA Dockerを使うようにしているのでなくても大丈夫なオプションですが、うっかり初期設定を忘れてても使えるように念のためつけています。
- NVIDIA Dockerを明示して実行します[2]NVIDIA Docker って今どうなってるの? (20.09 版)
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-melodic sudo 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.4
Dockerコンテナ内で以下のコマンドを実行すると、ROSノードが起動します。
video_source.ros1.launch
を起動することで/video_source/raw
と言う名前でsensor_msgs/Image
形式のROSトピックが配信されます。
catkin source roslaunch 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
- ghcr.io/tiryoh/jetson-nano/ros-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がデフォルトのデスクトップ環境となっているようです。
コメント
コメント一覧 (1件)
[…] 今回、以下の記事を参考にさせていただきました。ありがとうございます。 メモリ2GB版Jetson NanoでDocker内のROSを使うまで スポンサーリンク (adsbygoogle = window.adsbygoogle || []).push({}); […]