9387552e18
Python piezophantomtest ffd436b (2026-07-15 PR #35 'alignment bvcv 규칙 추가') 의 `vesiscan_test.alignment.CenterAligner` 를 Kotlin 으로 이식. 기존 V2 (실시간 sliding window 6-stage) 와 병행. V3 는 Clinical batch 전용: Pass 1 (scanSelect): - 5 위치 (0/1/2/3/4 cm) × 20 cycle → sliding window 10 → 11 trace 씩 - mean-scan 으로 base 검출 (apply_cross=false) → nch, ch3 판정 - per-trace cross 검출 → BV 계산 → std/mean = bv_cv - Rule A (ch3 필수 + per-trace 검출률 ≥ CH3_HIT_MIN 0.80 + max nch + min bv_cv tie) Pass 2 (guide): - 재측정 한 위치 → target 기준 (ch3='O' & 검출률≥80% & nch≥t.nch & bv_cv ≤ t.bv_cv × (1 + bvCvTol)) 충족 시 STOP, 아니면 MOVE_UP. 포팅 원칙: - MethodDRunner (기존) 재사용, apply_cross=false/true 두 모드 활용. - PiezoBVEstimator.estimateBladderVolume6ch (기존) 재사용. - alignment_selection.py 의 select_cm(rule='A', tie='bvcv') 로직 완전 이식. 검증 (CenterAlignerValidationTest, data123 인체 3 세션): - Python reference 와 nch/ch3/ch3_hit 완전 일치. - bv_cv 오차 <2% (정상 case). BV 발산 케이스 (ch3=X) 만 큰 오차 — Rule A 에서 어차피 탈락하므로 최종 선택 영향 없음. - 최종 선택 위치 = cm=3 (Python 과 일치). 주의: test 실행 전 PiezoHW.activePreset 를 V1 로 명시 설정 필요. 실기기는 BleManager 가 device name 으로 autoDetectPreset 처리. UI 통합 (Pass 1 위치 안내 + Pass 2 판정 화면) 은 후속 작업.