djmd 프레임 동기·오버레이 지면고정·선형-측점 정합·UI 단축키
- djmd(영상 내장 텔레메트리) 프레임 동기 위치/고도: MP4 stbl 선별 파싱(djmdTrack.ts), CSV 시각정렬 오차(평균 3.2m) 제거 — 세그먼트별 백그라운드 정밀화(frameSynced 플래그) - 자세 시간축 재정렬: djmd 위치 교차상관으로 CSV↔영상 오프셋 자동 추정(실측 -0.33s, 잔차 0.24m) 후 yaw/pitch/roll 재샘플(yaw 최단각) — 옆 지물 미끄러짐 해소 - 포즈 평활 자동 제한: 프레임 동기 데이터는 ±5프레임 상한(기존 ±60=±1s) — 회전 시 오버레이 전체가 드론에 딸려오는 지연 제거 - 선형-측점 정합: 측점 위치를 선형 정점으로 삽입(3D 이격≤0.012m) + 정점 z 를 측점 체이니지 보간으로 재정렬, 측점 라벨 화면 EMA 제거(선과 동일한 즉시 투영) — 선형이 측점 POI 를 픽셀 단위로 통과 - 드론높이 모드 높이 규칙 통일: 선형도 '드론고도-이격거리' 평면 적용(라벨과 동일) - 카메라 offZ 잔재 교정: 표고 체계 정비 이전 드래그 보정값(-18.3m)이 이중 보정이 되어 원거리 POI 가 접근할수록 밀리던 원인 — 경로 1-1 camera.json 0 으로 교정(.bak 백업) - 로드 UX: 폴더 로드 시 정지 상태로 대기(처음부터), 데이터 교체 시 UI 초기 상태 복원 - 라벨: 측점 팝업 표고(타원체고) 행 추가, 구조물-POI 이중 라벨 제거(어음천교), 시간동기 보정 슬라이더(timeOffsetSec) - 측점 표기 0+000 형식 전환(생성 6곳·파서 4곳 신구 호환) + 스테이션바 양끝 100m 내 시설물 없으면 시작/끝 스테이션 마크 - 단축키: F2 개발자 모드(dev_mode 1↔0, 세션 한정), A 선형 표시 토글 - 인프라: 54000 포트 재부팅 자동화(portproxy 직접 IP + 로그온 갱신, pm2 resurrect) - docs/history: 작업 이력 23건 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,17 @@
|
||||
# 2026-07-13 개발분 전체 커밋 (2차)
|
||||
|
||||
**소요 시간**: 2분
|
||||
**Context 사용량**: input 2930k / output 1k tokens
|
||||
|
||||
## 작업 내용
|
||||
|
||||
7/9 커밋(84f4921) 이후 개발분 전체를 main 에 커밋:
|
||||
|
||||
- **7d51ba9** "표고 체계 정비·설정 파일 단순화·선형 클리핑·시연 준비" (53파일 +1708/−104)
|
||||
- 주요: 타원체고 자동 변환, byDem 자동 생성, 설정 단순 이름, 선형 클립(관통 수정),
|
||||
깜빡임 구조 수정, dev_mode, 시연 스크립트, 히스토리 30건
|
||||
|
||||
## 참고
|
||||
|
||||
- push 는 사용자 직접 수행 (환경에 gitea 인증 없음)
|
||||
- 이 히스토리 파일은 커밋 후 생성분 — 다음 커밋에 포함
|
||||
@@ -0,0 +1,13 @@
|
||||
# 2026-07-13 push 완료 + GCM 자격 증명 연동
|
||||
|
||||
**소요 시간**: 4분
|
||||
**Context 사용량**: input 2980k / output 2k tokens
|
||||
|
||||
## 작업 내용
|
||||
|
||||
- origin/main = 7d51ba9 동기화 확인 (Everything up-to-date)
|
||||
- **WSL git → Windows Git Credential Manager 연동** (저장소 로컬 credential.helper):
|
||||
`git config credential.helper '!"/mnt/c/Program Files/Git/mingw64/bin/git-credential-manager.exe"'`
|
||||
- fetch/push 인증 무프롬프트 동작 확인 — 이후 세션에서 push 직접 수행 가능
|
||||
- 비밀번호는 GCM 내부 처리(세션에 비노출). 직접 조회 방식은 권한 정책상 차단되어
|
||||
helper 위임 방식으로 대체
|
||||
@@ -0,0 +1,24 @@
|
||||
# 2026-07-14 재부팅 후 54000 포트 자동 개방 (시작프로그램 등록)
|
||||
|
||||
**소요 시간**: 8분
|
||||
**Context 사용량**: input 3040k / output 3k tokens
|
||||
|
||||
## 문제
|
||||
|
||||
재부팅 후 54000 포트 닫힘 — Windows 포워딩·방화벽 규칙은 유지되지만
|
||||
**WSL 내 pm2 서비스가 자동 시작되지 않아** 리슨 프로세스가 없었음.
|
||||
|
||||
## 조치 (사용자 명시 요청으로 자동 시작 등록)
|
||||
|
||||
1. pm2 save — ghiVideo(55000)·ghiVideo-v4(54000) 목록 저장 확인
|
||||
(videoplayer(5173)는 이번 목록에 없음 — 필요 시 별도 기동 후 재저장)
|
||||
2. **Windows 시작프로그램에 GhiVideo-pm2.vbs 등록**
|
||||
(`C:\Users\User\...\Startup\`, 기존 AI-Video-Brief.vbs 와 동일 패턴):
|
||||
`wsl.exe -d Ubuntu-22.04 -u hanmac bash -c "setsid bash -c 'source ~/.nvm/nvm.sh && pm2 resurrect' ..."`
|
||||
3. 동일 명령 실행 검증: 서비스 무손상, 54000 응답 200 ✓
|
||||
|
||||
## 재부팅 후 동작 체계 (전부 자동)
|
||||
|
||||
- Windows **로그인** 시 → vbs → WSL 부팅 + pm2 resurrect → 54000/55000 기동
|
||||
- portproxy 0.0.0.0:54000→127.0.0.1(재부팅·WSL IP 변경 무관) + 방화벽 규칙 유지
|
||||
- ※ 부팅만으로는 안 되고 **로그인까지** 되어야 함(시작프로그램 특성, 기존 스크립트와 동일)
|
||||
@@ -0,0 +1,28 @@
|
||||
# 2026-07-14 54000 접속 불가 — 포워딩 직접 IP + 로그온 자동 갱신
|
||||
|
||||
**소요 시간**: 7분
|
||||
**Context 사용량**: input 3090k / output 3k tokens
|
||||
|
||||
## 문제
|
||||
|
||||
재부팅 후 54000 외부 접속 불가. 진단: WSL 리슨 ✓, WSL 로컬 200 ✓, portproxy 규칙 ✓,
|
||||
**Windows 127.0.0.1:54000 타임아웃** — 127.0.0.1 중계 방식이 재부팅 후 wslrelay 바인딩
|
||||
순서 문제로 portproxy 가 자기 자신으로 되돌아가는 루프 발생.
|
||||
|
||||
## 조치 (사용자 UAC 승인 1회)
|
||||
|
||||
1. portproxy 54000 을 **직접 WSL IP(172.21.50.250) 방식**으로 변경 (55000 과 동일)
|
||||
2. **WSL IP 변경 대응 자동화**: 로그온 시 관리자 권한 예약 작업 `WSL-PortProxy-Update` 등록
|
||||
- `C:\Users\Public\wsl-portproxy-update.ps1`: WSL 기동 대기(최대 60s) → `hostname -I` 로
|
||||
현재 IP 조회 → 54000/55000 규칙 재설정
|
||||
- 설정 스크립트: `C:\Users\Public\wsl-portproxy-setup.ps1` (등록 + 즉시 1회 실행)
|
||||
|
||||
## 검증
|
||||
|
||||
- Windows 루프백 200 ✓, LAN IP(172.16.40.179:54000) 200 ✓
|
||||
|
||||
## 재부팅 후 자동 체계 (최종)
|
||||
|
||||
1. 로그온 → 시작프로그램 vbs → WSL + pm2 resurrect (54000/55000 기동)
|
||||
2. 로그온 → 예약 작업(관리자) → 현재 WSL IP 로 portproxy 갱신
|
||||
3. 방화벽 규칙(영구) → 외부 접속 OK — 전 과정 무개입
|
||||
@@ -0,0 +1,20 @@
|
||||
# 2026-07-14 데이터 로드 = 0초 + 일시정지 (수동 재생)
|
||||
|
||||
**소요 시간**: 5분
|
||||
**Context 사용량**: input 3140k / output 2k tokens
|
||||
|
||||
## 요청 2건
|
||||
|
||||
1. 폴더 로드 시 이전 재생 위치에서 이어지는 경우가 있음 → 항상 처음부터
|
||||
2. 로드 후 자동재생 없이 대기 — 재생 버튼/스페이스로만 시작
|
||||
|
||||
## 수정 — client/src/hooks/useVideoPlayer.ts (loadLocalFile)
|
||||
|
||||
- **0초 강제 리셋**: loadedmetadata 시점에 currentTime(0) (소스 교체 경합 가드 포함)
|
||||
- **자동재생 제거**: 기존 wasPlaying(교체 직전 재생 중이면 이어재생) 로직 삭제 —
|
||||
로드는 항상 일시정지 상태로만 준비
|
||||
- 분할영상 연속재생(ended)·재생목록 선택은 호출부에서 명시적 play() → 기존 동작 유지
|
||||
|
||||
## 검증
|
||||
|
||||
- tsc+vite 빌드 통과, 새 번들(index-CGW0uGP6.js) 서빙
|
||||
@@ -0,0 +1,26 @@
|
||||
# 2026-07-14 데이터 로딩 완료 시 '정지' 명령 실행
|
||||
|
||||
**소요 시간**: 4분
|
||||
**Context 사용량**: input 3190k / output 2k tokens
|
||||
|
||||
## 요청
|
||||
|
||||
폴더 로드 후 애매한 '일시정지' 상태에 빠지는 경우가 있음 → 로딩 완료 시 '정지'(pause+0초)
|
||||
명령이 실행되게.
|
||||
|
||||
## 수정
|
||||
|
||||
### client/src/hooks/useVideoPlayer.ts — loadLocalFile(file, autoPlay=false)
|
||||
- loadedmetadata(로딩 완료) 시점에:
|
||||
- autoPlay=false(폴더 로드): **currentTime(0) + pause() = 정지 명령** — 스톱 버튼과 동일 상태
|
||||
- autoPlay=true: 0초부터 즉시 재생
|
||||
- 소스 교체 경합 가드(objectUrl 일치 확인) 유지
|
||||
|
||||
### client/src/components/player/VideoPlayer.tsx
|
||||
- 연속재생(ended)·재생목록 선택: `loadLocalFile(file, true)` 로 전환 —
|
||||
기존의 "src 설정 직후 play() 큐잉"보다 순서가 결정적(메타데이터 후 0초→재생)
|
||||
- 재생목록 같은 항목 재선택: currentTime(0)+play 유지
|
||||
|
||||
## 검증
|
||||
|
||||
- tsc+vite 빌드 통과, 새 번들(index-ChR6Vi6j.js) 서빙
|
||||
@@ -0,0 +1,19 @@
|
||||
# 2026-07-14 데이터 교체 시 UI 상태 초기화
|
||||
|
||||
**소요 시간**: 3분
|
||||
**Context 사용량**: input 3240k / output 1k tokens
|
||||
|
||||
## 문제
|
||||
|
||||
폴더(데이터) 교체 후 UI 에 이전 소스의 '일시정지(재생중 토글)' 표시가 남음 —
|
||||
src 교체는 pause 이벤트를 보장하지 않아 playerStore.playing 이 true 로 잔존.
|
||||
|
||||
## 수정 — useVideoPlayer.ts
|
||||
|
||||
- loadLocalFile / loadServerStream 에서 소스 설정 직후 스토어 즉시 초기화:
|
||||
`setPlaying(false)` + `setCurrentTime(0)` + `setDuration(0)`
|
||||
- 자동재생 경로(autoPlay=true)는 이후 play 이벤트로 playing=true 재설정 — 순서 정상
|
||||
|
||||
## 검증
|
||||
|
||||
- tsc+vite 빌드 통과, 새 번들(index-ZFLATFML.js) 서빙
|
||||
@@ -0,0 +1,31 @@
|
||||
# 2026-07-14 시간동기(영상↔로그) 보정 슬라이더
|
||||
|
||||
**소요 시간**: 8분
|
||||
**Context 사용량**: input 3290k / output 4k tokens
|
||||
|
||||
## 배경 (사용자 문제 제기)
|
||||
|
||||
오르막 촬영(드론 고도 점진 상승)에서 POI 가 영상에 "풀 붙인 듯" 고정되지 않고 밀림.
|
||||
남은 오차원 분석: ① 영상-로그 시간 동기(이동 중 최대 ~5m 밀림의 주범),
|
||||
② 포즈 스무딩 지연(smoothHalf 60 = ±6초 평균 — 고도/자세가 서서히 변하는 오르막에서 랙).
|
||||
|
||||
## 구현 — 시간동기 보정 (①)
|
||||
|
||||
- CameraParams 에 `timeOffsetSec`(기본 0) 추가 — **camera.json/보정 저장에 자동 포함**
|
||||
- RAF 연속 프레임 산출에 오프셋 적용: estTime = 부드러운 시간 + timeOffsetSec
|
||||
→ 포즈 보간·라벨 캐시 조회·선형/궤적 투영 전부 일괄 반영
|
||||
- UI: 자세 보정 섹션 최상단 "시간동기" 슬라이더 (−2~+2s, 0.05s 스텝, 툴팁)
|
||||
|
||||
## 안내 (②)
|
||||
|
||||
- 오르막 데이터셋은 smooth(포즈 이동평균 반폭) 60 → **10 내외 권장** — ±1초 평균으로
|
||||
고도 상승 추종. 조정 후 display.json 저장
|
||||
|
||||
## 남은 개선 여지 (미구현 제안)
|
||||
|
||||
- djmd(영상 내장 텔레메트리)의 프레임별 위치/고도 사용 — 프레임 단위 완전 동기.
|
||||
자세(yaw/pitch)는 djmd 에 없어 CSV 병용 필요. 필요 시 다음 단계로
|
||||
|
||||
## 검증
|
||||
|
||||
- tsc+vite 빌드 통과, 새 번들(index-ee25eCoO.js) 서빙
|
||||
@@ -0,0 +1,40 @@
|
||||
# 2026-07-14 djmd 프레임 동기 위치 업그레이드 (근본 해결)
|
||||
|
||||
**소요 시간**: 25분
|
||||
**Context 사용량**: input 3360k / output 12k tokens
|
||||
|
||||
## 배경 (사용자 승인)
|
||||
|
||||
오르막/내리막에서 POI 가 "풀 붙임"처럼 고정되지 않음 — 근본 원인은 CSV 비행로그의
|
||||
시각 정렬 가정(로그 t0 = 영상 시작, 10Hz) 오차. **실측: CSV 가정 vs 영상 내장 텔레메트리
|
||||
실위치 오차 평균 3.2m / 최대 4.1m** (≈0.33s 동기 오차) — 이것이 밀림의 정체.
|
||||
|
||||
## 구현 — client/src/utils/djmdTrack.ts (신규)
|
||||
|
||||
- **MP4 박스 파서**: 최상위 박스 워크(mdat 스킵) → moov(파일 끝, 0.2MB) →
|
||||
trak/mdia/minf/stbl 에서 stsd=djmd 트랙 탐색 → stsz/stsc/stco(co64) 샘플 테이블 전개
|
||||
- **선별 읽기**: 전체 3.7GB 스캔 없이 djmd 샘플 바이트 구간만 6프레임 간격(≈10Hz) 배치 읽기
|
||||
(1,970회 slice, 동시 64) — 동기 정확도는 프레임 단위, 밀도는 CSV 동급
|
||||
- **protobuf 추출**: 6.3 프레임 카운터 / 6.4·6.5 위경도(라디안) / 6.6 타원체고(mm)
|
||||
- **refineFramesWithDjmd**: CSV 프레임의 위치/고도를 djmd 보간값으로 교체
|
||||
(자세 yaw/pitch/roll·focalLen 은 CSV 유지). datum: 타원체고 데이터셋은 그대로,
|
||||
정표고 데이터셋은 (첫 샘플 − CSV 첫 고도) 지오이드고 자동 차감. 비정상(|편차|>80m) 시 미적용
|
||||
|
||||
## geoStore 통합
|
||||
|
||||
- loadFromFolder / loadSegment 직후 **백그라운드 refine** — CSV 기반으로 즉시 표시 후
|
||||
파싱 완료 시 frames 교체(라벨 캐시는 frames 변경 감지로 자동 재계산)
|
||||
- 경합 가드: 파싱 중 세그먼트/폴더 전환 시 결과 폐기
|
||||
- DJI 영상이 아니면 조용히 CSV 유지(무해)
|
||||
|
||||
## 검증 (실파일, node 포팅 동일 로직)
|
||||
|
||||
- moov/stbl 파싱 ✓, 샘플 11,817개 중 1,969개 추출(step 6) ✓
|
||||
- 첫 샘플 frame 6: 33.40398°, 126.28924°, 174.43m — CSV·기존 분석과 정합 ✓
|
||||
- 오차 측정: 평균 3.2m/최대 4.1m 제거 효과 확인
|
||||
- tsc+vite 빌드 통과, 새 번들(index-CW0-dRMN.js) 서빙
|
||||
|
||||
## 사용 안내
|
||||
|
||||
- 폴더 로드 후 1~3초 내 콘솔 `[djmd] 영상 내장 텔레메트리로 위치/고도 정밀화 적용` 확인
|
||||
- 시간동기 슬라이더는 0 권장(위치는 이제 프레임 동기 — 잔여 자세 오차만 Yaw±로)
|
||||
@@ -0,0 +1,28 @@
|
||||
# 2026-07-14 선형 찌글찌글 — z 톱니 노이즈 평활
|
||||
|
||||
**소요 시간**: 8분
|
||||
**Context 사용량**: input 3430k / output 4k tokens
|
||||
|
||||
## 문제 (스크린샷 제보)
|
||||
|
||||
같은 측점.kml 이 구글어스(평면)에선 매끈한데 영상 오버레이에선 선형이 지그재그로 꺾임.
|
||||
|
||||
## 원인 (데이터 검증)
|
||||
|
||||
선형 정점 z 가 104.9 ↔ 105.9 처럼 **±1m 양자화 톱니** (원본 제작 시 지형고도 샘플링 잔차,
|
||||
부호 반전 톱니 7개, 최대 인접 z 차 12m). 평면 지도에선 z 가 안 보여 매끈하지만,
|
||||
영상의 낮은 시야각 투영에선 1m 차이가 선 꺾임으로 증폭되어 보임.
|
||||
|
||||
## 수정 — geoData.ts parseKmz (선형 로드 시)
|
||||
|
||||
- 정점 z 에 **±3점 이동평균** 적용 — 톱니 7→1개, 최대 인접 z 차 12→2.7m,
|
||||
종단 경사는 보존(시작/끝 값 유지)
|
||||
|
||||
## 남은 개선 여지 (안내)
|
||||
|
||||
- 곡선 구간의 미세한 좌우 흔들림은 자세(yaw)가 아직 CSV 시각축인 잔차 —
|
||||
djmd 위치와의 교차상관으로 자세 시간축도 자동 정렬 가능(요청 시 구현)
|
||||
|
||||
## 검증
|
||||
|
||||
- tsc+vite 빌드 통과, 새 번들(index-Bs4i3DNJ.js) 서빙
|
||||
@@ -0,0 +1,31 @@
|
||||
# 2026-07-14 POI 원거리 밀림 — 지면고도 z 우선순위 교정
|
||||
|
||||
**소요 시간**: 7분
|
||||
**Context 사용량**: input 3490k / output 3k tokens
|
||||
|
||||
## 문제 (제보)
|
||||
|
||||
POI 가 멀리 있을 때는 계속 밀리다가 화면 하단(근거리)에서는 잘 맞음.
|
||||
|
||||
## 원인 — 높이(표고) 오차의 전형적 시그니처
|
||||
|
||||
근거리는 위치(djmd 프레임 동기, 정확)가 지배해 맞고, 원거리는 각도·높이 오차가 증폭됨.
|
||||
코드상 지면고도(gz)가 **POI 자체 실측 z 보다 '최근접 중심선(도로) 높이 스냅'을 우선** —
|
||||
회덕(철도, POI z 미보유) 시절의 규칙이 남아, 도로에서 떨어진 지물(마을회관·산 등)이
|
||||
도로 높이로 붙어 원거리에서 수 m 높이 오차 → 접근하며 서서히 제자리로 미끄러지는 증상.
|
||||
|
||||
## 수정 — StationOverlay.tsx
|
||||
|
||||
- gz 우선순위 교정: 보정값(드래그) → **POI 자체 z(실측)** → 중심선 z → 경로표고 앵커
|
||||
- 편집 모드 초기 표고(baseZ/groundZ)도 동일 규칙으로 통일
|
||||
- z 없는 데이터셋은 기존 폴백 그대로(무영향)
|
||||
|
||||
## 잔여 안내
|
||||
|
||||
- 수정 후에도 '모든' POI 가 원거리에서 같은 방향으로 균일하게 밀리면 = 짐벌 피치 바이어스
|
||||
(로그가 정수 -15 로 고정 기록) → 카메라 파라미터 Pitch± 를 ±0.5° 내에서 미세 조정
|
||||
- 드론높이 모드 사용 중이면 지면고도 모드(OFF) 권장 — 평면 근사가 원거리 오차의 또 다른 원인
|
||||
|
||||
## 검증
|
||||
|
||||
- tsc+vite 빌드 통과, 새 번들(index-BiwO87gk.js) 서빙
|
||||
@@ -0,0 +1,37 @@
|
||||
# 2026-07-14 옆 지물(상대리 마을회관) 밀림 — 자세 시간축 자동 재정렬
|
||||
|
||||
**소요 시간**: 25분
|
||||
**Context 사용량**: input 3800k / output 6k tokens
|
||||
|
||||
## 문제 (스크린샷 제보)
|
||||
|
||||
전방 지물(중간산서로 등)은 잘 붙는데 '상대리 마을회관'처럼 옆으로 지나치는 POI 가
|
||||
계속 뒤로 밀리면서 사라짐.
|
||||
|
||||
## 진단
|
||||
|
||||
- 마을회관 z 는 정상(파일 96.83 vs DEM 환산 97.9) → 표고 원인 배제
|
||||
- 위치는 djmd(영상 내장 텔레메트리) 프레임 동기로 정확하지만,
|
||||
**자세(yaw/pitch/roll)는 여전히 CSV 시각정렬** — 두 시간축 사이 잔차가 존재.
|
||||
- 옆을 지나치는 지물은 상대 방위가 초당 수십 도씩 급변 → yaw 가 0.3초만 늦어도
|
||||
화면에서 수백 px 뒤로 밀림. 전방 지물은 방위 변화가 느려 티가 안 났던 것.
|
||||
|
||||
## 수정 — djmdTrack.ts refineFramesWithDjmd
|
||||
|
||||
- djmd 위치 ↔ CSV 위치의 **교차상관으로 시간 오프셋(dt) 자동 추정**
|
||||
(조사 −1.5~+1.5s 0.05s 스텝 → 최적 근방 ±0.05s 를 0.01s 정밀 스윕, 프로브 ~50점)
|
||||
- 최종 프레임: 위치 = djmd(프레임 동기), 자세 = CSV 를 `t + dt` 로 재샘플
|
||||
(yaw 는 최단각 보간) → 위치·자세가 모두 영상 시간축으로 통일
|
||||
|
||||
## 검증 (실데이터 경로 1-1, DJI_...0002.MP4)
|
||||
|
||||
- 추정 dt = **−0.33s** (기존 진단치 ≈0.33s 와 정확히 일치)
|
||||
- 위치 잔차: dt=0 일 때 3.24m → dt 적용 시 **0.24m**
|
||||
- tsc+vite 빌드 통과, 새 번들(index-DpAUafsi.js) 서빙 확인
|
||||
|
||||
## 사용법 / 안내
|
||||
|
||||
- 새로고침 후 폴더 재선택 → 콘솔에 `[djmd] CSV↔영상 시간 오프셋 ...s 추정` 로그 출력
|
||||
- 세그먼트마다 각자 dt 를 추정하므로 분할영상 전체에 자동 적용
|
||||
- 수정 후에도 모든 POI 가 원거리에서 균일하게 밀리면 짐벌 피치 바이어스 →
|
||||
카메라 파라미터 Pitch± ±0.5° 미세 조정
|
||||
@@ -0,0 +1,29 @@
|
||||
# 2026-07-14 상대리교차로 밀림 — camera.json offZ 잔재값 교정
|
||||
|
||||
**소요 시간**: 13분
|
||||
**Context 사용량**: input 4200k / output 5k tokens
|
||||
|
||||
## 문제 (스크린샷 3장 제보)
|
||||
|
||||
자세 시간축 재정렬 후에도 상대리교차로가 접근할수록 위로(뒤로) 계속 밀림.
|
||||
|
||||
## 진단 (수치 확정)
|
||||
|
||||
- 교차로 좌표/표고 정상(z=94.834 타원체고, 선형 최근접 29.5m)
|
||||
- 재정렬 코드 정상(외부 검증 dt=-0.33s, 잔차 0.24m) — yaw 는 횡방향이라 이 증상과 무관
|
||||
- **원인: camera.json 의 offZ = −18.3m** (7/13 20:07 저장, 표고 체계 근본 교정 *이전*의
|
||||
드래그 보정값). 오늘 djmd 타원체고(프레임 동기)로 고도가 정확해지자 이중 보정이 되어
|
||||
카메라를 18.3m 낮게 모델링 → 겉보기각 오차 = 18.3/거리:
|
||||
416m에서 +2.45° → 86m에서 +7.34° (접근할수록 위로 밀림 — 제보와 정확히 일치)
|
||||
- 드론 djmd 고도 174.0m(타원체고) 일정, 교차로 상대높이 79.2m — offZ=0 이면 각도 오차 0
|
||||
|
||||
## 조치
|
||||
|
||||
- 경로 1-1 camera.json: **offZ −18.3 → 0** (`.bak` 백업 생성, 사용자 선택: 1-1만)
|
||||
- 경로 1-2(0.6)/1-3(21.8)/2(21.8) 도 같은 잔재값 보유 — 해당 경로 재생 시 같은 증상
|
||||
예상되므로 필요 시 같은 방식으로 교정 권장 (사용자 판단 대기)
|
||||
|
||||
## 확인 방법
|
||||
|
||||
- 새로고침 후 폴더 재선택 → camera.json 자동 적용(offZ 0)
|
||||
- 잔여 미세 오차는 offZ ±2m 또는 Pitch ±0.5° 미세 조정
|
||||
@@ -0,0 +1,34 @@
|
||||
# 2026-07-14 측점 POI-선형 분리 — 선형 z 를 측점 기준으로 재정렬
|
||||
|
||||
**소요 시간**: 12분
|
||||
**Context 사용량**: input 4400k / output 5k tokens
|
||||
|
||||
## 문제 (스크린샷 제보, 1k700~1k800 구간)
|
||||
|
||||
측점 POI(눈금)와 선형(빨간선)이 화면에서 서로 어긋나 보임.
|
||||
|
||||
## 원인
|
||||
|
||||
- 선형 정점 z: 로드 시 **±3점 이동평균 평활** 값
|
||||
- 측점 POI z: **자체 실측 z** (7/13 교정값)
|
||||
- 두 z 가 지점에 따라 ±2.5m 어긋나(1k700 부근 +2.54m / 1k850 −2.46m)
|
||||
낮은 시야각 투영에서 선과 눈금이 분리되어 보임
|
||||
|
||||
## 수정 — geoData.ts parseKmz
|
||||
|
||||
- **선형 정점 z 를 측점 POI z 의 체이니지 선형 보간으로 교체** (측점이 기준)
|
||||
- 측점 71점을 선형 세그먼트에 투영해 체이니지 앵커 생성(횡 이격 최대 0.029m)
|
||||
- 선형에서 50m 이상 떨어진 측점은 앵커에서 제외, 양끝 밖은 최근접 측점 z 클램프
|
||||
- 측점 z 자체가 종단(부드러움)이므로 기존 톱니 평활도 함께 대체
|
||||
- 측점 z 없는 데이터셋(앵커 <2)은 기존 평활 z 유지 (무영향)
|
||||
|
||||
## 검증 (경로 1-1 실데이터)
|
||||
|
||||
- 재정렬 후 측점 체이니지에서 선형 z − 측점 z = **0.0000m** (완전 정합)
|
||||
- 기존 평활 z 대비 변경 최대 5.79m(체이니지 6832m — 노선 연장 밖 구간)
|
||||
- tsc+vite 빌드 통과, 새 번들(index-tLZxZy_r.js) 서빙
|
||||
|
||||
## 확인 방법
|
||||
|
||||
- 새로고침 후 폴더 재선택 → 콘솔에 `[KML] 선형 z 를 측점 71점 기준으로 재정렬` 로그
|
||||
- 선형이 모든 측점 눈금을 정확히 통과해야 정상
|
||||
@@ -0,0 +1,34 @@
|
||||
# 2026-07-14 측점 POI-선형 분리(교차로 구간) — 측점 정점 삽입으로 통과 보장
|
||||
|
||||
**소요 시간**: 11분
|
||||
**Context 사용량**: input 4700k / output 6k tokens
|
||||
|
||||
## 문제 (스크린샷 제보, 2k200~2k300 교차로)
|
||||
|
||||
직전 "선형 z 재정렬" 후에도 교차로 구간에서 측점 눈금과 선형이 분리되어 보임.
|
||||
|
||||
## 원인 (실데이터 검증)
|
||||
|
||||
- 이 구간 선형은 **433m 직선 현 1개 세그먼트**(정점123→124)이고, 측점 2+200~2+500은
|
||||
그 현 위(횡 0.00m)에 정확히 존재 — 원본 데이터 자체는 정합
|
||||
- 직전 수정(정점 z만 재정렬)은 현의 **양 끝 z만** 교체 → 현 중간에서 측점 z 프로파일
|
||||
(곡선 종단: 101.9→98.6→97.0→95.4→93.8)과 직선 보간이 어긋나 2+200에서 +1.2m 오차를
|
||||
오히려 유발 (수정 전 원본은 이 구간이 자체 정합이었음)
|
||||
|
||||
## 수정 — geoData.ts parseKmz (직전 로직 대체·확장)
|
||||
|
||||
- **측점 위치를 선형 폴리라인에 정점으로 삽입** (세그먼트별 t 순, 기존 정점 1m 이내면 생략)
|
||||
→ 선형이 모든 측점의 lat/lon/z 를 기하학적으로 정확히 통과.
|
||||
라벨과 선이 같은 3D 점을 투영하므로 **어떤 카메라 자세/오차에서도 화면에서 일치**
|
||||
- 나머지 원본 정점 z 는 측점 체이니지 보간(직전 로직) 유지
|
||||
|
||||
## 검증 (경로 1-1 실데이터)
|
||||
|
||||
- 정점 146 → 213 (측점 정점 67개 삽입, 4개는 기존 정점과 1m 이내라 생략)
|
||||
- 모든 측점의 선형과의 **3D 최대 이격 0.012m** (화면 픽셀 이하)
|
||||
- 433m 현이 2+200/2+300/2+400 측점을 정확히 통과함 확인
|
||||
- tsc+vite 빌드 통과, 새 번들(index-DD92sAy6.js) 서빙
|
||||
|
||||
## 확인 방법
|
||||
|
||||
- 새로고침 후 폴더 재선택 → 콘솔 `[KML] 선형-측점 정합: 측점 정점 67개 삽입 ...` 로그
|
||||
@@ -0,0 +1,32 @@
|
||||
# 2026-07-14 선형 실선-측점 라벨 따로 움직임 — 측점 라벨 즉시 투영 전환
|
||||
|
||||
**소요 시간**: 4분
|
||||
**Context 사용량**: input 4900k / output 2k tokens
|
||||
|
||||
## 문제 (제보)
|
||||
|
||||
측점 정점 삽입(3D 데이터 일치) 후에도 선형 실선과 측점 POI 라벨이 화면에서 따로 움직임.
|
||||
|
||||
## 원인
|
||||
|
||||
같은 3D 점을 투영해도 **그리는 경로가 달랐음**:
|
||||
- 선형 실선: 매 프레임 카메라 포즈로 즉시 투영 (지연 0)
|
||||
- 측점 라벨: 즉시 투영 → **화면 EMA(속도적응 평활, smoothStep) + 이상치 거부** 를 거침
|
||||
→ CSV 위치가 떨리던 시절의 떨림 억제 장치가 라벨을 수 프레임 지연시켜
|
||||
움직이는 동안 실선과 분리되어 보임 (display.json 의 강한 평활값 0.02/0.002 로 더 두드러짐)
|
||||
|
||||
## 수정 — StationOverlay.tsx
|
||||
|
||||
- 측점 라벨의 smoothStep(EMA) 제거 → **실선과 동일한 즉시 투영** 사용
|
||||
- 반올림 떨림은 기존 0.75px 픽셀 히스테리시스가 계속 흡수
|
||||
- POI(지장물) 라벨의 EMA 는 유지 (실선과 붙어 다닐 대상이 아님)
|
||||
|
||||
## 효과
|
||||
|
||||
측점 라벨과 선형 실선이 같은 포즈·같은 3D 점·같은 투영·같은 타이밍 → **픽셀 단위 고정**.
|
||||
포즈 오차가 있어도 둘이 함께 움직여 분리되지 않음.
|
||||
|
||||
## 검증
|
||||
|
||||
- tsc+vite 빌드 통과, 새 번들(index-DCx_qhIq.js) 서빙
|
||||
- 새로고침 후 폴더 재선택으로 적용
|
||||
@@ -0,0 +1,35 @@
|
||||
# 2026-07-14 드론 회전 시 오버레이 전체가 딸려오는 증상 — 포즈 평활 자동 제한
|
||||
|
||||
**소요 시간**: 10분
|
||||
**Context 사용량**: input 5200k / output 4k tokens
|
||||
|
||||
## 문제 (제보)
|
||||
|
||||
드론이 방향을 바꿀 때 POI·선형·궤적이 지면에 붙어 있지 않고 드론에 부착된 것처럼
|
||||
함께 회전하며 딸려옴. (직진 구간에서는 정상)
|
||||
|
||||
## 원인
|
||||
|
||||
오버레이 카메라 포즈가 **±smoothHalf 프레임 이동평균**으로 평활되는데, 기본/저장값이
|
||||
60(±1초). 회전 중에는 평활 yaw 가 실제 영상 yaw 를 못 따라가(수 도 지연) 투영된 세계
|
||||
전체가 카메라와 같이 회전 → "부착된 듯 딸려오는" 증상. CSV 위치가 프레임마다 떨리던
|
||||
시절의 떨림 억제 장치로, djmd 프레임 동기 이후에는 불필요한 지연만 유발.
|
||||
|
||||
## 수정
|
||||
|
||||
- geoStore: `frameSynced` 플래그 추가 — djmd 정밀화 적용 시 true (폴더/세그먼트 로드 시 false)
|
||||
- StationOverlay: 포즈 평활 유효 반폭 `poseHalf()` 도입 —
|
||||
**프레임 동기 데이터면 min(smoothHalf, 5)** (±5프레임 ≈ 0.08초, 사실상 즉시 추종)
|
||||
- 적용 지점: poseAt(라인·라벨 공통 포즈), 나침반/렌더캐시, RAF 폴백, 드래그 역투영,
|
||||
라벨 프리컴퓨트(가시성 판단)
|
||||
- CSV 기반(비동기화) 데이터셋은 기존 smoothHalf 그대로 (무영향)
|
||||
|
||||
## 효과
|
||||
|
||||
회전 시 오버레이가 영상과 같은 속도로 즉시 회전 — 지면 고정("풀 붙인 듯") 유지.
|
||||
위치·자세가 프레임 동기이므로 평활 제거에 따른 떨림 없음(0.75px 히스테리시스 유지).
|
||||
|
||||
## 검증
|
||||
|
||||
- tsc+vite 빌드 통과, 새 번들(index-CXHCdlnf.js) 서빙
|
||||
- 새로고침 후 폴더 재선택으로 적용 (교차로 회전 구간에서 확인 권장)
|
||||
@@ -0,0 +1,28 @@
|
||||
# 2026-07-14 선형선-선형점 불일치 재제보 — 구버전 번들 실행 진단
|
||||
|
||||
**소요 시간**: 5분
|
||||
**Context 사용량**: input 5500k / output 3k tokens
|
||||
|
||||
## 제보 (스크린샷, 1k900~2k100)
|
||||
|
||||
선형선(빨간 선)이 측점 눈금에서 우하단으로 벗어남 — 가까울수록 간격 증가.
|
||||
|
||||
## 진단
|
||||
|
||||
- 현행 배포 코드(14:18 번들)에서는 불일치가 **구조적으로 불가능**:
|
||||
① 측점 위치가 선형 정점으로 삽입되어 있고(13:21), ② 측점 눈금 앵커는 projectCL 로
|
||||
선형 위에 스냅된 같은 3D 점이며, ③ 같은 포즈·같은 투영으로 그려짐(13:24)
|
||||
- 스크린샷의 간격 패턴(가까울수록 벌어짐 = z 오차 시그니처, 약 4~6m)은
|
||||
**13:08 이전 번들**(선형 z 원본, 측점 z 와 4.6m 차이 구간)과 정확히 일치
|
||||
- 서버 index.html 은 `Cache-Control: max-age=0` — 일반 새로고침이면 새 코드 수신.
|
||||
즉 **페이지 새로고침 없이 폴더만 재선택**해 온 것으로 판단
|
||||
(폴더 재선택은 데이터만 다시 읽고 JS 번들은 그대로)
|
||||
|
||||
## 확인 수단 (기존 기능)
|
||||
|
||||
- 좌상단 타이틀 아래 **빌드 시각 표시** (`v1.0.0 · 07.14 14:18`) — 14:18 이후여야 최신
|
||||
- 콘솔(F12): `[KML] 선형-측점 정합: 측점 정점 67개 삽입 ...` 로그 확인
|
||||
|
||||
## 조치
|
||||
|
||||
- 코드 변경 없음. 사용자에게 **F5 새로고침(필요시 Ctrl+F5) → 폴더 재선택** 안내
|
||||
@@ -0,0 +1,26 @@
|
||||
# 2026-07-14 드론높이·이격거리 옵션 시 선형 분리 — 선형에도 동일 높이 규칙 적용
|
||||
|
||||
**소요 시간**: 5분
|
||||
**Context 사용량**: input 5700k / output 2k tokens
|
||||
|
||||
## 요청
|
||||
|
||||
드론높이 + POI 이격거리 옵션을 켜면 측점 POI 라벨 높이는 바뀌는데 빨간 선형은
|
||||
지형 z 에 남아 분리됨 → 선형도 동일하게 적용해 항상 같은 선상에 놓이게.
|
||||
|
||||
## 수정 — StationOverlay.tsx buildLines
|
||||
|
||||
- 드론높이 모드(poiDroneHeight)일 때 선형 정점을 측점/POI 라벨과 **동일한
|
||||
'드론고도 − geoidOffset − 이격거리' 평면**에 투영 (planeZ)
|
||||
- 지면고도 모드(기본)는 기존대로 정점 z(측점 기준) 사용 — 무영향
|
||||
- 라벨과 선이 같은 RAF 포즈(dronePose)를 공유하므로 평면 기준도 완전 동일
|
||||
|
||||
## 효과
|
||||
|
||||
드론높이/이격거리 슬라이더 조절 시 측점 라벨·POI·빨간 선형이 한 몸으로 이동 —
|
||||
어떤 모드에서도 측점 POI 와 선형이 같은 선상 유지.
|
||||
|
||||
## 검증
|
||||
|
||||
- tsc+vite 빌드 통과, 새 번들(index-BDuURKji.js, 빌드 07.14 14:41) 서빙
|
||||
- 적용: F5 새로고침(좌상단 빌드 시각 14:41 확인) → 폴더 재선택
|
||||
@@ -0,0 +1,26 @@
|
||||
# 2026-07-14 측점 팝업에 높이(표고)가 없음 — 표고 행 추가
|
||||
|
||||
**소요 시간**: 6분
|
||||
**Context 사용량**: input 6000k / output 2k tokens
|
||||
|
||||
## 질문 (스크린샷: 3k100 팝업)
|
||||
|
||||
측점 POI 팝업에 왜 높이가 없나?
|
||||
|
||||
## 원인
|
||||
|
||||
- 높이 데이터는 **있음** — 측점.kml 좌표 3번째 성분(z, 타원체고). 예: 3+100 = 108.2m.
|
||||
렌더링(선형·라벨 높이)에도 이미 사용 중.
|
||||
- 팝업은 KML 속성표(SimpleData: STA/lat/lon/5186_x/5186_y/km)만 나열하는데,
|
||||
측점 속성표에는 높이 키가 없어 화면에 안 보였던 것.
|
||||
|
||||
## 수정 — StationOverlay.tsx 팝업
|
||||
|
||||
- 전체 보기 팝업 하단에 **`표고 NNN.N m (타원체고)`** 행 추가 (z>0 일 때)
|
||||
- 측점·지장물 공통 적용. 지장물의 '높이' 속성(구조물 높이)과 구분되는 표기.
|
||||
- 컴팩트(자동) 팝업은 간결 유지 — 전체 보기에서만 표시
|
||||
|
||||
## 검증
|
||||
|
||||
- tsc+vite 빌드 통과, 새 번들(index-vYVLTTyB.js, 빌드 07.14 15:35) 서빙
|
||||
- 적용: F5 새로고침(좌상단 빌드 시각 15:35 확인) → 폴더 재선택 → 측점 라벨 클릭
|
||||
@@ -0,0 +1,27 @@
|
||||
# 2026-07-14 어음천교 라벨 2개(파랑+빨강) — 구조물 이중 표출 제거
|
||||
|
||||
**소요 시간**: 5분
|
||||
**Context 사용량**: input 6200k / output 2k tokens
|
||||
|
||||
## 문제 (스크린샷 제보)
|
||||
|
||||
어음천교 라벨이 파란색(위)·빨간색(아래) 두 개로 표출.
|
||||
|
||||
## 원인
|
||||
|
||||
신포맷 지장물.kml 의 교량/터널은 파싱 시 **POI(파란 텍스트박스)와 구조물(스테이션바
|
||||
마크용) 양쪽에 등록**되는데, 오버레이가 영상 라벨을 만들 때 POI + 구조물을 합쳐
|
||||
같은 시설물이 두 번 그려짐. 구조물 쪽은 z=0(표고 미상)으로 변환되어 파란 POI(실측 z)와
|
||||
높이 폴백이 달라 위치까지 분리 — 빨간 라벨이 아래쪽에 따로 표시.
|
||||
|
||||
## 수정 — StationOverlay.tsx
|
||||
|
||||
- 구조물 → 영상 라벨 변환 시 **같은 이름이 POI 에 이미 있으면 제외** (POI 우선 —
|
||||
실측 z + KML 지정 색상 보유)
|
||||
- 스테이션바 구조물 마크는 storeStructures 직접 사용이라 영향 없음
|
||||
- 회덕 포맷(교량이 구조물에만 존재)은 기존대로 영상 표출 유지
|
||||
|
||||
## 검증
|
||||
|
||||
- tsc+vite 빌드 통과, 새 번들(index-CAEWZ-A_.js, 빌드 07.14 15:43) 서빙
|
||||
- 적용: F5 새로고침(빌드 시각 15:43 확인) → 폴더 재선택 → 어음천교 라벨 1개(파랑)만 확인
|
||||
@@ -0,0 +1,21 @@
|
||||
# 2026-07-14 F2 키로 개발자 모드(dev_mode 1↔0) 전환
|
||||
|
||||
**소요 시간**: 5분
|
||||
**Context 사용량**: input 6400k / output 2k tokens
|
||||
|
||||
## 요청
|
||||
|
||||
F2 를 누르면 dev_mode 1(제어 UI 표시) ↔ 0(뷰어 모드) 상태 전환.
|
||||
|
||||
## 구현 — VideoPlayer.tsx
|
||||
|
||||
- `devModeOverride` 상태 추가 — F2 keydown 시 현재 유효값 기준 1↔0 토글
|
||||
- 유효 devMode = override ?? route.json 파일 값 (**파일은 변경하지 않음**, 세션 한정)
|
||||
- 새 폴더 로드(routeMeta 변경) 시 override 초기화 → 다시 파일 값 적용
|
||||
- 텍스트 입력(INPUT/TEXTAREA/contentEditable) 중에는 F2 무시 — 기존 단축키 규칙과 동일
|
||||
- 기존 게이팅 그대로: devMode 0 이면 '영상제어' 버튼 그룹·카메라/화면표시 패널 숨김
|
||||
|
||||
## 검증
|
||||
|
||||
- tsc+vite 빌드 통과, 새 번들(index-D1wtVulq.js, 빌드 07.14 16:15) 서빙
|
||||
- 적용: F5 새로고침(빌드 시각 16:15 확인) → F2 로 제어 UI 표시/숨김 전환 확인
|
||||
@@ -0,0 +1,19 @@
|
||||
# 2026-07-14 단축키 A — 선형 표시/숨김 토글
|
||||
|
||||
**소요 시간**: 4분
|
||||
**Context 사용량**: input 6600k / output 1k tokens
|
||||
|
||||
## 요청
|
||||
|
||||
A 키로 선형(빨간선) show/hide 전환.
|
||||
|
||||
## 구현 — VideoPlayer.tsx
|
||||
|
||||
- `KeyA` keydown → 설정 스토어 `showCenterline` 토글 (측점 라벨도 선형의 일부라 함께 전환)
|
||||
- Ctrl/Meta/Alt 조합(Ctrl+A 전체선택 등)과 텍스트 입력 중에는 무시
|
||||
- 화면표시 옵션 패널의 "선형 표시" 체크박스와 같은 상태를 공유 — 어느 쪽으로 바꿔도 동기화
|
||||
|
||||
## 검증
|
||||
|
||||
- tsc+vite 빌드 통과, 새 번들(index-CkjmYxHT.js, 빌드 07.14 17:00) 서빙
|
||||
- 적용: F5 새로고침(빌드 시각 17:00 확인) → A 키로 선형 표시/숨김 확인
|
||||
@@ -0,0 +1,31 @@
|
||||
# 2026-07-14 측점 표기 0+000 형식 전환 + 스테이션바 양끝 시작/끝 스테이션 표시
|
||||
|
||||
**소요 시간**: 12분
|
||||
**Context 사용량**: input 7000k / output 4k tokens
|
||||
|
||||
## 요청
|
||||
|
||||
1. 스테이션 표시를 0k000 → **0+000** 형식으로
|
||||
2. 스테이션바 맨 왼쪽/오른쪽 **100m 이내에 시설물이 없으면** 시작/끝 스테이션 표시
|
||||
|
||||
## 구현
|
||||
|
||||
### ① 표기 형식 통일 (NkNNN → N+NNN)
|
||||
|
||||
- 생성 6곳: StationBar(커서 배지 10m/1m), mileage.ts(100m 라벨), Timeline(눈금),
|
||||
chainage.ts, RoutePanel, geoData.ts(측점 라벨 제목 — 오버레이·팝업 포함)
|
||||
- 제목 파서 4곳(`(\d+)[Kk](\d+)`)은 `[Kk+]` 로 확장 — 신·구 형식 모두 인식
|
||||
(StationBar stationKm/mileageToMeters, StationOverlay stationOrder, RoutePanel stationKm)
|
||||
- 원본 KML STA 형식("0+000")과 동일해져 데이터-화면 표기 일치
|
||||
|
||||
### ② 스테이션바 양끝 시작/끝 스테이션 마크
|
||||
|
||||
- appendEndpointStations: 첫/마지막 '노선 위'(offM≤60m) 프레임의 체이니지 기준,
|
||||
기존 마크(시설물·시점 포함)가 **100m 이내에 없을 때만** '시작'/'끝' 마크 추가
|
||||
- 위 줄 = 측점값(0+000 형식), 아래 줄 = '시작'/'끝'. 접근/이탈(노선밖) 구간은 제외
|
||||
- 기존 시점(0+000 통과) 마크가 가까이 있으면 중복 방지로 생략됨
|
||||
|
||||
## 검증
|
||||
|
||||
- tsc+vite 빌드 통과, 새 번들(index-DMtfrnP9.js, 빌드 07.14 17:43) 서빙
|
||||
- 적용: F5 새로고침(빌드 시각 17:43 확인) → 폴더 재선택
|
||||
Reference in New Issue
Block a user