1.2 NVIDIA Isaac Sim 런타임 이해

1.2.1 구성 요소의 역할

Isaac Sim은 하나의 물리 엔진이 아니라 여러 계층이 결합된 애플리케이션이다.

  • Kit 애플리케이션 런타임: 확장(extension), UI, 명령, Python 환경의 생명주기를 관리한다.
  • OpenUSD: 장면의 구조, 속성, 참조, 변형을 표현한다.
  • PhysX: 강체, 관절, 접촉, 충돌을 시간에 따라 적분한다.
  • RTX 렌더러와 센서 모델: 카메라 관측과 합성 데이터를 생성한다.
  • OmniGraph/Action Graph: 데이터 흐름과 실행 노드를 연결한다.
  • ROS 2 Bridge: ROS 메시지와 시뮬레이터의 상태·명령을 변환한다.

Isaac Sim 계층

그림 1-2. USD는 장면의 정적·구성적 표현을, PhysX는 시간에 따른 상태 변화를, ROS 2 Bridge는 외부 시스템과의 메시지 교환을 담당한다.

1.2.2 Stage와 시뮬레이션 상태를 구분하라

Stage에 translate = (0, 0, 1)을 작성하는 것은 장면 기술을 바꾸는 일이다. 반면 물리 스텝 뒤 강체가 낙하해 현재 자세가 달라지는 것은 런타임 상태 변화다. 두 경로를 무분별하게 섞으면 물리 엔진이 계산한 값을 매 프레임 덮어쓰거나, 저장한 USD가 예상과 달라진다.

다음 질문으로 소유권을 정한다.

  • 초기 자세는 어느 Layer가 작성하는가?
  • 시뮬레이션 중 관절 명령은 ROS와 그래프 중 누가 소유하는가?
  • 물리 결과를 USD에 저장할 것인가, 별도 로그로 남길 것인가?
  • Reset 시 어떤 값이 초기화되는가?

1.2.3 확장 기반 실행과 독립 실행

GUI에서의 작업은 탐색과 디버깅에 유리하다. 반복 가능한 데이터 생성이나 자동 실험은 독립 실행(standalone) Python이 적합하다. 일반적인 순서는 애플리케이션 생성, 필요한 확장 활성화, Stage 준비, 물리 초기화, 반복 스텝, 종료다.

# 개념적 생명주기 예시: 릴리스별 import 경로를 공식 문서에서 확인한다.
simulation_app = SimulationApp({"headless": True})
try:
    # USD/Isaac 모듈은 앱 생성 후 import하는 버전이 많다.
    prepare_stage()
    reset_world()
    while simulation_app.is_running():
        step_world(render=False)
finally:
    simulation_app.close()

앱 생성 전에 렌더러 의존 모듈을 import하거나, 종료 시 close()를 호출하지 않으면 플러그인 초기화·정리 문제를 만들 수 있다. 이 책의 예제 code/create_usd_scene.py는 Isaac Sim 생명주기와 독립적으로 OpenUSD 데이터 모델만 연습하도록 구성했다.

이 장의 예제 코드·설정 파일 (12)

이 장의 자가 점검·가상실습