diff --git a/VesiScan_Android_Pipeline_Summary.md b/VesiScan_Android_Pipeline_Summary.md index 44bda84..332a7e8 100644 --- a/VesiScan_Android_Pipeline_Summary.md +++ b/VesiScan_Android_Pipeline_Summary.md @@ -1044,60 +1044,76 @@ Stop Scanning → LED 0 (OFF) --- -# 18. Placement 전체 파이프라인 (CV threshold + Detachment + LED) +# 18. Placement 전체 파이프라인 (2단계 순차 탐색 + CV) -### 원본: placement.py (원은지님, 2026-04-24) +### 대표님 요구사항 반영 (2026-04-27) ### 전체 흐름도 ``` Start Scanning (3초 간격 자동 반복) ↓ -[매 스캔] - ↓ -6채널 ADC 수신 (maa? → reb:×6 → raa:) +[매 스캔] 6채널 ADC 수신 → Detachment 체크 ↓ ┌───────────────────────────────────────┐ -│ 1. Detachment Detection │ -│ signal[20:80] - median([80:100]) │ +│ 0. Detachment Detection │ │ mean(|y|) < 100 AND std < 100? │ │ → YES: LED 4 (미부착) → 다음 스캔 │ └───────────────────────────────────────┘ ↓ NO (부착됨) -┌───────────────────────────────────────┐ -│ 2. Echo Analysis (6채널) │ -│ SG denoise → Low-echo detection │ -│ → ant/post wall 위치 (mm) │ -└───────────────────────────────────────┘ - ↓ -┌───────────────────────────────────────┐ -│ 3. CV Threshold (Center CH0~CH3) │ -│ depth_mm = (post-ant) × DPS × cos(θ)│ -│ CV = std(depths) / mean(depths) │ -│ CV ≤ 0.15? → PASS │ -└───────────────────────────────────────┘ - ↓ -┌───────────────────────────────────────┐ -│ 4. LR Deviation (CH4 vs CH5) │ -│ lr_dev = (depth4-depth5) / mean │ -│ |lr_dev| ≤ 0.15? → PASS │ -└───────────────────────────────────────┘ - ↓ -┌───────────────────────────────────────┐ -│ 5. 최종 판정 │ -│ CV PASS AND LR PASS │ -│ → YES: LED 6 (최적 위치) → Lock │ -│ → NO: LED 5 (탐색 중) │ -│ + 방향 가이드 │ -│ (MOVE UP/DOWN/LEFT/RIGHT) │ -│ + severity (slight/moderate/severe) │ -└───────────────────────────────────────┘ - ↓ -Threshold Relaxation (반복 시): - CV_thr = 0.15 + scanCount × 0.02 - → 오래 조절해도 안 되면 기준 완화 +╔═══════════════════════════════════════╗ +║ Step 1/3: 상하 탐색 (VERTICAL) ║ +║ ║ +║ 안내: "센서를 아래에서 위로 천천히 ║ +║ 이동하세요" ║ +║ ║ +║ CH3,2,1,0 low echo 검출 ║ +║ 조건: 3개 이상 + 크기 유사 ║ +║ 또는 3≥2≥1≥0 패턴 ║ +║ ║ +║ 미달 → "위로 이동" / "아래로 이동" ║ +║ PASS → Step 2로 자동 전환 ║ +╚═══════════════════════════════════════╝ + ↓ PASS +╔═══════════════════════════════════════╗ +║ Step 2/3: 좌우 탐색 (LATERAL) ║ +║ ║ +║ 안내: "센서를 좌우로 천천히 ║ +║ 이동하세요" ║ +║ ║ +║ CH4, CH5 대칭성 확인 ║ +║ |len4-len5| / max < 0.3 → 대칭 ║ +║ ║ +║ 미달 → "왼쪽으로" / "오른쪽으로" ║ +║ 상하 벗어남 → Step 1로 복귀 ║ +║ PASS → Step 3로 자동 전환 ║ +╚═══════════════════════════════════════╝ + ↓ PASS +╔═══════════════════════════════════════╗ +║ Step 3/3: 최종 Green (CV 확인) ║ +║ ║ +║ CV = std(depths) / mean(depths) ║ +║ CV ≤ threshold → Green! ║ +║ ║ +║ Threshold Relaxation (5회 단위): ║ +║ 1~5회: 0.15 ║ +║ 6~10회: 0.20 ║ +║ 11~15회: 0.25 ║ +║ 16+회: 0.30 (최대) ║ +║ ║ +║ CV 미달 → Step 1부터 다시 ║ +║ PASS → LED 6 (ALIGN_COMPLETE) + Lock ║ +╚═══════════════════════════════════════╝ + ↓ Green! +"Start Measurement" 버튼 활성화 +``` -Lock → "Start Measurement" 버튼 활성화 +### 패킷 드랍 대응 + +``` +maa? → reb 4개만 수신 (CH4,CH5 드랍) + → INCOMPLETE_SCAN 4/6 → 자동 retry (최대 2회) + → retry 후 6채널 수신 → 정상 진행 ``` ### BLE 디버그 로그 출력 예시 @@ -1280,7 +1296,7 @@ ADC 파싱 시 Big/Little Endian을 자동 감지: | Low-echo Detection (prominence + edge penalty) | ✅ 완료 | VALLEY_STOP=50, EDGE_DECAY=0.12 | | Frustum BV 추정 (6ch) | ✅ 완료 | center 4ch + lateral lr_ratio(≥1.0) | | lr_ratio 동적 계산 | ✅ 완료 | CH4/CH5 타원 추정, 하한 1.0 | -| Placement Guide (CV threshold) | ✅ 완료 | CV≤0.15 + LR dev≤0.15 + relaxation | +| Placement Guide 2단계 순차 | ✅ 완료 | 상하(3ch+크기)→좌우(대칭)→CV Green | | 미부착 감지 (DetachmentDetection) | ✅ 완료 | mean/std < 100 → LED 4 | | LED 모드 (mls?) BE 포맷 | ✅ 완료 | Placement 3단계 (4→5→6→0) | | BLE 자동 reconnect | ✅ 완료 | 무한 3초 재시도 + watchdog | @@ -1288,7 +1304,8 @@ ADC 파싱 시 Big/Little Endian을 자동 감지: | BLE 명령어 Endian 통일 | ✅ 완료 | 테스터 exe와 100% 동일 (BE+공백) | | 자동측정 (IMU 1s + 측정 10s) | ✅ 완료 | | | 런타임 캘리브레이션 | ✅ 완료 | Threshold 슬라이더 + DPS 직접입력 + SG 토글 | -| 도넛차트 실시간 ml | ✅ 완료 | lastVolumeMl 직접 표시 | +| 도넛차트 max volume 표시 | ✅ 완료 | maxVolumeMl 직접 표시 | +| 패킷 드랍 자동 retry | ✅ 완료 | 6ch 미만 수신 시 자동 재전송 (최대 2회) | | ADC CSV 저장 | ✅ 완료 | Downloads/VesiScan_ADC/일별.csv + 설정값 포함 | | Endian 감지 안정화 | ✅ 완료 | VBT=BE 기본, 애매한 경우 기기 기반 fallback | | Python ↔ Android 1:1 검증 | ✅ 완료 | 전수 상수 비교 |