NVIDIA Isaac Simを使い3D仮想環境でロボットのシミュレーションを行う

JetBotというロボットのシミュレーションをIsaac Simで行ったので、概要をまとめました。

Isaac Simはロボティクスシミュレーションアプリケーション、および合成データ生成ツールです。Isaac Simを利用することで、フォトリアリスティックな仮想環境でAI ベースのロボットの開発、テスト、管理を行うことができます。

JetBotとは、NVIDIA Jetson Nanoというシングルボードコンピューターを搭載したオープンソースのロボットです。

開発環境の準備

今回の作業は、RTX対応のGPUを搭載したPCが必要になります。本記事では、対応するGPUを搭載したUbuntu 22.04のLinuxの仮想マシンを利用します。

細かい手順は省略していますが、以下の流れで環境を構築します。

※ 手順はすべてLinux向けのものになります。

ROS2をインストールする

次のリンクを参考にROS2 humbleをインストールします。

ROS & ROS 2 Installation — Omniverse IsaacSim latest documentation

Dockerをインストールする

以下を参考にDockerをUbuntu 22.04にインストールします。

Ubuntu 22.04にdockerをインストールする #Docker - Qiita

VNC(Virtual Network Computing)をインストールする

GUIでLinuxを操作するためにTurboVNCをインストールします。

VNCはTurboVNC以外のものでも可能かと思います。

GPU対応のPCにNVIDIA Omniverseをインストールする

Isaac SimはNVIDIA Omniverseを基盤とするアプリケーションのため、以下のリンクに従いOmniverseをインストールします。

Overview — Omniverse Install Guide latest documentation

Omniverseのインストールが完了後、Isaac Simをインストールします。

JetBotをIsaac Simでシミュレーションする

開発の環境構築が完了したので、JetBotの3DモデルをIsaac Sim内で動かす手順に移ります。

jetbot_rosのレポジトリをクローンし修正する

JetBotの操作には、https://github.com/dusty-nv/jetbot_rosのコードを利用します。

このレポジトリはNVIDIA JetBot向けのROS2 nodesとGazebo modelを含んでいます。

そのままのコードは実機のJetBot用になっているため、Linux VM上で動くようにDockerfile等を修正する必要があります。

修正が完了したらdocker imageをビルドし、コンテナが動くことを確認します。

Isaac Simのusdファイルを作成する

Isaac Sim

Isaac Simでjetbotを動かすためには、次のものをステージに追加します。

JetBotの3Dオブジェクト

公式のjetbot.usdのアセットを追加します。

2.7. OmniGraph — Omniverse IsaacSim latest documentationの2.7.3.Setting up the stageの手順に従い、Ground Planeとjetbot.usdをステージに追加します。

※上の画像はGround Planeの代わりにSimple roomのアセットを利用しています。

公式のロボットアセット:Robot Assets — Omniverse IsaacSim latest documentation

ActionGraph

ROS2と接続しJetBotをコントロールするために2つのAction Graphをステージに追加します。

1つはjetbotを動かすため、もうひとつはjetbotのカメラで取得した画像を送るために必要になります。

それぞれ以下のリンクを参考に実装します。
7.2.2. Driving TurtleBot via ROS2 messages — Omniverse IsaacSim latest documentation

ActionGraphDrive

作成したActionGraphに次の変更を加えます。

  • ROS2 Subscribe Twist NodeのnodeNamespaceにjetbotを設定
  • Differential Controller NodeのWheel Radiusを.0325、Wheel Distanceを.118に設定
  • Articulation Controller NodeのtargetPrimを/World/jetbotに設定

7.2.3. ROS2 Cameras — Omniverse IsaacSim latest documentation

ActionGraphCamera

AcrionGraphCameraには次の変更を加えます。

  • ROS2 Contextを追加
  • Isaac Create Render ProductのcameraPrimを/World/jetbot/chassis/rgb_camera/jetbot_cameraに設定
  • ROS2 Camera HelperのnodeNamespaceにjetbotを設定
  • ROS2 Camera HelperのtopicNameにcamera/image_rawを設定
道のオブジェクト

jetbot_rosのコードはroad followingを行うものなので、道のオブジェクトをステージに追加します。

道のオブジェクトはIsaac Simや他の3Dモデリングのツールで作成します。

モデルトレーニング用の画像データを収集する

JetBotをIsaac Sim内で動かす準備ができたので、コンテナを起動しData Collectionを実行します。

コンテナの起動後、ROS_DOMAIN_IDをIsaac Simを動かしている環境と同じ値に設定します。

export ROS_DOMAIN_ID=12

Data Collectionの実行

ros2 launch jetbot_ros data_collection.launch.py

Isaac Simでシミュレーションを開始
youtu.be

トレーニング用の画像が集まったので、Navigation modelのトレーニング・実行を行います。

Navigation modelのトレーニング:
"image_folder"は収集した画像データのフォルダ名に変更します。

cd /workspace/src/jetbot_ros/jetbot_ros/dnn
python3 train.py --data /workspace/src/jetbot_ros/data/datasets/<image_folder>/

Navigation modelの実行:
"model_folder"はトレーニングしたモデルのパスに変更します。

ros2 launch jetbot_ros nav_model.launch.py model:=/workspace/src/jetbot_ros/jetbot_ros/dnn/data/models/<model_folder>/model_best.pth

youtu.be

終わりに

今回はIsaac SimでAIモデルのシミュレーションを行う、大まかな流れをまとめました。

AIモデルのデータ収集を仮想空間で行うことで、効率的にモデルトレーニングやシミュレーションを行うことが可能かと思います。

今後も他のAIモデルやトレーニングしたモデルを実機で動かすことなども試していきたいです。

執筆担当者プロフィール
寺澤 駿

寺澤 駿(日本ビジネスシステムズ株式会社)

IoTやAzure Cognitive ServicesのAIを活用したデモ環境・ソリューション作成を担当。

担当記事一覧