ABEJA Tech Blog

中の人の興味のある情報を発信していきます

NVIDIA のロボティクス用3Dシミュレーター「Isaac Sim & Lab」でロボットを動かす on Ubuntu Server

こんにちは!ABEJA で ABEJA Platform 開発を行っている坂井(@Yagami360)です。

先日の記事では、いずれも Gymnasium というライブラリを使用して簡易的な環境でモデルを推論させながらロボットを動かしてみました。

tech-blog.abeja.asia

tech-blog.abeja.asia

しかしながら実際のロボティクス開発においては、できるだけ現実世界に近くなるように物理演算が考慮された3Dシミュレーター上で動かしながらシミュレーションする必要があります。

このような3Dシミュレーターには、MuJoCo, Isaac Sim, Genesis, Pybullet などがあります。MuJoCo については、以下の記事を見てもらえればと思います。 tech-blog.abeja.asia

本記事では、NVIDIA のロボティクス用の 3D シミュレーターである Isaac Sim 及び Isaac Lab を使用して、物理演算が考慮された3Dシミュレーター上で学習済みモデルで推論させながらロボットを動かしてみようと思います。

Isaac Sim 及び Isaac Lab は、NVIDIA 製 GPU 搭載の Ubuntu Desktop 環境や Window 環境で動かすのが一般的なようですが、本記事ではそういった環境がない方々向けに、非 GUI 環境の Ubuntu サーバー上で動かす内容になっています。

なおモデルの学習とシミュレーター環境での推論部分に関しては、公式チュートリアルのスクリプトをそのまま利用しただけの入門的な内容になります。

Isaac Sim & Isaac Lab とは?

NVIDIA公式ドキュメントより引用

Isaac Sim と Isaac Lab は NVIDIA Omniverse というプラットフォームの下位に存在するフレームワークになっています。

そのため、まずは NVIDIA Omniverse について軽く説明します。

www.nvidia.com

NVIDIA Omniverse とは?

まずはじめに、NVIDIA Omniverse について理解するには、まずその背景にある「Physical AI」という思想を理解するのが良いと思います。

自分は最初 NVIDIA Omniverse についてネットで色々調べてみましたが、サイトによって説明がまちまちで内容も抽象的だったので、正直イマイチ理解できなかったです。

これは恐らく、NVIDIA Omniverse が特定のツールと言うより、NVIDIA の強みでもある3Dゲームや3Dグラフィックス・AI分野での技術を活かしながら、「Physical AI」という壮大な思想を実現するために、NVIDIA が時代の先を見越して作り上げている巨大なプラットフォームという側面が強く、そのサービス形態も試行錯誤しながら変異しているためだと思いました。(実際に最近では NVIDIA Cosmos も発表されました)

とはいえこの説明だけではよくわからないと思うので、現状の範囲でもうちょい具体的にいうと、 3Dグラフィックスのツールをベースとしながら、以下のような今後需要が高まることが予想される機能(他にも色々あります)もセットにしてコンソール UI, API, SDK 等の形式で提供しているプラットフォームであり、IT業界以外のIT化やAI化といったことを意識しているプラットフォームなのだと思います。

  • ロボティクス用3Dシミュレーター

    www.nvidia.com

    現実世界に近い物理演算やセンサーシミュレーションのもとで、ロボットを動かすことが可能な3Dシミュレーターです。

    ロボットのアセットや強化学習用の環境も提供しており、ロボティクスモデルの強化学習や模倣学習に適したシミュレーターになっています。

    後で説明しますが Isaac Sim と Isaac Lab は、NVIDIA Omniverse の中のこのロボティクス用シミュレーターのフレームワークになっています。

  • 合成データ生成

    www.nvidia.com

    AIモデルを動かそうとすると学習用データセット不足に悩まれがちですが、特にロボティクス領域においてはこれが顕著になります。

    その問題を解決するための方法の1つとして、シミュレーター上で学習用データセットを作成したり生成AIで学習用データセットを作成する方法があり、これを合成データセット(Synthetic Data)といいます。NVIDIA Omniverse ではこの合成データ生成のための機能をサポートしています

    個人的には、合成データ生成は今後ますます有益な手法になるかと思ってます。

  • デジタルツイン

    デジタルツインというワードは近年よく耳にすることが多いと思います。NVIDIA Omniverse でも大きな活用例になっているようです。

    デジタルツインとは、NVIDIA Omniverse の範囲で言えば、現実世界での工場などの空間を3Dツール上などでシーン化する(デジタルツイン化)し、相互をリアルタイム同期させながら3Dツール上などで現実世界に近いシミュレーションができるようにすることかと思ってますが、自分自身正確に説明できなく誤解を招くとよくないのでこれ以上の詳細は省略します。

    PysicalAI とデジタルツインの関係については、以下のサイトなどが参考になるかと思います。

    www.nvidia.com

  • OpenUSD による互換性

    www.nvidia.com

    NVIDIA Omniverse では OpenUSD [Universal Scene Description] という汎用的な 3D シーンのファイルフォーマットを採用しており、他の様々な 3Dツール(Blender, Maya, Unreal Engine など)との連携や互換性を考慮しているようです

