Index
2026-09-07 — Progress

Routine 물량 파이프라인 — 홀드아웃·배치 샘플러·질의 행·채점 판정, 첫 샘플 짝 완주

질의 시작 상태 = 끝 상태 그대로 · 홀드아웃은 조리대에 처음부터 · 집 샘플 → 짝 → 사전 패스 → 실행 → 행

TL;DR

4/4 · 4/4
train_5455 짝 실행
14
질의 행 (2짝: Direct 10 + Stateful 4, D② 2)
3/20
사전 패스 통과 짝 (s1+s2+s3)
714
카드 자격 집
2/3
실행 짝 완주 (5455 · 3118; 4706 폐기)

1 바뀐 설계와 파이프라인

단계도구내용
집 샘플tools/routine_batch.py gen카드에서 출발 테이블 도달 ≥3 · 놓기 가능 수납처 ≥4종인 집(714채) 무작위. 편마다 규칙 수 2/3, 관찰 규칙 0/1, 클래스·수납처는 집에서 뽑음(sample_rules). 쌍둥이 = 값 순환(관찰 클래스는 기본·쌍둥이 모두 Basket 회피)
계획routine_gen.py규칙마다 홀드아웃 1개(role=holdout) 출발 테이블에 주입. 출발 테이블은 조리대 우선(카드 n_spots 는 8 로 잘려 용량 지표가 아님)
사전 패스tools/prestage_resume.py실행 task → 관찰 증거(심기만, ROUTINE_OBS_SOFT) → 홀드아웃(도달성 요구). 쓴 상면의 geom AABB 저장(빌더가 모델 없이 "테이블 위" 판정)
실행scripts/routine_pilot.sh (sbmr)짝(2편)을 GPU 하나에서 동시. 유닛 문장 낱말 = 실제 배우
실행 후tools/routine_batch.py finish관찰 노출 실측(routine_evidence.py) → 질의 행(build_routine_queries.py) → 요약
질의 행build_routine_queries.py시작 상태 = final.npz. 규칙 성립: 실행 = 성공 유닛 ≥1, 관찰 = 픽셀 로그 유닛 ≥2. Direct "Put the {홀드아웃} on the {테이블} away." · Stateful "Clear the {테이블}." (홀드아웃 + 남은 배우). twin_id, axes.evidence_source
채점routine_judge.py정답 클래스 인스턴스 중 하나에 on_surface(top_z) / inside — 컨텍스트 유닛 완료 판정과 같은 함수. 하네스 연결은 평가팀

2 첫 샘플 짝 — train_5455 (천·그릇, 홀드아웃 손수건·머그)

__5400 · 16× · 7분 19초 — "Put the clothes from the dining table into the laundry basket." "Put the dishes from the dining table on the countertop." 천 → 바구니 ×2, 컵·그릇 → 조리대 ×2. 손수건·머그는 식탁에 그대로
__5401 (쌍둥이) · 16× · 5분 26초 — 천 → 조리대 ×2, 컵·그릇 → 바구니 ×2
편질의정답쌍둥이 정답
__5400Put the hand towel on the dining table away.빨래 바구니조리대
Put the mug on the dining table away.조리대빨래 바구니
Clear the dining table.손수건 → 바구니 · 머그 → 조리대 · 남은 천 2 → 바구니 · 남은 컵·그릇 3 → 조리대전부 반대
확인된 것: 두 편 모두 실행 4/4 깨끗(유닛 254~802 s). 홀드아웃이 끝 상태에서 식탁 위에 남아 있어 행이 그대로 성립하고, 같은 질의의 정답이 짝에서 뒤집힌다. 유닛 문장이 "cup"·"bowl" 로 실제 배우를 적는다.

3 공급 깔때기 — 사전 패스 통과율과 병목

배치설정자격 짝탈락 사유
s1 (4집)k=3, 관찰 무작위1/4식탁이 작아 규칙당 배우 5개 중 1~2개만 앉음 ×3 (그중 2집은 사전 패스 크래시 — 수정)
s2 (8집)k=3, 관찰 7/8, 조리대 우선0/8출발 테이블 용량(0~3/5) + 관찰 배치 A* 예측 전부 0점 + 쌍둥이 값 순환에서 관찰 클래스가 Basket(샘플러 수정)
s3 (8집)k=2, 관찰 1/편 심기만(라벨은 실행 후)2/8출발 테이블 용량 4, 홀드아웃 0(테이블 꽉 참) 2
병목은 출발 테이블 용량이다. 카드는 상면 크기를 안 들고(n_spots 8 고정) 사전 패스가 실제로 세워 봐야 안다. 통과율 ~25% 는 CPU 사전 패스(편당 2.5분, 병렬)라 감당은 되지만, 카드에 상면 AABB 를 넣어 샘플러에서 거르거나 배우를 같은 방 두 테이블에 나눠 심으면 통과율이 오른다.

