# CH62 — FWD 고착의 진짜 원인: grounding 실패가 아니라 액션-그라운딩 라벨 confound

> 작성일: 2026-07-12
> 배경: CH61 §17/§18에서 "그라운딩 성공/실패가 obj_* 성공률을 가른다"고 결론냈으나,
> 2026-07-11 신규 13세션의 H5 raw 데이터(images/actions/grounding)를 프레임 단위로
> 직접 대조한 결과 더 근본적인 원인이 드러남 — **grounding이 나중에 정확히 성공해도
> 액션은 반응하지 않는다.**

## 1. 결정적 반례: grounding 성공 ≠ 액션 반응

2026-07-11 세션 13개(obj_right 12건 유효 11건 + left_left 1건) 중 obj_right 11건을
H5 raw 배열(`observations/images`, `actions`, `grounding/bbox`)로 직접 대조.

| 세션 | 결과 | 첫 탐지 프레임 | 첫 탐지 cx | 회전 액션(vyaw≠0) 낸 프레임 |
|---|---|---|---|---|
| 205228 | 실패 | 0 | 0.73 | 0,1,2,9 |
| 205354 | 성공 | 0 | 0.71 | 0,1,2 |
| 205621 | 성공 | 0 | 0.71 | 0,1,2 |
| 205726 | 성공 | 0 | 0.71 | 0,1,2,3,4 |
| 213650 | 실패 | 6 | 0.76 | **없음** |
| 213749 | 실패 | 3 | 0.66 | **없음** |
| 214155 | 실패 | 3 | 0.77 | 5 (1프레임뿐) |
| 215709 | 실패 | 3 | 0.70 | **없음** |
| 220142 | 실패 | 6 | 0.73 | **없음** |
| 220233 | 실패 | 3 | 0.72 | **없음** |
| 220439 | 실패 | 없음(끝까지 미탐지) | — | **없음** |

성공 4개 전부 `first_detect_frame=0`, 실패 7개 전부 `first_detect_frame≥3` 또는 미탐지 —
완벽하게 갈림. 그리고 **회전 액션은 예외 없이 에피소드 초반 0~4프레임에서만** 나온다.
213650·220142는 grounding이 나중에(frame 6) 정확히 잡혔는데도(cx 0.73~0.76, 3회 연속)
회전 액션이 단 한 프레임도 없었다 — grounding 문제가 아니라 **액션 헤드가 초반 window
이후 grounding 업데이트에 반응하지 않는다**는 직접 증거.

## 2. 반례 안 반례: 205228 (첫탐지 성공했는데도 실패)

205228은 첫 프레임부터 탐지됐는데(성공군과 동일 조건) 결과는 실패. 성공 3건과 프레임
단위로 대조:

| | 205228(실패) | 205354(성공) | 205621(성공) | 205726(성공) |
|---|---|---|---|---|
| frame0 cx | 0.730 | 0.706 | 0.711 | 0.711 |
| f3~5 cx | 0.318 (Δ0.41, 급격) | 0.377 (Δ0.33) | 0.465 (Δ0.25) | 0.575 (Δ0.14) |
| f6~8 cx | 0.186 (계속 하강) | 0.410 (반등) | 0.437 (반등) | 0.612 (반등) |
| 재회전 시도 | f9 vyaw=+1.15 (grounding 놓친 직후, 늦음) | 없음 | 없음 | f4 1회 미세보정 |
| 마지막 유효 cx | 0.082~0.112 (가장자리) | 0.278~0.407 | 0.428~0.432 | 0.171~0.322 |

성공 케이스는 초기 회전 후 cx가 반등하며 중앙 쪽으로 재수렴한다. 205228은 초기 회전량이
과도해(vyaw=-1.15가 3프레임 유지) cx가 반등 없이 계속 밀리고, 뒤늦은 재보정(f9)도
방향/타이밍이 어긋나 화면 가장자리(cx≈0.1)로 빗나간 채 종료(오퍼레이터 메모: "살짝 엇나감").

## 3. 근본 원인 후보

1. **극단cx 구간 데이터 부족** (기존 `plan_20260707` 근거와 일치) — cx<0.25/>0.75가
   학습 프레임의 3.2%뿐이라 이 구간에서의 회복 행동을 모델이 거의 학습 못함.
2. **학습 에피소드 구조 자체가 "초반 1회 회전 → 나머지 직진"으로 편향** — 수집 스크립트가
   "목표를 보고 경로를 한 번 정하면 끝까지 유지"하는 방식이라, "가다가 오버슈트해서
   반대로 재보정"하는 궤적이 데이터에 거의 없음.
3. **8-class 이산 액션 공간** — 회전량이 cx 오프셋에 비례하지 않아 미세 보정이 구조적으로
   불가능. ROT_L/ROT_R은 전체 데이터의 ~0.8%뿐(CLAUDE.md 액션 분포표).
4. **grounding_skip_n=3 캐싱 vs 학습 시 가정한 갱신 주기 불일치**.
5. **cx-액션 라벨 confound (§4에서 정량 확인, 가장 강한 근거)**.

## 4. 정량 검증: cx-액션 방향 일치율(VSC)이 우연 이하

