Index
2026-09-04 — Analysis

Hand-off 장면 교란(distractor 추가/제거) 강건성 평가

MolmoBot-Pi0 | pi0.5 goal v2 (`pi05_mlspaces_place_goal_v2/10000`) | hand-off 117편 × 4조건 (own, jobs 109165–109169)

TL;DR

12.8%→7.7~12.0%
replace@5cm (on, 무교란→교란)
3.5~4×
on vs off, 같은 교란
117편
조건당 hand-off 편수

1 배경 / 목적

goal v2(배치 완료 프레임을 goal 이미지로 주입)의 hand-off replace@5cm 12.8%라는 결과는, goal 이미지가 같은 장면·같은 카메라·같은 base pose에서 pass 1(expert 완주)로 만든 것이라 관측과의 차이가 물체 위치·팔 자세뿐인 가장 유리한 조건이다(09-04 확인: base pose·카메라 파라미터는 에피소드 내 변화 없음).

사용자 요청: base pose 교란보다 먼저 책상 위에 다른 물체를 추가하거나 없애는 조건에서 goal 이미지를 보고도 정확히 놓을 수 있는지 확인. 실제 배포에서는 goal을 찍은 뒤 다른 물체가 놓이거나 치워지는 상황이 흔하다.

기존 한계: v2 goal 평가는 전부 "교란 없음" 조건이었다 — goal-on의 우위가 goal 이미지의 위치 정보를 실제로 읽어서인지, 아니면 관측·goal이 거의 동일해 정합만 하면 되는 쉬운 문제였는지 구분되지 않았다.

2 작업 내용

새 모듈 molmobot_pi0/eval/scene_perturb.py로 hand-off 시점 장면 교란을 구현. 환경변수 HANDOFF_PERTURB="add:N" | "remove:N" | "add:N,remove:M"로 제어.

