데이터 파이프라인 — 전 구간 프레임·djmd dt 전파·세그먼트 시크·선형 곡선 평활

- geoData: fullFrames(전체 비행 프레임 — 전 구간 측점 검색용, datum·초점 보정 동일
  적용), DJI_VIRTUAL_FPS export, 선형 곡선 평활(Centripetal Catmull-Rom — 정점
  ~6m 세분, 원 정점 전부 통과로 측점 정합 유지, 60m+ 직선·양끝 제외)
- djmdTrack: refineFramesWithDjmd 가 교차상관 dt(초)도 반환
- geoStore: fullFrames·djmdDtSec 상태 — 검색의 CSV↔영상 시간 변환에 사용
- useVideoPlayer.loadLocalFile(startAtSec): 로드 후 지정 시각부터 시작
- VideoPlayer.handleSeekSegment: 측점 검색의 타 세그먼트 점프(전환+시크,
  재생 상태 유지), station_lookahead 등 RouteInfo 타입 문서화

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-15 16:27:03 +09:00
co-authored by Claude Fable 5
parent 76a2ab4984
commit 87b66d9ed4
6 changed files with 102 additions and 10 deletions
+5 -2
View File
@@ -234,7 +234,7 @@ export async function refineFramesWithDjmd(
videoFile: File,
frames: DroneFrame[],
useEllipsoidal: boolean,
): Promise<DroneFrame[] | null> {
): Promise<{ frames: DroneFrame[]; dtSec: number } | null> {
if (!frames.length) return null;
const samples = await parseDjmdPositions(videoFile);
if (!samples) return null;
@@ -306,7 +306,7 @@ export async function refineFramesWithDjmd(
console.log(`[djmd] CSV↔영상 시간 오프셋 ${bestDt.toFixed(2)}s 추정 (잔차 ${bestC.toFixed(1)}m) — 자세 재정렬 적용`);
}
return frames.map((f) => {
const refined = frames.map((f) => {
const p = at(f.frame); // 위치/고도: djmd (프레임 동기)
const a = csvAt(f.frame / FPS + bestDt); // 자세: CSV 를 추정 오프셋으로 재시각화
return {
@@ -315,4 +315,7 @@ export async function refineFramesWithDjmd(
yaw: a.yaw, pitch: a.pitch, roll: a.roll,
};
});
// dtSec: CSV↔영상 시간 오프셋 — 영상시간 = CSV시간 − dtSec.
// 측점 검색(CSV 축 인덱스)이 영상 시각으로 변환할 때 사용(0.33s ≈ 2m 오차 제거).
return { frames: refined, dtSec: bestDt };
}