1.3 OpenUSD 데이터 모델
1.3.1 Stage, Layer, Prim
Layer는 USD 의견(opinion)을 저장하는 단위다. 파일일 수도 있고 메모리 안의 익명 Layer일 수도 있다. Stage는 여러 Layer와 composition arc를 합성해 애플리케이션이 보는 하나의 장면을 제공한다. Prim은 /World/Robot/arm_link처럼 경로를 갖는 장면 객체다.
파일 시스템 비유는 유용하지만 완전하지 않다. Prim은 단순 폴더가 아니라 타입, 속성, 관계, 메타데이터, 자식 Prim을 가진다. 여러 Layer가 같은 Prim 경로에 서로 다른 의견을 낼 수 있으며, Stage는 합성 규칙으로 최종 값을 결정한다.
Stage
└── /World (Xform Prim)
├── /World/Worktable (Cube Prim)
├── /World/Robot (Reference로 가져온 Prim)
│ └── /World/Robot/Tool
└── /World/Target (Sphere Prim)
Prim 경로는 절대 경로로 명시하면 /로 시작한다. 이름 변경은 코드·관계·센서 설정에 영향을 줄 수 있으므로 장면 경로를 공개 API처럼 관리한다.
1.3.2 Attribute와 Relationship
Attribute는 시간 샘플을 가질 수 있는 값이다. 위치, 색, 질량처럼 수치나 토큰을 저장한다. Relationship은 다른 Prim 또는 Property 경로를 가리킨다. 센서가 어떤 링크에 부착되었는지, 재질이 어떤 대상과 연결되는지처럼 값 복사보다 참조가 자연스러운 경우에 쓴다.
prim = stage.GetPrimAtPath("/World/Target")
purpose = prim.CreateAttribute("robotics:purpose", Sdf.ValueTypeNames.Token)
purpose.Set("pick_target")
rel = prim.CreateRelationship("robotics:observedBy")
rel.SetTargets([Sdf.Path("/World/Camera")])
사용자 정의 namespace robotics:는 표준 스키마와 충돌을 피하고 의미를 묶는다. 다만 팀 프로젝트에서는 임의 Attribute를 늘리기 전에 Typed/API Schema로 만들 필요가 있는지 검토한다.
1.3.3 변환과 XformOp
UsdGeom.Xformable은 변환 연산(XformOp)의 순서를 명시한다. 단일 4×4 행렬, translate/orient/scale의 조합 등 여러 표현이 가능하다. 단순히 속성 이름만 찾아 값을 바꾸면 기존 xformOpOrder와 충돌할 수 있다.
쿼터니언 순서도 주의한다. USD의 Gf.Quatd(real, imaginary)는 실수부 를 먼저 받는 반면, ROS 메시지 geometry_msgs/Quaternion 필드는 x, y, z, w 순서다. 배열을 그대로 복사하지 말고 이름 있는 필드로 변환한다.
1.3.4 비파괴 합성
OpenUSD의 핵심은 원본 자산을 수정하지 않고 의견을 겹치는 것이다.
- SubLayer: Layer 스택에 다른 Layer를 포함한다. 환경, 조명, 작업 설정을 계층화할 때 유용하다.
- Reference: 특정 Prim 아래에 외부 자산을 가져온다. 한 로봇 자산을 여러 장면에 재사용한다.
- Payload: Reference와 비슷하지만 필요할 때 적재해 대형 장면의 작업 집합을 줄인다.
- Inherit: 클래스 Prim의 의견을 상속한다.
- VariantSet: 같은 자산의 그리퍼, 재질, 상세도 같은 선택지를 제공한다.
- Specialize: 기반 정의를 특수화한다.
강한 Layer의 override가 약한 Layer의 값을 가릴 수 있다. “파일에는 값이 맞는데 Stage에서 다르게 보인다”면 먼저 Prim Stack과 Layer Stack을 조사한다. 값을 반복해서 덮어써 증상을 숨기지 않는다.
그림 1-3. 로봇 자산, 작업 환경, 실험별 override를 분리하면 원본 자산을 보존하면서 여러 실험을 재현할 수 있다.
1.3.5 예제 장면 생성
code/create_usd_scene.py는 다음을 수행한다.
- 메모리 또는 파일 Stage를 생성한다.
/World를 default prim으로 지정한다.- 바닥, 작업대, 목표 물체, 카메라 Prim을 만든다.
- 사용자 Attribute와 Relationship을 작성한다.
- 별도 session Layer에서 목표 색을 override한다.
예상 출력 예시
stage: physical_ai_scene.usda
default prim: /World
target purpose: pick_target
observed by: [/World/Camera]
composed display color: [(0.9, 0.2, 0.1)]
생성된 USDA를 텍스트 편집기로 열어 계층과 값이 어떻게 기록되는지 확인한다. 바이너리 USDC는 배포에 유리하지만 학습 단계에서는 USDA가 디버깅하기 쉽다.