s3 실행 결과 — 2짝

짝구성실행관찰 노출 (max px, 3개 전부 ≥200 px 유닛)행
train_4706실행 그릇→책상 / 그릇→소파, 관찰 음식기본 0/2 (책상 놓기 IK) · 쌍둥이 런타임 무대 탈락(소파 IK 96회 전멸, 사전 패스는 통과)—0
train_3118실행 음식→식탁·그릇→바구니 / 음식→바구니·그릇→사이드테이블, 관찰 세면용품→사이드테이블 / →식탁4/4 · 4/4 깨끗비누병 3개 4,486 · 3,742 · 1,974 / 1,093 · 1,443 · 323 — 유닛 1개(t1u0)4 + 4 (Direct 3 + Stateful 1 씩, D② 행 포함)
train_3118__5808 · 16× · 10분 12초 — "Put the food … on the dining table." "Put the dishes … into the laundry basket." 사이드테이블 위 비누병 3개는 아무도 말하지 않는다
glimpse
노출 최대 프레임 — 사이드테이블 위 비누병 3개 (4,486 px)
편질의정답쌍둥이 정답출처
__5808Put the bread on the countertop away.식탁바구니Direct ① (실행)
Put the mug on the countertop away.바구니사이드테이블Direct ① (실행)
Put the spray bottle on the countertop away.사이드테이블식탁Direct ② (관찰)
Clear the countertop.빵 → 식탁 · 머그 → 바구니 · 분무기 → 사이드테이블 · 남은 사과·컵 → 각 규칙전부 교체Stateful
관찰 규칙의 성립 기준: 비누병(큰 물체)은 한 유닛에서 4,486 px 까지 잡혔지만 "셋 다 ≥200 px" 인 유닛이 하나라 2유닛 기준으로는 미달이었다. 실행 규칙 기준(성공 유닛 ≥ 1)과 맞춰 관찰도 유닛 ≥ 1로 두고 axes 에 유닛 수·max px 를 남겨 층화한다. 큰 물체를 관찰 규칙에 두면 D② 행이 잘 나온다 — 칼(작음)과 대비.

5 exo 카메라가 벽 안에 박히는 구간 — 원인과 수정

리포트 영상에서 "exo 카메라가 벽 밖으로 나가 아무것도 안 보이는 구간"이 지적됐다. 실측해 보니 카메라가 벽 슬래브 안에 들어간 것이었다. 어깨 exo 는 베이스 뒤 0.40 m · 높이 1.55 m 라, 로봇이 벽을 등지고 작업하면 카메라만 벽 안으로 들어가 화면이 통째로 벽면이 된다.

편 (카메라)표본카메라가 벽 안마지막 발생
train_5455__5400 · exo_144084 (19%)편의 66% 지점
train_5455__5401 · exo_1 (쌍둥이)32737 (11%)편의 100% — 끝부분
train_1652__2001 · exo_1 (쇼케이스)8025 (1%)75% · 약 5초
train_1652__3002 / __3002_tv · exo_1641 / 6174 / 5 (1%)88% / 63%
train_1652__2000 · __3000 · __3004 · train_3118__5808/5809375~8220~2 (0%)—
before after
같은 편·같은 프레임(1775 · 1800 · 1825 · 2275). 위 = 수정 전(벽면으로 가득) · 아래 = 수정 후(로봇·의자·바구니·바닥이 보인다)
5401 before after
쌍둥이 편 train_5455__5401 의 끝부분(프레임 7900 · 8100 · 8150). 위 = 수정 전 · 아래 = 수정 후. 이 편에서 컬링은 1,087 스텝(약 44초) 동안 발동했다
2001 before after
쇼케이스 편 train_1652__2001(프레임 14900 · 14925 · 14950, 편의 73% 지점). 위 = 수정 전(첫 장 완전 차단, 둘째 장 절반) · 아래 = 수정 후. 이 편의 컬링 발동 1,770 스텝

수정(cam_wall_cull.py + 정책 매 스텝): 카메라 위치가 벽 geom 내부면 그 벽과 붙은 문·창·액자의 시각 geom만 숨기고, 빠져나오면 25스텝 뒤 되돌린다(즉시 복구하면 벽이 깜빡인다). 충돌 geom 은 그대로라 물리·주행·판정은 불변 — 재실행에서 유닛 4/4 깨끗, 로봇 경로도 동일하게 재현(프로브 84/440 그대로).

