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 모드만 쓴다.
