2 Commits

Author SHA1 Message Date
a00dbe6429 feat: UWB follow-me system (#57) — saltybot_uwb package + sensor fusion
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>
2026-03-01 00:48:03 -05:00
432d5cb267 feat: person-following control loop (Phase 2b)
Adds saltybot_follower ROS2 package — proportional person-following
controller that bridges sl-jetson's /person/target detections to Nav2
/cmd_vel, with the cmd_vel_bridge_node (PR #46) providing safety wrapping.

Controller features:
  - Proportional control: linear.x ∝ distance error, angular.z ∝ bearing
  - Follow distance: 1.5m default with ±0.3m dead zone (no jitter at target)
  - Max speed: 0.5 m/s linear, 1.0 rad/s angular (conservative for balance)
  - Obstacle override: zeroes forward cmd_vel when Nav2 local costmap
    detects obstacle in forward corridor; turning still allowed
  - Lost-target state machine:
      FOLLOWING  → person visible
      STOPPING   → lost > 2s, publish zero
      SEARCHING  → lost > 5s, slow rotation (0.3 rad/s) to re-acquire
  - Mode integration: follow_enabled param (toggle via ros2 param set)
    independently gates the controller; cmd_vel bridge gates on md=2

Deliverables:
  saltybot_follower/person_follower_node.py   — ROS2 node (314 lines)
  config/person_follower_params.yaml          — all params documented
  launch/person_follower.launch.py            — all params as launch args
  test/test_person_follower.py                — 53 pytest tests, no ROS2
  package.xml / setup.py / setup.cfg          — package metadata

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-28 23:22:49 -05:00