NVIDIA Jetson プラットフォームでの ROS2 と AI を使用したロボットアプリケーションの実装

Masaaki Komuro
NVIDIA Japan
Published in
14 min readDec 8, 2020

ディープラーニングは、屋内環境で正確に動き回ったり、関心のあるオブジェクトを検出して追跡したり、ぶつかることなく運行するために、ロボティクスで採用されています。しかし、ディープラーニングの複雑さが増すと、組み込みシステムでこれらのワークロードに対応することが困難になります。精度と深層学習モデルのサイズの間でトレードオフを行うことはできますが、リアルタイムの要求を満たすために精度を妥協することは、ほとんどのロボティクスアプリケーションにおいて逆効果になる場合が多いです。

使いやすさと展開のしやすさにより、NVIDIA Jetson プラットフォームは、JetBot、MuSHR、MITRaceCar などのロボットを構築、および実装をおこなう開発者、研究者、および製造業者にとって論理的な選択肢となっています。この投稿では、Jetson 上の ROS 2 を使用した、分類、オブジェクト検出、および人間の姿勢推定のための深層学習モデルを紹介します。また、Jetson のさまざまなリソースと動作パラメーターのデプロイメントの内部をモニターする ROS 2 ノードも提供しています。ROS 2 は、ブリッジノードへの依存を無くし、組み込みシステムでさまざまな利点を提供する、軽量の実装を提供します。
TensorRT などの深層学習モデルの実装に既存の NVIDIA フレームワークを利用して、モデルの推論パフォーマンスを向上させます。また、NVIDIA DeepStream SDK を ROS 2 と統合して、ストリームの集約とバッチ処理を実行し、ResNet18、MobileNetV1 / V2、SSD、YOLO、FasterRCNN などの分類とオブジェクト検出のためのさまざまな AI モデルをデプロイできるようにします。さらに、世界中の開発者による trt_pose や、 jetson_stats といった人気のある Jetson ベースのプロジェクトのために、ROS 2 ノードを実装しました。最後に、Jetson プラットフォームにノードを簡単にデプロイできるように、上記の各アプリケーションに GitHub リポジトリ (ROS 2 ノードと Dockerfiles を含む) を提供します。各プロジェクトの詳細は、次のセクションを参照してください。

人間の姿勢推定のための ROS2 ノード

trt_pose に基づいて実装されている ros2_trt_pose パッケージは、Jetson プラットフォーム上で姿勢推定を可能にします。リポジトリは resnet18densenet121 を使用して姿勢を推定するための 2 つの事前学習済みモデルを提供します。人間の姿勢を理解するために、事前学習済みモデルは、COCO データセットのカテゴリに基づいて 17 の身体の部位を推測します。

図 1. ros2_trt_pose パッケージの説明と出力

ros2_trt_pose パッケージの主な機能は次のとおりです。

  • count of personpose_idpose_msgs を配信します。それぞれの person_id で、17 の身体の部位を配信しています。
  • Rviz2 で簡単な使用および視覚化するための起動ファイルを提供します。
    ・ 画像メッセージ
    ・ 視覚的マーカー: body_jointsbody_skeleton
  • インストールと利用が簡単な Jetson ベースの Docker イメージが含まれています。
ビデオ1. ros2_trt_pose パッケージからの出力。pose_msgs ログを画面に表示し、平均 42FPS の人間の姿勢推定タスクが Jetson NX 上で動いている、体の関節と骨格を含めたライブ画像のビデオ

詳細は、NVIDIA-AI-IOT / ros2_trt_pose GitHub リポジトリを参照してください。

PyTorch および TensorRT 用の ROS 2 パッケージ

図 2. ROS 2trt_classification および trt_detection ノードのパッケージの説明

