【Isaac Sim × Isaac Lab入門】#5 Isaac SimのGUIで作成した3D環境(USD)をIsaac Labに取り込む
以下の記事にて、Isaac Sim内にカメラを設置し、「RGB画像」「法線画像」「セグメンテーション画像」を取得することができた。
課題として、3D環境をコードで一つ一つ定義しているため、大規模かつオブジェクトが複数ある3D環境を作成する場合、作成の負担が大きいことが挙げられた。
一方、こちらのFAQによると、Isaac SimでGUI操作で3D環境を用意し、そのファイルをUSD形式で保存すると、Isaac Labにインポートして使用できるらしい。
そこで今回は、上記内容を調査する。
USD形式とは?
ピクサーによって開発されたファイル形式で、2016年からオープンソース化された。
多くの3Dアーティストが1つのプロジェクトを分担して作成する場合に、統一のファイル形式で作業が可能。
例えば、3Dの屋内を作成する場合、「椅子やタンスなどの3Dの家具を作成するアーティスト」と、「屋内の構造(壁や床など)を担当するアーティスト」で、それぞれで作成したものを一つのシーンに統合する必要がある。
この時、使用するファイル形式をUSDファイルに統一しておくと、「椅子やタンスなどの家具」というUSDファイルと、「屋内の構造」というUSDファイルをそれぞれのアーティストごとの環境で作成し、最後に組み合わせたり、サイズを調整したりということが簡単になる。
また、GPUアクセラレーションを使用しており、USDのファイルサイズが大きくなっても過負荷なく処理できるように構築されているため、大手のスタジオや小規模チーム両方に対応できるとのこと。
画像出典:ピクサー
参考:ユニバーサルシーンディスクリプション(USD)でコラボレーションを効率化する
Isaac Simで3D環境の作成
今回は、「地面」「ライト」「物理特性を付与したキューブ」というシンプルなシーンを作成する。
なお、事前にこちらの手順でIsaac Simの環境構築が済んでいることを前提として進める。
手順1. Isaac Simを開く
コマンドプロンプトで、以下のコマンドを実行する。
cd C:\isaacsim
isaac-sim.selector.bat
AppSelectorが開くので、「START」を押す。
すると、シーンが開く。
手順2. 3D環境を作成する
こちらの記事を参考に、「地面」「ライト」「物理特性を付与したキューブ」を設置したシーンを作成する。
手順3. シーンを保存する
File > Saveを押す。
以下のような画面が表示されるので、適当なディレクトリを選び、File nameを設定して、Saveを押す。
今回はC:/Users/{ユーザ名}/work/Scenes
というディレクトリを作成し、File nameをscene001
という名前に設定した。
シーンをIsaac Labから読み込む
ここでは、先ほど作成したシーンを、Pythonスクリプトから読み込む手順を記載する。
手順1. Pythonスクリプトの作成
前回までの手順と同様に、C:\Users\{ユーザ名}\work\python_scripts
ディレクトリの中に、read_scene.py
というPythonスクリプトを作成する。
C:\Users\{ユーザ名}\work\
├─ IsaacLab
└─ python_scripts
└─ create_empty_scene.py
└─ create_object.py
└─ get_object_transform.py
└─ camera_capture.py
└─ read_scene.py
そしてread_scene.py
の中に、以下のコードを貼り付ける。
今回のコード
import argparse
from isaaclab.app import AppLauncher
def create_scene():
"""
空のシーンに、地面、ライト、キューブが配置されたシーンを読み込む
"""
usd_path = r"C:\Users\{ユーザ名}\work\Scenes\scene001.usd"
my_asset = AssetBaseCfg(
prim_path="/World/scene/my_asset",
init_state=AssetBaseCfg.InitialStateCfg(pos=[0.0, 0.0, 0.0], rot=[1.0, 0.0, 0.0, 0.0]),
spawn=sim_utils.UsdFileCfg(usd_path=usd_path),
)
my_asset.spawn.func(
my_asset.prim_path, my_asset.spawn, translation=my_asset.init_state.pos, orientation=my_asset.init_state.rot,
)
# ステップ0. 引数を受け取る
parser = argparse.ArgumentParser(description="Tutorial on creating an empty stage.")
AppLauncher.add_app_launcher_args(parser)
args_cli = parser.parse_args()
# ステップ1. シミュレータの起動
app_launcher = AppLauncher(args_cli)
simulation_app = app_launcher.app
# ステップ2. Isaac Sim(や他のライブラリ)からモジュールをインポート
import isaaclab.sim as sim_utils
from isaaclab.assets import AssetBaseCfg
# ステップ3. シミュレーションコンテキストの設定
sim_cfg = sim_utils.SimulationCfg(dt=0.01)
sim = sim_utils.SimulationContext(sim_cfg)
# ステップ4. ビューポートを映すカメラの位置・注視点を設定
sim.set_camera_view([2.5, 2.5, 2.5], [0.0, 0.0, 0.0])
# ステップ5. 地面、ライト、キューブをシーンに配置
create_scene()
# ステップ6. シミュレーションの実行
sim.reset()
while simulation_app.is_running():
sim.step()
# ステップ7. シミュレーションを終了
simulation_app.close()
手順2. 実行前の事前準備
Isaac SimとIsaac Labを実行する事前作業として、パスを通す。
コマンドプロンプト上で、以下を実行する。
cd C:\Users\{ユーザ名}\work\IsaacLab
set ISAACSIM_PATH="C:/isaacsim"
set ISAACSIM_PYTHON_EXE="%ISAACSIM_PATH:"=%\python.bat"
isaaclab.bat --install
手順3. 実行
コマンドプロンプト上で、以下を実行する。
isaaclab.bat -p ..\python_scripts\read_scene.py
実行に成功すると、以下のように「地面」「ライト」「キューブ」が配置されたシーンが表示され、
「キューブ」が落下し地面の上で停止するシミュレーションが行われる。
ネクストアクション
今回の調査で、Isaac Sim上で作成したシーンを、Pythonで読み込み、アセットとして配置することができた。
これにより、もともと課題としていた「コードで環境を一つ一つ定義する負担」問題が、低減されたと考えられる。
今後は、Isaac SimでPLATEAUを読み込み、そのうえで人を歩かせることを試してみたい。
Discussion