In the case like kuka robot_manager node, the lifecycle node is transitioning some components. This causes foreman to freak out with UNEXPECTED TRANSITION, even though we're not managing the kuka_cell_robot hardware. The state monitor listens to all components anyways, and logs unexpected changes if it ever moves from initial state it saw it in.
In the example config below, the idea is that the robot_manager transitions kuka_cell_robot hardware, along with all controllers it needs to transition. We just trigger the lifecycle node transition.
lifecycle_nodes:
- robot_manager
hardware:
- kuka_cell_gripper
controllers:
gripper:
requires: [kuka_cell_gripper, active]
gripper_break:
requires: [kuka_cell_gripper, active]
goal_states:
inactive:
controllers:
gripper: inactive
gripper_break: inactive
hardware:
kuka_cell_gripper: inactive
robot_manager: inactive
active:
controllers:
gripper: active
gripper_break: active
hardware:
kuka_cell_gripper: active
lifecycle_nodes:
robot_manager: active
To solve this,. with 8c96add, foreman ignores components not listed in scenario.yaml.
However, filtering untracked components like this feels wrong.
Problem discussion
- If we filter untracked components: We miss actual hardware crash monitoring.
- If we track everything: the engine aborts every time a valid lifecycle node command causes a secondary component to change state.
Currently, the engine assumes every un-commanded state change is a fault. We need the engine to tolerate cascading state changes without losing our ability to detect unexpected transitions.
How a solution would look like
in yaml config (parser.py & ParsedConfig), we have tracked_components, which tells us which components we monitor, and which we disregard. Now we want to:
- monitor all components we see on
activity topic, this is our source of truth, we don't filter this.
- for a component, we should be able to add a field, something like
monitor_unexpected_transition: false.
That way we get the following:
- we can have a lifecycle node like
robot_manager to manage nodes without foreman throwing a fit, and we can control the robot_manager
- we can list components which robot_manager controls as dependencies for other controllers
Basically, we want a field that says, for a specific component, we're okay with something other than Foreman changing its state, we won't panic.
In the case like kuka
robot_managernode, the lifecycle node is transitioning some components. This causes foreman to freak out withUNEXPECTED TRANSITION, even though we're not managing thekuka_cell_robothardware. The state monitor listens to all components anyways, and logs unexpected changes if it ever moves from initial state it saw it in.In the example config below, the idea is that the
robot_managertransitionskuka_cell_robothardware, along with all controllers it needs to transition. We just trigger the lifecycle node transition.To solve this,. with 8c96add, foreman ignores components not listed in
scenario.yaml.However, filtering untracked components like this feels wrong.
Problem discussion
Currently, the engine assumes every un-commanded state change is a fault. We need the engine to tolerate cascading state changes without losing our ability to detect unexpected transitions.
How a solution would look like
in yaml config (parser.py & ParsedConfig), we have
tracked_components, which tells us which components we monitor, and which we disregard. Now we want to:activitytopic, this is our source of truth, we don't filter this.monitor_unexpected_transition: false.That way we get the following:
robot_managerto manage nodes without foreman throwing a fit, and we can control the robot_managerBasically, we want a field that says, for a specific component, we're okay with something other than Foreman changing its state, we won't panic.