Isaac Sim とは?Isaac Lab とは?

NVIDIA公式ドキュメントより引用

NVIDIA Isaac Sim とは、上記 NVIDIA Omniverse の下位フレームワークで、ロボティクスのシミュレーターに特化したフレームワークになっています。

Isaac Sim では、PhysX という NVIDIA が開発した3Dゲームの分野では昔から広く使われている高度な物理シミュレーションが組み込まれており、現実世界にかなり近い挙動でロボットを動かせるようになっています。

また以下のような機能があります

  • シミュレーター上のロボットのアセットを提供

    docs.isaacsim.omniverse.nvidia.com

    ロボットのアセット(3Dモデル)を提供しており、シーンや環境に配置することができます。Isaac-GR00T のデモ動画でも使われているヒューマノイドロボット(GR1)のアセットや定番の Franka の片腕ロボットのアセットもあります

  • センサー

    カメラなどのセンサーも提供されており、シーンや環境としてシミュレーター上に配置することができます

  • ROS連携のための機能

    また ROS連携のための機能もあるようです。ROS/ROS2については、以下の記事が参考になります。 tech-blog.abeja.asia

NVIDIA Isaac Lab は、Isaac Sim の更に下位のフレームワークになっており、ロボティクス領域における強化学習や模倣学習により特化したフレームワークになっています。 もともと Isaac Gym という強化学習用のフレームワークがありましたが、Isaac Lab として統合されたようです。

具体的には、以下のような機能などがあります

  • 強化学習用の環境

    isaac-sim.github.io

    強化学習や模倣学習用の予め定義された環境がいくつか準備されています。

    Isaac Lab の SDK を使用して自身で独自の環境を作成したり、作成した環境を Gymnasium 用の環境として登録することも可能です

Isaac Sim と Isaac Lab をセットで利用することで、3Dシミュレーター上でロボットのモデルを強化学習したり、学習済みモデルで推論させながらロボットを動かすこともできるようになっています。

但し、ロボティクスのモデルや学習&推論コード自体は、(チュートリアルのコード以外では)Isaac Sim & Lab の対象外になります

ロボティクス領域でよく利用される3Dシミュレーターには、他にも Mujoco, Genesis, PyBullet といった 3D シミュレーターもありそれぞれ長所短所があるのですが、Isaac Sim & Lab では、PhysX という3Dゲームの分野では昔から広く使われている物理シミュレーションが組み込まれており現実世界にかなり近い挙動でロボットを動かせるになっているの点やシミュレーター上での学習用データセット作成のサポート、ROS連携サポートあたりが強みかなと思ってます。

また先に述べたように、NVIDIA が Physical AI という思想とそれを実現するための NVIDIA Omniverse に力を入れていることから、単にシミュレーターという部分以外での機能も強化されていく気がしているので、そう意味でも強みがあると思ってます。

