feat(uwb): MaUWB ESP32-S3 DW3000 dual-anchor bearing driver (Issue #90) #99

Merged
sl-jetson merged 1 commits from sl-firmware/uwb-integration into main 2026-03-01 23:30:14 -05:00
Collaborator

Summary

Closes #90 — UWB integration: MaUWB ESP32-S3 DW3000 serial/USB driver on Orin.

Changes

saltybot_uwb_msgs

  • New UwbBearing.msg — 10 Hz Kalman-fused bearing estimate
  • UwbRange.msg — add tag_id field for enrolled-person attribution
  • CMakeLists.txt — register UwbBearing.msg

saltybot_uwb

  • ranging_math.py — add bearing_from_pos(x, y) helper (atan2, -π..+π)
  • uwb_driver_node.py — dual-rate: 100 Hz /uwb/ranges + 10 Hz /uwb/bearing; tag pairing via enrolled_tag_ids; AT+RANGE_ADDR on connect
  • uwb_config.yamlrange_rate / bearing_rate / enrolled_tag_ids params
  • uwb.launch.py — expose new params as launch args
  • test_ranging_math.py — 7 new bearing_from_pos unit tests

Test plan

  • pytest jetson/ros2_ws/src/saltybot_uwb/test/test_ranging_math.py passes
  • /uwb/ranges publishes at 100 Hz with both anchors connected
  • /uwb/bearing publishes at 10 Hz; confidence drops to 0.5 on single anchor
  • enrolled_tag_ids filter drops non-enrolled tags

🤖 Generated with Claude Code

## Summary Closes #90 — UWB integration: MaUWB ESP32-S3 DW3000 serial/USB driver on Orin. ### Changes **`saltybot_uwb_msgs`** - New `UwbBearing.msg` — 10 Hz Kalman-fused bearing estimate - `UwbRange.msg` — add `tag_id` field for enrolled-person attribution - `CMakeLists.txt` — register `UwbBearing.msg` **`saltybot_uwb`** - `ranging_math.py` — add `bearing_from_pos(x, y)` helper (atan2, -π..+π) - `uwb_driver_node.py` — dual-rate: 100 Hz `/uwb/ranges` + 10 Hz `/uwb/bearing`; tag pairing via `enrolled_tag_ids`; `AT+RANGE_ADDR` on connect - `uwb_config.yaml` — `range_rate` / `bearing_rate` / `enrolled_tag_ids` params - `uwb.launch.py` — expose new params as launch args - `test_ranging_math.py` — 7 new bearing_from_pos unit tests ## Test plan - [ ] `pytest jetson/ros2_ws/src/saltybot_uwb/test/test_ranging_math.py` passes - [ ] `/uwb/ranges` publishes at 100 Hz with both anchors connected - [ ] `/uwb/bearing` publishes at 10 Hz; confidence drops to 0.5 on single anchor - [ ] `enrolled_tag_ids` filter drops non-enrolled tags 🤖 Generated with [Claude Code](https://claude.com/claude-code)
sl-firmware added 1 commit 2026-03-01 23:25:46 -05:00
## Summary
- saltybot_uwb_msgs: add UwbBearing.msg, add tag_id to UwbRange.msg,
  register UwbBearing in CMakeLists.txt
- ranging_math.py: add bearing_from_pos(x, y) helper (atan2-based)
- uwb_driver_node.py: dual-rate architecture
    • 100 Hz /uwb/ranges  — raw TWR ranges with tag_id attribution
    • 10 Hz  /uwb/bearing — Kalman-fused bearing + range estimate
    • enrolled_tag_ids parameter for tag pairing filter
    • AT+RANGE_ADDR=<tag> pairing command on connect
- uwb_config.yaml: range_rate / bearing_rate / enrolled_tag_ids params
- uwb.launch.py: expose new params as launch arguments
- test_ranging_math.py: 7 new bearing_from_pos unit tests

Closes #90

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
sl-jetson merged commit 54e9274405 into main 2026-03-01 23:30:13 -05:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: seb/saltylab-firmware#99
No description provided.