← BlogIsaac Sim 작동 원리· 1/10

Isaac Sim 런이 부팅되는 순서 — SimulationApp이 먼저다

Isaac Sim에서 USD·PhysX·RTX를 쓰려면 SimulationApp(Kit 런타임)을 가장 먼저 띄워야 하고, 그 뒤에야 omni 모듈을 import할 수 있다는 강한 순서 의존성.

약 3분
Isaac-SimOmniverseUSDPhysXrobotics-basics

Isaac Sim 런이 부팅되는 순서

처음 Isaac Sim 코드를 짜는 사람이 거의 반드시 한 번 부딪히는 벽이 있습니다.

import omni.isaac.core   # ❌ ModuleNotFoundError / 크래시
from isaacsim import SimulationApp

분명히 설치돼 있는데 import가 안 됩니다. 이유는 단순하지만 강력합니다 — Isaac Sim의 omni.* 모듈은 런타임(Kit)이 먼저 떠 있어야만 존재합니다. 코드 레벨이 아니라 런타임 레벨에서 순서가 강제됩니다.

SimulationApp이 모든 것의 1번이다

올바른 순서는 이렇습니다.

from isaacsim import SimulationApp
sim = SimulationApp({"headless": True})   # ← Kit 런타임 부팅. 이게 1번.

# 이 줄 이후에야 omni.* import가 해금된다
import omni
from isaacsim.core.api import World

SimulationApp(...)을 인스턴스화하는 순간 Omniverse Kit 런타임이 메모리에 올라오고, 그제서야 USD·PhysX·RTX를 제공하는 omni.* 확장들이 로드됩니다. 그 전에 omni.*를 import하면 존재하지 않는 모듈을 찾는 셈입니다.

도식 렌더링 중…

코드로 보면 이 순서가 한눈에 들어옵니다 — 한 줄이라도 어긋나면 import부터 깨집니다.

from isaacsim import SimulationApp
sim = SimulationApp({"headless": True})   # ① 최우선 — Kit 런타임 부팅
# 이 줄 이후에야 Isaac/USD 모듈을 import 할 수 있다
from isaacsim.core.api import World
world = World()
world.scene.add(robot)                    # ② 씬 구성
world.reset()                             # ③ 물리 확정 (GPU dynamics·관절 잠금)
while running:
    world.step(render=True)               # ④ 한 틱 전진

왜 이 순서가 중요한가 — world.reset()이라는 또 하나의 경계

부팅 순서에는 두 번째 결정적 경계가 있습니다. world.reset() 입니다. PhysX는 충돌 필터, FixedJoint, GPU dynamics 같은 것들을 reset 시점에 "잠급니다(lock)". 그래서 많은 설정이 reset 전에 끝나야 합니다.

reset 이전에 해야 하는 것reset 이후에 해야 하는 것
FixedJoint 생성 (이후에 만들면 모든 joint freeze)GPU dynamics enable
broadphase collision filter 설정physics step callback 등록
fixed base 설정trajectory 수집 시작

실제로 imSim에서 FixedJoint를 reset 에 만들었더니 모든 관절이 얼어붙는 버그가 있었고(Test #8 실패), reset 으로 옮겨 해결했습니다(Test #9). "reset 전/후"를 깐깐하게 따지는 건 이 때문입니다.

imSim의 선택 — 항상 Fresh, 절대 Daemon 아님

부팅이 매번 비싸니까(수십 초) 한 번 띄워두고 여러 런을 재사용하고 싶은 유혹이 있습니다. imSim은 이 길(daemon)을 의도적으로 폐기했습니다.

도식 렌더링 중…
  • 이유: 런 간 stage/PhysX 상태가 누적 오염되면 재현성이 깨집니다. 깨끗한 시작이 검증 플랫폼의 기본입니다.
  • daemon(상주) 경로는 비활성화돼 있어 실제로는 쓰이지 않습니다 — 항상 Fresh.
  • 대가는 매번 부팅 비용 — 그래서 위의 부팅 순서가 production에서 중요합니다.

production에서는 항상 표준화된 부팅 스크립트로 띄워 올바른 Python·ROS2(Jazzy) 환경을 보장합니다.

한 줄 정리

📌 Isaac Sim은 SimulationApp이 가장 먼저다. 이 런타임이 떠야 omni.*가 존재하고, world.reset()이 물리 상태를 잠그는 두 번째 경계다. imSim은 재현성을 위해 런마다 깨끗이 부팅하는 Fresh 모드만 쓴다.