Skip to content

Ghost person detection, FPS infinity, skeleton flickering and jumpy vitals with ESP32-S3 multi-node setup (edge-tier 1 & 2) #519

@kapilsoni2013

Description

@kapilsoni2013

Environment

  • Hardware: 3x ESP32-S3-WROOM (16MB Flash, 8MB PSRAM)
  • Firmware: v0.6.4-esp32
  • Server: ruvnet/wifi-densepose Docker (latest)
  • Host OS: macOS (MacBook Pro)
  • WiFi channel: 3 (locked via --channel 3)
  • Edge tier: 1 and 2 (both tested)
  • TDM: enabled (--tdm-slot 0/1/2 --tdm-total 3)
  • pres-thresh: 15, vital-win: 30, vital-int: 2, subk-count: 16
  • Docker env: CSI_SOURCE=esp32, MAX_FPS=10, MAX_PERSONS=1

Bugs observed

Bug 1 — Ghost person: 2 persons detected with only 1 person present

Occurs with 1 ESP32 and with 3 ESP32 nodes. Persists on both edge-tier 1 and edge-tier 2. MAX_PERSONS=1 Docker env var does not resolve it. Suspected cause: subcarrier group clustering splitting single person's reflections into 2 clusters (as noted in issue #104).

Bug 2 — FPS shows "Infinity" in UI with 3 ESP32 nodes

MAX_FPS=10 Docker env var fixes it with 1 node but not with 3 nodes. With 3 nodes active the frame flood overwhelms the rate limiter and FPS counter overflows to Infinity.

Bug 3 — Pose skeleton flickering too fast

Skeleton keypoints jump rapidly between positions making it impossible to track posture. Occurs on both edge-tier 1 and 2 with 3 nodes. TDM provisioning did not resolve this.

Bug 4 — Vitals (BR, HR) readings are very jumpy

Values change erratically every second even with --vital-win 30 and --vital-int 2. Not stable enough for real use. Tested with single stationary subject within 2m of ESP32.

Steps to reproduce

  1. Flash v0.6.4 firmware (8MB variant) to 3x ESP32-S3
  2. Provision each node separately (one at a time, unplugged others):
    python provision.py --port /dev/cu.usbmodem1101 \
      --ssid "SSID" --password "PWD" --target-ip 192.168.1.10 \
      --edge-tier 1 --channel 3 --node-id 1 \
      --tdm-slot 0 --tdm-total 3 \
      --pres-thresh 15 --vital-win 30 --vital-int 2 --subk-count 16
    
  3. Run Docker:
    docker run -e CSI_SOURCE=esp32 -e MAX_FPS=10 -e MAX_PERSONS=1 \
      -p 3000:3000 -p 3001:3001 -p 5005:5005/udp \
      ruvnet/wifi-densepose:latest
    
  4. Open http://localhost:3000/ui/index.html
  5. Stand alone in room with 3 ESP32s in 3 corners

Result: persons=2, FPS=Infinity, skeleton flickering, jumpy vitals

Serial log sample (1 node, edge-tier 1)

I (944120) csi_collector: CSI cb #18500: len=128 rssi=-58 ch=3
E (960790) task_wdt: Task watchdog got triggered.
E (960790) task_wdt:  - IDLE1 (CPU 1)
E (960790) task_wdt: CPU 1: edge_dsp
Backtrace: 0x4037890F:0x3FC9D6A0 0x4037746D:0x3FC9D6C0 0x4200D225:0x3FCC9F10
I (968100) csi_collector: CSI cb #18700: len=384 rssi=-52 ch=3

Questions for maintainers

  1. Is MAX_PERSONS=1 env var actually implemented in the server? (had no effect)
  2. Is there a server-side person deduplication setting for multi-node setups?
  3. What is the correct way to rate-limit WebSocket frame delivery to the UI?
  4. Is vital-win/vital-int smoothing applied server-side or only on ESP32?
  5. Is the task_wdt: edge_dsp watchdog fixed in v0.6.4 for edge-tier 1?

Expected vs actual

  • Expected: 1 person detected, stable ~10 FPS, smooth skeleton, stable vitals
  • Actual: 2 ghost persons, FPS=Infinity (3 nodes), flickering skeleton, jumpy vitals

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions