|
|
d57c0bd51d
|
feat: VESC CAN health monitor (Issue #651)
New package: saltybot_vesc_health
- recovery_fsm.py: pure state machine (no ROS2/CAN deps; fully unit-tested)
- VescHealthState: HEALTHY → DEGRADED (>500 ms) → ESTOP (>2 s) / BUS_OFF
- VescMonitor.tick(): drives recovery sequence per VESC; startup-safe
- VescMonitor.on_frame(): resets state on CAN frame arrival
- VescMonitor.on_bus_off/on_bus_ok(): bus-off override + recovery
- HealthFsm: dual-VESC wrapper aggregating both monitors
- health_monitor_node.py: ROS2 node
- Subscribes /vesc/left/state + /vesc/right/state (JSON from vesc_telemetry)
- Sends GET_VALUES alive frames via SocketCAN on DEGRADED state
- Publishes /vesc/health (JSON, 10 Hz) — state, elapsed, recent faults
- Publishes /diagnostics (DiagnosticArray, OK/WARN/ERROR per VESC)
- Publishes /estop (JSON event) + zero /cmd_vel on e-stop trigger/clear
- Polls ip link for bus-off state (1 Hz)
- 200-entry fault event log included in /vesc/health
- test/test_vesc_health.py: 39 unit tests, all passing, no hardware needed
- config/vesc_health_params.yaml, launch/vesc_health.launch.py
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-03-18 08:03:19 -04:00 |
|