環境構築

Isaac Sim の 3D シミュレーターは GUI ツールになるので、NVIDIA GPU 搭載の Ubuntu Desktop 環境や Windows 環境で開発するのが一般的なのかもしれませんが、 あいにく手元にそのような環境がなかったため、今回の記事では VNC サーバーを使用して GUI なしの Ubuntu サーバー(VMインスタンス)上で Isaac Sim の 3D シミュレーターを起動&表示させます。

X11 サーバーを使用する方法でも同様のことは実現できますが、シミュレーターのGUIツールがマウスクリックに反応しなかったので、X11ではなくVNCサーバーを使用します。

NVIDIA 製 GPU 搭載の Ubuntu Desktop 環境や Windows 環境をお持ちの方はこういったことは不要なので、もっと簡単にシミュレーターを起動できると思います。

VM インスタンスの作成

GPU ありでの VM インスタンスを作成し、毎度おなじみの NVIDA ドライバーや CUDA のインストールを行ってください。

今回の自分の環境では、以下のような環境にしました。

  • Ubuntu: 22.04
  • NVIDIAドライバー: 575.51.03
  • CUDA: 12.9
  • GPU: T4 x 1台

VNC サーバーのインストール

サーバー上で実行した3Dシミュレーターをローカル環境(Macなど)のディスプレイ上に表示させるために、まずはVNCサーバーをインストールします

  1. VNC 用のファイアウォールルールを作成する

    VNCサーバーはデフォルトで 5901 ポートを使用するため、サーバーの5901ポートを開放する必要があります

    今回は GCP の VM インスタンスを使用したので、例えば以下のようなコマンドか手動でVNC 用のファイアウォールルールを作成します。

    セキュリティの観点から自宅やオフィスのIPアドレスからのみアクセスできるようにしておくことを推奨します

     gcloud compute firewall-rules create allow-vnc \
         --allow tcp:5901 \
         --source-ranges ${LOCAL_IP_ADDRESS}/32
    
  2. 作成したファイアウォールのネットワークタグを VM インスタンスに付与する

    上記作成したファイアウォールルールを VM インスタンスのネットワークタグに付与して、対象VMインスタンスに適用します

  3. Ubuntu サーバー側に VNCをインストールする

    VMインスタンス(Ubuntu Server)上で以下コマンドを実行し、VNC関連のパッケージをインストールします

     sudo apt update
     sudo apt install -y tigervnc-standalone-server
     sudo apt install -y xfce4 xfce4-goodies
    
  4. VNC 設定ファイルを作成する

    以下のコマンドや手動で VNC サーバー用の設定ファイル(~/.vnc/xstartup)を作成します

     cat > ~/.vnc/xstartup << 'EOF'
     #!/bin/bash
     unset SESSION_MANAGER
     unset DBUS_SESSION_BUS_ADDRESS
     export XKL_XMODMAP_DISABLE=1
    
     # マウスとキーボードの設定
     xsetroot -solid grey
     xrdb $HOME/.Xresources 2>/dev/null || true
    
     # VNC設定
     vncconfig -iconic &
    
     # デスクトップ環境を起動
     if command -v startxfce4 >/dev/null 2>&1; then
         exec startxfce4
     else
         exec xterm -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop"
     fi
     EOF
    
     chmod +x ~/.vnc/xstartup
    
  5. VNCサーバーを起動する

    VMインスタンス(Ubuntu Server)上で以下コマンドを実行し、VNCサーバーを起動します。

     vncserver :1 -geometry 1280x720 -depth 16 -localhost no -SecurityTypes VncAuth -SendCutText=0 -AcceptCutText=0 -AcceptPointerEvents=1 -AcceptKeyEvents=1
    
  6. Macの場合は、画面共有アプリを起動し、${LOCAL_IP_ADDRESS}:5901 を設定してください

  7. 接続に成功すると、手元のローカル環境(Macなど)上に以下のような画面が表示されます

  8. VNCサーバーを終了させたい場合は、以下のコマンドを実行してください

     vncserver -kill :1
    

