Isaac Sim 入門 (3) - 基本チュートリアル
「Isaac Sim」の基本チュートリアルの手順をまとめました。
前回
1. 基本チュートリアル
このチュートリアルでは、「Isaac Sim の基本操作」「GUI の操作」「ステージへのオブジェクトの追加」「オブジェクトの基本プロパティの確認」「シミュレーションの実行」などについて説明します。
2. ワークフロー
「Isaac Sim」は、同じことを実現するために複数の方法を使用できます。これらの異なる方法を「ワークフロー」と呼びます。「Isaac Sim」の主なワークフローは3つあります。
・GUI
「GUI」ワークフローは視覚的な編集に向いており、ロボットやセンサーの配置や環境構築をドラッグ&ドロップで直感的に行えます。さらに、「OmniGraph」でノードをつないでロジックを組むこともできるため、最初のプロトタイプや実験環境の構築に最適です。
・Extensions
「Extensions」ワークフローは、「Isaac Sim」の拡張機能としてコードを組み込み、「GUI」と並行して動かせるのが特徴です。ホットリロードに対応しており、コードを編集して保存するだけで即座に反映されるため、試行錯誤しながらの開発するのに便利です。
・Standalone Pyton
「Standalone Python」ワークフローは、 「GUI」に依存せず、スクリプトだけでシミュレーションを制御する方法で、物理演算や描画のステップを明示的に管理できます。「GUI」を立ち上げない headless 実行も可能なため、大規模な強化学習やシーンの自動生成・バッチ処理に向いています。
3. GUI
3-1. 起動
(1) 「App Selector」で「Isaac Sim」を起動。
・Linux
cd ~/isaacsim
./isaac-sim.selector.sh・Windows
cd C:\isaacsim
isaac-sim.selector.bat(2) 「File → New」をクリック。
3-2. グラウンドプレーンの追加
シーンにグラウンドプレーンを追加します。
(1) 「Create → Physics → Ground Plane」をクリック。
3-2. 光源の追加
シーンに光源を追加します。シーンに光源があっても、光を反射するオブジェクトがない場合、シーンは暗くなります。
(1) 「Create → Lights → Distant Light」をクリック。
3-3. ビジュアルキューブの追加
ビジュアルキューブは、物理特性 (質量や衝突判定など) が付与されていないキューブのことです。このキューブは重力によって落下したり、他のオブジェクトと衝突したりすることはありません。
(1) 「Create → Shape → Cube」をクリック。
(2) 「Play」(▶)ボタンをクリック。
シミュレーション実行中、キューブは何も動作しません。

3-4. キューブの移動・回転・拡大縮小
左側のツールバーにある様々なギズモを使ってキューブを操作します。
(1) 「W」キーを押すか、「移動ギズモ」をクリックすると、立方体をドラッグして移動できます。矢印をクリックしてドラッグすると1軸方向に、色付きの四角をクリックしてドラッグすると2軸方向に、ギズモ中央の点をクリックしてドラッグすると3軸方向すべてに移動できます。
(2) 「E」キーを押すか、「回転ギズモ」をクリックすると、立方体を回転できます。
(3) 「R」キーを押すか、「拡大縮小ギズモ」をクリックすると、立方体の拡大縮小ができます。矢印をクリックしてドラッグすると1次元方向に、色付きの四角をクリックしてドラッグすると2次元方向に、ギズモ中央の円をクリックしてドラッグすると3次元方向に拡大縮小できます。
(4) 「esc」キーを押すと、立方体の選択が解除されます。
「移動」と「回転」は、ギズモをクリックホールドすることで、ローカル座標とワールド座標のどちらで操作するかを指定できます。
キューブの「Property」パネルで、対応するボックスに正確な数値を入力することで、より正確な変更を行うことができます。ボックスの横にある青い四角をクリックすると、値がデフォルトにリセットされます。

3-5. 物理特性と衝突特性を追加
「物理特性」には、「質量」と「慣性行列」があります。これらは、オブジェクトに力や回転が加わったときの動き方を決める特性です。「衝突特性」は、オブジェクトが他のオブジェクトと接触・反発するための特性です。
これらの特性は別々に設定することもできます。そのため、「他のオブジェクトとは衝突するが重力の影響を受けない物体」や、「重力で落下するが他のオブジェクトと衝突しない物体」を作ることも可能です。
ただし、通常は物理特性と衝突特性を組み合わせて設定します。
(1) ステージツリーでキューブ (/World/Cube) を選択。
(2) ワークスペースの右下にある「Property」パネルで「Add → Physics → Rigid Body with Colliders Preset」を選択。
オブジェクトに物理特性と衝突メッシュの両方が追加されます。
(3) 「Play」(▶) ボタンを押す。
キューブが重力によって落下し、地面に衝突する様子を確認できます。

