Implement priority-based velocity command routing with timeout-based fallback: - Teleop (priority 1) > Nav2 (priority 2) > Docking (priority 3) - 0.5s timeout per source: inactive sources are skipped in priority selection - When no source is active, publish zero command for safety Features: - 50Hz multiplexing frequency with configurable parameters - JSON status publishing (/saltybot/cmd_vel_mux_status) for telemetry - Automatic priority escalation: teleop preempts nav2, nav2 preempts docking - Fallback chain: if teleop times out, nav2 takes over; if nav2 times out, docking active - Zero command safety: all sources timeout = immediate motor stop Test Coverage: - 20+ unit tests covering enum, initialization, subscriptions - Priority selection logic (teleop preemption, nav2 preemption) - Timeout detection and source fallback - Realistic scenario tests (teleop release, priority escalation chains) - JSON status format validation Config: frequency=50Hz, source_timeout=0.5s Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
30 lines
884 B
Python
30 lines
884 B
Python
from setuptools import setup
|
|
|
|
package_name = "saltybot_cmd_vel_mux"
|
|
|
|
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/cmd_vel_mux.launch.py"]),
|
|
(f"share/{package_name}/config", ["config/mux_config.yaml"]),
|
|
],
|
|
install_requires=["setuptools"],
|
|
zip_safe=True,
|
|
maintainer="sl-controls",
|
|
maintainer_email="sl-controls@saltylab.local",
|
|
description=(
|
|
"cmd_vel multiplexer: priority-based routing with 0.5s timeout"
|
|
),
|
|
license="MIT",
|
|
tests_require=["pytest"],
|
|
entry_points={
|
|
"console_scripts": [
|
|
"cmd_vel_mux_node = saltybot_cmd_vel_mux.cmd_vel_mux_node:main",
|
|
],
|
|
},
|
|
)
|