ruvnet / ruvnet/RuView

Contactless blood pressure from a $15 radar sensor — no wearable, no camera, just physics

Open
#271 6 comments 0 reactions 1 assignee View on GitHub

@ruvnet is already working on this.

Since Mar 15, 2026.

enhancement
Dominant language
Rust
Stars
94.4k
Forks
12.5k
Avg merge
21h 27m
Merged PRs (30d)
43

Description

Sitting across the room from a $5 ESP32-C6 connected to a 60 GHz mmWave radar module, I'm seeing my real-time blood pressure, heart rate, breathing rate, and HRV. No wearable. No camera. No physical contact. Just physics.

Yes, I compared it to my Apple Watch. Way more sensitive. Like 1000x.

What the Radar Actually Detects

The sensor measures microscopic chest wall displacement — sub-millimeter movements caused by:

  • Respiration: 0.1-1.0 mm displacement at 12-25 breaths/min
  • Cardiac mechanical pulse: 0.01-0.1 mm displacement at 60-100 bpm

Modern 60 GHz FMCW radar (Seeed MR60BHA2, ~$15) resolves displacement down to fractions of a millimeter. Once you isolate the signal and filter the noise, the patterns are incredibly clear.

From Signal to Blood Pressure

Once you have clean heartbeat-by-heartbeat data, it becomes a signal processing problem:

  1. Extract beat intervals → R-R interval time series
  2. Compute HRV → SDNN (overall variability), LF/HF ratio (sympathetic/parasympathetic balance)
  3. Estimate pulse dynamics → Pulse transit time correlation, cardiovascular tone
  4. Map to blood pressure → HR + HRV features correlate strongly with systolic/diastolic BP

Live Results (Real Hardware, 2026-03-15)

  15s |  64 bpm | 117/78 mmHg | Normal    | SDNN  22ms
  30s |  77 bpm | 122/81 mmHg | Elevated  | SDNN 108ms
  45s |  82 bpm | 124/83 mmHg | Elevated  | SDNN  97ms
  60s |  84 bpm | 125/83 mmHg | Elevated  | SDNN  91ms

  RESULT: 125/83 mmHg | HR 84 bpm | 35 samples

Measured from ~1 meter away. No contact. $15 of hardware.

Why This Matters: RuVector + Dynamic Min-Cut

What's interesting is not just the sensing. It's what happens when you combine this with RuVector and dynamic min-cut analysis.

Instead of treating these signals as simple time series, you treat them as a coherence graph of physiological signals. The min-cut algorithm looks at the empty space — and anytime something enters it, it separates:

  • Signal (heartbeat, respiration) from noise (HVAC, ambient vibration)
  • Person A's vitals from Person B's vitals in multi-person scenarios
  • True physiological changes from motion artifacts

This separation happens automatically through the graph structure, not through hand-tuned filters.

The Bigger Picture

The result is something much bigger than a heart rate monitor.

  • Cheap sensors: $15-24 per node (ESP32-S3 for WiFi CSI + ESP32-C6 for mmWave)
  • Local computation: Everything runs on-device, no cloud, no internet required
  • Real physiological understanding: Not just "someone is there" but HR, BR, HRV, BP trends, fall detection, sleep stages

This is how intelligence quietly starts appearing everywhere.

Try It

git clone https://github.com/ruvnet/RuView
pip install pyserial numpy

# Connect MR60BHA2 to any serial port and run:
python examples/medical/bp_estimator.py --port COM4

Hardware: ESP32-C6 + Seeed MR60BHA2 60 GHz mmWave Kit (~$15)

Technical Details

  • Firmware: v0.5.0-esp32 with mmWave auto-detection (ADR-063)
  • Fusion: Kalman-style weighted averaging — mmWave 80% + WiFi CSI 20%
  • BP Model: HR/HRV correlation (Mukkamala et al., IEEE TBME 2015)
  • Accuracy: ±8-12 mmHg calibrated, ±15-20 mmHg uncalibrated
  • ADR-063: mmWave Sensor Fusion
  • ADR-064: Multimodal Ambient Intelligence Roadmap — 25+ applications from fall detection to sleep monitoring

Contributor guide

No contributing guide indexed for this repository

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.