PyTorch を使用した分類と検出には 2 つのパッケージがあり、それぞれに対応する TRT バージョンが実装されています。これらの4つのパッケージは、ロボット工学者が ROS 2 を使用して PyTorch でディープラーニングを始めるための良い出発点です。
TensorRT は、推論を加速するために torch2trt の助けを借りてパッケージに統合されました。ネットワークのアーキテクチャと実装するデバイスに応じて最適化されたランタイムエンジンを生成します。
パッケージの主な機能は次のとおりです。

  • 分類には、Resnet18、AlexNet、SqueezeNet、Resnet50 などのさまざまな ImageNet 事前学習済みモデルから選択できます。
  • 検出のために、MobileNetV1 ベースの SSD が現在サポートされており、COCO データセットで学習されています。
  • TRT パッケージは、GPU で直接推論を実行する PyTorch モデルと比較して、推論の実行を大幅に高速化します。
  • 推論結果は、vision_msgs の形式で配信されます。
  • ノードを実行すると、推論結果が視覚化されたウィンドウも表示されます。
  • 使いやすくするために、Jetson ベースの Docker イメージと起動ファイルが提供されています。
ビデオ 2. NVIDIA TensorRT ベースのオブジェクト検出タスク用 ros2_torch_trt パッケージからの出力

詳細は、NVIDIA-AI-IOT / ros2_torch_trt GitHub リポジトリを参照してください。

DeepStream SDK 用の ROS 2 ノード

図 3. ROS 2 DeepStream 配信者ノードのパッケージの説明

DeepStream SDK は、マルチセンサー処理、ビデオ、および画像解釈を使用してエンドツーエンドの AI ベースソリューションを構築するための完全なストリーミング分析ツールキットを提供します。最先端の SSD、YOLO、FasterRCNN、MaskRCNN などのよく使われるオブジェクト検出およびセグメンテーションモデルのサポートを提供します。
NVIDIA は、 DeepStream Python Apps プロジェクトに基づいて 2 つの推論タスクを以下の様に実行する ROS 2 ノードを提供します。

  • オブジェクト検出: 検出された 4つのオブジェクトクラス: VehiclePersonRodaSignTwoWheeler
  • 属性分類: 車のクラスのオブジェクトは、次の3種類の属性に分類: ColorMakeType

これらの配信者ノードは、カメラまたはファイルからの入力として一つまたは複数のビデオストリームを受け取ります。それらは推論を実行し、検出と分類の結果をさまざまなトピックに配信します。また、これらのトピックにサブスクライブし、結果を vision_msgs 形式で表示するサンプル ROS 2 サブスクライバーノードも提供します。各推論タスクは、検出されたオブジェクトの周囲に境界ボックスとラベルが付いた視覚化ウィンドウも生成します。追加の推論タスクとカスタムモデルは、このプロジェクトで提供される DeepStream パイプラインと統合できます。

ビデオ 3. オブジェクト検出タスクに NVIDIA DeepStream SDK を使用した、ros2_deepstream パッケージからのマルチストリーム出力。ログ画面の平均レートは、ros2_deepstream ノードが Jetson Xavier では 164FPS で実行できることを示しています。

ビデオでは、下部のコンソールに、マルチストリームパブリッシャーノードが分類出力を配信している平均レート (ヘルツ単位) が表示されます。
vision_msgs Classification2D 形式のサンプル分類出力:

[vision_msgs.msg.ObjectHypothesis(id='silver', score=0.7280375957489014), 
vision_msgs.msg.ObjectHypothesis(id='toyota', score=0.7242303490638733),
vision_msgs.msg.ObjectHypothesis(id='sedan', score=0.6891725063323975)]

詳細は、NVIDIA-AI-IOT / ros2_deepstream GitHub リポジトリを参照してください。

ROS 2 Jetson stats パッケージ

ros2_jetson_stats パッケージは、Jetson デバイスを監視および制御するコミュニティビルドパッケージです。ターミナルで実行でき、Python スクリプトに簡単に統合できる Python パッケージを提供します。ros2_jetson_stats ライブラリを利用して、ROS 2 診断メッセージとサービスを構築します。
ros2_jetson_stats パッケージには、次の ROS 2 診断メッセージが含まれています。

  • GPU / CPU 使用率
  • EMC / SWAP /メモリステータス (使用率)
  • SoC の電力と温度

ROS 2 コマンドラインから以下を制御できます。

  • ファン (Mode および Speed)
  • パワーモデル (nvpmodel)
  • jetson_clocks

診断メッセージを読み取る頻度を設定するパラメーターを指定することもできます。
詳細は、NVIDIA-AI-IOT / ros2_jetson_stats GitHub リポジトリを参照してください。

Jetson 用の ROS 2 コンテナ

