docs: 런타임 캘리브레이션 + BLE Endian 통일 + 향후과제 업데이트

- 19. 런타임 캘리브레이션: Threshold/DPS 슬라이더, lr_ratio 하한
- 20. BLE Endian 통일: 테스터 exe 분석 결과 (BE 파라미터 + 공백)
- 21. 향후 과제: 20+ 완료 항목 업데이트

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-24 17:11:17 +09:00
parent f391f404b4
commit 36da75b1f0
+79 -14
View File
@@ -2,7 +2,7 @@
## 작성일: 2026-04-23
## 작성자: dwjang
## 마지막 업데이트: 2026-04-24
## 마지막 업데이트: 2026-04-24 (v2)
---
@@ -1111,27 +1111,92 @@ Lock → "Start Measurement" 버튼 활성화
---
# 19. 향후 과제
# 19. 런타임 캘리브레이션 (Settings 패널)
측정 화면 Settings(톱니바퀴)에서 실시간으로 조절 가능:
### Low Echo Threshold (주황색 슬라이더, 800~2000)
```
기본값: 1150
용도: low-echo 판정 임계값. 올리면 벽 경계를 더 일찍 잡음.
문제: CH4/CH5 lateral에서 threshold가 너무 낮으면 urine을 과도하게 잡음
→ len이 비정상적으로 길어짐 → lr_ratio 왜곡 → BV 과소평가
해결: threshold를 1200~1300으로 올려서 테스트
```
### Distance/Sample (초록색 슬라이더, 1.5~2.5mm)
```
기본값: 1.771 mm/sample
용도: ADC 샘플 1개당 물리적 거리. BV 계산에 직접 영향.
d_mm = delay_offset + sample_index × distance_per_sample
조절: 기기별 캘리브레이션 시 팬텀 실측값과 맞추기 위해 사용
```
### lr_ratio 하한 제한
```
lr_ratio = computeLrRatio(center, lateral)
result = max(lr_ratio, 1.0) ← 원형보다 좁은 단면 방지
문제: 500ml 팬텀에서 CH4/CH5 짧음 → lr=0.32 → 100ml 과소평가
수정: 하한 1.0 제한 → 정상 용적 출력
```
---
# 20. BLE 명령어 Endian 통일 (테스터 exe 분석)
### 테스터 코드 (vsbtester/ble.js buildPacket) 분석 결과
```javascript
// 파라미터 없는 명령: '?' 뒤에 공백 0x20 추가
if (payloadParams.length === 0) {
bytes.push(0x20);
}
// 파라미터 있는 명령: 16비트 Big Endian
for (const p of payloadParams) {
bytes.push((n >> 8) & 0xff); // High byte first
bytes.push(n & 0xff); // Low byte
}
// CRC: Little Endian
bytes.push(crc & 0xff);
bytes.push((crc >> 8) & 0xff);
```
### Android 통일 결과
| 명령 | 파라미터 | 포맷 | 함수 |
|------|---------|------|------|
| maa | 없음 | `maa? ` + CRC(LE) | buildCommandASCII(" ") |
| mbb | 없음 | `mbb? ` + CRC(LE) | buildCommandASCII(" ") |
| msp | 없음 | `msp? ` + CRC(LE) | buildCommandASCII(" ") |
| mid | 없음 | `mid? ` + CRC(LE) | buildCommandASCII(" ") |
| mpa | [freq,cyc] | `mpa?` + params(BE) + CRC(LE) | buildCommandBE |
| mec | [6개] | `mec?` + params(BE) + CRC(LE) | buildCommandBE |
| mls | [state] | `mls?` + [0x00,state](BE) + CRC(LE) | buildCommandBE |
| msn | [0] | `msn?` + [0x00,0x00](BE) + CRC(LE) | buildCommandBE |
---
# 21. 향후 과제
| 항목 | 상태 | 비고 |
|------|------|------|
| BLE 6채널 수신 | ✅ 완료 | |
| Low-echo Detection (prominence + edge penalty) | ✅ 완료 | VALLEY_STOP=50, EDGE_DECAY=0.12 |
| Frustum BV 추정 (6ch) | ✅ 완료 | center 4ch + lateral lr_ratio |
| lr_ratio 동적 계산 | ✅ 완료 | CH4/CH5 타원 추정 |
| Placement Guide (CV threshold) | ✅ 완료 | CV≤0.15 + LR dev≤0.15 |
| 기기 자동 감지 (V0/V1/V2) | ✅ 완료 | Snell's law 각도 |
| Big Endian 자동 감지 | ✅ 완료 | |
| 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 |
| 미부착 감지 (DetachmentDetection) | ✅ 완료 | mean/std < 100 → LED 4 |
| LED 모드 (mls?) BE 포맷 | ✅ 완료 | Placement 3단계 (4→5→6→0) |
| BLE 자동 reconnect | ✅ 완료 | 무한 3초 재시도 + watchdog |
| BLE 디버그 로거 | ✅ 완료 | TX/RX 파싱 + Downloads 내보내기 |
| ADC 로그 저장 | ✅ 완료 | 6ch raw ADC → JSONL |
| 기기 정보 조회 (mid?) | ✅ 완료 | 연결 시 자동 (HW/SN/FW) |
| 미부착 감지 (DetachmentDetection) | ✅ 완료 | mean/std < 100 → LED 4 |
| LED 모드 (mls?) | ✅ 완료 | Placement 3단계 (4→5→6→0) |
| IMU 쿼리 (msp?) | ✅ 완료 | 1초 간격, 자동측정 루프 |
| BLE 명령어 Endian 통일 | ✅ 완료 | 테스터 exe와 100% 동일 (BE+공백) |
| 자동측정 (IMU 1s + 측정 10s) | ✅ 완료 | |
| iOS 동기화 (UI) | ✅ 완료 | 알림, Quick Save, 일지 |
| 배터리 폴링 5초 | ✅ 완료 | keep-alive |
| 런타임 캘리브레이션 | ✅ 완료 | Threshold + DPS 슬라이더 |
| 도넛차트 실시간 ml | ✅ 완료 | lastVolumeMl 직접 표시 |
| Python ↔ Android 1:1 검증 | ✅ 완료 | 전수 상수 비교 |
| 금요일 APK 배포 | 🔜 예정 | Gitea 릴리즈 |
| mbb 전체측정 전환 | 🔜 예정 | rbb: 헤더 파싱 검증 후 |