Skip to content

Track all components, but don't throw errors on unexpected change #2

@Nibanovic

Description

@Nibanovic

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions