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개는 아무도 말하지 않는다

노출 최대 프레임 — 사이드테이블 위 비누병 3개 (4,486 px)
| 편 | 질의 | 정답 | 쌍둥이 정답 | 출처 |
| __5808 | Put 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_1 | 440 | 84 (19%) | 편의 66% 지점 |
| train_5455__5401 · exo_1 (쌍둥이) | 327 | 37 (11%) | 편의 100% — 끝부분 |
| train_1652__2001 · exo_1 (쇼케이스) | 802 | 5 (1%) | 75% · 약 5초 |
| train_1652__3002 / __3002_tv · exo_1 | 641 / 617 | 4 / 5 (1%) | 88% / 63% |
| train_1652__2000 · __3000 · __3004 · train_3118__5808/5809 | 375~822 | 0~2 (0%) | — |

같은 편·같은 프레임(1775 · 1800 · 1825 · 2275). 위 = 수정 전(벽면으로 가득) · 아래 = 수정 후(로봇·의자·바구니·바닥이 보인다)

쌍둥이 편 train_5455__5401 의 끝부분(프레임 7900 · 8100 · 8150). 위 = 수정 전 · 아래 = 수정 후. 이 편에서 컬링은 1,087 스텝(약 44초) 동안 발동했다

쇼케이스 편 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,087 | 4/4 · 4/4 |
| + 자세 선호, 통 유지(보수적) | (13.76, 5.55) | 19% / 11% | 2,348 / 1,087 | 3/4 |
| + 자세 선호 + 통 자리 선호 | (10.21, 9.90) | 0% / 0% | 102 / 164 | 4/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·발동 스텝) 를 찍는다 — 비율은 기하라 컬링을 켠 편도 그대로지만 화면은 멀쩡하다.