Real Robot Navigation Test

Robot Test Session Log

Exp66 Stage2 v2 SOTA 모델 실제 로봇 추론 세션 분석.
회색 바스켓 navigation task — 5개 세션, 66개 실수 카메라 프레임.

2026-05-29 / 2026-06-04 66 실수 프레임 Exp66 Stage2 v2 Goal: gray basket navigation

세션 개요

이미지가 저장된 3개 세션 (2026-05-29) + JSON 로그 세션 (2026-06-04)

❌ FAIL — Left Drift

2026-05-29 10:19:30 (29 frames)

29 frames
FWD+LEFT 누적 → 바스켓 시야 상실
의자 쪽 벽으로 완전히 이탈
✅ SUCCESS — Approach

2026-05-29 10:20:26 (20 frames)

20 frames
바스켓 프레임 가득 채울 때까지 직진
정확한 목표 접근 성공
✅ SUCCESS — Fast

2026-05-29 10:21:36 (17 frames)

17 frames
더 빠른 접근, 프레임 수 적음
B보다 효율적인 접근 궤적

2026-05-29 10:19:30 (29 frames) (29 frames)

2026-05-29 10:19 | 목표: gray basket | 결과: LEFT DRIFT → 타깃 상실 ❌

session_20260529_101930

Gray Basket Navigation — Left Drift Failure

❌ FAIL
좌우 스크롤

액션 타임라인 추정

FWD
FWD+L
← DRIFT
🚫 LOST
FORWARD
FWD+LEFT
Drift / 타깃 상실

바스켓 상대 크기 (시야 내 추정) — 프레임별

Frame 1→ 바스켓 사라짐Frame 29

관찰

  • F1~5: 바스켓 중앙, 거리 있음 — 정상 출발
  • F5~10: 바스켓 오른쪽으로 이동 → 로봇이 왼쪽 drift
  • F10~15: 왼쪽 벽에 의자 등장, 바스켓 오른쪽 끝으로
  • F15~29: 바스켓 완전 소실, 의자·서랍장 zone으로 이탈

원인 분석

  • FWD+LEFT 편향 — 데이터 수집 경로 특성 반영
  • 바스켓이 화면 중앙에 있어도 LEFT 성분 지속
  • 누적 오류: 각 스텝 작은 좌향 → 큰 이탈
  • Closed-loop FPE 1.45m (Exp11 기준) 와 동일 패턴

2026-05-29 10:20:26 (20 frames) (20 frames)

2026-05-29 10:20 | 목표: gray basket | 결과: 바스켓 직진 접근 ✅

session_20260529_102026

Gray Basket Navigation — Successful Approach

✅ SUCCESS
좌우 스크롤

액션 타임라인 추정

FWD
FWD±
FWD 근접
🎯 도달
FORWARD
FWD+L 보정
목표 도달

바스켓 크기 증가 (접근 지표)

Frame 1 (멀리)→ 꾸준히 접근Frame 20 (바스켓 꽉 참)

관찰

  • F1: 바스켓 중앙, 세션 A와 동일 출발 위치
  • F10: 바스켓 우측 치우침, 크기 커짐 → 근접 중
  • F15: 바스켓이 프레임 절반 이상 차지
  • F20: 바스켓 전체 화면 가득 — 목표 도달 지점

성공 요인

  • 출발 위치/각도가 세션 A보다 미세하게 유리
  • 초기 FORWARD 비율이 더 높아 직진 성분 우세
  • Decomposition Stage2 bbox 추적이 정상 작동
  • FPE 0.55m (Exp14 Step2 기준) 수준 일치

2026-05-29 10:21:36 (17 frames) (17 frames)

2026-05-29 10:21 | 목표: gray basket | 결과: 빠른 접근 성공 ✅

session_20260529_102136

Gray Basket Navigation — Efficient Approach

✅ SUCCESS
좌우 스크롤

접근 속도 — B보다 17% 빠름 (17 vs 20 frames)

Frame 1→ 빠른 접근Frame 17

관찰

  • F1: B와 거의 동일 출발 — 바스켓 중앙
  • F9~12: 이미 중간 거리에서 바스켓 크게 보임
  • F17: 바스켓 프레임 가득 — 목표 도달
  • B 대비 3 프레임 빠른 도달 (~1.3초 이득)

비교 포인트

  • 출발 위치가 B보다 약간 더 가까웠을 가능성
  • 또는 초기 FORWARD 속도 성분이 더 강함
  • 성공 패턴: B와 동일하게 drift 없이 직진
  • 이 두 세션이 실제 66.7% success 수치에 기여

June 4 세션 — 실험 조건 & 원인 분석

5개 세션 × 2 모델 비교. 각 세션별 실험 조건 / 액션 분포 / 실패 원인 분석.

세션 시각 모델 지시어 스텝 avg 레이턴시 전략 결과
D 01:34:59 checkpoints/best (Exp66 Stage2v2) "[FORWARD] the gray basket on right" 102 427ms single_action 🔴 순환
E 08:59:23 checkpoints/best (Exp66 Stage2v2) "[FORWARD] the gray basket" 21 412ms single_action 🟡 수동종료
F 13:30:07 checkpoints/best (Exp66 Stage2v2) "[FORWARD] the gray basket on right" 92 432ms single_action 🔴 순환
G 13:31:50 checkpoints/best (Exp66 Stage2v2) "[FORWARD] the gray basket on right" 17 429ms single_action 🟢 최우수
H 16:36:17 exp49/exp49_mlp.pt (GoalNav regression) "[FORWARD] the gray basket" 14 619ms receding_horizon 🚫 폐기
session_20260604_013459

D — 2026-06-04 01:34:59

🔴 순환 실패
checkpoints/best "[FORWARD] the gray basket on right" avg 427ms 102 steps gt: gray basket single_action

