Source code for brom_drake.productions.roles.role
"""
Description:
This file defines a Role class that is used to populate the
production with ONLY systems that match the appropriate structure/signature.
"""
from dataclasses import dataclass
from typing import List
from pydrake.systems.framework import DiagramBuilder
from brom_drake.productions.roles.role_port_assignment import RolePortAssignment
# Internal Imports
from brom_drake.utils import Performer
[docs]
@dataclass
class Role:
"""
*Description*
This class defines a "slot" to be filled in a Drake Diagram.
A name is used for unique identification and a description is (optionally)
used to describe what is expected of a drake LeafSystem (or Diagram) that
properly "fills the role" (i.e., fills the slot) in a Drake Diagram.
*Parameters*
name: str
Unique identifier of the role.
description: str
Non-binding description of the role.
port_assignments: List[RolePortAssigment]
Each element of this list describes:
- an external target (e.g., `LeafSystems`) that the role expects to connect to
- the port on the ``LeafSystem`` that fills this role that should connect to that target.
*Usage*
Consider the following pieces of code: ::
from brom_drake.productions.roles import Role, RolePortAssignment
from brom_drake.productions.roles.role_port_assignment import PairingType
kGraspConfirmer = Role(
name="Confirm-When-Grasp-Worked",
description="Attempts to define with a boolean whether or not the object we're interested in is currently in our grasp.",
port_assignments=[
# Required inputs for Role
RolePortAssignment(
external_target_name="target_cube_pose",
performer_port_name="current_manipuland_pose",
pairing_type=PairingType.kInput
),
RolePortAssignment(
external_target_name="cube_model_idx",
performer_port_name="object_model_index",
pairing_type=PairingType.kInput
),
RolePortAssignment(
external_target_name="gripper_pose",
performer_port_name="gripper_pose",
pairing_type=PairingType.kInput,
),
RolePortAssignment(
external_target_name="production_gripper_model_idx",
performer_port_name="gripper_model_index",
pairing_type=PairingType.kInput
),
RolePortAssignment(
external_target_name="gripper_configuration",
performer_port_name="gripper_configuration",
pairing_type=PairingType.kInput,
),
# Output Of Role
RolePortAssignment(
external_target_name="grasp_complete",
performer_port_name="grasp_success_flag",
pairing_type=PairingType.kOutput,
)
]
)
The above example defines a Role with:
- name: ``"Confirm-When-Grasp-Worked"``
- Required Input Ports:
+ ``"current_manipuland_pose"``
+ ``"object_model_index"``
+ ``"gripper_pose"``
+ ``"gripper_model_index"``
+ ``"gripper_configuration"``
- Required Output Port:
+ ``"grasp_success_flag"``
- Required Ports to exist *somewhere else in the Diagram*:
+ ``"target_cube_pose"``
+ ``"cube_model_idx"``
+ ``"gripper_pose"``
+ ``"production_gripper_model_idx"``
+ ``"gripper_configuration"``
+ ``"grasp_complete"``
Without all of these satisfied, we can not successfully place
a `LeafSystem` into a Production that expects the ``"Confirm-When-Grasp-Worked"``
role.
"""
name: str
description: str
port_assignments: List[RolePortAssignment]
def __str__(self):
return self.name