Index
2026-09-15 — Progress

Whole-scene delivery 파이프라인 — portable MuJoCo 패키지 통합 및 public runtime 검증

R2S | full_scene_background / full_scene_delivery / full_scene_runtime

TL;DR

94
Steps (row 9–102)
22.9%→71.4%
Table appearance coverage
4 fail → 4 pass
Delivery job 시도
GPU+CPU
런타임 재현 경로

1 배경 / 목적

2026-09-14~15에 R2S 파이프라인의 개별 구성 요소들(관측 지오메트리, MuJoCo FrozenEnv 하이브리드 컨트롤러, Cycles 렌더링/SSIM-LPIPS, source IK bridge, table texture fusion)이 각각 별도 리포트로 검증됐지만, 이 조각들을 하나의 재현 가능한 패키지로 조립해 외부에서 raw 센서 데이터·repo 전체 없이 로드·재생할 수 있게 만드는 단계는 아직 없었다.

목표는 (1) 배경 mesh + robot/gripper/block 지오메트리 + table appearance 텍스처를 하나의 MJCF로 병합해 FrozenEnv를 재컴파일하고, (2) 모든 asset을 sha256 해시로 검증되는 portable 번들로 패키징하고, (3) repo-bound지만 public한 load_delivery() API로 그 패키지가 실제로 로드/step 가능함을 증명하는 것.

기존 한계: 각 조각(배경, 텍스처, 컨트롤러)이 서로 다른 job의 output 디렉토리에 흩어져 있었고, joint/free/site ID가 원본 XML과 augmented XML 사이에서 재정렬되는지 검증된 적이 없었다.

2 작업 내용

2.1 배경 빌더 — full_scene_background.py

build_background(root, output)가 exterior 카메라 22246076 frame 0에서 RGB-textured observed mesh, MJCF 조각(asset_xml/worldbody_xml), removal-mask preview, manifest(상대경로/해시/bounds/method label)를 생성. 로봇·그리퍼·테이블탑·두 블록은 사람이 그린 source-pixel polygon으로 제거 — segmentation ground truth가 아닌 보수적 근사임을 명시. observed mesh는 OBSERVED_VISUAL(collision 비활성), 바닥/벽은 INFERRED_PROXY_NOT_GT 시각 전용 shell로 분리해 물리 충돌은 nominal floor에만 부여.

2.2 델리버리 컴파일러 — full_scene_delivery.py

