For the core stacks (Nav2, MoveIt 2, ros2_control), the authoritative failure is the action result, not /rosout or /diagnostics. A MoveGroup / NavigateToPose abort emits no /rosout ERROR and there is no /diagnostics, so log- and diagnostic-based rules miss it entirely. Catch it generically via the goal-status channel.
Scope
- Discover every action via its
*/_action/status topic (action_msgs/msg/GoalStatusArray); rescan the graph for actions that appear later.
ABORTED (6) -> fault (default SEVERITY_ERROR); CANCELED (5) -> fault only if canceled_is_fault; SUCCEEDED (4) -> PASSED to heal the action's ABORTED code.
fault_code = <PREFIX>_<ACTION>_ABORTED; source_id = action name.
- Per-goal dedup keyed on
goal_id so a latched terminal status reports once.
- Reporter local filtering disabled for these terminal events (an abort is discrete, not flapping) so a single recovery heals reliably.
Acceptance
- An unreachable
MoveGroup / NavigateToPose goal produces ACTION_<name>_ABORTED CONFIRMED in list_faults, source = action name.
- A subsequent successful goal heals it to HEALED (FaultManager
healing_enabled).
- A MoveIt abort produces the action fault with zero
LOG_* faults present (the action channel is the only signal).
- Unit tests: action-name extraction from the status topic, fault_code, uuid/dedup.
For the core stacks (Nav2, MoveIt 2, ros2_control), the authoritative failure is the action result, not
/rosoutor/diagnostics. AMoveGroup/NavigateToPoseabort emits no/rosoutERROR and there is no/diagnostics, so log- and diagnostic-based rules miss it entirely. Catch it generically via the goal-status channel.Scope
*/_action/statustopic (action_msgs/msg/GoalStatusArray); rescan the graph for actions that appear later.ABORTED (6)-> fault (default SEVERITY_ERROR);CANCELED (5)-> fault only ifcanceled_is_fault;SUCCEEDED (4)-> PASSED to heal the action's ABORTED code.fault_code=<PREFIX>_<ACTION>_ABORTED;source_id= action name.goal_idso a latched terminal status reports once.Acceptance
MoveGroup/NavigateToPosegoal producesACTION_<name>_ABORTEDCONFIRMED inlist_faults,source= action name.healing_enabled).LOG_*faults present (the action channel is the only signal).