メモリ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

NVIDIA Jetson Nano 2GB 開発者キット - Amazon.co.jp
NVIDIA Jetson Nano 2GB 開発者キットの通販

Jetson Nano用のmicroSD

Dockerイメージを保存するので64GB以上はほしいです。

サンディスク microSD 256GB UHS-I Class10 読取り最大100MB/s 【Nintendo Switch メーカー動作確認済】SanDisk Ultra SDSQUAR-256G-EPK エコパッケージ - SanDisk
サンディスク microSD 256GB UHS-I Class10 読取り最大100MB/s 【Nintendo Switch メーカー動作確認済】SanDisk Ultra SDSQUAR-256G-EPK エコパッケージの通販をAmazonで。

Jetson Nano用の無線LANアダプタ

2.4GHz帯しか対応していませんが、追加でのドライバインストールせずに使えたのでおすすめです。

TP-Link WIFI 無線LAN 子機 11n/11g/b デュアルモード対応モデル TL-WN725N - TP-LINK
TP-Link WIFI 無線LAN 子機 11n/11g/b デュアルモード対応モデル TL-WN725Nの通販をAmazonで。

Jetson Nano用のUSB Type-Cの電源

ノートパソコンを充電するときに使っているものと同じものを使っています。

Amazon | Anker PowerPort Atom III Slim (Four Ports)(PD 充電器 65W 4ポート USB-C)【PowerIQ3.0搭載 / PD対応/GaN(窒素ガリウム)採用】 iPhone iPad iPod 各種、 MacBook Air、その他USB-C機器対応 (ブラック) | AC式充電器 通販
Anker PowerPort Atom III Slim (Four Ports)(PD 充電器 65W 4ポート USB-C)【PowerIQ3.0搭載 / PD対応/GaN(窒素ガリウム)採用】 iPhone iPad iPod 各種、 MacBook Air、その他USB-C機器対応 (ブラック)がAC式充電器...
Anker PowerLine II USB-C & USB-C 2.0 ケーブル (1.8m ブラック)【USB-IF認証取得/超高耐久/PD対応】Galaxy S10 / S10+ / S9 / S9+、iPad Pro (2018, 11インチ) / MacBook/MacBook Air (2018)、MateBook対応 テレワーク リモート 在宅勤務 - Amazon.co.jp
Anker PowerLine II USB-C & USB-C 2.0 ケーブル (1.8m ブラック)【USB-IF認証取得/超高耐久/PD対応】Galaxy S10 / S10+ / S9 / S9+、iPad Pro (2018, 11インチ) / MacBook/MacBook Air (2018)、Mate...

Jetson Nanoに接続するカメラ

CSI接続のカメラモジュールを使います。USB接続のWebカメラでも使えると思います。

SainSmart IMX219 AIカメラモジュールNVIDIA Jetson Nanoボード用8MPセンサー120度FoV - SainSmart
SainSmart IMX219 AIカメラモジュールNVIDIA Jetson Nanoボード用8MPセンサー120度FoVの通販をAmazonで。
Amazon.co.jp: ロジクール ウェブカメラ C270n ブラック HD 720P ウェブカム ストリーミング 小型 シンプル設計 国内正規品 2年間メーカー保証 : パソコン・周辺機器
Amazon.co.jp: ロジクール ウェブカメラ C270n ブラック HD 720P ウェブカム ストリーミング 小型 シンプル設計 国内正規品 2年間メーカー保証 : パソコン・周辺機器

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のそれぞれのバージョンの対応リストは以下のページから確認できます。

JetPack Archive
This page includes access to previously released versions of JetPack. The latest version of JetPack is always available under the main NVIDIA JetPack product pa...

イメージのダウンロード

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

Getting Started with Jetson Nano 2GB Developer Kit
Getting Started with Jetson Nano 2GB Developer Kit Click here for the guide based on Jetson Nano Developer Kit. Introduction Included in the Box Items not Inclu...