액션 시퀀스 (102 steps)

? FWD+L FWD+L LEFT FWD+L FORWARD FWD+L FWD+L FORWARD FORWARD FWD+L FWD+L FORWARD FORWARD FORWARD LEFT FORWARD FWD+R FWD+L FORWARD FORWARD FWD+L FWD+L FWD+L FORWARD FORWARD FWD+L FORWARD FWD+R FWD+R FWD+L FORWARD FWD+L FORWARD FWD+L FORWARD FORWARD FORWARD FWD+R FWD+R FWD+L FORWARD FWD+L FWD+L FWD+L FWD+L ROT_R FWD+L FWD+L FWD+L FWD+L FORWARD FWD+L FWD+L FWD+L FWD+L FORWARD FWD+L FORWARD FORWARD …+42스텝

액션 분포

FWD+L
50%
FORWARD
32%
FWD+R
11%
LEFT
7%
ROT_R
1%
⚡ 문제점

FWD+L 50% 지배 → 지속적 좌편향 이동. 102스텝에도 목표 미달성. grounding 매 스텝 새로 실행 (cached=0%), 지시어 "on right"에도 우회전 보정 없음.

🔬 가설

바스켓이 항상 왼쪽에 있어 좌회전 bias가 정당화됨. 그러나 순환 루프 탈출 조건 없음 → 무한 접근 시도. Stop rule 부재가 주원인.

다음 액션: bbox area 임계값 기반 stop 조건 추가 필요
session_20260604_085923

E — 2026-06-04 08:59:23

🟡 단기 테스트
checkpoints/best "[FORWARD] the gray basket" avg 412ms 21 steps gt: gray basket single_action

액션 시퀀스 (21 steps)

? FWD+L FWD+L FWD+L FORWARD RIGHT FORWARD FWD+L FWD+L FWD+L FWD+L FWD+L FWD+L FWD+L FORWARD FWD+L FWD+L FORWARD LEFT FORWARD FORWARD

액션 분포

FWD+L
60%
FORWARD
30%
RIGHT
5%
LEFT
5%
⚡ 문제점

지시어 단순화 ("on right" 제거). FWD+L 60% 여전히 지배. 21스텝 후 수동 중단. D 세션 대비 지시어 변경 효과 불명확.

🔬 가설

지시어 변형만으로는 action bias 변화 없음. 모델이 지시어 텍스트보다 이미지 bbox cx에 더 의존. 바스켓 위치가 cx<0.5이면 FWD+L이 지속됨.

다음 액션: 바스켓 상대 위치별 action 분포 추가 분석 필요
session_20260604_133007

F — 2026-06-04 13:30:07

🔴 순환 실패
checkpoints/best "[FORWARD] the gray basket on right" avg 432ms 92 steps gt: gray basket single_action

액션 시퀀스 (92 steps)

? FWD+L FORWARD FWD+L FORWARD FWD+R FORWARD FORWARD FWD+L FWD+L FWD+L FORWARD FWD+L FWD+L FWD+L LEFT FORWARD FWD+L FORWARD FWD+L FORWARD FWD+L FWD+L FWD+L FWD+L FWD+L FWD+L FORWARD FWD+L FWD+L FWD+R FORWARD FORWARD FWD+L FWD+L FWD+L FORWARD FWD+L FORWARD FWD+L FORWARD FORWARD FWD+L FORWARD FWD+L FORWARD FWD+R FWD+L FWD+L FWD+L FWD+L FORWARD FWD+L FWD+L FORWARD FWD+L FWD+L FORWARD FWD+L FWD+L …+32스텝

액션 분포

FWD+L
52%
FORWARD
42%
FWD+R
3%
LEFT
2%
RIGHT
1%
⚡ 문제점

D 세션과 동일 지시어 재시도. FORWARD 비율 42%로 증가(D: 32%) — 더 직진적이지만 여전히 목표 미달. 92스텝, grounding 전부 uncached.

🔬 가설

바스켓이 항상 화면 중앙~좌측에 위치 → FWD+L이 정답처럼 출력. bbox cx 추적은 되지만 "충분히 가까워졌다"는 stop 판단이 없어 무한 루프.

다음 액션: F세션은 D보다 FORWARD 비율 높음 → 바스켓 위치가 더 중앙적이었을 가능성
session_20260604_133150

G — 2026-06-04 13:31:50

🟢 최우수 분포
checkpoints/best "[FORWARD] the gray basket on right" avg 429ms 17 steps gt: gray basket single_action

액션 시퀀스 (17 steps)

? FORWARD FWD+L FWD+L FORWARD FORWARD FWD+L FWD+L FORWARD LEFT FORWARD FORWARD FORWARD FORWARD FWD+L FWD+L FWD+L

액션 분포

FORWARD
50%
FWD+L
44%
LEFT
6%
⚡ 문제점

FORWARD 50%, FWD+L 44% — 가장 균형잡힌 분포. 17스텝으로 짧게 종료. F 세션 직후 동일 조건 재시도.

🔬 가설

초기 포즈에서 바스켓이 비교적 정면에 위치 → FORWARD 비율 상승. checkpoints/best의 잠재력 확인. 단 stop 조건 없어 인간이 개입.

다음 액션: 이 조건(바스켓 정면)이 재현 가능하다면 성공률 높을 것
session_20260604_163617

H — 2026-06-04 16:36:17

🚫 모델 폐기
exp49/exp49_mlp.pt "[FORWARD] the gray basket" avg 619ms 14 steps gt: gray basket receding_horizon

액션 시퀀스 (14 steps)

? STOP REG≈0 REG≈0 REG≈0 REG≈0 REG≈0 REG≈0 REG≈0 REG≈0 REG≈0 REG≈0 REG≈0 REG≈0

액션 분포

REGRESSION
92%
STOP
8%
⚡ 문제점