frozen candidate XML에 배경 asset/worldbody 조각을 병합한 뒤 install_final_model()로 FrozenEnv.env를 재컴파일하고 모든 joint/free/site ID를 재해석. rows 9–102(94 steps)에 걸쳐 frozen scheduler로 recorded controls를 재생하며 미래 state 주입 없음을 보장. 이식 가능한 asset 번들(package/scene.xml + package/assets/*.obj,*.stl,*.png, 절대경로 전부 상대화)은 별도 full_scene_bundle에 위임.

2.3 반복 디버깅 (sbatch --container=docker.io/nvidia/opengl, EGL)

job 127159 (11:35, 4s FAILED) → OpenGL.raw.EGL._types: eglQueryString AttributeError (EGL 컨텍스트 바인딩 실패, PLATFORM.EGL None) job 127172 (11:42, 7s FAILED) → PIL ImageDraw.polygon: "coordinate list must contain at least 2 coordinates" (full_scene_table.py: articulated_robot_gripper exclusion polygon이 빈 리스트) job 127188 (11:44, 5s FAILED) → MuJoCo XML: "plane size(3) must be positive" (inferred_floor_nominal, line 301) job 127210 (11:57, 7s FAILED) → MuJoCo XML: "unrecognized attribute: 'inertia'" (planar_proxy geom 병합 시 schema 위반) job 127193 (11:47, 43s COMPLETED) → 첫 성공 delivery (appearance/planar_proxy 없음) job 127218 (12:02, 49s COMPLETED) → appearance projection + planar_proxy(멀티뷰 확장) 추가 job 127223 (12:13, 4s COMPLETED) → full_scene_runtime.load_delivery() public loader smoke test job 127238 (12:24, 46s COMPLETED) → planar_proxy 멀티뷰 시각 품질 실패로 DISABLED 처리 job 127322 (13:33, 2m50s COMPLETED) → full_scene_delivery_cpu.sbatch, CPU-only 경로 최종 재검증

2.4 런타임 로더 — full_scene_runtime.py

배포된 package/scene.xml/package/assets/는 상대경로+해시 검증된 portable MuJoCo 아티팩트지만, public 로더 자체는 repository-bound다 — R2S FrozenEnv 컨트롤러 구현, pinned snapshot calibration, raw trajectory row 9 reset state가 필요. load_delivery()는 canonical package 경로, release media 해시, 94-row completion 상태, 모든 번들 asset 해시, 안전한 상대 XML 참조, bound raw trajectory를 전부 검증 후 모델을 로드. worker-only 실행(sbatch scripts/full_scene_runtime.sbatch <delivery-jobid>), login node에서는 render/step 금지.

3 결과

Job단계StateElapsed비고
127159/127172/127188/127210delivery (GPU)FAILED ×44–7sEGL → PIL polygon → plane size → XML schema, 순차 수정
127193delivery (GPU)COMPLETED43sappearance/planar_proxy 미적용 최초 성공
127218delivery (GPU)COMPLETED49sappearance projection + planar_proxy 시도(coverage 13.5%)
127223runtime loaderCOMPLETED4sload_delivery() 스모크, qpos 최종값 delivery와 일치
127238delivery (GPU)COMPLETED46splanar_proxy DISABLED (multiview 시각 품질 실패)
127322delivery (CPU)COMPLETED2m50sfull_scene_delivery_cpu, 최종 상태와 동일 결과 재현
status
PROVISIONAL_WHOLE_SCENE_SIM_NOT_REAL_TO_SIM_COMPLETION
controller
FROZEN_HYBRID_TORQUE_REPLAYED_COMPUTED_ACTIONS
timeline_rows
94 (row 9–102)
packaged_model.nu
8 actuators
table observed coverage
22.87%
table appearance-projected
71.45%
planar_proxy (최종)
DISABLED, coverage 0.0
same_compiled_model_identity
True
핵심 발견: job 127223 런타임 로더의 최종 qpos가 delivery job(127322)의 counterfactual final_qpos와 소수점 단위까지 일치 — 패키지가 GPU delivery, CPU delivery, public runtime loader 세 경로 모두에서 동일 물리 상태로 재현됨을 확인.
기각된 실험: job 127218에서 시도한 planar_proxy(멀티뷰 depth 융합 기반 바닥/벽 확장, coverage 13.5%, status INFERRED_PLANAR_VISUAL_ONLY_NOT_DEPTH_GT)는 시각 품질 검사에서 실패해 127238부터 DISABLED_NOT_ADOPTED_AFTER_MULTIVIEW_VISUAL_FAILURE로 명시적 폐기 — 260915-scene_temporal_consensus 카드의 net_gain 음수(-21%~-28%) 결과와 같은 결론(멀티뷰 depth 합의로는 hole을 못 채움).

4 Takeaway

의미

DROID raw 에피소드 → 관측 지오메트리 → FrozenEnv 컨트롤러 → Cycles 렌더/텍스처 검증까지 개별적으로 진행되던 R2S 파이프라인이 처음으로 하나의 로드 가능한 아티팩트로 닫혔다. sha256 해시 검증 + row-level completion 체크가 있는 load_delivery() 덕분에, 이후 어떤 소비자(정책 학습, 추가 렌더링 등)도 raw 센서 데이터나 R2S 전체 repo 없이 package/ 디렉토리만으로 동일한 물리 상태를 재현 가능.

동시에 status 필드가 여전히 PROVISIONAL_WHOLE_SCENE_SIM_NOT_REAL_TO_SIM_COMPLETION으로 fail-closed 유지된다는 점이 프로젝트 전체 방법론과 일치한다 — 텍스처 71.4%는 depth 검증이 아닌 RGB projection이고, floor/wall 확장은 명시적으로 미채택. "패키지가 작동한다"와 "패키지가 real-to-sim 품질을 만족한다"는 여전히 분리된 주장이다.

5 Next Steps

미해결 한계

table_extension은 FITTED_PLANE_VISUAL_EXTENT_EXTRAPOLATION_NOT_TRUE_EDGE — 22.9%만 depth-verified이고 나머지 확장은 관측 텍셀의 중립 median으로 채워진 미검증 영역. floor/wall은 planar_proxy 폐기 이후 INFERRED_PROXY_NOT_GT shell 그대로 남아, 실제 방 형상에 대한 어떤 주장도 하지 않음.

다음 실험

현재 raw ZED depth 기반 멀티뷰 융합은 floor/wall 확장에 반복적으로 실패(temporal consensus net_gain 음수, planar_proxy 시각 품질 실패). 260915-las2_stereo_model_evaluation 카드에서 평가 중인 LAS2-M 학습 스테레오 모델이 근접 거리(<0.334m) 한계에도 불구하고 중간~원거리 floor/wall 영역에서 ZED보다 나은 depth consensus를 제공할 수 있는지 검증 필요 — 채택 시 planar_proxy를 LAS2 depth 기반으로 재시도.