Jetson でさまざまなバージョンの ROS 2 を簡単に実行するために、NVIDIA は、ROS Melodic と Noetic に加えて、ROS 2 Eloquent と Foxy のための、さまざまなDockerfiles とビルドスクリプトをリリースしました。これらのコンテナは、ROS または ROS 2 を Jetson にインストールし、独自の ROS ベースのアプリケーションを構築するための自動化された信頼性の高い方法を提供します。
Eloquent と Melodic はすでに Ubuntu18.04 のビルド済みパッケージを提供しているため、これらのバージョンの ROS は Dockerfiles によってコンテナにインストールされます。一方、Foxy と Noetic は、Ubuntu 20.04 用にのみビルド済みであるため、コンテナ内のソースからビルドされます。コンテナでは、基盤となる OS ディストリビューションに関係なく、これらのバージョンの ROS または ROS 2 の使用方法は同じです。
コンテナをビルドするには、JetPack 4.4 以降を実行している Jetson デバイスでリポジトリのクローンを作成し、ROS ビルドスクリプトを起動します。

$ git clone https://github.com/dusty-nv/jetson-containers

$ cd jetson-containers

$ ./scripts/docker_build_ros.sh all # build all: melodic, noetic, eloquent, foxy

$ ./scripts/docker_build_ros.sh melodic # build only melodic

$ ./scripts/docker_build_ros.sh noetic # build only noetic

$ ./scripts/docker_build_ros.sh eloquent # build only eloquent

$ ./scripts/docker_build_ros.sh foxy # build only foxy

このコマンドは、次のタグを持つコンテナを作成します。

  • ros:melodic-ros-base-l4t-r32.4.4
  • ros:noetic-ros-base-l4t-r32.4.4
  • ros:eloquent-ros-base-l4t-r32.4.4
  • ros:foxy-ros-base-l4t-r32.4.4

たとえば、ROS 2 Foxy コンテナを起動するには、次のコマンドを実行します。

$ sudo docker run --runtime nvidia -it --rm --network host ros:foxy-ros-base-l4t-r32.4.4

--runtime nvidia フラグを使用すると、ビデオエンコーダーやデコーダーなどの Jetson デバイス上の他のハードウェアアクセラレーターに加えて、コンテナ内で GPU パススルーが自動的に有効になります。
コンテナで MIPI CSI カメラをストリーミングするには、次のフラグを含めます。

--volume /tmp/argus_socket:/tmp/argus_socket

コンテナ内で V4L2USB カメラをストリーミングするには、コンテナを起動するときに目的の /dev/video* をマウントします。

--device /dev/video0

詳細は、dusty-nv / jetson-containers GitHub リポジトリを参照してください。

ROS 開発者向けの NVIDIA Omniverse Isaac Sim

NVIDIA Omniverse プラットフォーム上に構築された NVIDIA Isaac Sim シミュレーションツールキットは、既存のロボットのワークフローに比べていくつかの有益な改善をもたらします。

  • Omniverse の非常に正確な物理シミュレーションと写実的レイトレーシングによるグラフィックスを利用して、剛体力学用の NVIDIA PhysX SDK などの業界をリードする物理フレームワークと直接統合します。
  • 相互運用性、NVIDIA Isaac SDK との緊密な統合、およびROSの拡張機能に新たに焦点を当てています。
  • 容易に拡張可能です。Python ベースのスクリプトインターフェイスを使用すると、独自のユースケースに適応できます。
  • ローカルワークステーション上および NVIDIA NGC を使用したクラウドを介したワークフローをサポートするアーキテクチャを使用して、実装可能に構築されています。(*1)

(*1) NVIDIA NGC には 2020 年 11 月時点でコンピュティーング計算機能はなくコンテナなどの提供のみとなります。

次のステップ

ROS 開発者は、ソフトウェアへの投資を維持しながら、Isaac SDK 機能を利用できるようになりました。Isaac-ROS Bridge を利用すれば ROS の実装のなかで Isaac GEMS を使用することができます。
NVIDIA は、ロボティクスの主要なアプリケーションを構築および実装できる NVIDIA Jetson プラットフォーム上の ROS 2 の使いやすいパッケージを提供します。AI-IOT とロボティクスに関するその他のプロジェクトについては、次のリソースを利用できます。

--

--