Isaac Sim のインストール

今回は conda を使用してインストールしましたが、docker でもインストールできます。

  1. 以下コマンドで glibc のバージョンが 2.34 以上になっているか確認してください。自分の環境では 2.34 以上になっていないと Isaac Sim をインストールできませんでした

     ldd --version
    

    Ubuntu 20.04 や Debian 11 の場合は、glibc バージョンはデフォルトで 2.31 になっているので注意してください。バージョンが 2.34 未満の場合は、Ubuntu や Debian のバージョンを更新する必要があるかと思います。

  2. Isaac Sim をインストールする

     conda create -n isaac python=3.10
     conda activate isaac
    
     pip install --upgrade pip
     pip install torch==2.5.1 torchvision==0.20.1 --index-url https://download.pytorch.org/whl/cu121
     pip install 'isaacsim[all,extscache]' --extra-index-url https://pypi.nvidia.com
    
  3. 以下のコマンドでインストールできたか確認できます

     isaacsim
    

Isaac Lab のインストール

  1. conda を使用する場合は、先で作成した環境に切り替えます

     conda activate isaac
    
  2. Isaac Lab のレポジトリをクローンする

     git clone https://github.com/isaac-sim/IsaacLab
     cd IsaacLab
    
  3. Isaac Lab をインストールする

     sudo apt install cmake build-essential
     ./isaaclab.sh --install
    

シミュレーターを起動する

  1. VNC サーバーを起動します

     vncserver :1 -geometry 1280x720 -depth 16 -localhost no -SecurityTypes VncAuth -SendCutText=0 -AcceptCutText=0 -AcceptPointerEvents=1 -AcceptKeyEvents=1
    
  2. Macの場合は、画面共有アプリを起動し、${LOCAL_IP_ADDRESS}:5901 を設定して接続してください

  3. conda を使用する場合は、先で作成した環境に切り替えます

     conda activate isaac
    
  4. VNCサーバーで指定しているディスプレイ出力先の環境変数を設定します

     export DISPLAY=:1
    
  5. Isaac Lab のサンプルコードを実行し、3Dシミュレーターを起動します

     cd IsaacLab
     python scripts/tutorials/00_sim/create_empty.py
    
  6. 以下のような空のシミュレーター画面が Mac 環境のディスプレイに表示されれば成功です!

なおシミュレーター実行時にシミュレーターがフリーズする場合は、VirtualGL 等を使用して VNC越しのOpenGL描画するようにすれば解決するケースがあります

# VirtualGL をインストールする
wget https://sourceforge.net/projects/virtualgl/files/2.6.5/virtualgl_2.6.5_amd64.deb
sudo apt install ./virtualgl_2.6.5_amd64.deb

# VirtualGL を使用してシミュレーターを実行する
export DISPLAY=:1
vglrun -d :1 python scripts/tutorials/00_sim/create_empty.py

ヒューマノイドロボット(H1)で歩行する

今回は、以下のチュートリアルに従って学習と推論を行います。

isaac-sim.github.io

モデルを学習する

今回のチュートリアルにある{ロボット・シミュレーション環境・モデル}に限定するのであれば、以下のコマンドを実行するだけで簡単に学習できます

conda activate isaac

cd IsaacLab
./isaaclab.sh -p scripts/reinforcement_learning/rsl_rl/train.py --task Isaac-Velocity-Rough-H1-v0 --headless

このスクリプトでは、Unitree Humanoids のヒューマノイドロボットである H1 に対して、歩行タスクを行うための定義済みのシミュレーション環境(Isaac-Velocity-Rough-H1-v0)を使用しており、環境から得られる報酬を元に強化学習で学習を行うので、模倣学習のときのように学習用データセットは不要になっています。

学習完了後に、IsaacLab/logs/h1_rough ディレクトリ以下にモデルのチェックポイントが出力されるので、後述の推論フェイズでこれを利用します