exp49 regression 헤드 전 스텝 출력 ≈ −0.015, −0.007 → 사실상 정지. receding_horizon 전략, 레이턴시 619ms(checkpoints/best 대비 +44%). 분류 헤드 없는 순수 regression은 동작 불가.

🔬 가설

exp49 EMA 누적으로 regression output이 소수점 근처로 수렴. 분류(argmax) 없이 연속값만으로 속도 매핑 시 zero-crossing 문제 발생. discrete classification이 필수임을 실증.

다음 액션: → exp49 폐기, checkpoints/best(discrete 8-class) 계속 사용

모델 발전 경로

2026-05-29
Proxy Server (Kosmos-2 Grounder)
이미지 기반 navigation 첫 실사 테스트. grounding bbox cx → left/right 판단. 세션 A 실패(좌편향), B/C 성공(정면 접근).
2026-06-04 (D, E)
checkpoints/best Stage2v2 — 장시간 세션
D: 102스텝, FWD+L 50% 지배. E: 지시어 단순화 시도. 공통 문제: stop 조건 없어 무한 순환. grounding은 정상 동작.
2026-06-04 (F, G)
checkpoints/best — 조건 재시도 & 개선 확인
G 세션: FORWARD 50%, FWD+L 44% — 가장 균형 잡힌 분포. 바스켓이 정면에 있을 때 모델이 올바르게 FORWARD를 선택함을 실증. 초기 포즈가 핵심 변수임을 확인.
2026-06-04 (H)
exp49 regression — 실패 확인 후 폐기
regression 출력 ≈ −0.015 수렴. 619ms 레이턴시. discrete 8-class classification이 필수임을 실증. exp49 regression 방식 폐기 결정.

핵심 발견 & 모델 발전 결론

May 29 + June 4 세션 전체에서 도출된 실사 결론

Decomposition 모델 실사 접근 가능

Session B·C(May 29) 모두 바스켓에 성공적으로 접근. 시뮬레이션 66.7% success rate 실사 재현. checkpoints/best Stage2v2가 현재 유일한 동작 모델.

⚠️

초기 포즈가 성패의 핵심 변수

Session G(Jun 4): FORWARD 50% — 바스켓 정면 배치 시 균형 잡힌 출력. Session A(May 29): FWD+L 누적 → 이탈. 동일 모델이 초기 각도 ±10°에 따라 완전히 다른 결과.

🚫

exp49 regression 완전 비동작 → 폐기

Session H: regression 출력 ≈ −0.015 수렴. 619ms 레이턴시. discrete 8-class classification이 실사 제어에 필수임을 실증. exp49 폐기 결정.

🔁

Stop 조건 부재 = 무한 순환

Session D(102스텝), F(92스텝) 모두 목표 미달. 바스켓에 가까워져도 멈추지 않고 순환. bbox area threshold stop 조건이 실사에서 필수. 현재 대시보드에 0.18 기준 구현됨.

📡

Grounding 정상 동작 — 레이턴시 허용 범위

checkpoints/best 평균 427ms. grounding 매 스텝 uncached(0/102)임에도 실사 제어에 문제 없음. 0.5s 타이머 + 0.43s API = 0.93s/step. post-move 캡처 도입 후 학습 분포 일치.

💡

지시어 변형보다 포즈 제어가 효과적

"on right" → "the gray basket"으로 지시어 단순화(Session E)했으나 action bias 변화 없음. 텍스트 attention이 낮은 모델 특성상 포즈/거리 표준화가 더 효과적인 개입점.

2026-06-04 세션 — Action 시퀀스 분석

이미지 저장 없이 action log만 기록된 세션. proxy inference server (checkpoints/best) 사용. Exp49 직접 실행 세션(H)에서 EMA 붕괴로 REGRESSION 출력 확인.

2026-06-04 01:34:59 2026-06-04 01:34:59 — 102스텝
Basket on right — FWD+L 50회 좌편향
FWD+L bias
Action Sequence (step 2→102)
FWD+LFWD+LLEFTFWD+LFWDFWD+LFWD+LFWDFWDFWD+LFWD+LFWDFWDFWDLEFTFWDFWD+RFWD+LFWDFWDFWD+LFWD+LFWD+LFWDFWDFWD+LFWDFWD+RFWD+RFWD+LFWDFWD+LFWDFWD+LFWDFWDFWDFWD+RFWD+RFWD+LFWDFWD+LFWD+LFWD+LFWD+LRRFWD+LFWD+LFWD+LFWD+LFWDFWD+LFWD+LFWD+LFWD+LFWDFWD+LFWDFWDFWDLEFTFWDFWD+LFWDFWD+LFWD+LFWDFWD+LFWD+LFWDFWD+LFWD+LFWDLEFTFWD+RFWD+LFWD+LFWD+RFWD+LFWD+LFWDFWDFWD+RFWD+LFWD+LLEFTFWD+LFWD+LFWD+LFWDFWD+RFWD+LFWD+LFWD+LFWD+LLEFTFWD+LFWD+RFWDFWD+RLEFT
Distribution
FWD+L
50 (50%)
FORWARD
32 (32%)
FWD+R
11 (11%)
LEFT
7 (7%)
ROT_R
1 (1%)
2026-06-04 08:59:23 2026-06-04 08:59:23 — 21스텝
FWD+L bias 지속 확인
FWD+L bias
Action Sequence (step 2→21)
FWD+LFWD+LFWD+LFWDRIGHTFWDFWD+LFWD+LFWD+LFWD+LFWD+LFWD+LFWD+LFWDFWD+LFWD+LFWDLEFTFWDFWD
Distribution
FWD+L
12 (60%)
FORWARD
6 (30%)
RIGHT
1 (5%)
LEFT
1 (5%)
2026-06-04 13:30:07 2026-06-04 13:30:07 — 92스텝
FWD+L 47회 — bias 재현
FWD+L bias
Action Sequence (step 2→92)
FWD+LFWDFWD+LFWDFWD+RFWDFWDFWD+LFWD+LFWD+LFWDFWD+LFWD+LFWD+LLEFTFWDFWD+LFWDFWD+LFWDFWD+LFWD+LFWD+LFWD+LFWD+LFWD+LFWDFWD+LFWD+LFWD+RFWDFWDFWD+LFWD+LFWD+LFWDFWD+LFWDFWD+LFWDFWDFWD+LFWDFWD+LFWDFWD+RFWD+LFWD+LFWD+LFWD+LFWDFWD+LFWD+LFWDFWD+LFWD+LFWDFWD+LFWD+LFWDFWD+LFWD+LFWD+LFWDFWDFWDFWD+LFWDFWDFWDFWDRIGHTFWD+LFWDFWD+LFWDFWD+LFWD+LFWDFWDFWD+LFWD+LFWDFWD+LFWD+LFWDFWDFWDFWDLEFTFWD
Distribution
FWD+L
47 (52%)
FORWARD
38 (42%)
FWD+R
3 (3%)
LEFT
2 (2%)
RIGHT
1 (1%)
2026-06-04 13:31:50 2026-06-04 13:31:50 — 17스텝
수동 중단
FORWARD
Action Sequence (step 2→17)
FWDFWD+LFWD+LFWDFWDFWD+LFWD+LFWDLEFTFWDFWDFWDFWDFWD+LFWD+LFWD+L
Distribution
FORWARD
8 (50%)
FWD+L
7 (44%)
LEFT
1 (6%)
2026-06-04 16:36:17 2026-06-04 16:36:17 — 14스텝
Exp49 직접 실행 → REGRESSION 출력 / EMA 붕괴
EMA 붕괴
Action Sequence (step 2→14)
STOPREGREGREGREGREGREGREGREGREGREGREGREG
Distribution
REGRESSION
12 (92%)
STOP
1 (8%)

