Previous Tutorial | Description |
---|---|
๐ Isaac Lab Tutorial #1 | Overview of Isaac Lab & Setting up the Docker Environment |
๐ ๋ ๋ฒ์งธ ํํ ๋ฆฌ์ผ์์๋ Standalone Python ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ์ฌ Isaac Sim ์๋ฎฌ๋ ์ดํฐ๋ฅผ ์คํํ๊ณ , Isaac Lab์ ์ฅ๋ฉด์ ๋ค์ํ ๊ฐ์ฒด ๋๋ ํ๋ฆฌ๋ฏธํฐ๋ธ๋ฅผ ๋ถ๋ฌ์ค๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณธ๋ค.
1. Creating an empty scene
NVIDIA Omniverse์ ๊ธฐ๋ณธ์ ์ธ ์ํฌํ๋ก์ฐ๋ ํฌ๊ฒ ์ธ ๊ฐ์ง๋ก ๋๋๋ค.
- GUI: ์ง๊ด์ ์ธ ์๊ฐ์ ์ธํฐํ์ด์ค๋ฅผ ํตํด ๊ฐ์ ์ธ๊ณ๋ฅผ ๊ตฌ์ฑํ๊ณ ๋ก๋ด ์กฐ๋ฆฝ ๋ฐ ์ผ์ ๋ถ์ฐฉ ๋ฑ์ ์์ ์ ์ํํ๋ ๋ฐ ์ ํฉํ๋ค.
- Extensions: ๋น๋๊ธฐ ์คํ ๋ฐ ์ค์๊ฐ ๋ณ๊ฒฝ์ ์ง์ํ๋ฉฐ, ์ ์ํ ๋ฌผ๋ฆฌ ์์ง์ ํ์ฉํด ์ธํฐ๋ํฐ๋ธ GUI์ ์ค์๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ๊ตฌํํ๋ ๋ฐ ์ ์ฉํ๋ค.
- Standalone Python: ๋ฌผ๋ฆฌ ๋ฐ ๋ ๋๋ง ํ์ด๋ฐ์ ์ง์ ์ ์ดํ ์ ์์ผ๋ฉฐ, headless ๋ชจ๋๋ก ๋๊ท๋ชจ ๊ฐํํ์ต ๋ฐ ๋์ ํ๊ฒฝ ์์ฑ์ ํจ์จ์ ์ผ๋ก ์ํํ ์ ์๋ค.
๋ณธ ์น์ ์์๋ ๋ ๋ฆฝ ์คํํ ํ์ด์ฌ(Standalone Python) ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ์ฌ ์๋ฎฌ๋ ์ด์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ํ๊ณ ๋น ์ฅ๋ฉด์ ์์ฑํ๋ ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ๋ฒ์ ์๊ฐํ๋ค. ๋ง์ง๋ง์๋ argparse.ArgumentParser์ ๋ช ๋ น์ค ์ต์ ์ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช ํ๋ฉฐ, AppLauncher.add_app_launcher_args() ๋ฉ์๋์ ํ์ ์ธ์คํด์ค๋ฅผ ์ ๋ฌํ์ฌ ๋ค์ํ ๋งค๊ฐ๋ณ์๋ฅผ ์ถ๊ฐํ๋ ๊ณผ์ ์ ๋ค๋ฃฌ๋ค. ์ฌ๊ธฐ์๋ headless ๋ชจ๋ ์ค์ , ๋ค์ํ Livestream(ํด์๋ ๋ฐ ์ถ๋ ฅ) ์กฐ์ , ์คํ์คํฌ๋ฆฐ ๋ ๋๋ง ํ์ฑํ ๋ฑ ์ฌ์ฉ์ ์ ์ ์๋ฎฌ๋ ์ด์ ์ ์ค์ ํ๋ ์ต์ ์ด ํฌํจ๋๋ค.
1.1. Launching the simulator
import argparse
from isaaclab.app import AppLauncher
# create argparser
parser = argparse.ArgumentParser(description="Creating an empty stage.")
# append AppLauncher CLI args
AppLauncher.add_app_launcher_args(parser)
# parse the arguments
args_cli = parser.parse_args()
# launch omniverse app
app_launcher = AppLauncher(args_cli)
simulation_app = app_launcher.app
isaaclab.app ๋ชจ๋์ AppLauncher ํด๋์ค๋ Omniverse Isaac Sim ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ๋ ์ญํ ์ ํ๋ค. AppLauncher.add_app_launcher_args(parser)๋ฅผ ํธ์ถํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์คํ์ ํ์ํ ๊ธฐ๋ณธ์ ์ธ CLI ์ธ์๊ฐ parser์ ์ถ๊ฐ๋๋ค. ์ดํ AppLauncher(args_cli)๋ฅผ ํธ์ถํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์คํ ๊ฐ์ฒด๊ฐ ์์ฑ๋๋ฉฐ, app_launcher.app์ ํตํด ์๋ฎฌ๋ ์ด์ ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ์ฒด(simulation_app)๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค.
1.2. Importing python modules
์๋ฎฌ๋ ์ด์ ์ฑ์ด ์คํ๋๋ฉด Isaac Sim ๋ฐ ๊ธฐํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ๋ค์ํ Python ๋ชจ๋์ ๊ฐ์ ธ์ฌ ์ ์๋ค. ์๋์์๋ ๋ค์ ๋ชจ๋์ ๊ฐ์ ธ์ค๋ ์์๋ค.
- isaaclab.sim: ์๋ฎฌ๋ ์ดํฐ์ ๊ด๋ จ๋ ๋ชจ๋ ํต์ฌ ์์ ์ ์ํ Isaac Lab์ ํ์ ํจํค์ง
from isaaclab.sim import SimulationCfg, SimulationContext
1.3. Configuring the simulation context
๋ ๋ฆฝ ์คํํ ์คํฌ๋ฆฝํธ์์ ์๋ฎฌ๋ ์ด์ ์ ์์ํ ๋ sim.SimulationContext ํด๋์ค๋ฅผ ํตํด ์๋ฎฌ๋ ์ดํฐ ์ฌ์, ์ผ์ ์ ์ง ๋ฐ ๋จ๊ณ๋ณ ์คํ ์ ์ด๋ฟ๋ง ์๋๋ผ ๋ค์ํ ํ์๋ผ์ธ ์ด๋ฒคํธ ์ฒ๋ฆฌ ๋ฐ ๋ฌผ๋ฆฌ ์ฅ๋ฉด ๊ตฌ์ฑ์ ์ํํ ์ ์๋ค. ์๋ ์คํฌ๋ฆฝํธ์์๋ ๋ฌผ๋ฆฌ ๋ฐ ๋ ๋๋ง์ ์๊ฐ ๊ฐ๊ฒฉ(time step)์ 0.01์ด๋ก ์ค์ ํ๊ณ ์์ผ๋ฉฐ, ์ด๋ฅผ ์ํด ํด๋น ๊ฐ์ sim.SimulationCfg์ ์ ๋ฌํ ํ ์๋ฎฌ๋ ์ด์ ์ปจํ ์คํธ์ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ค.
# Initialize the simulation context
sim_cfg = SimulationCfg(dt=0.01)
sim = SimulationContext(sim_cfg)
# Set main camera
sim.set_camera_view([2.5, 2.5, 2.5], [0.0, 0.0, 0.0])
์ ์์ ์์๋ ์๋ฎฌ๋ ์ด์ ์ปจํ ์คํธ๋ฅผ ์์ฑํ ํ, ์๋ฎฌ๋ ์ด์ ๋ ์ฅ๋ฉด์์ ์๋ํ๋ ๋ฌผ๋ฆฌ ์์ง(physics)๋ง ์ค์ ํ์๋ค. ์ฌ๊ธฐ์๋ ์๋ฎฌ๋ ์ด์ ์ ์ฌ์ฉํ ์ฅ์น(device), ์ค๋ ฅ ๋ฒกํฐ(gravity vector), ๊ธฐํ ๊ณ ๊ธ ์๋ฒ ๋งค๊ฐ๋ณ์(advanced solver parameters) ๋ฑ์ด ํฌํจ๋๋ค. ์ด์ ์๋ฎฌ๋ ์ด์ ์คํ์ ์ํด ๋ค์ ๋ ๊ฐ์ง ์ฃผ์ ๋จ๊ณ๊ฐ ๋จ์์๋ค.
- ์๋ฎฌ๋ ์ด์ ์ฅ๋ฉด ์ค๊ณ: ์ผ์, ๋ก๋ด ๋ฐ ๊ธฐํ ์๋ฎฌ๋ ์ด์ ๊ฐ์ฒด ์ถ๊ฐ
- ์๋ฎฌ๋ ์ด์ ๋ฃจํ ์คํ: ์๋ฎฌ๋ ์ดํฐ ๋จ๊ณ๋ณ ์คํ ๋ฐ ๋ฐ์ดํฐ ์ค์ ๋ฐ ๊ฐ์ ธ์ค๊ธฐ
์ด๋ฒ ํํ ๋ฆฌ์ผ์์๋ ๋น ์ฅ๋ฉด์์์ ์๋ฎฌ๋ ์ด์ ์ ์ด(2๋จ๊ณ)๋ง ๋ค๋ฃฌ๋ค. ๋ค์ ํํ ๋ฆฌ์ผ์์๋ ๊ฐ์ฒด ์ถ๊ฐ ๋ฐ ์ํธ ์์ฉ์ ์ํ ์๋ฎฌ๋ ์ด์ ํธ๋ค ์์ (1๋จ๊ณ)์ ์ดํด๋ณผ ์์ ์ด๋ค.
1.4. Running the simulation
์๋ฎฌ๋ ์ด์ ์ฅ๋ฉด์ ์ค์ ํ ํ ๊ฐ์ฅ ๋จผ์ ํด์ผ ํ ์ผ์ sim.SimulationContext.reset() ๋ฉ์๋๋ฅผ ํธ์ถํ๋ ๊ฒ์ด๋ค. ์ด ๋ฉ์๋๋ ํ์๋ผ์ธ์ ์์ํ๊ณ , ์๋ฎฌ๋ ์ดํฐ์์ ๋ฌผ๋ฆฌ ํธ๋ค(physics handles)์ ์ด๊ธฐํํ๋ ์ญํ ์ ํ๋ค. ์๋ฎฌ๋ ์ด์ ์ ์คํํ๊ธฐ ์ ์ ๋ฐ๋์ ์ฒ์์ ํธ์ถํด์ผ ํ๋ฉฐ, ๊ทธ๋ ์ง ์์ผ๋ฉด ์๋ฎฌ๋ ์ด์ ํธ๋ค์ด ์ฌ๋ฐ๋ฅด๊ฒ ์ด๊ธฐํ๋์ง ์๋๋ค.
์๋ ์ฝ๋ ์ค๋ํซ์ ์๋ฎฌ๋ ์ด์ ํ์๋ผ์ธ์ ์์ํ ํ, ์ ํ๋ฆฌ์ผ์ด์ ์ด ์คํ๋๋ ๋์ ๋ฐ๋ณต์ ์ผ๋ก ์๋ฎฌ๋ ์ด์ ๋จ๊ณ๋ฅผ ์งํํ๋ ๊ฐ๋จํ ์๋ฎฌ๋ ์ด์ ๋ฃจํ๋ฅผ ์ค์ ํ๋ ์์ ์ด๋ค. sim.SimulationContext.step() ๋ฉ์๋๋ render ์ธ์๋ฅผ ๋ฐ์ ์คํ๋๋ฉฐ, ์ด ๊ฐ์ ๋ฐ๋ผ ๋ ๋๋ง ๊ด๋ จ ์ด๋ฒคํธ๋ฅผ ํฌํจํ ์ง ์ฌ๋ถ๊ฐ ๊ฒฐ์ ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก render ๊ฐ์ True๋ก ์ค์ ๋์ด ์๋ค.
# Play the simulator
sim.reset()
print("[INFO]: Simulator Setup complete...")
# Simulate physics
while simulation_app.is_running():
# perform step
sim.step()
1.5. Exiting the simulation
๋ง์ง๋ง์ผ๋ก, isaacsim.SimulationApp.close() ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ์๋ฎฌ๋ ์ด์ ์ ์ค์งํ๊ณ ํด๋น ์ฐฝ์ ๋ซ์ ์ ์๋ค.
# close sim app
simulation_app.close()
1.6. Test Code Execution
์ด์ ์๋ ๋ช ๋ น์ด๋ฅผ ํตํด ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ๋ฉด ์๋ฎฌ๋ ์ด์ ์ด ์์๋๊ณ ์คํ ์ด์ง๊ฐ ๋ ๋๋ง๋๋ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ ์ ์๋ค. ์๋ฎฌ๋ ์ด์ ์ ์ค์งํ๋ ค๋ฉด ์ฐฝ์ ๋ซ๊ฑฐ๋ ํฐ๋ฏธ๋์์ Ctrl+C์ ์ ๋ ฅํ๋ฉด ๋๋ค.
$ ./isaaclab.sh -p scripts/tutorials/00_sim/create_empty.py
2. Spawning prims into the scene
2.1. Key concepts of USD
Omniverse์ ์ฅ๋ฉด ๋์์ธ์ USD(Universal Scene Description)๋ผ๋ ํ์ผ ํ์์ ์ค์ฌ์ผ๋ก ๊ตฌ์ถ๋๋ค. USD ํ์ผ์ ํตํด ๊ณ์ธต์ ๋ฐฉ์์ผ๋ก 3D ์ฅ๋ฉด์ ๊ตฌ์ฑํ ์ ์์ผ๋ฉฐ, USD์ ๋ํ ์์ธํ ์ค๋ช ์ ์๋ ํ์ด์ง๋ฅผ ํตํด ํ์ธํด๋ณด๋ ๊ฒ์ ์ถ์ฒํ๋ค.
๋ณธ ํํ ๋ฆฌ์ผ์ ์ดํดํ๊ธฐ ์ํด ๊ผญ ์์์ผ ํ USD์ ๊ฐ๋
์ ๋ค์๊ณผ ๊ฐ๋ค.
- Primitive (Prim): USD ์ฅ๋ฉด์ ๊ธฐ๋ณธ ๊ตฌ์ฑ ์์๋ก ์ฅ๋ฉด ๊ทธ๋ํ์ ๋ ธ๋(node)๋ผ๊ณ ๋ณผ ์ ์๋ค. ๊ฐ ๋ ธ๋๋ ๋ฉ์(mesh), ๊ด์(light), ์นด๋ฉ๋ผ(camera) ๋๋ ๋ณํ(transform)์ผ ์ ์๋ค.
- Attribute: Prim์ด ๊ฐ์ง๋ ์์ฑ(attribute)์ผ๋ก ํค-๊ฐ(key-value) ์์ ํํ๋ฅผ ๋ค๋ค. ์๋ฅผ ๋ค์ด, ํน์ prim์ด color๋ผ๋ ์์ฑ์ ๊ฐ์ง๋ฉฐ, ๊ทธ ๊ฐ์ด red์ผ ์๋ ์๋ค.
- Relationship: Prim ๊ฐ์ ์ฐ๊ฒฐ์ ๋ํ๋ธ๋ค. ์ด๋ ๋ค๋ฅธ prim์ ์ฐธ์กฐํ๋ ํฌ์ธํฐ์ ๊ฐ์ ๊ฐ๋ ์ผ๋ก, ์๋ฅผ ๋ค์ด ๋ฉ์(mesh) prim์ด shading์ ์ํ material prim๊ณผ ๊ด๊ณ๋ฅผ ๊ฐ์ง ์ ์๋ค.
- Stage: ํ๋ฆฌ๋ฏธํฐ๋ธ(prim)์ ์์ฑ(attribute) ๋ฐ ๊ด๊ณ(relationship)์ ๋ชจ์์ USD ์คํ ์ด์ง(stage)๋ผ๊ณ ํ๋ค. ์ด๋ ์ฅ๋ฉด์ ๋ชจ๋ prim์ ์ํ ์ปจํ ์ด๋๋ก ์๊ฐํ ์ ์๋ค. ์ฆ, USD ์คํ ์ด์ง๋ ์ฅ๋ฉด์ ๊ตฌ์ฑํ๋ ๋ชจ๋ prim์ ๊ด๋ฆฌํ๋ ๊ณต๊ฐ์ด๋ฉฐ, ์ฅ๋ฉด์ ๋์์ธํ๋ค๋ ๊ฒ์ ๊ณง USD stage๋ฅผ ๊ตฌ์ฑํ๋ ๊ฒ๊ณผ ๊ฐ๋ค.
Isaac Lab์์๋ USD API๋ฅผ ๊ธฐ๋ฐ์ผ๋ก configuration-driven ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ์ฌ ์ฅ๋ฉด์ prim์ ์์ฑํ ์ ์๋ค. ์ด๋ sim.spawners ๋ชจ๋์ ํฌํจ๋์ด ์๋ค.
์ฅ๋ฉด์ prim์ ์์ฑํ ๋ ๊ฐ prim์๋ ์์ฑ๊ณผ ๊ด๊ณ๋ฅผ ์ ์ํ๋ ๊ตฌ์ฑ ํด๋์ค ์ธ์คํด์ค๊ฐ ํ์ํ๋ค. ์ด ๊ตฌ์ฑ ํด๋์ค๊ฐ ํด๋น ํจ์์ ์ ๋ฌ๋์ด prim ์ด๋ฆ๊ณผ ๋ณํ์ด ์ง์ ๋๋ค. ๊ทธ๋ฐ ๋ค์ ํจ์๊ฐ ์ฅ๋ฉด์ prim์ ์์ฑํ๋ค.
๊ฐ๋ต์ ์ผ๋ก ๋ณด๋ฉด ์๋ ๋ฐฉ์์ ์๋์ ๊ฐ๋ค.
- ์ค์ ํด๋์ค ์ธ์คํด์ค ์์ฑ
- ํด๋น spawner ํจ์๋ฅผ ์ฌ์ฉํ์ฌ prim์ ์ฅ๋ฉด์ ๋ฐฐ์นํ๊ฑฐ๋ ์ค์ ํด๋์ค์์ ์ง์ spawner ํจ์๋ฅผ ํธ์ถ
# Create a configuration class instance
cfg = MyPrimCfg()
prim_path = "/path/to/prim"
# Spawn the prim into the scene using the corresponding spawner function
spawn_my_prim(prim_path, cfg, translation=[0, 0, 0], orientation=[1, 0, 0, 0], scale=[1, 1, 1])
# OR
# Use the spawner function directly from the configuration class
cfg.func(prim_path, cfg, translation=[0, 0, 0], orientation=[1, 0, 0, 0], scale=[1, 1, 1])
โ ๏ธ [Attention]
๋ชจ๋ ์ฅ๋ฉด ๊ตฌ์ฑ์ ์๋ฎฌ๋ ์ด์ ์ด ์์๋๊ธฐ ์ ์ ์ด๋ฃจ์ด์ ธ์ผ ํ๋ค. ์๋ฎฌ๋ ์ด์ ์ด ์์๋๋ฉด ์ฅ๋ฉด์ ๊ณ ์ ํ๊ณ prim์ ์์ฑ๋ง ๋ณ๊ฒฝํ๋ ๊ฒ์ด ์ข๋ค. ์๋ฎฌ๋ ์ด์ ์ค ์๋ก์ด prim์ ์ถ๊ฐํ๋ฉด GPU ๋ฌผ๋ฆฌ ์๋ฎฌ๋ ์ด์ ๋ฒํผ๊ฐ ๋ณ๊ฒฝ๋์ด ์์์น ๋ชปํ ๋์์ด ๋ฐ์ํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
2.2. Reference Script Guide
์ด์ ์ฅ๋ฉด์ ์ง๋ฉด ํ๋ฉด(Ground Plane)๊ณผ ์กฐ๋ช , ํ๋ธ์ ๊ตฌ, ์ค๋ฆฐ๋์ ๊ฐ์ ๊ธฐ๋ณธ ํ์ ๋ฐ ๋ค๋ฅธ .USD, .URDF ๋๋ .OBJ ํ์ผ๊ณผ ๊ฐ์ ๋ค๋ฅธ ํ์ผ ํ์์์ prim์ ์คํฐํ๋ ๋ฐฉ๋ฒ์ ๊ฐ๋จํ ์์๋ฅผ ํตํด ์์๋ณด์.
- ์ง๋ฉด ํ๋ฉด ์์ฑ: GroundPlaneCfg ๋ชจ์๊ณผ ํฌ๊ธฐ ๋ฑ์ ๋ณ๊ฒฝ ๊ฐ๋ฅํ ์์ฑ์ ๊ฐ๋ ๊ฒฉ์ ๋ชจ์์ ์ ์ง๋ฉด์ ๊ตฌ์ฑํ๋ค.
# Spawn ground-plane cfg_ground = sim_utils.GroundPlaneCfg() cfg_ground.func("/World/defaultGroundPlane", cfg_ground)
- ์กฐ๋ช
์์ฑ: ์ฅ๋ฉด์ ์กฐ๋ช
์ค์ ์ ๋ถ๋ฌ์จ๋ค. ์ฌ๊ธฐ์๋ ์๊ฑฐ๋ฆฌ ์กฐ๋ช
(distant lights), ๊ตฌํ ์กฐ๋ช
(sphere lights), ๋์คํฌ ์กฐ๋ช
(disk lights), ์ํตํ ์กฐ๋ช
(cylinder lights)์ด ํฌํจ๋๋ค.
# Spawn distant light cfg_light_distant = sim_utils.DistantLightCfg( intensity=3000.0, color=(0.75, 0.75, 0.75), ) cfg_light_distant.func("/World/lightDistant", cfg_light_distant, translation=(1, 0, 10))
- ๊ธฐ๋ณธ ํ์ ์์ฑ:
- ๊ธฐ๋ณธ ํ์์ ์์ฑํ๊ธฐ ์ ์, Transform Primitive(Xform)์ ๊ฐ๋ ์ ์ดํดํด์ผ ํ๋ค. Xform์ ๋ณํ(transformation) ์์ฑ๋ง ํฌํจํ๋ ๊ธฐ๋ณธ ์์(primitive)๋ก ๋ค๋ฅธ prim์ ๊ทธ ์๋์ ๊ทธ๋ฃนํ(parent-child ๊ด๊ณ)ํ๊ณ ๊ทธ๋ฃน ์ ์ฒด๋ฅผ ๋ณํํ๋ ๋ฐ ์ฌ์ฉ๋๋ค. ์๋๋ Xform Prim์ ์์ฑํ์ฌ ํ์์ ์๋ ๋ชจ๋ ๊ธฐ๋ณธ ํ์์ ๊ทธ๋ฃนํํ๋ ์์ ์ด๋ค.
# Create a new xform prim for all objects to be spawned under
prim_utils.create_prim("/World/Objects", "Xform")
๋ค์์ผ๋ก, ConeCfg ํด๋์ค๋ฅผ ์ฌ์ฉํ์ฌ ์๋ฟ์ ๋ฐ๊ฒฝ, ๋์ด, [2] ๋ฌผ๋ฆฌ ์์ฑ ๋ฐ ์ฌ๋ฃ ์์ฑ์ ์ง์ ํ์ฌ ์๋ฟ ํ์์ ์์ฑํ๋ ์์๋ ์๋์ ๊ฐ๋ค. ([1] ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฌผ๋ฆฌ ๋ฐ ์ฌ๋ฃ ์์ฑ์ ๋นํ์ฑํ๋๋ค.)
# Spawn a red cone (without physics and material properties)
cfg_cone = sim_utils.ConeCfg(
radius=0.15,
height=0.5,
visual_material=sim_utils.PreviewSurfaceCfg(diffuse_color=(1.0, 0.0, 0.0)),
)
cfg_cone.func("/World/Objects/Cone1", cfg_cone, translation=(-1.0, 1.0, 1.0))
cfg_cone.func("/World/Objects/Cone2", cfg_cone, translation=(-1.0, -1.0, 1.0))
์๋๋ ๊ฐ์ฒด ๋ฌผ๋ฆฌ(Rigid body physics)๋ฅผ ์ถ๊ฐํ์ฌ ์๋ฟ์ ์ง๋, ๋ง์ฐฐ ๋ฐ ๋ณต์๋ ฅ์ ์ง์ ํ๋ ์์๋ค. ๋ง์ฝ ์ด๋ฅผ ๋ฐ๋ก ์ง์ ํ์ง ์์ผ๋ฉด USD Physics์ ๊ธฐ๋ณธ๊ฐ์ด ์ ์ฉ๋๋ค.
# Spawn a green cone with colliders and rigid body (with rigid body physics)
cfg_cone_rigid = sim_utils.ConeCfg(
radius=0.15,
height=0.5,
rigid_props=sim_utils.RigidBodyPropertiesCfg(),
mass_props=sim_utils.MassPropertiesCfg(mass=1.0),
collision_props=sim_utils.CollisionPropertiesCfg(),
visual_material=sim_utils.PreviewSurfaceCfg(diffuse_color=(0.0, 1.0, 0.0)),
)
cfg_cone_rigid.func(
"/World/Objects/ConeRigid", cfg_cone_rigid, translation=(-0.2, 0.0, 2.0), orientation=(0.5, 0.0, 0.5, 0.0)
)
๋ง์ง๋ง์ผ๋ก, ๋ณํ ๊ฐ๋ฅํ ๋ฌผ๋ฆฌ ์์ฑ(Deformable body physics)์ ํฌํจํ๋ ์ง์ก๋ฉด์ฒด๋ฅผ ์์ฑํ๋ ์์๋ค. ๊ฐ์ฒด ์๋ฎฌ๋ ์ด์ ๊ณผ ๋ฌ๋ฆฌ ๋ณํ ๊ฐ๋ฅํ ๊ฐ์ฒด๋ ๊ฐ ๊ผญ์ง์ (vertex) ์ฌ์ด์ ์๋์ ์ธ ์์ง์์ด ๊ฐ๋ฅํ๋ค. ์ด๋ ์ฒ, ๊ณ ๋ฌด ๋๋ ์ ค๋ฆฌ์ ๊ฐ์ ๋ถ๋๋ฌ์ด ์ฌ์ง์ ๊ฐ๋ ๊ฐ์ฒด๋ฅผ ์๋ฎฌ๋ ์ด์ ํ๋ ๋ฐ ์ ์ฉํ๋ค. ๋ณํ ๊ฐ๋ฅํ ๋ฌผ๋ฆฌ ์์ฑ์ GPU ์๋ฎฌ๋ ์ด์ ์์๋ง ์ง์๋๋ค.
# Spawn a blue cuboid with deformable body
cfg_cuboid_deformable = sim_utils.MeshCuboidCfg(
size=(0.2, 0.5, 0.2),
deformable_props=sim_utils.DeformableBodyPropertiesCfg(),
visual_material=sim_utils.PreviewSurfaceCfg(diffuse_color=(0.0, 0.0, 1.0)),
physics_material=sim_utils.DeformableBodyMaterialCfg(),
)
cfg_cuboid_deformable.func("/World/Objects/CuboidDeformable", cfg_cuboid_deformable, translation=(0.15, 0.0, 2.0))
- ๋ค๋ฅธ ํ์ผ์์ ๋ถ๋ฌ์ค๊ธฐ: USD, URDF ๋๋ OBJ ํ์ผ๊ณผ ๊ฐ์ ๋ค๋ฅธ ํ์ผ ํ์์์ ๊ฐ์ฒด๋ฅผ ๋ถ๋ฌ์ฌ ์ ์๋ค. ์๋ ์์์์๋ ํ ์ด๋ธ์ USD ํ์ผ์ ์ฅ๋ฉด์ ์ถ๊ฐํ๋ค. ํ ์ด๋ธ์ mesh primitive์ด๋ฉฐ, ์ฐ๊ด๋ material primitive๊ฐ ์๋ค. ์ด ๋ชจ๋ ์ ๋ณด๋ USD ํ์ผ์ ์ ์ฅ๋์ด ์๋ค.
# Spawn a usd file of a table into the scene
cfg = sim_utils.UsdFileCfg(usd_path=f"{ISAAC_NUCLEUS_DIR}/Props/Mounts/SeattleLabTable/table_instanceable.usd")
cfg.func("/World/Objects/Table", cfg, translation=(0.0, 0.0, 1.05))
์ด ํํ ๋ฆฌ์ผ๊ณผ ๊ด๋ จ๋ ๋ณด๋ค ์์ธํ ๋ด์ฉ์ ์๋ ๋งํฌ์์ ํ์ธํ ์ ์๋ค.
2.3. Executing the Script
์๋ ๋ช ๋ น์ด๋ฅผ ํตํด ์์์ ์ค๋ช ํ ์ฅ๋ฉด ๊ตฌ์ฑ์ ํ๋ ์์ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ ์ ์๋ค.
$ ./isaaclab.sh -p scripts/tutorials/00_sim/spawn_prims.py
์๋ฎฌ๋ ์ด์ ์ด ์์๋๋ฉด ์๋ ์์๊ณผ ๊ฐ์ด ์ง๋ฉด ํ๋ฉด, ์กฐ๋ช , ์๋ฟ ๊ฐ์ฒด, ํ ์ด๋ธ์ด ๋ํ๋ ํ๋ฉด์ด ๋ณด์ฌ์ง๋ค. ๊ฐ์ฒด ๋ฌผ๋ฆฌ๊ฐ ํ์ฑํ๋ ๋ น์ ์๋ฟ์ ๋จ์ด์ ธ์ ํ ์ด๋ธ๊ณผ ์ง๋ฉด ํ๋ฉด๊ณผ ์ถฉ๋ํด์ผ ํ๋ฉฐ, ๋ค๋ฅธ ๋นจ๊ฐ์ ์๋ฟ์ ์๊ฐ์ ์์์ด๋ฏ๋ก ์์ง์ด์ง ์๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
์ด๋ฒ ํฌ์คํ ์์๋ ๊ธฐ๋ณธ์ ์ธ ์๋ฎฌ๋ ์ด์ ์ฅ๋ฉด ๊ตฌ์ฑ ๋ฐฉ๋ฒ์ ์ดํด๋ณด์๋ค. ๋ค์ ํฌ์คํ ์์๋ ๊ฐ์ฒด(rigid object), ๊ด์ (articulation), ๋ณํ ๊ฐ๋ฅํ ๊ฐ์ฒด(deformable object)๋ฅผ ๋ถ๋ฌ์ค๊ณ ์ํธ์์ฉ ํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณด๋๋ก ํ์!