feat: UWB follow-me system (#57) #66
Loading…
x
Reference in New Issue
Block a user
No description provided.
Delete Branch "sl-jetson/uwb-follow-me"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
Implements issue #57 — UWB follow-me system using 3× MaUWB ESP32-S3 DW3000 modules (2 anchors on robot stem, 1 tag on person).
New packages
saltybot_uwb_msgs(ament_cmake)UwbRange.msg— per-anchor TWR range measurement (anchor_id, range_m, raw_mm, rssi)UwbRangeArray.msg— published on/uwb/rangessaltybot_uwb(ament_python)ranging_math.py— puretriangulate_2anchor()(height-compensated 2-anchor geometry) +KalmanFilter2D(constant-velocity, numpy-free)uwb_driver_node.py— SerialReader background threads poll both anchors viaAT+RANGE?(115200 8N1), triangulate, Kalman-smooth, publish/uwb/target(PoseStamped in base_link) +/uwb/rangesconfig/uwb_config.yaml— anchor geometry, serial ports, Kalman tuninglaunch/uwb.launch.py— all params overridable at launch timetest/test_ranging_math.py— 16 tests (triangulation geometry + Kalman convergence)Updated
saltybot_followerperson_follower_node.py— addsfuse_targets()pure helper +/uwb/targetsubscriber (primary, default weight=0.7);/person/targetsecondary (weight=0.3); weighted blend when both fresh, graceful fallback to single source; new paramsuwb_weight+uwb_timeoutperson_follower_params.yaml—uwb_weight: 0.7,uwb_timeout: 1.0stest_person_follower.py— 7 newTestFuseTargetscases; 60 tests total, all passTest plan
pytest jetson/ros2_ws/src/saltybot_uwb/test/— 16 passpytest jetson/ros2_ws/src/saltybot_follower/test/— 60 passros2 launch saltybot_uwb uwb.launch.pyon Orin with anchors on USB/uwb/rangespublishes at 20Hz with both anchors active/uwb/targetx-position tracks person walking away/toward robotros2 launch saltybot_follower person_follower.launch.py— confirm fusion log: "Fusing UWB+camera" when both active🤖 Generated with Claude Code
New packages ------------ saltybot_uwb_msgs (ament_cmake) • UwbRange.msg — per-anchor range reading (anchor_id, range_m, raw_mm, rssi) • UwbRangeArray.msg — array of UwbRange published on /uwb/ranges saltybot_uwb (ament_python) • ranging_math.py — pure triangulate_2anchor() (height-compensated TWR geometry, 2-anchor intersection) + KalmanFilter2D (constant-velocity, numpy-free, 16 tests pass) • uwb_driver_node.py — SerialReader threads poll MaUWB ESP32-S3 DW3000 anchors via AT+RANGE?, triangulate, Kalman-smooth, publish /uwb/target (PoseStamped/base_link) + /uwb/ranges • config/uwb_config.yaml, launch/uwb.launch.py • test/test_ranging_math.py — 16 unit tests (triangulation + Kalman), all pass Updated saltybot_follower ------------------------- • person_follower_node.py — adds fuse_targets() pure helper + /uwb/target subscriber (primary, weight=0.7); /person/target secondary (weight=0.3); weighted blend when both fresh, graceful fallback to single source; new params uwb_weight + uwb_timeout • person_follower_params.yaml — uwb_weight: 0.7, uwb_timeout: 1.0s • test_person_follower.py — 7 new TestFuseTargets cases; total 60 pass Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>