以下の画像は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は以下のページからダウンロードできます。

balenaEtcher - Flash OS images to SD cards & USB drives
A cross-platform tool to flash OS images onto SD cards and USB drives safely and easily. Free and open source for makers around the world.

Jetson Nanoの初期設定

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

最初はEULA(End-User License Agreement)への同意やユーザ名、ホスト名の設定などがあります。
適宜設定を進めてください。

また、jtopを入れておくとJetson Nanoのステータスを確認できるのでおすすめです。

GitHub - rbonghi/jetson_stats: 📊 Simple package for monitoring and control your NVIDIA Jetson [Xavier NX, Nano, AGX Xavier, TX1, TX2]
📊 Simple package for monitoring and control your NVIDIA Jetson - GitHub - rbonghi/jetson_stats: 📊 Simple package for monitoring and control your NVIDIA Jetso.....

以下のコマンドを実行してから再起動するとjtopコマンドを使えるようになります。

sudo -H pip install -U jetson-stats

Jetson NanoのDockerの初期設定

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

GitHub - dusty-nv/jetson-containers: Machine Learning Containers for NVIDIA Jetson and JetPack-L4T
Machine Learning Containers for NVIDIA Jetson and JetPack-L4T - GitHub - dusty-nv/jetson-containers: Machine Learning Containers for NVIDIA Jetson and JetPack-L...

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

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

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

GitHub - Tiryoh/jetson-nano-containers: Dockerfiles for Jetson Nano
Dockerfiles for Jetson Nano. Contribute to Tiryoh/jetson-nano-containers development by creating an account on GitHub.

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_IPROS_MASTER_URIについてDockerを意識せずに設定することができます。
  • -v /tmp/argus_socket:/tmp/argus_socket
    • CSIカメラの映像へDockerコンテナ内部からアクセスできるようにするためのvolumeマウントオプションです[1]NVIDIA Jetson プラットフォームでの ROS2 と AI を使用したロボットアプリケーションの実装
      NVIDIA Japan – Medium
      。CSIカメラでなくUSBカメラを使う場合は、ここは--device /dev/video0とします(ビデオデバイスの番号は環境に応じて変えてください)。
  • --runtime nvidia
    • NVIDIA Dockerを明示して実行します[2]NVIDIA Docker って今どうなってるの? (20.09 版)
      NVIDIA Japan – Medium
      。今回紹介した手順では/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-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_URIROS_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に置いています。

まとめ(と関連情報の紹介)

Jetson Nano 2GB Developer Kit用JetPackでJetson Nanoを起動して、

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

その他、Jetson Nano上ではなくPC上でDokcerイメージをビルドする方法などをGitHubのREADMEには記載しています。

GitHub - Tiryoh/jetson-nano-containers: Dockerfiles for Jetson Nano
Dockerfiles for Jetson Nano. Contribute to Tiryoh/jetson-nano-containers development by creating an account on GitHub.

今回紹介したROSインストール済みのDockerイメージをベースイメージとして使うと、今回紹介したROSパッケージ以外でもDockerコンテナ内で起動できるようになります。
もしよかったら参考にしてみてください。

参考・関連ページ

Redirecting…
GitHub - dusty-nv/ros_deep_learning: Deep learning inference nodes for ROS with support for NVIDIA Jetson TX1/TX2/Xavier and TensorRT
Deep learning inference nodes for ROS with support for NVIDIA Jetson TX1/TX2/Xavier and TensorRT - GitHub - dusty-nv/ros_deep_learning: Deep learning inference ...

デスクトップ環境の比較

JetPack 4.4.1 (Jetson Nano 2GB)

LXDEがデフォルトのデスクトップ環境となっているようです。

JetPack 4.4.1 (Jetson Nano 4GB)

Unityがデフォルトのデスクトップ環境となっているようです。

JetPack 4.3 (Jetson Nano 4GB)

Unityがデフォルトのデスクトップ環境となっているようです。

コメント