2026-06-18 세션 — stop_N1 첫 실전 테스트

NEW

모델: stop_N1.pt (L3b N=1, CL 96.6%)  |  STOP 모드: VLA_STOP_MODE=learned  |  서버: stage2_v2_inference_server (포트 8001)

실험 조건
모델 stop_N1.pt — 마지막 1프레임 STOP 주입 (val_acc 0.799)
STOP 모드 learned latch — 모델이 class 0 예측 시 reset 전까지 유지
Instruction "the gray basket"
Grounder PG2 (stage2_v2_inference_server)
장소 실험실 — 바구니 정면 (중앙 배치)
2026-06-18 09:01:19 09:01:19 — 17스텝
바구니 정면 중앙 배치 — STOP 미발동, 좌우 편향 혼재
PG2 grounding 전체 실패 STOP 미발동
Action Sequence (step 2→17)
FWD+R FWD+L FWD+R FWD+R FWD FWD+R FWD FWD FWD FWD FWD FWD FWD FWD FWD FWD
⚠️ PG2 Grounder 전체 실패 (17/17 프레임)
모든 프레임에서 has_bbox=False — Fallback bbox 고정값 사용
cx=0.50, cy=0.60, area=0.060 (방향 정보 없음)
→ 모델이 이미지 피처만으로 액션 결정 (Stage1 16×16 feature)
Action Distribution (16 steps)
FORWARD
11 (69%)
FWD+R
4 (25%)
FWD+L
1 (6%)
STOP
0 (0%)
Latency
평균 406 ms / step
원인 분석
① Grounding 완전 실패
PG2가 "the gray basket" 검출 실패 → has_bbox=False 17/17.
Stage2 MLP 입력의 bbox 채널이 fallback 고정값(area=0.06, cx=0.5)으로 채워짐.
실질적으로 Stage1 이미지 피처만 동작.
② Learned STOP 미발동
stop_N1 모델은 바구니가 가까울 때(area 크기) STOP을 학습함.
그러나 grounding 실패로 area=0.06 고정 → 모델 입장에서 "바구니 멀리 있음" 판단.
→ STOP class 한 번도 예측 안 함.
③ 초기 FWD+R 편향
step2~5에 FWD+R 연속 — grounding 없이 이미지 피처만으로 오른쪽 편향.
이후 FORWARD 수렴은 "방향 정보 없을 때 직진" 패턴으로 해석 가능.
결론 — 핵심 병목
PG2 grounding이 실패하면 learned STOP도 동작 안 함.
다음 테스트 전 PG2가 바구니를 제대로 검출하는지 먼저 확인 필요.
대시보드 bbox area 실시간 표시로 검출 여부 사전 확인 가능.

2026-06-18 PG2 Grounding — S1~S6 전체 세션 분석

grounding

모델: paligemma2-3b-mix-224 (base, 파인튜닝 없음)  |  총 512프레임 (S1=7 + S2=247 + S3=14 + S4=24 + S5=115 + S6=105)  |  카메라 버그 → 4종 필터 → PNG → temporal N=3 순서로 패치 누적

