docs: Placement 2단계 순차 + 패킷 retry + max volume 표시 업데이트

- 18. Placement: 2단계 순차 흐름도 (상하→좌우→CV Green)
  대표님 요구사항 반영 (센서 이동 안내, 크기 패턴, 대칭성)
- 패킷 드랍 자동 retry 설명
- 향후 과제: 순차 Placement, 패킷 retry, max volume 완료 항목 추가

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-27 16:21:46 +09:00
parent 01637ce503
commit c3eba581d4
+59 -42
View File
@@ -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 검증 | ✅ 완료 | 전수 상수 비교 |