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
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で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
作成した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
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のトレーニング・実行を行います。
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
終わりに
今回はIsaac SimでAIモデルのシミュレーションを行う、大まかな流れをまとめました。
AIモデルのデータ収集を仮想空間で行うことで、効率的にモデルトレーニングやシミュレーションを行うことが可能かと思います。
今後も他のAIモデルやトレーニングしたモデルを実機で動かすことなども試していきたいです。