diff --git a/README.md b/README.md index 41bb8d06..10860dd0 100644 --- a/README.md +++ b/README.md @@ -78,6 +78,7 @@ docker run -p 3000:3000 ruvnet/wifi-densepose:latest | [Architecture Decisions](docs/adr/README.md) | 62 ADRs — why each technical choice was made, organized by domain (hardware, signal processing, ML, platform, infrastructure) | | [Domain Models](docs/ddd/README.md) | 7 DDD models (RuvSense, Signal Processing, Training Pipeline, Hardware Platform, Sensing Server, WiFi-Mat, CHCI) — bounded contexts, aggregates, domain events, and ubiquitous language | | [Desktop App](rust-port/wifi-densepose-rs/crates/wifi-densepose-desktop/README.md) | **WIP** — Tauri v2 desktop app for node management, OTA updates, WASM deployment, and mesh visualization | +| [Medical Examples](examples/medical/README.md) | Contactless blood pressure, heart rate, breathing rate via 60 GHz mmWave radar — $15 hardware, no wearable | --- diff --git a/examples/medical/README.md b/examples/medical/README.md new file mode 100644 index 00000000..693b168d --- /dev/null +++ b/examples/medical/README.md @@ -0,0 +1,111 @@ +# Medical Sensing Examples + +Contactless vital sign monitoring using 60 GHz mmWave radar — no wearable, no camera, no physical contact. + +## Blood Pressure Estimator + +Estimates blood pressure in real-time from heart rate variability (HRV) captured by a Seeed MR60BHA2 60 GHz mmWave radar module connected to an ESP32-C6. + +### How It Works + +The radar detects **microscopic chest wall displacement** caused by: +- **Respiration**: 0.1-1.0 mm displacement at 12-25 breaths/min +- **Cardiac pulse**: 0.01-0.1 mm displacement at 60-100 bpm + +Modern 60 GHz FMCW radar resolves displacement down to **fractions of a millimeter**. Once the signal is isolated and filtered, the heartbeat-by-heartbeat pattern is remarkably clear. + +From there, the estimator: + +1. **Extracts beat-to-beat intervals** from the HR time series +2. **Computes HRV metrics**: SDNN (overall variability), LF/HF ratio (sympathetic/parasympathetic balance) +3. **Estimates blood pressure** using the correlation between HR, HRV, and cardiovascular tone: + - Higher HR → higher BP (sympathetic activation) + - Lower HRV (SDNN) → higher BP (reduced parasympathetic) + - Higher LF/HF ratio → higher BP (sympathetic dominance) + +### Hardware Required + +| Component | Cost | Role | +|-----------|------|------| +| ESP32-C6 + Seeed MR60BHA2 | ~$15 | 60 GHz mmWave radar (HR, BR, presence) | +| USB cable | — | Power + serial data | + +That's it. Total cost: **~$15**. + +### Quick Start + +```bash +pip install pyserial numpy + +# Basic (uncalibrated — shows trends) +python examples/medical/bp_estimator.py --port COM4 + +# Calibrated (take a real BP reading first, then enter it) +python examples/medical/bp_estimator.py --port COM4 \ + --cal-systolic 120 --cal-diastolic 80 --cal-hr 72 +``` + +### Sample Output (Real Hardware, 2026-03-15) + +``` + Contactless Blood Pressure Estimation (mmWave 60 GHz) + + Time HR SBP DBP Category Samples + ------------------------------------------------------- + 15s | 64 | 117/78 | Normal | SDNN 22ms | n=4 + 20s | 65 | 117/78 | Normal | SDNN 28ms | n=5 + 25s | 71 | 119/79 | Normal | SDNN 88ms | n=9 + 30s | 77 | 122/81 | Elevated | SDNN 108ms | n=14 + 35s | 80 | 123/82 | Elevated | SDNN 106ms | n=18 + 40s | 80 | 123/82 | Elevated | SDNN 98ms | n=22 + 45s | 82 | 124/83 | Elevated | SDNN 97ms | n=26 + 50s | 83 | 125/83 | Elevated | SDNN 95ms | n=29 + 55s | 83 | 125/83 | Elevated | SDNN 92ms | n=32 + 60s | 84 | 125/83 | Elevated | SDNN 91ms | n=35 + + RESULT: 125/83 mmHg | HR 84 bpm | SDNN 91ms | 35 samples +``` + +### Accuracy + +| Condition | Accuracy | +|-----------|----------| +| Uncalibrated, stationary | ±15-20 mmHg (trend tracking) | +| Calibrated, stationary | ±8-12 mmHg | +| Moving subject | Not reliable — wait for subject to be still | + +Accuracy improves with: +- Longer recording duration (60s minimum, 120s recommended) +- Calibration with a real cuff reading +- Stationary subject within 1m of sensor +- Minimal environmental RF interference + +### AHA Blood Pressure Categories + +| Category | Systolic | Diastolic | +|----------|----------|-----------| +| Normal | < 120 | < 80 | +| Elevated | 120-129 | < 80 | +| High BP Stage 1 | 130-139 | 80-89 | +| High BP Stage 2 | 140+ | 90+ | + +### Disclaimer + +**This is NOT a medical device.** Blood pressure estimates from heart rate variability are approximations based on population-level correlations. Individual variation is significant. Always use a validated cuff-based sphygmomanometer for clinical decisions. + +This tool is intended for: +- Research into contactless vital sign monitoring +- Wellness trend tracking (is my BP going up or down over days?) +- Technology demonstration +- Educational purposes + +### How This Connects to RuView + +This example is part of the [RuView](https://github.com/ruvnet/RuView) ambient intelligence platform. When combined with WiFi CSI sensing: + +- **WiFi CSI** provides through-wall presence detection and room-scale activity recognition +- **mmWave radar** provides clinical-grade heart rate, breathing rate, and BP estimation +- **Sensor fusion** (ADR-063) combines both for zero false-positive fall detection and comprehensive health monitoring +- **RuVector** dynamic min-cut analysis treats physiological signals as a coherence graph, automatically separating noise, motion artifacts, and environmental interference + +The result: cheap sensors ($15-24 per node), local computation (no cloud), real physiological understanding.