S1 — imgmsg_to_cv2 버그 (14:23:13~19, n=7)
카메라 버그
0%
유효율 (0/7)
7/7
fast 기록 (~361ms)
0.06
area (모두 fallback)
0.5
cx (모두 fallback)
7
연속 NO_BBOX
원인
ROS imgmsg_to_cv2(CompressedImage) 호출 → 빈 이미지 (blank array) → PG2에 검은 프레임 입력 → <eos> 즉시 반환 (latency ~360ms, fast path) → has_bbox=False + area=0.06/cx=0.5 (기본 fallback 값)
수정
compressed_imgmsg_to_cv2() 로 교체 → S3 이후 fast=0건 확인 (완전 해결). area=0.06, cx=0.5 fallback 패턴 = 버그 지문으로 활용 가능.
S2 — 장시간 로봇 테스트, 버그 지속 (14:23:20~14:46:46, n=247)
카메라 버그
1.2%
유효율 (3/247)
slow path만 유효
244
fast 기록 (~361ms)
98.8% 빈 이미지
195
최장 연속 NO_BBOX
0.360
OK area 평균
(3건만 유효)
2
near-goal 프레임
비연속 → 발동 0
3건 slow(유효) 상세
n=196: area=0.073 cx=0.511 lat=1298ms
n=209: area=0.505 cx=0.500 lat=1235ms  ★near-goal
n=216: area=0.501 cx=0.498 lat=1242ms  ★near-goal
→ n=209~216 사이 6프레임 fast(NO_BBOX) 분리 → temporal 불발 (정상)
NO_BBOX 연속 구간
195연속 / 31연속 / 12연속 / 6연속
총 23분 세션 — 로봇이 바스켓을 대부분 찾지 못함
(카메라 버그 + 탐색 실패 복합)
S3 — 카메라 버그 수정 직후 첫 테스트 (15:16:02~41, n=14)
카메라 수정 직후
64.3%
필터 후 유효 (9/14)
has_bbox=14/14
0
fast 기록
카메라 버그 해결!
5
TINY (area<0.01)
4-filter 未적용
3
near-goal
n=5,11,13 비연속
4
중복 프레임
n=1~4 완전 동일
14프레임 상세 (후처리 분류)
n=1~4: OK area=0.050 cx=0.514 (4프레임 완전 동일 — 버퍼 중복)
n=5: OK area=0.454 cx=0.500 ★near-goal
n=6: OK area=0.068 cx=0.683
n=7~10: TINY area=0.001~0.002 (4-filter 없음 → 통과)
n=11: OK area=0.505 cx=0.500 ★near-goal
n=12: OK area=0.064 cx=0.544
n=13: OK area=0.482 cx=0.498 ★near-goal
n=14: TINY area=0.001
발견 & 미적용
near-goal 3건: n=5 / n=11 / n=12(사이 gap있음) / n=13
n=11→n=12→n=13: n=12가 area=0.064(미달) → 3연속 불성립
이 세션 시점엔 4종 필터 未적용 → TINY 5건이 has_bbox=True로 통과
latency 전부 1270~1335ms (정상 PG2 추론)
S4 — 4종 필터 前 구버전 서버 (15:26:30~15:27:39, n=24)
29.2%
유효율 (7/24)
XFULL 제외 시
6
XFULL (cx≈0.5)
n=1,3,4,16,21,22
6
FULL (area≥0.987)
n=10~14,23
5
TINY (area≤0.001)
n=2,5,6,7,8
7
near-goal
area 0.26~0.55
24건 전부 has_bbox=True (min_new_tokens=1 적용, <eos> 없음) — 하지만 4종 필터 未적용 → TINY 5건(area<0.001), FULL 6건(area≥0.987), XFULL 6건(x방향 전체폭) 포함. OK 7건: n=9(area=0.258) / n=15(0.056) / n=17(0.074) / n=18(0.105) / n=19(0.078) / n=20(0.078) / n=24(0.234). max_ok_consec=8 (n=15~22, 하지만 내부에 FULL/XFULL 포함). 필름스트립 아래 참조.
24/24
검출률 100%
min_new_tokens=1 적용 후
5/24
Micro-bbox (area < 0.01)
바스켓 일부만 포착
6/24
Giant bbox (area > 0.95)
전체 화면을 바스켓으로
1/24
False Positive
바스켓 없는데 검출
BUG 1 Micro-bbox — 바스켓 일부(≈3%)만 포착, area≈0.001
Record #2 — area=0.0011, cx=0.498
Record #6 — area=0.0014, cx=0.471
원인: base PG2가 바스켓 전체가 아닌 특정 feature(손잡이, 격자 패턴)에만 반응
raw 예시: <loc0528><loc0496><loc0568><loc0524> → 4%×3% 크기
영향: cx는 우연히 중앙값이나 area 기반 stop 판단 불가. area < 0.01 프레임은 필터링 필요
BUG 2 Giant bbox — 전체 화면을 바스켓으로 인식, area≈0.987
Record #10 — area=0.987, cx=0.499 (바스켓 근접 시)
Record #19 — area=0.078, cx=0.490 (정상 케이스)
원인: 바스켓이 근접(~0.5m)했을 때 PG2가 전체 이미지를 bbox로 출력. 파인튜닝 없이 min_new_tokens=1로 강제 생성 시 발생
raw 예시: <loc0000><loc0000><loc1022><loc1022>
영향: area 기반 stop threshold (≥0.4)가 항상 발동. area > 0.95 프레임도 필터링 또는 클램핑 필요
BUG 3 ⚠️ 심각 False Positive — 바스켓 없는 장면에서 검출 (cx=0.33)
Record #17 — 바스켓 없음, has_bbox=True, area=0.074, cx=0.33
상황: 카메라가 책상/의자 방향을 바라보고 있었음. 바스켓은 화면에 없음.
원인: min_new_tokens=1로 강제 생성 → PG2가 항상 무언가를 검출. base 모델은 "없음" 판단 불가.
영향: has_bbox 필드는 더 이상 신뢰 불가. goal_near 판단을 area 단일값으로 하면 오작동 위험.
→ 탐지 신뢰도 지표가 필요함 (confidence score, 복수 프레임 합산 등)
Area 분포 — 24프레임
Micro (area < 0.01)
5 / 24
Records: #2, 5, 6, 7, 8
cx 평균: 0.490 (우연히 정확)
유효 (0.01 ≤ area ≤ 0.95)
13 / 24
Records: #9, 15, 17~20, 24 등
cx 평균: 0.488 (대체로 정확)
Giant (area > 0.95)
6 / 24
Records: #10~14, 23
cx 평균: 0.499 (전체화면이라 항상 0.5)
S5 — 4종 필터 적용 신버전 서버 (16:35:35~16:54:35, n=115)
33.9%
유효율 (39/115)
↑ S4 29.2% +4.7%p
0
노이즈 bbox
FULL/TINY/XFULL 전멸
76
NO_BBOX
max_consec=24
0.076
OK area 평균
range: 0.013~0.297
2
near-goal
n=44(0.262) n=45(0.297)
area 분포 (39건 OK)
0.01~0.05: 13건 / 0.05~0.10: 19건 ★최다 / 0.10~0.20: 5건
0.20~0.30: 2건 (n=44, n=45) / 0.30+: 0건
→ area 상한 0.297 → stop 판단 아슬아슬
OK 연속 구간: [15, 6, 4, 4, 2, 1]
near-goal & temporal
n=44(area=0.262) → n=45(area=0.297): 2연속
n=45 다음: NO_BBOX → temporal 3연속 불성립 → goal_near 발동 0회
cx 이상치: n=43 cx=0.128 (좌측 끝 오탐 가능성)
잔존: temporal N=3 미적용 (다음 세션 S6에서 적용)
4종 필터 패치 + min_new_tokens=1 적용 후 — 신버전 서버 (16:22~, n=115)
115
총 프레임
39
유효 bbox (33.9%)
구버전 29.2% → +4.7%p
0
노이즈 bbox
tiny/giant/xfull 전멸
25
바스켓없음 fast
raw=' ; <eos>' ~660ms
개선사항
  • tiny/giant/xfull bbox → fallback 처리 (has_bbox=False)
  • 유효율 29.2% → 33.9%
  • 유효 39건 area: 0.013~0.297, cx: 0.128~0.712
  • area 평균 0.076 (1~3m 거리 정상 범위)
  • false positive 0건 (구버전 1건 → 0건)