今回はチュートリアルにあるコードをそのまま利用しているので、Isaac Sim & Lab にモデル・学習コード・推論コードが準備されているのか勘違いするもしれませんが、これら自体は(チュートリアル以外では)基本的に Isaac Sim & Lab にあるわけではないことに注意してください。Isaac Sim & Lab でサポートされているのは、あくまでシミュレーター上の各種オブジェクトのアセット(ロボットやセンサーなど)やそれらを配置するためのシーン、定義済みシミュレーション環境(ない場合は自作する必要あり)とそれらの3Dツールなどになります。

シミュレーション上でモデルを推論させながらロボットを動かす

モデルの学習済みチェックポイントが得られたので、今度はこのチェックポイントを利用して、シミュレーター上でモデルを推論させながらロボットを動かします。

こちらもチュートリアルあるスクリプトをのままま利用します。

今回のチュートリアルにある{ロボット・シミュレーション環境・モデル}に限定するのであれば、以下のコマンドを実行するだけで簡単にシミュレーター上でモデルを推論させながらロボットを動かせます

  1. VNC サーバーを起動する

     vncserver :1 -geometry 1280x720 -depth 16 -localhost no -SecurityTypes VncAuth -SendCutText=0 -AcceptCutText=0 -AcceptPointerEvents=1 -AcceptKeyEvents=1
    
  2. Macの場合は、画面共有アプリを起動し、${LOCAL_IP_ADDRESS}:5901 を設定して接続してください

  3. ディスプレイの出力先を設定する

     export DISPLAY=:1
    
  4. シミュレーション環境上での推論スクリプト(その1)を実行する

     ./isaaclab.sh -p scripts/reinforcement_learning/rsl_rl/play.py --task Isaac-Velocity-Rough-H1-v0 --num_envs 64 --checkpoint logs/rsl_rl/h1_rough/EXPERIMENT_NAME/POLICY_FILE.pt
    

    —checkpoint に上記学習済みチェックポイントのパスを指定してください。--num_envs で環境の数を指定できます

    コマンド実行後に、以下のような3Dシミュレーション環境が表示されます。

    —num_envs 64 にして T4 で回したので動きが遅いですが、学習済みモデルで推論させなながらうまくロボットを動かせていることがわかるかと思います。

    但しこの推論スクリプトは、学習スクリプトと全く同じ定義済みの環境(Isaac-Velocity-Rough-H1-v0)での推論になっており、学習時と推論が同じ理想的な環境下での推論になっています。

    なおこのスクリプトでは、学習済みチェックポイントの Pytorch 形式から JIT 形式への変換も行っており、以下の推論スクリプト(その2)で使用します。

  5. シミュレーション環境上での推論スクリプト(その2)を実行する

     conda activate isaac
    
     cd IsaacLab
     ./isaaclab.sh -p scripts/tutorials/03_envs/policy_inference_in_usd.py --checkpoint logs/rsl_rl/h1_rough/EXPERIMENT_NAME/exported/policy.pt
    

    —checkpoint に上記学習済みチェックポイントの JIT 形式でのパスを指定してください。こちらで指定するチェックポイントは Pytorch の学習済みチェックポイントではなく JIT での学習用チェックポイントであることに注意してください。

    この推論スクリプトは、学習スクリプトと同じ定義済みの環境(Isaac-Velocity-Rough-H1-v0)を使用していますが、この環境に倉庫の3Dオブジェクトを追加した少し違う環境になっています。

    コマンド実行後に、以下のような3Dシミュレーション環境が表示されます。学習済みモデルで推論させながら、周りの環境が少し違ってもうまくロボットを動かせていることがわかるかと思います。

単腕アームロボット(Franka)で引き出しを開ける

今度は、同様の方法で Isaac-Open-Drawer-Franka-v0 という定義済みの環境を利用して、Franka ロボットで引き出しを開けるタスクをシミュレーター上で動かしてみます。

モデルを学習する

