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>
28 lines
878 B
Python
28 lines
878 B
Python
from setuptools import setup
|
|
|
|
package_name = "saltybot_follower"
|
|
|
|
setup(
|
|
name=package_name,
|
|
version="0.1.0",
|
|
packages=[package_name],
|
|
data_files=[
|
|
("share/ament_index/resource_index/packages", [f"resource/{package_name}"]),
|
|
(f"share/{package_name}", ["package.xml"]),
|
|
(f"share/{package_name}/launch", ["launch/person_follower.launch.py"]),
|
|
(f"share/{package_name}/config", ["config/person_follower_params.yaml"]),
|
|
],
|
|
install_requires=["setuptools"],
|
|
zip_safe=True,
|
|
maintainer="sl-controls",
|
|
maintainer_email="sl-controls@saltylab.local",
|
|
description="Proportional person-following controller for saltybot",
|
|
license="MIT",
|
|
tests_require=["pytest"],
|
|
entry_points={
|
|
"console_scripts": [
|
|
"person_follower_node = saltybot_follower.person_follower_node:main",
|
|
],
|
|
},
|
|
)
|