잔존 이슈
  • 필터차단 51건: 주로 xfull(cx≈0.5 area>0.4)
  • cx=0.128 이상치 — 좌측 끝 오탐 가능성
  • 바스켓 근접 시 area 상한 0.297 — stop 판단 아슬아슬
  • false positive 기하필터 불가 → temporal 필터 미구현
S6 — 4종 필터 + PNG + temporal N=3 전부 적용 (17:26~17:31, n=105)
최신
51.4%
유효율 (54/105)
↑ 33.9% → +17.5%p
0
fast 기록
카메라 버그 완전 해결
0
노이즈 bbox
tiny/full/xfull 전멸
0.687
area 최대 (근접)
avg 0.093 · cx 0.522
1264ms
평균 latency
전부 정상 PG2 추론
OK BBOX AREA 분포 (54건)
0.01~0.05
21건
0.05~0.10
24건 ★ 최다
0.10~0.20
3건
0.20~0.30
1건
0.30~0.50
4건 (근접 구간)
0.50+
1건 (area 0.687 최대근접)
연속 OK 구간
n=2~25  24프레임 연속 — area 0.034~0.687
n=32~44  13프레임 연속 — area 0.047~0.320
n=48~52  5프레임 연속
n=98~105  8프레임 연속
temporal N=3 분석
near-goal(area≥0.25) 프레임: 6건
· n=23(0.276) → n=24(0.687) — 2연속, 3번째 없음
· n=33(0.320) → n=36→37(0.314→0.320) — 비연속
goal_near 발동 0회 (correct — 로봇이 충분히 접근 안 함)
연속 NO_BBOX 최대: 41프레임 (바스켓 시야 이탈)
gnd_20260618_172556.jsonl · 105레코드 · 17:26:21~17:31:32 · fast 기록 0건 (camera decode 버그 완전 해결 확인) · temporal filter 로그 [near N/3] 실서버 확인됨 · NO_BBOX 51건은 바스켓 시야 이탈 (false negative) — filter 과차단 아님
세션별 유효율 진행 (패치 누적)
S1/S2
0.4% imgmsg_to_cv2 버그 → 빈 이미지
S3
42.9% 카메라 버그 수정 직후 첫 세션
S4
29.2% full/xfull/tiny 포함 — 4종 필터 前
S5
33.9% 4종 필터 적용 후 (+4.7%p)
S6 ★
51.4% PNG + temporal N=3 (+17.5%p)
패치 완료 상태 (2026-06-18 기준)
항목 상태 세션 확인
compressed_imgmsg_to_cv2 버그 수정 ✅ 완료 S3 이후 fast=0
area>0.9 full-frame 필터 ✅ 완료 S6 FULL=0
area<0.01 tiny noise 필터 ✅ 완료 S6 TINY=0
x1<0.02 & x2>0.98 xfull 필터 ✅ 완료 S6 XFULL=0
cy<0.35 상단오탐 필터 ✅ 완료 S6 TOP=0
PNG 인코딩 (JPEG 이중압축 제거) ✅ 완료 S5 이후 적용
temporal N=3 goal_near 필터 ✅ 완료 GOAL_CONSEC_FRAMES=3, strict
실로봇 closed-loop 재테스트 🔲 대기 전체 패치 완료 → 다음 단계
결론 (2026-06-18 최종)
완료된 것
  • 카메라 decode 버그 수정 → fast=0 ✅
  • PG2 bbox 필터 4종 → 노이즈 bbox 완전 차단 ✅
  • PNG 인코딩 → 학습/추론 이미지 조건 일치 ✅
  • temporal N=3 → goal_near false positive 차단 ✅
  • 유효율 0.4% → 51.4%
  • async 10Hz 연속 이동 (bang-bang 제거) ✅