4. Extensions
4-1. 起動
既存のExtensionsモジュール「Script Editor」を使用して、「Extensions」ワークフローの特性をデモンストレーションします。「Script Editor」を使用すると、ユーザーはPythonを使ってステージを操作できます。「Standalone Python」ワークフローとほぼ同じ「Python API」を使用していることがわかります。
(1) 「Isaac Sim」を起動。
(2) 「Window → Script Editor」を選択。
4-2. グラウンドプレーンの追加
(1) 「Script Editor」に以下のコードをコピー&ペーストし、「Run」ボタンをクリック。
from isaacsim.core.api.objects.ground_plane import GroundPlane
GroundPlane(prim_path="/World/GroundPlane", z_position=0)4-3. 光源の追加
(1) 「Script Editor」で「Tab → Add Tab」。
(2) 「Script Editor」に以下のコードをコピー&ペーストし、「Run」ボタンをクリック。
import omni.usd
from pxr import Sdf, UsdLux
stage = omni.usd.get_context().get_stage()
distantLight = UsdLux.DistantLight.Define(stage, Sdf.Path("/DistantLight"))
distantLight.CreateIntensityAttr(300)4-4. ビジュアルキューブの追加
ビジュアルキューブとは、物理特性が一切設定されていないキューブのことです。質量も衝突判定もありません。このキューブは重力によって落下したり、他のオブジェクトと衝突したりすることはありません。シミュレーション実行中に「Play」(▶)ボタンを押すと、キューブが何も動作しないことがわかります。
(1) 「Script Editor」で「Tab → Add Tab」。
(2) 「Script Editor」に以下のコードをコピー&ペーストして、「Run」ボタンをクリック。
import numpy as np
from isaacsim.core.api.objects import VisualCuboid
VisualCuboid(
prim_path="/visual_cube",
name="visual_cube",
position=np.array([0, 0.5, 0.5]),
size=0.3,
color=np.array([255, 255, 0]),
)
VisualCuboid(
prim_path="/test_cube",
name="test_cube",
position=np.array([0, -0.5, 0.5]),
size=0.3,
color=np.array([0, 255, 255]),
)4-5. 物理特性と衝突特性の追加
「物理特性」には、「質量」と「慣性行列」があります。これらは、オブジェクトに力や回転が加わったときの動き方を決める特性です。「衝突特性」は、オブジェクトが他のオブジェクトと接触・反発するための特性です。
これらの特性は別々に設定することもできます。そのため、「他のオブジェクトとは衝突するが重力の影響を受けない物体」や、「重力で落下するが他のオブジェクトと衝突しない物体」を作ることも可能です。
ただし、通常は物理特性と衝突特性を組み合わせて設定します。
(1) 「Script Editor」で「Tab → Add Tab」。
(2) 「Script Editor」に以下のコードをコピー&ペーストして、「Run」ボタンをクリック。
import numpy as np
from isaacsim.core.api.objects import DynamicCuboid
DynamicCuboid(
prim_path="/dynamic_cube",
name="dynamic_cube",
position=np.array([0, -1.0, 1.0]),
scale=np.array([0.6, 0.5, 0.2]),
size=1.0,
color=np.array([255, 0, 0]),
)「Play」(▶) ボタンをクリックすると、立方体が重力によって落下し、地面に衝突する様子を確認できます。
4-6. キューブの移動・回転・拡大縮小
(1) 「Script Editor」で「Tab → Add Tab」。
(2) 「Script Editor」に以下のコードをコピー&ペーストし、「Run」ボタンをクリック。
import numpy as np
from isaacsim.core.prims import XFormPrim
translate_offset = np.array([[1.5,1.2,1.0]])
orientation_offset = np.array([[0.7,0.7,0,1]]) # note this is in radians
scale = np.array([[1,1.5,0.2]])
stage = omni.usd.get_context().get_stage()
cube_in_coreapi = XFormPrim(prim_paths_expr="/test_cube")
cube_in_coreapi.set_world_poses(translate_offset, orientation_offset)
cube_in_coreapi.set_local_scales(scale)5. Standalone Pyton
5-1. 起動
スクリプトは、「standalone_examples/tutorials/getting_started.py」 にあります。
(1) スクリプトの実行。
・Linux
./python.sh standalone_examples/tutorials/getting_started.py・Windows
python.bat standalone_examples\tutorials\getting_started.py5-2. コードの説明
・グラウンドプレーンの追加
シーンにグラウンドプレーンを追加する際に関連する行は次のとおりです。
from isaacsim.core.api.objects.ground_plane import GroundPlane
GroundPlane(prim_path="/World/GroundPlane", z_position=0)・光源の追加
「getting_started.py」内で遠隔光源を追加する行は次のとおりです。
from pxr import Sdf, UsdLux
stage = omni.usd.get_context().get_stage()
distantLight = UsdLux.DistantLight.Define(stage, Sdf.Path("/DistantLight"))
distantLight.CreateIntensityAttr(300)・ビジュアルキューブの追加
「getting_started.py」内で、シーンにビジュアルキューブを追加する行は次のとおりです。
import numpy as np
from isaacsim.core.api.objects import VisualCuboid
VisualCuboid(
prim_path="/visual_cube",
name="visual_cube",
position=np.array([0, 0.5, 0.5]),
size=0.3,
color=np.array([255, 255, 0]),
)・物理特性と衝突特性を追加
Standalone Pythonスクリプトでは、以下に示すようにキューブをRigidPrimオブジェクトに変換することで、物理特性を追加できます。これにより、オブジェクトは重力の影響を受けて落下する能力を持ちます。
from isaacsim.core.prims import RigidPrim
RigidPrim("/visual_cube")以下のコードは、衝突プロパティを追加する行を示しています。これにより、オブジェクトは他のオブジェクトと衝突できるようになります。
from isaacsim.core.prims import GeometryPrim
prim = GeometryPrim("/visual_cube")
prim.apply_collision_apis()・キューブの移動・回転・拡大縮小
以下のコードは、コアAPIを使用してシーン内のオブジェクトを移動した行を示しています。
import numpy as np
from isaacsim.core.prims.xform_prim import XformPrim
from isaacsim.core.prims.prim import Prim
translate_offset = np.array([[1.5,-0.2,1.0]])
rotate_offset = np.array([[90,-90,180]])
scale = np.array([[1,1.5,0.2]])
cube_in_coreapi = XformPrim(Prim(prim_paths_expr="/test_cube"))
cube_in_coreapi.set_world_poses(translate_offset, rotate_offset)
cube_in_coreapi.set_scales(scale)