적용 시점: pass 2에서 expert가 hand-off(preplace)에 도달한 직후, 정책 첫 step 전 goal 이미지 · replace 기준 위치: pass 1(원래 장면) 그대로 — 교란은 정책이 보는 관측에만 영향 면 찾기: 참조 물체(next-to의 Y)를 받치는 body = get_supporting_geom(접촉 기반) → root body; 없으면 get_support_below remove: 그 면 위 자유 물체(집는 물체·참조 물체 제외) 중 카메라에 보이는 것 우선으로 N개를 같은 높이 +50m로 이동 (중력 보상) add: 집 안의 다른 자유 물체(최대 변 0.05-0.35m)를 참조 물체 중심 0.15-0.55m 안, 면 AABB 안쪽, goal 자리(+0.12m)·참조 물체·hand-off 물체·hand-off→goal 경로와 안 겹치는 자리에 배치 - 상판 검증: 중심+발자국 4귀퉁이에서 mj_ray로 첫 geom이 그 면이고 높이가 맞는지 확인 - 가시성 검증: 카메라 extrinsic/intrinsic으로 투영해 프레임 안(6% 여백)일 때만 채택 - mj_forward 후 1cm 관통 시 재샘플(최대 150회) 교란 후: mj_forward → 카메라 갱신 → get_observations()로 관측 재생성 → perturb_images/*.png 저장 메타 기록: handoff["perturb"] = {surface, removed/added 이름·위치·goal까지 거리, skipped}

검증: 프로브(house 100, 로그인 GPU 3, 정책 없이) 3회 — 팬·소금통 제거(가시 후보 3), 접시/머그 추가 후 15 step 물리에서 높이 유지(0.954→0.952). 스모크(v2 goal-on, add:2,remove:2, 2편) 통과 — house 100 hand-off @119 step에서 제거 2·추가 1(가시 자리 부족으로 후보 23 중 1개만), 정책 303 step, h5 메타·PNG 정상 저장.

제출: own, -c 20 — 109165 placegoalv2_on_add2 / 109166 on_rm2 / 109167 on_addrm2 / 109168 off_add2(INJECT=0) / 109169 off_rm2, 각 ~3h17m. 비교 기준 = 교란 없는 v2 on(replace@5 12.8%, @10 36.8%, 13.4cm) / v2 off(1.7 / 7.7 / 28.9cm).

3 결과

117편 중 실제 쌍 비교 가능 편 113편. "실제 교란 편수"는 add/remove 대상이 존재해 정말로 장면이 바뀐 편만(가시 자리·경로 제약으로 목표 N개를 다 못 놓는 경우가 있음).

조건실제 교란 편수replace@5cm@10cm@15cmgoal까지 중앙값NextTooff-surface
v2 on (무교란)—12.8%36.8%53.0%13.4 cm53.8%18
v2 on + add:273/11712.0%30.8%41.9%16.0 cm46.2%21
v2 on + remove:2107/1177.7%26.5%45.3%15.9 cm39.3%17
v2 on + add:2,remove:2112/11711.1%23.9%41.9%16.9 cm49.6%14
v2 off (무교란)—1.7%7.7%13.7%28.9 cm26.5%17
v2 off + add:273/1172.6%8.5%17.9%29.3 cm28.2%15
v2 off + remove:2107/1175.1%10.3%17.1%30.9 cm27.4%15

쌍 비교 (실제로 교란된 편만, 같은 에피소드의 무교란 조건 대비)

on+remove vs on (n=103)
17.0 vs 13.3cm (p=0.024)
on+remove @10cm
25.2 vs 36.9% (11:23, p=0.06)
on+remove NextTo
39.8 vs 54.4% (11:26, p=0.02)
on+add vs on (n=71)
16.0 vs 13.0cm (p=0.22)
on+add @10cm
29.6 vs 35.2% (8:12, p=0.50)
on+add NextTo
43.7 vs 62.0% (6:19, p=0.01)
on+add+remove vs on (n=108)
17.2 vs 13.3cm (p=0.16)
on+add+remove @10cm
23.1 vs 37.0% (12:27, p=0.02)

같은 교란 아래 goal on vs off

add: 거리
16.0 vs 29.3cm (p=1.3e-6)
add: replace@10cm
29.6 vs 7.0% (18:2, p=4e-4)
remove: 거리
17.0 vs 30.8cm (p=3.2e-7)
remove: replace@10cm
25.2 vs 8.7% (23:6, p=2e-3)
핵심 발견: goal-on은 같은 교란의 goal-off보다 거리 절반, replace@10cm 3.5~4배로 압도적 우위를 유지한다 → goal-관측 불일치(산만 물체 차원)에서도 v2는 무너지지 않고 goal의 위치 정보를 계속 사용한다.
완만한 저하: goal-on 자체는 교란으로 거리 중앙값 +3~4cm, replace@10cm −6~14%p, NextTo −5~15%p 하락한다. remove(참조 단서 소실)가 add(가시 자리 제약으로 교란 강도 약함)보다 더 해롭다.
대조군 무반응: goal-off는 교란에 거의 반응하지 않는다(거리 p≥0.14, 성공률 전부 p≥0.38) — 언어("next to Y")만으로 배치하는 정책이라 장면 변화 자체를 못 본다. replace@5cm는 n이 작아(9–14편) 조건 간 차이가 노이즈 범위.

4 Takeaway

의미

goal-관측 불일치 중 "산만 물체 추가/제거" 차원만 분리해서 재는 도구를 확보했다. 대조군(goal-off+교란)을 같이 재서 "clutter 자체가 배치를 방해하는 효과"와 "goal 불일치 효과"를 분리할 수 있게 됐다. 결과적으로 v2의 goal 활용은 정합(alignment)만 학습한 것이 아니라 물체 배치의 실제 위치 정보를 읽는 것에 가깝다는 근거가 하나 더 늘었다 — 배포 시 goal 촬영과 실행 사이에 장면이 조금 바뀌어도 성능이 완전히 무너지지는 않을 것으로 기대할 수 있다.

5 Next Steps

미해결 한계

add는 가시 자리·경로 회피 제약으로 목표 N개를 다 못 놓는 에피소드가 있다(스모크에서도 1/2) — 결과의 "실제 교란 편수"·perturb.mean_added로 실제 교란 강도를 항상 같이 보고해야 한다. 또한 이 실험은 프롬프트 정정(09-04) 이전 버전이라 "next to Y" 프롬프트로 진행됐다 — 참조 물체 언어 힌트가 있는 상태의 강건성이므로, 복원 프롬프트("on the {받침면}", 참조 물체 없음) 모델로도 재측정이 필요하다.

다음 실험

다음 교란 차원: (1) goal 프레임 시점 차이 — 다른 exo 카메라로 goal을 찍는 HANDOFF_GOAL_CAMERA 실험(미구현), (2) base pose 교란(미구현), (3) 조명/시간대 차이. 프롬프트 정정 후 모델(place_oc goal v2, onsupport 프롬프트)로 같은 add/remove 프로토콜을 재실행해 "언어 힌트 없이도 교란에 강건한가"를 확인.