Files
GhiVideo_v4/docs/history/2026-07-09_1558_제주-드론궤적-어댑터.md
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

3.4 KiB
Raw Permalink Blame History

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)

남은 제약 / 다음 단계 참고

  • 분할 영상 24번째(_0003_0005) 미지원 — 세그먼트 선택 UI + offsetSec(누적 길이) 연결 필요. 로그 폭(672.6s) ≈ 영상 총길이(671.7s) 검증됨, 오프셋: 0 / 197.147 / 394.211 / 591.475s
  • 드론 고도 거의 일정(147.8148.6m ASL) — 도로 표고는 그 아래. 경로표고 슬라이더로 90140m 부근 튜닝 필요
  • KML LineString(도로 중심선)은 고도가 전부 0이라 중심선(선형 오버레이) 소스로 미사용
  • 측점/POI 데이터가 제주 데이터셋에 없음 — KML 체이니지 표점(0+000~) 활용하려면 표고 부여 필요
  • route.json의 durationSec(568)이 실제 영상 총길이(671.7s)와 불일치 — 사용자 확인 필요