다음 단계
  • 실로봇 closed-loop 재테스트 — 전체 패치 통합 후 첫 네비게이션
  • goal_near 발동 확인 — area≥0.25 연속 3프레임
  • NO_BBOX 41연속 원인 파악 — 로봇 방향 vs 바스켓 위치
  • PG2 파인튜닝 (Exp65/66 bbox 데이터) — 중거리 탐지 개선

S4 유효 bbox 실제 분석 — "13/24 정상"은 과장

area 0.01~0.95 필터를 통과한 13건을 x1/x2/y1/y2 좌표 기준으로 재분류. 통과한 레코드 중 절반 가까이가 x 방향 full-width collapse — 실질 신뢰 bbox는 7건.

S4 유효 판정 13건 좌표 상세 (area 0.01–0.95)
n area cx cy x1 x2 y1 y2 판정
1 0.4815 0.498 0.758 0.000 0.995 0.516 1.000 🔴 X-FULL-WIDTH
3,4 0.4514 0.498 0.773 0.000 0.995 0.546 1.000 🔴 X-FULL-WIDTH
16 0.5506 0.498 0.723 0.000 0.995 0.447 1.000 🔴 X-FULL-WIDTH
21,22 0.5054 0.500 0.747 0.000 1.000 0.495 1.000 🔴 X-FULL-WIDTH
9 0.2581 0.603 0.411 0.326 0.879 0.178 0.645 ✅ 신뢰
15 0.0564 0.505 0.603 0.334 0.675 0.520 0.685 ✅ 신뢰
17 0.0741 0.331 0.884 0.171 0.491 0.768 1.000 ⚠️ y2=1 (하단 컷)
18 0.1051 0.518 0.592 0.249 0.787 0.495 0.690 ✅ 신뢰
19,20 0.0779 0.490 0.577 0.253 0.727 0.495 0.659 ✅ 신뢰
24 0.2335 0.552 0.416 0.326 0.777 0.157 0.675 ✅ 신뢰
7
실제 신뢰 bbox
6
X-full-width collapse
(x1=0, x2≈1.0)
5
Tiny (area<0.01)
(노이즈 탐지)
6
Full-frame (area>0.9)
(서버 필터 추가됨)
X-FULL-WIDTH Collapse 원인
x1=0.000, x2=0.995~1.000 패턴 — PG2가 수평 위치를 특정하지 못하고 "x 방향 전체를 bbox로 잡는" 절반 붕괴 상태. x=<loc0000>, x=<loc1023>는 PaliGemma2가 1024-grid 중 경계값을 출력한 것으로, 학습 데이터에서 바구니가 카메라 가까이 있는 상황에서 종종 발생 (area>0.9와 동일한 원인).

