What's Changed
Cross-Node Mesh Fusion
- RSSI-weighted feature fusion across multiple ESP32 nodes — closer node gets higher weight
- DynamicMinCut person separation via
ruvector_mincuton subcarrier temporal correlation graph - RSSI-based skeleton position tracking — walk between nodes and the skeleton follows
- Motion-responsive skeleton — arm swing (0-80px), leg kick (0-50px), walking bob, head nod all driven by real CSI data
Per-Node State (ADR-068)
- Each ESP32 gets independent classification, vitals, person count
- Stale node eviction after 60s inactivity
- Multi-node aggregation: max(per_node_counts)
RuVector Signal Processing (Phases 1-3)
- Subcarrier importance weighting via mincut partition
- Temporal EMA keypoint smoothing with coherence gating
- Skeleton kinematic constraints (Jakobsen relaxation, 12-bone COCO-17 tree)
- Compressed pose history for trajectory matching
Smoothing & Quality
- Client-side lerp interpolation (alpha=0.15) for fluid skeleton
- Server EMA (alpha=0.15) for temporal blending
- Dampened procedural animation, recalibrated for real ESP32 data
- Vital sign filtering: larger median window (31), faster EMA, looser jump filter
Hardware Benchmarks (2 ESP32 nodes, 30s)
| Metric | v0.5.2 (baseline) | v0.5.3 (fusion) | Improvement |
|---|---|---|---|
| Keypoint jitter | std=4.5px | std=1.3px | -72% |
| Feature noise | 109.4 | 77.6 | -29% |
| Feature stability | std=154.1 | std=105.4 | -32% |
| Confidence | 0.643 | 0.686 | +7% |
| Presence accuracy | 93.4% | 94.6% | +1.3pp |
Bug Fixes
- RSSI byte offset (#332), stack overflow, stale node leak, unsafe pointer removed
- Person count: sum→max aggregation, recalibrated thresholds
- Firmware CI: IDF v5.4, xxd→od
Binaries
| File | Flash Size | Description |
|---|---|---|
esp32-csi-node.bin
| 8MB | Main firmware |
esp32-csi-node-4mb.bin
| 4MB | For 4MB flash boards |
bootloader.bin
| — | Bootloader |
partition-table.bin
| 8MB | Partition table |
partition-table-4mb.bin
| 4MB | Partition table (4MB) |
ota_data_initial.bin
| — | OTA data |
Full Changelog: v0.5.2-esp32...v0.5.3-esp32