`docs/v5/bbox_nav_owl/bbox_dataset_owl_150ep.json`(147ep, 2559 유효프레임)에서
방향성 액션(LEFT/RIGHT류, gt_class∈{2,3,4,5,6,7})만 골라 `sign(cx-0.5)`(시각적으로
기대되는 회전 방향)과 실제 라벨 방향의 일치율(Visual-Servoing Consistency, VSC) 계산:

| cx 구간 | 일치 / 전체 | VSC |
|---|---|---|
| 0.15~0.30 | 26/55 | 47.3% |
| 0.30~0.45 | 51/200 | **25.5%** |
| 0.45~0.55 | 88/192 | 45.8% |
| 0.55~0.70 | 44/166 | **26.5%** |
| 0.70~0.85 | 26/49 | 53.1% |
| **전체** | **235/662** | **35.5%** |

50%(우연)보다 낮다 — 즉 라벨 방향이 시각적 cx 기대와 **오히려 반대로 겹치는 경향**이
있다. 원인: 액션 라벨은 "이 순간 물체가 화면 어디 있으니 이 방향으로 튼다"가 아니라
"사전에 정한 경로(path_type)를 재생한 기록"이기 때문 — 곡선 진입 중에는 회전 자체가
물체를 화면 반대쪽으로 밀어내는 광학적 효과(motion parallax)가 나서, "이 순간의 cx"와
"이 순간의 액션"이 원래도 강하게 연결돼 있지 않다.

**결론**: 실시간 물리 드리프트로 cx가 계속 바뀌어도 모델이 반응하지 않는 게 이상한 게
아니라 — 애초에 학습 라벨 자체가 "라이브 cx에 반응하는 제어기"가 아니라 "초반에 본
장면으로 경로 하나를 고르고 그 경로를 재생하는 함수"에 가깝게 구성돼 있다.

## 5. 오프라인 지표: 오버슈트 회복률

`grounding/bbox`의 cx가 방향을 반전(Δcx 부호 전환, |Δ|>0.03)하는 지점에서, 이후
5프레임 이내 회전 액션(|vyaw|>0)이 나오는지 확인 (2026-07-11 obj_right 11세션 대상):

- 오버슈트(cx 반전) 이벤트 **7건 중 회복시도 1건 = 14.3%**
- 나머지 6건은 cx가 반전됐는데도 액션은 그대로 FORWARD 유지
- 단, 성공 케이스(205354/205621/205726)의 반전은 근접 접근 중 측정 노이즈 수준의
  미세 진동일 가능성 있음 — 이 지표는 §4 VSC보다 노이즈에 민감해 보조지표로 취급

## 6. 향후 시도 평가지표 (5개, 재수집/재학습 전후 비교용)

| # | 지표 | 정의 | 현재값 | 목표 |
|---|---|---|---|---|
| 1 | VSC (방향 일치율) | 방향성 액션에서 sign(cx-0.5)=sign(vyaw) 비율, 극단cx 구간 | **35.5% 전체 / 극단구간 47~53%** | 70%+ |
| 2 | 오버슈트 회복률 | cx 반전 후 5프레임 내 회전 액션 비율 | **14.3% (1/7)** | 유의미한 증가 |
| 3 | Grounding-Action 반응 지연 | 유의미한 cx 변화(Δ>0.15) 후 액션 반응까지 프레임 수 | 사실상 무한(초반 이후 반응 없음) | 유한값으로 감소 |
| 4 | first_detect_frame 무관 성공률 | obj_* 성공률을 first_detect=0군 vs ≥3군으로 분리 | 75%(0군) vs **0%**(≥3군) | 격차 축소 |
| 5 | closed-loop obj_* 종합 성공률 | 기존 §17/§18 지표, 회귀 확인용 앵커 | 34.7%(25/72, 기간 전체) | 유지/개선 확인 |

지표 1·2는 **재수집 없이 기존 학습 annotation만으로 오프라인 측정 가능** — 새 데이터의
"지시-경로 디커플링"이 confound를 실제로 끊었는지 로봇 재수집 전에 먼저 검증 가능.

## 7. 다음 결정 필요

- `plan_20260707_heterogeneous_instruction_extreme_cx_collection.md`의 트랙A/B에
  "일부러 과도하게 꺾은 뒤 되돌아오는(오버슈트→재수렴) 궤적"을 세팅당 몇 회 명시적으로
  포함할지 결정 필요 — 현재 플랜은 극단cx 위치·경로 다양성만 다루고 이 유형은 없음.
  초반 1회 회전 데이터를 **빼는 것은 비권장** — 그 패턴 자체가 문제가 아니라
  "그 패턴만 있다"는 다양성 부족이 문제이므로, 삭제보다 추가가 맞는 방향.

## 관련 문서

- [CH61_OWL_LIVE_FAILURE_AND_FIX.md](CH61_OWL_LIVE_FAILURE_AND_FIX.md) §17/§18 — 이 장의 전제가 된 그라운딩 vs 체크포인트 시계열 분석
- [plan_20260707_heterogeneous_instruction_extreme_cx_collection.md](../../plans/plan_20260707_heterogeneous_instruction_extreme_cx_collection.md)
- 로컬 이미지 비교 리포트: `docs/v5/analysis_reports/ch61_forward_lock_20260712.html` (grounding bbox/cx 오버레이 포함, git 비대상)