cx는 항상 0.498~0.500으로 수렴 — x1=0, x2=1.0이면 cx=(0+1)/2=0.5가 되므로 cx 값이 0.5라는 것 자체가 X-full-width 신호다. 학습 annotation의 경우 이 레코드는 area<0.9 필터를 통과하므로 MLP 학습에 오염됨.
왜 학습 서버와 추론 서버 결과가 다른가 — 항목별 비교
항목 학습 annotation
gen_base_pg2_annotation.py
추론 서버 grounding탭
stage2_v2_inference_server /ground
실제 로봇 추론
dashboard → /predict
이미지 소스 H5 저장 프레임
(수집 시 환경)
ROS 카메라 실시간
(현재 실험실)
ROS 카메라 실시간
(현재 실험실)
이미지 디코더 h5py → numpy (lossless) compressed_imgmsg_to_cv2
S1/S2는 버그(imgmsg_to_cv2)
compressed_imgmsg_to_cv2
api_client_node 기준 올바름
JPEG 압축 횟수 0회
H5 → numpy uint8 lossless (JPEG 없음)
0회
카메라 raw(bgr8) + 대시보드 PNG 인코딩 ✓
0회
PNG 수정 완료 (2026-06-18)
구: JPEG → train/infer 불일치
PG2 모델 base PG2 bfloat16
HF cache 동일 snapshot
base PG2 bfloat16
HF cache 동일 snapshot
base PG2 bfloat16
동일
area>0.9 필터 ✓ 있음 ✓ 추가됨
(2026-06-18 이번 커밋)
✗ 없음
(predict 내부 별도 경로)
area<0.01 필터
(tiny noise)
✓ 있음 ✓ 추가됨
(2026-06-18 4종 패치)
✗ 없음
cy<0.35 필터
(상단 오탐)
✓ 있음 ✓ 추가됨
(2026-06-18 4종 패치)
✗ 없음
x-full-width 필터
(x1≈0 & x2≈1)
✗ 없음
(area<0.9 이면 통과)
✓ 추가됨
→ 6건 필터됨 (n=1,3,4,16,21,22)
✗ 없음
이미지 환경 수집 시 특정 조명·거리 현재 실험실
(조명·거리 다를 수 있음)
현재 실험실
(동일 문제)
실제 동작 여부 bbox_dataset.json 생성 완료 S4: 4종 필터 적용
신뢰 입력 7/24 (29%) — false pos 1건 잔존
09:01 세션: 0% 탐지
(camera decode 버그)
4종 필터 패치 — 2026-06-18 inference-integration 머지 완료 ✅
# stage2_v2_inference_server.py PG2Grounder.run() 내부
if area > 0.9: → ✅ 적용됨 (full-frame collapse)
if area < 0.01: → ✅ 적용됨 (tiny noise)
if cy < 0.35: → ✅ 적용됨 (상단 오탐)
if x1 < 0.02 and x2 > 0.98: → ✅ 적용됨 (x-full-width)
4개 필터 적용 후 S4 기준: 24 레코드 중 신뢰 7건만 통과, 나머지 17건은 fallback(area=0.06, cx=0.5). 미해결: false positive 1건(#17 책상)은 기하 필터로 불가 — temporal N-frame 필터 필요.

S4 전체 24프레임 — Bbox 시각화 Filmstrip

← → 스크롤
OK — 신뢰 bbox XFULL — x방향 전체폭 collapse FULL — area > 0.9 (full-frame) TINY — area < 0.01 (noise)
#1 XFULL  a=0.482
cx=0.498 cy=0.758  |  x0→1.0
#2 TINY  a=0.001
cx=0.499 cy=0.536  |  noise
#3 XFULL  a=0.451
cx=0.498 cy=0.773  |  x0→1.0
#4 XFULL  a=0.451
cx=0.498 cy=0.773  |  x0→1.0
#5 TINY  a=0.001
cx=0.471 cy=0.519  |  noise
#6 TINY  a=0.001
cx=0.471 cy=0.519  |  noise
#7 TINY  a=0.001
cx=0.499 cy=0.519  |  noise
#8 TINY  a=0.001
cx=0.502 cy=0.519  |  noise
#9 OK  a=0.258
cx=0.603 cy=0.412  |  ✅ 신뢰
#10 FULL  a=0.987
cx=0.500 cy=0.494  |  서버 필터됨 ✓
#11 FULL  a=0.998
cx=0.500 cy=0.500  |  서버 필터됨 ✓
#12 FULL  a=0.998
cx=0.500 cy=0.500  |  서버 필터됨 ✓
#13 FULL  a=0.986
cx=0.500 cy=0.494  |  서버 필터됨 ✓
#14 FULL  a=0.986
cx=0.500 cy=0.494  |  서버 필터됨 ✓
#15 OK  a=0.056
cx=0.505 cy=0.603  |  ✅ 신뢰
#16 XFULL  a=0.551
cx=0.498 cy=0.723  |  x0→1.0
#17 OK⚠  a=0.074
cx=0.331 cy=0.884  |  y2=1.0 (하단 컷)
#18 OK  a=0.105
cx=0.518 cy=0.592  |  ✅ 신뢰
#19 OK  a=0.078
cx=0.490 cy=0.577  |  ✅ 신뢰
#20 OK  a=0.078
cx=0.490 cy=0.577  |  ✅ 신뢰
#21 XFULL  a=0.505
cx=0.500 cy=0.747  |  x0→1.0
#22 XFULL  a=0.505
cx=0.500 cy=0.747  |  x0→1.0
#23 FULL  a=0.986
cx=0.500 cy=0.494  |  서버 필터됨 ✓
#24 OK  a=0.234
cx=0.552 cy=0.416  |  ✅ 신뢰

학습 vs 추론 파이프라인 — 플로우 비교

학습 Annotation 파이프라인
gen_base_pg2_annotation.py
STEP 1 — 이미지 소스
H5 파일 → h5py numpy direct
lossless, 수집 시 환경 그대로
STEP 2 — PG2 입력
BGR→RGB 변환 후 PaliGemma2 detect gray basket
lossless — H5 numpy uint8 직접 (JPEG 없음)
STEP 3 — <loc####> 파싱
y1,x1,y2,x2 → 좌표 정규화
STEP 4 — 필터 3종 ✅
PASS cy < 0.35 → REJECT (상단 오탐)
PASS area < 0.01 → REJECT (tiny noise)
PASS area > 0.90 → REJECT (full-frame)
STEP 5 — X-FULL WIDTH
MISS x1<0.02 & x2>0.98 → ? (미적용)
area 0.45~0.55로 위 필터 통과 → 학습 데이터 오염
bbox_dataset.json
794 frames / 45 episodes
⚠ X-FULL WIDTH 포함 가능성
실시간 추론 파이프라인
stage2_v2_inference_server.py /ground + /predict
STEP 1 — 이미지 소스
ROS 카메라 → sensor_msgs/Image (bgr8)
raw 전송 (CompressedImage 아님) — 현재 실험실 조명·거리
STEP 2 — 디코딩
compressed_imgmsg_to_cv2 → BGR→RGB
✓ 수정 완료 (S1/S2는 imgmsg_to_cv2 → blank image)
PNG 인코딩 — JPEG 이중압축 제거 ✓ (2026-06-18)
STEP 3 — PG2 입력
PaliGemma2 detect gray basket
~1285ms (정상) / ~365ms (blank → <eos>)
STEP 4 — 필터 현황 (4종 모두 적용 ✅)
PASS cy < 0.35 → REJECT 추가됨 ✓
PASS area < 0.01 → REJECT 추가됨 ✓
PASS area > 0.90 → REJECT 추가됨 ✓
STEP 5 — X-FULL WIDTH
PASS x1<0.02 & x2>0.98 → REJECT 추가됨 ✓
S4 6건(n=1,3,4,16,21,22) fallback 처리 완료
MLP Stage2 입력
cx, cy, area, has_bbox → goal_near 판단
4종 필터 적용 후 신뢰 입력: 7/24 (29%)
미해결: false pos #17 (temporal 필터 필요)
필터 패치 적용 완료 (stage2_v2_inference_server.py) — 2026-06-18 inference-integration 머지 ✅
# PG2Grounder.run() 내부 — locs 파싱 후
y1, x1, y2, x2 = locs[:4]
x1, x2 = min(x1, x2), max(x1, x2)
y1, y2 = min(y1, y2), max(y1, y2)
area = (x2 - x1) * (y2 - y1)
cx, cy = (x1 + x2) / 2, (y1 + y2) / 2

✓ 적용됨
if area > 0.9:
    return fallback  # full-frame collapse
✓ 적용됨
if area < 0.01:
    return fallback  # tiny noise
✓ 적용됨
if cy < 0.35:
    return fallback  # 상단 오탐 (바구니가 상단에 있을 수 없음)
✓ 적용됨
if x1 < 0.02 and x2 > 0.98:
    return fallback  # x-full-width collapse