Minho Lee

Master's Student

Robotics Engineer

AI Researcher

Blogger

Blog Post

Isaac Lab Tutorial #2 - Create the Scene

Feb 23, 2025 Simulation
Isaac Lab Tutorial #2 - Create the Scene
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์˜ ๊ฐœ๋…์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. Primitive (Prim): USD ์žฅ๋ฉด์˜ ๊ธฐ๋ณธ ๊ตฌ์„ฑ ์š”์†Œ๋กœ ์žฅ๋ฉด ๊ทธ๋ž˜ํ”„์˜ ๋…ธ๋“œ(node)๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๊ฐ ๋…ธ๋“œ๋Š” ๋ฉ”์‹œ(mesh), ๊ด‘์›(light), ์นด๋ฉ”๋ผ(camera) ๋˜๋Š” ๋ณ€ํ™˜(transform)์ผ ์ˆ˜ ์žˆ๋‹ค.
  2. Attribute: Prim์ด ๊ฐ€์ง€๋Š” ์†์„ฑ(attribute)์œผ๋กœ ํ‚ค-๊ฐ’(key-value) ์Œ์˜ ํ˜•ํƒœ๋ฅผ ๋ค๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํŠน์ • prim์ด color๋ผ๋Š” ์†์„ฑ์„ ๊ฐ€์ง€๋ฉฐ, ๊ทธ ๊ฐ’์ด red์ผ ์ˆ˜๋„ ์žˆ๋‹ค.
  3. Relationship: Prim ๊ฐ„์˜ ์—ฐ๊ฒฐ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. ์ด๋Š” ๋‹ค๋ฅธ prim์„ ์ฐธ์กฐํ•˜๋Š” ํฌ์ธํ„ฐ์™€ ๊ฐ™์€ ๊ฐœ๋…์œผ๋กœ, ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฉ”์‹œ(mesh) prim์ด shading์„ ์œ„ํ•œ material prim๊ณผ ๊ด€๊ณ„๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.
  4. Stage: ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ(prim)์™€ ์†์„ฑ(attribute) ๋ฐ ๊ด€๊ณ„(relationship)์˜ ๋ชจ์Œ์„ USD ์Šคํ…Œ์ด์ง€(stage)๋ผ๊ณ  ํ•œ๋‹ค. ์ด๋Š” ์žฅ๋ฉด์˜ ๋ชจ๋“  prim์„ ์œ„ํ•œ ์ปจํ…Œ์ด๋„ˆ๋กœ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, USD ์Šคํ…Œ์ด์ง€๋Š” ์žฅ๋ฉด์„ ๊ตฌ์„ฑํ•˜๋Š” ๋ชจ๋“  prim์„ ๊ด€๋ฆฌํ•˜๋Š” ๊ณต๊ฐ„์ด๋ฉฐ, ์žฅ๋ฉด์„ ๋””์ž์ธํ•œ๋‹ค๋Š” ๊ฒƒ์€ ๊ณง USD stage๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™๋‹ค.

Isaac Lab์—์„œ๋Š” USD API๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ configuration-driven ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•˜์—ฌ ์žฅ๋ฉด์— prim์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” sim.spawners ๋ชจ๋“ˆ์— ํฌํ•จ๋˜์–ด ์žˆ๋‹ค.

์žฅ๋ฉด์— prim์„ ์ƒ์„ฑํ•  ๋•Œ ๊ฐ prim์—๋Š” ์†์„ฑ๊ณผ ๊ด€๊ณ„๋ฅผ ์ •์˜ํ•˜๋Š” ๊ตฌ์„ฑ ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ์ด ๊ตฌ์„ฑ ํด๋ž˜์Šค๊ฐ€ ํ•ด๋‹น ํ•จ์ˆ˜์— ์ „๋‹ฌ๋˜์–ด prim ์ด๋ฆ„๊ณผ ๋ณ€ํ™˜์ด ์ง€์ •๋œ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ํ•จ์ˆ˜๊ฐ€ ์žฅ๋ฉด์— prim์„ ์ƒ์„ฑํ•œ๋‹ค.

๊ฐœ๋žต์ ์œผ๋กœ ๋ณด๋ฉด ์ž‘๋™ ๋ฐฉ์‹์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  1. ์„ค์ • ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ
  2. ํ•ด๋‹น 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์„ ์Šคํฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ฐ„๋‹จํ•œ ์˜ˆ์‹œ๋ฅผ ํ†ตํ•ด ์•Œ์•„๋ณด์ž.

  1. ์ง€๋ฉด ํ‰๋ฉด ์ƒ์„ฑ: GroundPlaneCfg ๋ชจ์–‘๊ณผ ํฌ๊ธฐ ๋“ฑ์˜ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ์†์„ฑ์„ ๊ฐ–๋Š” ๊ฒฉ์ž ๋ชจ์–‘์˜ ์ ‘์ง€๋ฉด์„ ๊ตฌ์„ฑํ•œ๋‹ค.
    # Spawn ground-plane
    cfg_ground = sim_utils.GroundPlaneCfg()
    cfg_ground.func("/World/defaultGroundPlane", cfg_ground)
    
  2. ์กฐ๋ช… ์ƒ์„ฑ: ์žฅ๋ฉด์— ์กฐ๋ช… ์„ค์ •์„ ๋ถˆ๋Ÿฌ์˜จ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ์›๊ฑฐ๋ฆฌ ์กฐ๋ช…(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))
    
  3. ๊ธฐ๋ณธ ํ˜•์ƒ ์ƒ์„ฑ:
    • ๊ธฐ๋ณธ ํ˜•์ƒ์„ ์ƒ์„ฑํ•˜๊ธฐ ์ „์—, 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))
  1. ๋‹ค๋ฅธ ํŒŒ์ผ์—์„œ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ: 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)๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๊ณ  ์ƒํ˜ธ์ž‘์šฉ ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋„๋ก ํ•˜์ž!


Comments