두 번 틀린 뒤 잡은 것: ① 프로브의 카메라 전방 축(이 파이프라인은 cam2world_gl 의 +Z 가 전방) ② 목표점으로 쓴 tcp_pose 가 베이스 상대 좌표라 "가림 99%" 라는 거짓 결과 ③ exo 는 MuJoCo 모델 안에 없다 — fr3_link0 에 오프셋으로 얹히므로 모델 카메라를 찾으면 손목 하나뿐이다(첫 실행 로그 "카메라 [] 감시"). 좌표계 규약은 영상 프레임으로 교차 검증하고 넘어갈 것.

근본 수정 — 애초에 벽 근처에 안 서게 (위치 기반)

렌더 컬링은 "카메라가 벽 안" 만 덮는다. 실측해 보니 문제 프레임은 서 있는 자리 몇 곳에 몰려 있었다(train_5455: 113개 중 100개가 정지, 그중 85개가 주입 바구니 앞 도킹 자세 하나). 그 자리는 벽면에서 0.37~0.43 m 인데 카메라는 뒤 0.47 m 라 반드시 벽을 넘는다. 그래서 자세 선택에 카메라 여유를 넣었다.

넣은 곳규칙
base_candidates (후보 생성 공통 지점, 호출처 11곳)카메라가 벽 안이 되는 자세를 뒤로 민다. 거리가 1순위, 카메라 여유는 그 안의 2순위 — 카메라를 1순위로 두면 먼 standoff 가 뽑혀 팔이 더 뻗는다. 거르지 않는다(유일한 자세면 그걸 써야 유닛이 산다). 후보 81개 정렬 3.9 ms
통 자리 선택 (_prefer_cam_clear_spots)후보 자리마다 12방향 도킹을 시험해 깨끗한 방향이 많은 자리 먼저
설정통 자리카메라 벽 안 (5400 / 5401)컬링 발동유닛
컬링만(13.76, 5.55)19% / 11%2,348 / 1,0874/4 · 4/4
+ 자세 선호, 통 유지(보수적)(13.76, 5.55)19% / 11%2,348 / 1,0873/4
+ 자세 선호 + 통 자리 선호(10.21, 9.90)0% / 0%102 / 1644/4 · 4/4
결과: 로봇이 애초에 그 자리에 안 서니 카메라가 벽 안인 프레임이 0 이 되고, 컬링은 주행 중 스치는 100~160 스텝(4~7초)만 덮는 안전망으로 남는다. 두 편 모두 4/4 깨끗으로 재현됐다(두 번 실행). 대가는 쌍둥이 첫 유닛의 재시도(1회 → 3회, 통이 옮겨져 운반 경로가 길어짐) — 유닛은 성공하고 편은 유지된다.
진단을 한 번 뒤집었다: 그 재시도를 보고 "통 이동이 회귀" 라 보고 보수적 판으로 되돌렸는데, 반대 설정에서는 다른 편이 아예 실패했다(3/4). 이 파이프라인은 편차가 커서 같은 설정을 두 편 이상 돌려야 비교가 된다.
한 편만 보고 정리한 것이 문제였다: 처음엔 기본 편(5400)만 재고 "0~19%, 집·자리 문제" 로 넘어갔는데, 사용자가 쌍둥이 편의 끝부분을 짚었다. 같은 집·같은 무대라도 동선이 달라 다른 벽에 걸린다(5400 은 66% 지점, 5401 은 100% 지점). 그래서 tools/cam_wall_audit.py 를 만들어 routine_batch.py finish 가 편마다 "벽안 N%" 를 찍게 했다 — 물량 단계에서 자동으로 걸린다.
운영: 기본 꺼짐(SCENEMEM_WALL_CULL=1 일 때만) — type1/type2 재현을 안 건드린다. routine 실행 스크립트에서 켜고, 편 끝에 발동 스텝 수를 남겨 감사한다(숨긴 동안은 세그 렌더도 그 벽을 통과하므로). 5400·5401·2001(쇼케이스) 을 고친 판으로 교체했다(이전 판 _prewallfix). 재실행은 유닛 결과·프레임 경계가 원본과 그대로 재현됐다(2001: 4/6 · 앞 4유닛 경계 동일). 0~1% 짜리(3002·3002_tv)는 D② 분석용이라 보류. finish 는 이제 편마다 벽안 N%(컬링 O/X·발동 스텝) 를 찍는다 — 비율은 기하라 컬링을 켠 편도 그대로지만 화면은 멀쩡하다.

6 Next

① (완료) ②′ 벽 컬링을 배치 기본으로 두고 편별 embedded 비율을 finish 지표에 추가 ② 카드에 상면 AABB → 샘플러 용량 필터 ③ 팩(contexts/type3)·family 등록·`build_eval` 합치기 ④ 하네스 채점 연결(routine_judge.judge)·오라클 예산 ⑤ 물량: 100짝 목표 = 자격 짝 ~25% × 실행 깨끗 ~60% → 집 ~700채 샘플, GPU 8장 3~4일.