Files
GhiVideo_v4/docs/history/2026-07-09_1558_제주-드론궤적-어댑터.md
T
b23042andClaude Fable 5 84f4921826 제주 드론 도로영상 지원: DJI 로그 어댑터·분할영상 연속재생·카메라 자동감지·오버레이 개선
- 제주 DJI 시간기반 비행로그(CSV) 파싱 어댑터: 세그먼트 창 정렬, 가상 fps 환산
- 분할 영상(이름 오름차순) 연속재생 + 좌상단 영상목록 콤보(선택 재생), 세그먼트별 드론 로그 재정렬
- KML 다중 파일 병합 파싱: STA 체이니지 측점(71개) + 지장물 신포맷(타입/이름/텍스트박스_색상)
- 시설물 라벨: 지정색 배경 박스 + 흰 글자, 팝업 중앙 정렬, 호버 구간 깜빡임 수정
- 카메라 자동감지(djmd: ZenmuseP1, focal 29.9mm) + <영상명>.camera.json PC 저장/폴더 자동 적용
- Yaw 자동추정(GPS 진행방위 기반) + 라벨 드래그 Yaw 역산 모드
- 스테이션바: GPS 이동거리 진행도(호버 시 정지), 노선밖 거리 표기, 원거리 구조물 마크 제외
- 서버: /api/camera 라우트, ecosystem 포트 54000·제주 데이터 경로
- docs/history: 작업 이력 21건

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-09 20:58:49 +09:00

50 lines
3.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 2026-07-09 제주 DJI 비행로그 드론궤적 어댑터
**소요 시간**: 30분
**Context 사용량**: input 175k / output 12k tokens
## 문제
제주 데이터 폴더 선택 시 드론 궤적 오버레이가 표시되지 않음.
## 원인
클라이언트 지리정보 파이프라인(폴더 선택 → `geoData.ts` 파싱 → geoStore → StationOverlay 투영)이 회덕 v2.0 프레임 기반 CSV(`frame_cnt,latitude,…,yaw,pitch,roll,focal_len`) 전용이었음. 제주 CSV는 DJI 비행로그 시간 기반(`time(millisecond),latitude,…,compass_heading,gimbal_heading,…`)이라:
1. 위치 폴백 인덱스로 컬럼이 밀림 — frame←ms값(89500~), altitude←X(E) 평면좌표, yaw←Y(N), focalLen←pitch 등 전부 오염
2. `effectiveFps`(=마지막 frame ÷ 영상길이) 자기보정이 깨져 시간↔프레임 변환 실패
3. 분할 영상 4개(_0002~_0005) 중 첫 영상 길이(197.1s)에 로그 전체(672.6s)가 압축 매핑됨
4. 경로표고 슬라이더 상한(중심선 z 기반, 폴백 60m)이 제주 지형(드론 148m ASL)에 못 미침
## 수정 내용
### client/src/utils/geoData.ts
- `parseDroneFrames`: `time(millisecond)` 헤더 감지 시 DJI 시간 기반 브랜치로 분기
- 컬럼: lat/lon/`altitude_above_seaLevel(meter)`, 자세는 gimbal_* 우선(기체 compass/pitch/roll 폴백), focalLen=24mm 기본
- `frame = ((timet0)/1000 offsetSec) × 59.94(가상fps)` — effectiveFps 자기보정과 정합
- `SegmentWindow`(offsetSec/durationSec)로 재생 영상 구간 밖 행 클리핑
- `findVideoFiles`: 영상 이름순 정렬(DJI 분할본 _0002 먼저 확정)
- `probeVideoDuration`: objectURL + `preload=metadata`로 영상 길이만 측정
- `loadFolderGeoData`: 첫 영상 길이 측정 → 세그먼트 창 전달, 분할본 감지 시 콘솔 경고
- `parseRouteMeta`: 임의 접두 `*.route.json` 인식 (제주 route.json 파일명 대응)
- `parseKmz`: 체이니지 표점(`0+100` 형식) Point는 POI 제외 (z=0이라 투영 깨짐 방지)
- `kmzMissing`: KML/KMZ 파일 자체가 없을 때만 alert (파일은 있으나 POI 0건은 콘솔 경고만)
### client/src/components/overlay/StationOverlay.tsx
- `pathZMax`: 중심선 z에 더해 드론 고도(ASL) 최대값도 상한 근거에 포함 → 제주에서 슬라이더 159m까지
## 검증
- `npm run build -w client` (tsc + vite) 통과, 54000 포트가 새 번들(index-Cp4zEgX_.js) 서빙 확인
- 실제 CSV로 파싱 수학 시뮬레이션: 6649행 → 세그먼트 내 1947행, frame 0~11814, effectiveFps 59.9248→59.94 스냅, 영상 t=100s ↔ 로그 t=100.00s 왕복 정합, 자세값 정상(yaw 65.1°, pitch 15°, alt 147.9m)
## 남은 제약 / 다음 단계 참고
- **분할 영상 2~4번째(_0003~_0005) 미지원** — 세그먼트 선택 UI + offsetSec(누적 길이) 연결 필요. 로그 폭(672.6s) ≈ 영상 총길이(671.7s) 검증됨, 오프셋: 0 / 197.147 / 394.211 / 591.475s
- 드론 고도 거의 일정(147.8~148.6m ASL) — 도로 표고는 그 아래. 경로표고 슬라이더로 90~140m 부근 튜닝 필요
- KML LineString(도로 중심선)은 고도가 전부 0이라 중심선(선형 오버레이) 소스로 미사용
- 측점/POI 데이터가 제주 데이터셋에 없음 — KML 체이니지 표점(0+000~) 활용하려면 표고 부여 필요
- route.json의 durationSec(568)이 실제 영상 총길이(671.7s)와 불일치 — 사용자 확인 필요