98.7K Views
February 23, 24
スライド概要
2023年12月13日に行ったIsaacSimハンズオン会で使用した資料になります.
奈良先端科学技術大学院大学修士2年生 研究分野: Task And Motion Planning
1 IsaacSimハンズオン 2023/12/13 奈良先端科学技術大学院大学 ロボットラーニング研究室 M2 佐藤誠人
自己紹介 佐藤誠人 (Makoto Sato) • NAISTロボットラーニング研究室修士2年 • ロボットラーニング色々浅く触ってます • • • • モバイルマニピュレータによる長期的タスクの動作学習 ロボットマニピュレータによる商品陳列動作の学習 ロボットマニピュレータによる物体表面なぞりと物体識別 画像ベース強化学習を用いた四足歩行ロボットの歩行学習 • 松尾研究室で世界モデル研究に従事 普段はTAMPをメインにContact-Richマニピュレーションの 研究をやってます 物理シミュレータの動向を調査するのが趣味です 2
この資料について 3 • この資料で扱う範囲 • 強化学習用の並列環境の作り方 • IsaacSimでできることの紹介 • この資料の目的 • 自身の解きたい課題に対してIsaacSimを用いた環境を構築できる • 今後IsaacSimで開発する上で詰まる時間を削減する • この資料の対象者 • 強化学習を並列環境で高速に回したい方 • 外部ライブラリなしでレイトレーシングなど高解像度データが欲しい方 • MuJoCo,PyBulletをこれまで使用していて,IsaacSimの使用を検討中の方 まだ使ってない機能が多すぎてわからないところも多いので,みなさん使ってみて知見を共有してください!
4 目次 1. IsaacSimの概要 • • • • IsaacSimとは? IsaacSimでできること 他のシミュレータとの違い IsaacSimの学習環境 2. IsaacSimを動かしてみる • • • • • Docker環境の構築 IsaacSim基本情報① IsaacSim基本情報② ロボットの制御 URDFのインポート 3. 様々なシミュレーション環境の作成 • • • • 剛体シミュレーション環境 柔軟物体シミュレーション環境 モバイルマニピュレータ環境 Contact-Richマニピュレーション環境 4. その他 • • • • 効果的なデバッグ方法 ありがたい/ありがたそうな機能 サンプル紹介 まとめ
1. IsaacSimの概要
IsaacSimの概要 IsaacSimとは? 6 • NVIDIA Omniverse Platformの一つの機能であり,ロボットシミュレーション ツールキットを提供 • ROS/ROS2を使用したマニピュレーション/ナビゲーションなどを提供 • RGB-D, LiDAR, IMUなど複数のセンサーシミュレーションを提供 引用: https://docs.omniverse.nvidia.com/isaacsim/latest/index.html
IsaacSimの概要 IsaacSimでできること • 学習用環境の構築 • 強化学習や模倣学習など大規模にデータセットを必要とする環境を提供 • 環境を並列化してGPU上で高速に動かす • アルゴリズム検証用環境の構築 • Embodied AIなど大規模な居住環境などを提供 AI2-THORやHabitat,Behaviorのような環境を提供 → 実際にOmniGibson • GazeboなどROSをサポートした実機とシームレスに接続可能 なぜかIsaacSim + Gazeboが存在 (この動画でなんで混ぜるのか話していたが) • 3DCG環境の構築 • 高解像度なレンダリングやPixar標準のモデル形式USDを使用することでリアルな シーンを再現可能 7
IsaacSimの概要 他のシミュレータとの違い① 8 • 大規模な並列化が可能 (~50,000環境程度) • 簡単なシミュレーション環境であれば,10,000~100,000FPS • 柔軟物体,流体など複数の物体のシミュレーションが可能 • Position-based Dynamicsも内包しているため,布や水などのマニピュレーション も可能 ※ PhysX+WarpでDifferentiableの部分も変化
IsaacSimの概要 他のシミュレータとの違い② 9 • 非凸形状もサポート (最近MuJoCo3.xがサポート) • 多くのシミュレータではConvex Hullなどで近似されてしまうCollisionモデルも Meshベースの詳細な形状を扱うことが可能 • レンダリングエンジンがリッチ • RTX Rendererを使用したRay TracingやPath Tracingを実装し,高画質なシーン 描画が可能 引用: https://www.youtube.com/watch?v=VW-dOMBFj7o
IsaacSimの概要 IsaacSimを使用した学習用環境 • OmniIsaacGymEnvs • NVIDIA公式が開発し,Preview版のIsaacGymEnvsをOmniverse用に改変 • Orbit • NVIDIA ETHが開発し,RL/ILなどロボットラーニング向けのUnifiedなフレーム ワークを提供 引用: https://isaac-orbit.github.io/orbit/index.html 10
2. IsaacSimの基本操作
IsaacSimを動かしてみる IsaacSimの基本情報① • 現状2023.1.0-hotfixまでDocker環境が公開 • 2022.2.x系はバグが多めで大変なことになっていた (メモリリークなども) • IsaacSim独自のPythonがインストールされている • 2023.1.0ではPython3.10で環境が構築 • 2023.1.0以前はPython3.7系環境限定 • Pixarが開発した3Dモデルファイル形式USDを採用 • ロボティクス,CGなどに使える • 内部の物理エンジンではPhysX5が動いており,Flexを内包 (Blastも内蔵) 12
IsaacSimを動かしてみる 13 IsaacSimの基本情報② • 環境中の物体の基本単位: Prim Stage内のPrim階層構造 • USD SceneはStageで管理 • 基本的にIsaacSimの環境はPrimの階層構造で管理 • Primの種類 • 剛体:XFormPrim, GeometryPrim, RigidPrim • ロボット/関節付き物体: ArticulationPrim • 柔軟物体: DeformablePrim • Viewによって並列化可能 • XFormPrimView, GeometryPrimView, RigidPrimViewなど 引用: https://docs.omniverse.nvidia.com/isaacsim/latest/reference̲glossary.html#usd
IsaacSimを動かしてみる 14 IsaacSimの基本情報③ • 単位と表現,座標系 • 基本的な単位は他のシミュレータ同じだが,driveの単位注意 (math.degreesなど) • Quaternionが(X, Y, Z, W)ではなく(W, X, Y, Z)であること注意! omni.Isaac.core.utilsに座標変換などのAPIが用意 されているので積極的に使ってください! (バッチ化された実装にもなっているので) 引用: https://docs.omniverse.nvidia.com/isaacsim/latest/reference̲conventions.html
IsaacSimを動かしてみる IsaacSimのDocker環境 • 公式からDockerイメージをpullしてくる • • • • NVIDIA Driver525.x推奨 NVIDIA Developer Programに登録 NGC Keyの生成 Dockerイメージをpull • 注意点 • 2021.2.0/2022.2.1はバグが多数ある • 2022.2.x系ではVulkan周りでマウント するディレクトリが異なる 引用: https://docs.omniverse.nvidia.com/isaacsim/latest/installation/install̲container.html 15
IsaacSimを動かしてみる IsaacSimの起動① • 次のコマンドを実行して,Dockerコンテナを起動 $ git clone https://github.com/makolon/OmniIsaacGymEnvs.git $ cd OmniIsaacGymEnvs $ ./docker/run_docker.sh • 環境変数の設定 (本来run̲docker.sh内の-eとかで設定する) • DISPLAYの設定 • DISPLAYの番号をホストのディスプレイ番号に設定してください e.g.) export DISPLAY=:1 • xhost権限の設定 • あんまり良くないかもですが,とりあえずxhost +などで権限を下す 16
IsaacSimを動かしてみる 17 IsaacSimの起動② • 次のコマンドを実行して,しばらく待つとIsaacSimのウィンドウが起動する $ cd /isaac-sim $ ./isaac-sim.sh –allow-root • Hello Worldから始める • 起動したウィンドウの上部Isaac Examples > Hello Worldをロード • physicsScene,地面や環境光が追加される physicsScene: 重力,ソルバー, CCD,GPU周りの 設定が記述されて いる 引用: https://docs.omniverse.nvidia.com/isaacsim/latest/core̲api̲tutorials/tutorial̲core̲hello̲world.html
IsaacSimを動かしてみる URDFのImport 18 • URDF Importerを使用したUSDの作成 1. IsaacUtils > workflows > URDF Importerを開く 2. 細かな設定 3. Instanceableなどに チェックを入れる 4. URDFのパスを指定 5. USDの保存先を指定 6. Load URDFでURDFを ロード ※2022.2.1を使用 ※ MJCFもImport可能,USDからURDFへExportも可能
IsaacSimを動かしてみる 19 ロボットの追加 • URDF Importerを使用して作成したロボットのUSDモデルをロード • めんどくさい部分はRobotクラスが 処理してくれているので,USDパス とPrimのパスを指定するだけ • 各ジョイントのモーターゲインなどを 細かく修正したい場合はこちら参照 基本的にこれだけ • Viewクラスで並列化する場合 • ArticulationViewを継承したクラスを 作るだけ • Primパスだけ正しければ並列化できる はず 引用: https://docs.omniverse.nvidia.com/isaacsim/latest/advanced̲tutorials/tutorial̲advanced̲import̲urdf.html
IsaacSimを動かしてみる 物体の追加 20 • URDF Importerを使用して作成した物体のUSDモデルをロード • 基本的な部分はロボットと同じ • USDパスとPrimのパスを指定するだけ • Viewクラスで並列化する場合 • RigidPrimViewクラスを作るだけ • Primパスだけ正しければ並列化できる はず これだけ… • 注意点 • URDF Importerを使用せずUSDを拾ってきた場合などはPrimの階層構造が異なる 場合があり,XFormPrimで環境に追加すると動かないかも (特にShapeNetの物体など, 詳細はこちら)
IsaacSimを動かしてみる ロボットの制御 21 • ロボットの制御は位置制御/速度制御/トルク制御をサポート (omni.core.robots.articulation内で以下の制御を実装) • • • • set̲joint̲positions: 関節の位置を指定された位置に(強制)移動 set̲joint̲position̲targets: 関節の位置PD制御が可能 set̲jonint̲velocities: 関節の速度制御が可能 set̲joint̲efforts: 関節のトルク制御が可能 • 注意点 • 1ステップ(SimulationContext.step(world, render)を実行)に一つのコマンドしか 受け付けません • グリッパーだけ動かしたいという時などに注意
3. さまざまなシミュレーション 環境の作成
さまざまなシミュレーション環境の作成 IsaacSim環境を作成する前に • どのフレームワークに乗っかるべきか? • 現状,学習用環境としてOIGE,Orbit,Arnoldなどが公開 • 個人的にここ半年前後の動向を見るとOIGEが一番良い • • • • 他に比べて開発頻度が高め IsaacGymEnvsと同様な書き方をしていて,機能の移行がしやすい サンプルが多い まず先に新しいデモが追加される • OIGEの不利な点 • 模倣学習用のインターフェースが乗りづらい • センサー周りの実装が少ない • RLに関してrl̲gamesとベッタリで改造しづらい (最近はskrlもサポートしたが?) 23
さまざまなシミュレーション環境の作成 強化学習用環境の構築手順 24 • OmniIsaacGymEnvsの改変 • 基本的にmodels/robots/tasksを変更 • modelsの変更点 • 新しいロボットURDF/USDモデルの追加 • 新しい物体URDF/USDモデルの追加 • robotsの変更点 • ロボットのPrim(ArticulationPrim)の設定の記述 • Articulation Objectもここへ追加 • tasksの変更点 • 環境にスポーンさせる物体を記述 • 報酬関数,終了条件,ロボットの動作などを記述 基本的に変更する箇所は ここだけ (cfgも少し)
さまざまなシミュレーション環境の作成 剛体シミュレーション環境の作成 • 剛体シミュレーション環境の作成手順 • • • • • USDの準備 (Issac Assetsにある場合は不要) ← 2 . URDFのインポート参照 add̲reference̲to̲stageでstageにprimを追加 RigidPrimViewで並列化 tasksの変更 sceneにRigidPrimViewを追加 報酬関数やロボットの制御を追加 • 位置/速度の取得 • get̲joint̲positions/get̲joint̲velocities, get̲world̲poses関数 が用意されている • 実際にやってみる! 25
さまざまなシミュレーション環境の作成 xArm環境を作ってみる① • 手順 1. xArm6̲with̲gripperのURDFを適当に拾ってくる (xacroからURDFへ変更するのが面倒だったのでPyBulletのを持ってきました) ↪ models/xarm参照 2. URDF Importerを使用してUSDモデルの作成 ↪ models/xarm/xarm6̲with̲gripper参照 3. Robotクラスを継承したXarmクラスの作成 ↪ robots/articulations/xarm.py参照 4. ArticulationViewクラスを継承したXarmViewクラスの作成 ↪ robots/articulations/views/xarm̲view.py参照 26
さまざまなシミュレーション環境の作成 xArm環境を作ってみる② • 手順 5. tasks下にxArm用の新しいタスクを追加 ↪ tasks/xarm̲block.py参照 6. 追加した新しいタスクに合わせてtask̲util.pyの変更 ↪ utils/task̲util.py参照 7. 設定の修正・追加 ↪ cfg/task/XarmPick.yaml, cfg/train/XarmPickPPO.yaml参照 8. 動かしてみよう! $ cd /workspace/omniisaacgymenvs/omniisaacgymenvs/scripts/ $ /isaac-sim/python.sh rlgames_train.py task=XarmPick ※ XarmPickPPO.yaml内のminibatch̲size, horizon̲lengthは次の関係式が成り立っていないとエラーが出るので注意 → batch̲size % minibatch̲size == 0, batch̲size = horizon̲length * num̲envs. 27
さまざまなシミュレーション環境の作成 28 xArm環境を作ってみる③ • 結果変更したファイル これだけ… 1時間半くらいで作りました
さまざまなシミュレーション環境の作成 xArm環境を作ってみる④ • xArm Block Pick環境デモ 29
さまざまなシミュレーション環境の作成 柔軟物体シミュレーション環境の作成 • 柔軟物体シミュレーション環境作成の手順 (簡易版) • • • • Deformable USDの準備 ← あとは剛体の時とほとんど同じ add̲reference̲to̲stageでstageにprimを追加 DeformablePrimViewで並列化 sceneにDeformablePrimViewを追加 • 位置/速度の取得 • get̲simulation̲mesh̲nodal̲positions/ get̲simulation̲mesh̲nodal̲velocities関数 が用意されている より高度な使い方はOIGEのfranka̲deformable.pyを参照 30
さまざまなシミュレーション環境の作成 柔軟物体USDの作成 31 • GUIベースのDeformable Objectの作り方 1. URDF Importerで物体を スポーン 2. USDに変換したモデルを 環境にロード 3. ロードした物体を右の stage内で指定 4. 対象の物体のRigidPrim に当たる部分を削除 5. 右クリックAdd > Physics > Deformable Bodyを追加 6. Ctrl+Sで保存 ※2022.2.1を使用
さまざまなシミュレーション環境の作成 32 モバイルマニピュレータ環境の作成 • モバイルロボットのモデル選択 • 車両モデル:タイヤでベースの移動を実現 • 仮想ジョイントモデル:ベースにx, y, yawの移動を可能にするジョイントを追加 メリット • 実際のロボットと同じ動き • アームの自由度が低い場 合,IK周りが大変 • 位置制御コマンドを扱い づらい • IKが簡単に解ける • 位置制御コマンドが扱える • モーターゲインの調整な どが大変 車両モデル 仮想ジョイントモデル デメリット 最近公開されたHSRのIsaacSim環境は車両モデルで実機同様に位置制御コマンドを 扱えるようになっていたと思います
さまざまなシミュレーション環境の作成 Contact-Richマニピュレーション環境の作成 • Meshベースのシミュレーション • AABBレベルの衝突判定では,Peg-in-Holeなどが不可能 • SDFベースの接触判定やのめり込み量検出 • 非凸形状物体 (動的物体/静的物体) • Contact-Richマニピュレーション環境作成手順 • SDF Mesh物体のUSDの作成 → 次のページ参照 • 静的物体の場合の追加処理 → 3. SDFを作成する上での注意点参照 • 環境に追加 → 2. 物体の追加参照 引用: https://docs.omniverse.nvidia.com/extensions/latest/ext̲physics/rigid-bodies.html 33
さまざまなシミュレーション環境の作成 SDFの作り方① • GUIベースの方法またはスクリプトベースの方法がある • 今回はGUIベースの方法を紹介 (こっちの方が直感的で確実) • Collision Typeの種類 • Convex Hull, Convex Decomposition, Bounding Sphere, Bounding Box, Triangle Mesh, SDF Meshが存在する ※ Mesh系はGPU pipeline時のみ使用可能 引用: https://docs.omniverse.nvidia.com/extensions/latest/ext̲physics/rigid-bodies.html 34
さまざまなシミュレーション環境の作成 SDFの作り方② 35 • GUIベースのSDF Meshの作り方 1. URDF Importerで物体を スポーン 2. USDに変換したモデルを 環境にロード 3. ロードした物体を右の stage内で指定 4. 対象の物体のCollision TypeをSDF Meshへ変更 5. Ctrl+Sで保存 ※2022.2.1を使用
さまざまなシミュレーション環境の作成 36 SDFを作成する上での注意点 • 環境に固定するようなSDFベース物体を作成する場合 • static̲colliderを追加する必要がある • 手順 • • • • • SDFの作り方に従ってSDFを持つUSDを作成 ./isaac-sim.sh --allow-rootなどでIsaacSimを起動 USDモデルを環境に配置 右下に出てくる黄色いポップアップでYesを押す Ctrl+Sでモデルを保存する • Meshは細かくしすぎない • Meshを細かくするとその分だけ処理が増える • デフォルトくらいが一番 これ
さまざまなシミュレーション環境の作成 Contact-Richマニピュレーション環境例 • 剛体シミュレーションと同様に作成したSDF Meshを持つ物体を環境に追加す ることで簡単にContact-Richなタスクを作成できます 37
4. その他
その他 効果的な開発方法① • 公式ドキュメントを確認する • そもそものドキュメント自体がそこまで多くないのでとりあえず公式へ • APIのソースコードを直接確認することも有効 (vscodeから確認など) • 公式のNVIDIA Developer Forumで該当内容を検索する • このリンクのSearchから探す (#IsaacSimで検索を絞りましょう) • 公式のNVIDIA Developer ForumまたはDiscordに投稿する • 日数は空くことも多いが返信率は割と高め (モデレータからも返信が来る) • インタラクティブに問題解決ができる 当たり前のことかもしれないですが,実際に触っていて結構苦しんだので 39
その他 効果的な開発方法② 40 • OrbitまたはOIGEのdocsを確認する • TroubleshootingやKnown Issuesに大切なことが書いてあったりする • サンプルプログラムを確認する • 学習環境用: OIGE, Orbit, rlmmbp, Partial MARL, (SafeMAIG), (IsaacGymEnvs) • 検証用: Arnold, OmniGibson • PhysX APIを直接叩く • 2022.2.x系だとラップしたOmniverseAPIにバグがあることが多いので,PhysXの APIを直接叩いて機能を実現する方が安定することが多い ※2023.1.0で修正され ている可能性もあります e.g.) Surface Gripperの機能
その他 ありがたい機能 • Gain Tuner • ロボットのReality Gapになりうるモーターゲインを調整する機能を提供 • Isaac Utils→Workflows→Gain Tunerで使用可能 • IsaacSim Profiler • CPUとGPUの使用状況や各シミュレーションプロセスにかかる時間を表示 • ボトルネックになっている処理などを確認することが可能 • IsaacSimの画面上でF8で使用可能 • Articulation Inspector • 新しく追加したロボットの関節DoFのプロパティを確認することが可能 • Isaac Utils→Workflows→Articulation Inspectorで使用可能 引用: https://docs.omniverse.nvidia.com/isaacsim/latest/features/robots̲simulation/index.html 41
その他 ありがたそうな機能① • Motion Generation • RRTなどロボットの動作計画やIK/FKなどKinematics Solverを提供 • OCS2(MPC)も搭載されている • Isaac Replicator • Segmentation Maskなどデータセットを作成するためのツールを提供 引用: https://docs.omniverse.nvidia.com/isaacsim/latest/features/robots̲simulation/index.html 42
その他 ありがたそうな機能② • Isaac Cortex • 環境の変化に適用可能な協働ロボットシステムを提供 • Behavior Treeなどが内部では使用されている? 引用: https://docs.omniverse.nvidia.com/isaacsim/latest/cortex̲tutorials/index.html 43
その他 これから欲しい機能 • Motion Planningの並列化 • 環境数分並列でMotion Planningしたい • Sceneの自動生成機能 • 並列化した環境数分シーンを構築するのが大変なので自動化したい • ShapeNet Importerがあるので? • ベンチマーク的な環境 • Robosuite,RLBenchみたいな環境 • レンダリングがRTX Redererだと ManiSkill2とか? • Arnoldが最近は出てきたが 引用: https://piginet.github.io/ 44
その他 サンプル一覧 • 流体シミュレーション (PBD + Marching Cube法) Window > Simulation > Physics > Demo Scenes > Particles > Fluid Isosurfaceから見れます 45
その他 サンプル一覧 • LEGOブロック組み立て Window > Simulation > Physics > Demo Scenes > Complex Showcases > Franka Brick Stackingから見れます 46
その他 サンプル一覧 • Franka Nut&Bolt Window > Simulation > Physics > Demo Scenes > Complex Showcases > Franka Nut and Boltから見れます 47
その他 サンプル一覧 • Warp Window > Warp > Scenes > Marching Cubesから見れます 48
まとめ 49 • IsaacSimでは,学習環境,検証用環境,3DCGシーンの構築などができる! • 他のシミュレータと違って並列化や柔軟物体など色々な種類の物体・ロボット のシミュレーションが可能! • OIGEを拡張することで解きたいタスクに合わせて環境を構築できる! • IsaacROSとかUSD Composerとかの知見がないので,みんなで共有していき たい!
参考文献 • 全ドキュメント: https://docs.omniverse.nvidia.com/index.html • Extensions Manual: https://docs.omniverse.nvidia.com/extensions/latest/index.html • Developer Manual: https://docs.omniverse.nvidia.com/dev-guide/latest/index.html 50
付録 51 • 環境数の変え方 • cfg/config.yaml内のnum̲envsを変更 • train/<task̲name>PPO.yamlの下の方のrlタグ内でminibatch̲sizeをminibatch̲size = horizon̲length num̲envsになるように修正 ※ horizon̲lengthはタスクごとに異なるため4で割れる数で適当 e.g.) num̲envs = 4096の場合 minibatch̲size = 1049088, horizon̲length = 256など • カメラの動かし方 • https://docs.omniverse.nvidia.com/isaacsim/latest/common/keyboard̲shortcuts.ht ml参照