この度、NVIDIA Japan様のお計らいにより、Jetsonインフルエンサーという大任を拝しました。

このおかげで、GTC 2020で新しく発表されたNVIDIA Jetson Nano 2GB開発者キットのプレビュー版を製品版の販売に先駆けて受け取ることができました。

そこで、今回から複数回のブログ記事で、このJetson Nano 2GBモデルを使ってROS 2アプリケーション開発を行ってみたいと思います。もちろん、GPUを積んでいるわけですので、JetPackの恩恵に預かれるようにしたいと思っています。

NVIDIA Jetson Nano 2GB開発者キット(プレビュー版)

Jetson Nano 2GBモデルは昨年発売されたJetson NanoからRAM容量を4GBから2GBにしたものです。これにより、$59というかなり廉価な値段設定で販売が予定されています。RAM容量以外は基本的に4GBモデルと大きな性能の差異がないようです。

USB Type-Cで電源を供給することができ、ケーブルの取り回しが便利ですね。実はNVIDIA Jetson AGX Xavierを以前から所有しており、Jetson XavierもUSB Type-Cで電源供給できるので、同じACアダプタやバッテリを使いまわすことができ、非常に助かります。

Jetson Xavierに比べてフットプリントが小さく、放熱フィンもかなり小さいので、高さ方向も非常に小さく感じます。

システムセットアップ

Jetson NanoはマイクロSDカードにイメージを焼いてブートする仕組みです。Jetson Nano 2GBプレビューキットでは非公開のイメージを使っていますが、製品版では公開されたイメージを使うことになるでしょう。

イメージの違いを除くと、4GBモデルとセットアップに違いはないと思いますので、OSのセットアップは公式サイトの

https://developer.nvidia.com/embedded/learn/get-started-jetson-nano-devkit

や日本人開発者の記事などを参考にすれば、苦労なくセットアップできると思います。 ですので、ここではそれ以外に僕が行ったセットアップ手順を記録しておきます。

GUIの無効化

2GBモデルは当然RAM容量が少ないので、少しでもRAM容量を節約する必要があります。僕の使用方法では最初のOSセットアップを除いてGUIの必要性がないため、GUIを無効化することでRAM容量を節約しました。

まず、GUIを無効化する前の状態でJetson Nanoを起動したときのメモリ使用量です。 ただ起動するだけで581MBを消費していることがわかります。ログインすると、さらに他のアプリケーションも動くため、余計に増えます。

$ free -h
              total        used        free      shared  buff/cache   available
Mem:           1.9G        581M        176M         59M        1.2G        1.2G
Swap:          4.9G        2.5M        4.9G

こちらがGUIを無効化した後です。メモリ使用量が198MBに減りました。スワップも発生していません。

$ free -h
              total        used        free      shared  buff/cache   available
Mem:           1.9G        198M        1.4G         18M        297M        1.6G
Swap:          4.9G          0B        4.9G

GUIの無効化は以下のコマンドを実行して、再起動するだけです。

sudo systemctl set-default multi-user.target

以下のコマンドで再度GUIを有効化することもできます。

sudo systemctl set-default graphical.target

Dockerのセットアップ

JetsonのSDKであるJetPackは、少し前のバージョンからDockerに対応するようになっています。これにより、強力なホストPCでビルドしたイメージをJetsonでは実行するだけ、という使い方が簡単にできるようになっています。

Jetson単体でROS 2をセットアップやソースコードビルドしようとすると、CPU性能やRAM容量の課題で、開発サイクルが遅くなってしまいがちです。しかし、ホストで予めビルドしておけば、この問題は解決できますし、再利用性や再現性も非常に高くできます。

また、JetsonはUbuntu 18.04がOSのベースイメージになっているため、Ubuntu 20.04を対象とする最新のROS 2ディストリビューションであるROS 2 Foxyをセットアップすることが非常に困難です。 ですが、Dockerイメージを使えば、ホストのOSのバージョンに依存しないため、最新のROS 2ディストリビューションを試すことも容易になります。

JetsonでJetPackが有効なコンテナランタイム(Dockerイメージの実行器)を利用する情報は以下にまとめられています。

https://github.com/NVIDIA/nvidia-docker/wiki/NVIDIA-Container-Runtime-on-Jetson

今回使用したJetPack 4.4では、すでにこのコンテナランタイムがインストールされているため、必要な作業はありません。しかし、dockerコマンドを実行するたびにsudoするのは面倒なので、僕はdockerグループにアカウントを追加しました。

sudo usermod -aG docker $USER

このやり方はJetsonを使った製品をリリースするような場面では推奨されるやり方ではないですが、今は開発者キットを使って遊んでいるだけですので、こちらの方が日常使いに便利です。

最後にコンテナランタイムが正しくNVIDIAのものになっているかどうかを確認して終わります。

$ docker info | grep Runtimes
 Runtimes: nvidia runc

次回はホストPCで、JetPackが有効化されたDockerイメージ上にROS 2環境をセットアップする手順を記事にしたいと思います。