Isaac Sim 한글 가이드

NVIDIA Isaac Sim 5.1/6.0 핵심 장점과 헤드리스로 직접 검증한 데모

02. PhysX 5 GPU 강체 물리

Physics · 검증 환경: Isaac Sim 6.0.0-dev2 / RTX PRO 6000 Blackwell

Isaac Sim의 물리 백엔드는 NVIDIA PhysX 5다. 강체·관절·연체·천(soft body, cloth)·유체(PBD)까지 GPU에서 한꺼번에 시뮬레이션할 수 있다. 같은 GPU에서 RTX 렌더러와 PhysX가 메모리를 공유하기 때문에 "수천 개 환경 병렬화 + 동시 렌더" 같은 RL 학습 패턴이 자연스럽게 가능하다.

이 기능의 강점

구현 방법

World 생성 → DynamicCuboid/Articulation 등록 → world.reset()world.step(render=True) 루프. 6.0에서는 render=False가 timeline을 정지시키므로 매 step마다 timeline.play() 확인 필요.

최소 데모

t=0: 5개 큐브 초기 자세 (cube_0 z=1.00).
t=0: 5개 큐브 초기 자세 (cube_0 z=1.00).
t≈1s: 중력으로 무너지는 중간 프레임 (cube_0 z=0.25, 지면 접촉).
t≈1s: 중력으로 무너지는 중간 프레임 (cube_0 z=0.25, 지면 접촉).
t≈3s: PhysX 안정 상태 수렴 (cube_0 z=0.25, 정지).
t≈3s: PhysX 안정 상태 수렴 (cube_0 z=0.25, 정지).

검증 결과

cube_0가 z=1.0 → 0.25로 자유낙하 후 안정. 3장의 PNG에서 적층→붕괴→안정 상태가 분명히 보임.

핵심 코드 발췌

from isaacsim.core.api import World
from isaacsim.core.api.objects import DynamicCuboid
import omni.timeline

world = World(stage_units_in_meters=1.0)
world.scene.add_default_ground_plane()
for i in range(5):
    world.scene.add(DynamicCuboid(prim_path=f"/World/Cube_{i}",
        name=f"cube_{i}", position=np.array([0,0,1.0+i*0.7]), size=0.5))
world.reset()
timeline = omni.timeline.get_timeline_interface()
for _ in range(180):
    if not timeline.is_playing(): timeline.play()
    world.step(render=True)
코드 다운로드 (zip)

실무 예제 — Franka + YCB cracker_box + 동적 큐브 타워

Franka Panda 로봇 + YCB 데이터셋의 cracker_box + 4개 동적 큐브 타워를 한 씬에 두고 GPU 물리 시뮬. 산업 매니퓰레이션 학습 데이터에 가까운 구성.

초기 프레임 — Franka 옆에 cracker_box와 큐브 타워가 정적으로 배치.
초기 프레임 — Franka 옆에 cracker_box와 큐브 타워가 정적으로 배치.
중간 프레임 — PhysX가 모든 강체를 동시에 step. 큐브 타워와 박스 모두 안정 자세.
중간 프레임 — PhysX가 모든 강체를 동시에 step. 큐브 타워와 박스 모두 안정 자세.
최종 프레임 — Franka(고정)·박스(정적)·큐브(중력)가 같은 PhysX scene에서 공존.
최종 프레임 — Franka(고정)·박스(정적)·큐브(중력)가 같은 PhysX scene에서 공존.

Franka articulation, YCB rigid body, DynamicCuboid 3종이 한 PhysX scene 안에서 동시에 동작. World.step() 하나로 모든 강체 + 관절이 GPU에서 함께 갱신된다.

실무 데모 코드

from isaacsim.core.api import World
from isaacsim.core.api.objects import DynamicCuboid
from isaacsim.core.utils.stage import add_reference_to_stage
from isaacsim.storage.native import get_assets_root_path

assets = get_assets_root_path()
world = World()
world.scene.add_default_ground_plane()
add_reference_to_stage(assets + "/Isaac/Robots/FrankaRobotics/FrankaPanda/franka.usd", "/World/Franka")
add_reference_to_stage(assets + "/Isaac/Props/YCB/Axis_Aligned/003_cracker_box.usd", "/World/Box")
for i in range(4):
    world.scene.add(DynamicCuboid(prim_path=f"/World/Tower_{i}",
        position=np.array([0.5, 0.4, 0.1+i*0.16]), size=0.12))
실무 데모 코드 zip