前回の学習スクリプトで --task 引数を Isaac-Open-Drawer-Franka-v0 に変更するだけです。

conda activate isaac

cd IsaacLab
./isaaclab.sh -p scripts/reinforcement_learning/rsl_rl/train.py --task Isaac-Open-Drawer-Franka-v0 --headless

学習完了後に、IsaacLab/logs/franka_open_drawer ディレクトリ以下にモデルのチェックポイントが出力されるので、後述の推論フェイズでこれを利用します。

シミュレーション上でモデルを推論させながらロボットを動かす

こちらも前回の推論スクリプトで —task 引数を Isaac-Open-Drawer-Franka-v0 に変更するだけです。

  1. VNC サーバーを起動する

     vncserver :1 -geometry 1280x720 -depth 16 -localhost no -SecurityTypes VncAuth -SendCutText=0 -AcceptCutText=0 -AcceptPointerEvents=1 -AcceptKeyEvents=1
    
  2. ディスプレイの出力先を設定する

     export DISPLAY=:1
    
  3. シミュレーション環境上での推論スクリプトを実行する

     ./isaaclab.sh -p scripts/reinforcement_learning/rsl_rl/play.py --task Isaac-Open-Drawer-Franka-v0 --num_envs 64 --checkpoint logs/rsl_rl/franka_open_drawer/EXPERIMENT_NAME/POLICY_FILE.pt
    

    コマンド実行後に、以下のような3Dシミュレーション環境が表示されます。学習済みモデルで推論させなながらうまくロボットを動かせていることがわかるかと思います。

今回の2つの例以外にも、以下で公開されている定義済みの環境を --task 引数に設定すれば、これらチュートリアルの学習スクリプトや推論スクリプトを利用して簡単にロボットを推論させながら3Dシミュレーター上で動かすことが可能になっています。

isaac-sim.github.io

まとめ

今回はチュートリアルにあるロボット・シミュレーション環境・モデル等を使って、Isaac Sim & Lab の 3D シミュレーション上でロボットを推論させながら動かしてみました。

Isaac Sim に限らず Gymnasium, Genenis のようなシミュレーターの場合でもそうなのですが、{シミュレーター上のロボット・シミュレーション環境・モデル・学習用データセット(模倣学習の場合は必要)}等がセットで提供されているチュートリアルやリソースがあるような場合は、シミュレーション上でモデルで推論させながらロボットを動かすことは正直何も難しくないです。

一方で、実際のロボット開発ではチュートリアル以外での任意のロボット・任意のシミュレーション環境・任意のモデル・任意の学習用データセットやそれらの組み合わせで動かす必要があるのでこれでは不十分なのですが、これをしようとすると途端に難易度が跳ね上がります。

これは当たり前のことではあるかと思いますが、特にロボティクス領域においてはこれが顕著になるかと思ってます。

というのはロボティクス固有の問題として、以下のような学習用データセット&モデルとシミュレーション環境間における互換性問題があり、これが少しでも違うとロボットがうまく動かない問題がでてきます。

  • ロボットの関節点の次元数や各関節点の順番の違い(同じ種類のロボットでも微妙に違うケースもある)
  • 座標系の違い(右手座標なのか左手座標系なのか)
  • スケールの違い(座標値のスケールが 1メートルなのか 1cm なのか。同じ 1 の座標値でも意味が変わる)
  • 座標値の意味の違い(絶対座標なのか相対座標なのか)
  • IKで変換する必要性有無の違い
  • 入出力の正規化有無の違い

ここらへんの詳細については、別記事で書くかもです。

実際に別のロボット・モデル・学習用データセット・シーン・環境を利用 or 作成しながら動かしていく内容にする予定です。

We Are Hiring!

株式会社ABEJAでは共に働く仲間を募集しています!

ロボティクスやLLMに興味ある方々!機械学習プロダクトに関わるフロントエンド開発やバックエンド開発に興味ある方々! こちらの採用ページから是非ご応募くださいませ!

careers.abejainc.com