Files
GhiVideo_v4/docs/history/2026-06-24_1002_회전종료후-선튐-에지보존평활.md
T
b23042andClaude Fable 5 d38b842e8d GhiVideo 소스 복제 — v4 작업 시작 기준
기존 GhiVideo 저장소 HEAD의 트래킹 소스 362개 파일을 복제.
(node_modules·storage·빌드 산출물·대용량 미디어는 .gitignore 규칙대로 제외)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-09 14:32:51 +09:00

40 lines
2.2 KiB
Markdown

# 회전 종료 후 중심선·궤적선이 한 번 튀는 현상 — 에지보존 평활로 교체
**날짜**: 2026-06-24
**수정 파일**: `client/src/components/overlay/StationOverlay.tsx`
**선행**: [2026-06-24_0957_회전시-선오버레이-지연어긋남-적응형평활.md](2026-06-24_0957_회전시-선오버레이-지연어긋남-적응형평활.md)
## 증상
드론 회전이 끝난 직후 스테이션선·드론궤적선이 **한 번 튐**.
## 원인
직전 작업에서 넣은 **변화율 기반 적응형 창**(`effHalf = halfWin/(1+8·rate)`)의 부작용.
회전이 끝나 yaw 변화율이 급감하면 `effHalf`가 **한꺼번에 5~7 → 60프레임으로 재확장**됨.
그 순간 trailing window에 회전 프레임들이 다시 포함되어 평균 yaw가 급변 → 1회 튐.
## 조치 — 에지(회전 경계) 보존 적응형 창
변화율로 창 크기를 정하지 않고, **중심 yaw 와 차이가 임계 이내인 인접 프레임까지만** 확장:
```ts
const YAW_EDGE = 8; // deg
const near = idx => |최단각(frames[idx].yaw - frames[i].yaw)| <= YAW_EDGE;
let lo = i, hi = i;
while (lo > i-halfWin && near(lo-1)) lo--; // 회전 프레임 만나면 정지
while (hi < i+halfWin && near(hi+1)) hi++;
```
- 회전 구간이 직선 평균에 **섞이지 않음**(시간축 양방향 에지보존 = bilateral).
- 회전 중: 창이 자연히 좁아 실제 자세 즉시 추종(지연 없음).
- 회전 종료 후: 회전 프레임을 배제한 채 창이 **한 프레임씩** 부드럽게 재확장 → 튐 없음.
- 직선: yaw 거의 일정 → 풀창(±halfWin)으로 노이즈 억제(기존 효과 유지).
## 튜닝
- `YAW_EDGE`(8°): 작게 → 회전 추종↑·직선 노이즈억제↓, 크게 → 반대. GPS yaw 지터(보통 <8°)는
창 확장을 막지 않도록 8°로 설정.
- 단일 프레임 yaw 스파이크가 8° 초과하면 그 지점에서 창이 끊길 수 있으나, 창 경계가
중심 이동에 따라 1프레임씩만 변하므로 **튐은 발생하지 않음**(완만).
## 검증
- `npm run build -w client` (node20) tsc + vite build 통과.
**소요 시간**: 약 10분
**Context 사용량**: input ~200k / output ~4k tokens