feat: Diagnostics aggregator — unified health dashboard (Issue #658) #665

Closed
sl-jetson wants to merge 0 commits from sl-firmware/issue-658-diagnostics-aggregator into main
Collaborator

Summary

  • New ROS2 package saltybot_diagnostics_aggregator subscribing to 5 telemetry/diagnostics topics and aggregating into /saltybot/system_health JSON at 1 Hz
  • Tracks 8 subsystems: motors, battery, imu, uwb, lidar, camera, can_bus, estop
  • Logs state transitions with ISO-8601 timestamps; keeps last 50 in memory, last 10 in JSON payload
  • Pure-logic subsystem.py module (no ROS2 dependency) enables fast unit testing
  • 46 unit tests, all passing

Closes

Issue #658

Packages

File Purpose
subsystem.py SubsystemState, worse(), ros_level_to_status(), keyword routing
aggregator_node.py ROS2 node, subscriptions, 1 Hz heartbeat, JSON publish
test/test_aggregator.py 46 unit tests — no rclpy required
config/aggregator_params.yaml Default parameters
launch/diagnostics_aggregator.launch.py Launch file
## Summary - New ROS2 package `saltybot_diagnostics_aggregator` subscribing to 5 telemetry/diagnostics topics and aggregating into `/saltybot/system_health` JSON at 1 Hz - Tracks 8 subsystems: motors, battery, imu, uwb, lidar, camera, can_bus, estop - Logs state transitions with ISO-8601 timestamps; keeps last 50 in memory, last 10 in JSON payload - Pure-logic `subsystem.py` module (no ROS2 dependency) enables fast unit testing - 46 unit tests, all passing ## Closes Issue #658 ## Packages | File | Purpose | |------|---------| | `subsystem.py` | `SubsystemState`, `worse()`, `ros_level_to_status()`, keyword routing | | `aggregator_node.py` | ROS2 node, subscriptions, 1 Hz heartbeat, JSON publish | | `test/test_aggregator.py` | 46 unit tests — no rclpy required | | `config/aggregator_params.yaml` | Default parameters | | `launch/diagnostics_aggregator.launch.py` | Launch file |
sl-jetson added 1 commit 2026-03-17 11:40:54 -04:00
New saltybot_diagnostics_aggregator ROS2 package — unified health dashboard
aggregating telemetry into /saltybot/system_health JSON at 1 Hz.

Subscribes to /vesc/health, /diagnostics, /saltybot/safety_zone/status,
/saltybot/pose/status, /saltybot/uwb/status. Tracks 8 subsystems:
motors, battery, imu, uwb, lidar, camera, can_bus, estop.

- subsystem.py: SubsystemState, stale detection, transition log, severity
  ranking, keyword→subsystem routing (no ROS2 dependency)
- aggregator_node.py: ROS2 node, 1 Hz heartbeat, overall_status rollup,
  last_error field, 50-entry transition ring buffer
- test_aggregator.py: 46 unit tests, all passing
- config/aggregator_params.yaml, launch file

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
sl-jetson force-pushed sl-firmware/issue-658-diagnostics-aggregator from cd263c385d to 4f3a30d871 2026-03-18 07:57:47 -04:00 Compare
sl-jetson closed this pull request 2026-03-18 07:58:39 -04:00

Pull request closed

Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: seb/saltylab-firmware#665
No description provided.