embodichain.lab.sim.atomic_actions.primitives

Contents

embodichain.lab.sim.atomic_actions.primitives#

Built-in atomic action primitive implementations.

Classes:

AssembleGoal

Place a held assemble object onto a base object at a relative pose.

AxisAlign

Grasp an object and align its local axis to a world axis.

AxisAlignGoal

Object whose local axis should be aligned after an antipodal grasp.

AxisAlignOptions

Per-invocation grasp-and-axis-alignment behavior.

CoordinatedPickGoal

Object-centric target for picking and moving one object with two hands.

CoordinatedPickment

Pick and move a single object pinched by two hands.

CoordinatedPickmentOptions

Per-invocation coordinated pickup behavior.

CoordinatedPlacement

Coordinate two held objects: support object below, placing object above.

CoordinatedPlacementGoal

Object-centric target for dual-arm coordinated placement.

CoordinatedPlacementOptions

Per-invocation coordinated placement behavior.

EndEffectorPoseGoal

End-effector pose goal with optional batched intermediate waypoints.

GraspGoal

Pickup target with an affordance-selected or supplied grasp pose.

HandOver

Pick an object with the nearer arm, hand it over, and place it.

HandOverGoal

Object to pick and hand over, plus its final object pose.

HandOverOptions

Per-invocation pick-up, handover, and placement behavior.

HeldObjectPoseGoal

Desired pose for the object held by this action's control part.

JointPositionGoal

Explicit or named joint-space goal for a bound robot resource.

MoveEndEffector

Plan a free-space move for a bound manipulator.

MoveEndEffectorOptions

Per-invocation behavior for MoveEndEffector.

MoveHeldObject

Move the held object to the exact target object pose with a closed hand.

MoveHeldObjectOptions

Per-invocation held-object transport behavior.

MoveJoints

Plan joint motion from the observed state to one or more waypoints.

MoveJointsOptions

Per-invocation behavior for MoveJoints.

OpenDoor

Approach, grasp, rotate a door about its hinge, release, and retract.

OpenDoorGoal

Door handle and desired absolute opening state.

OpenDoorOptions

Per-invocation approach, interpolation, release, and retract behavior.

PickUp

Approach a grasp pose, close the gripper, lift.

PickUpOptions

Per-invocation pickup behavior.

Place

Lower the held object to a place pose, open the gripper, retract.

PlaceGoal

End-effector release-pose target used by Place.

PlaceOptions

Per-invocation placement behavior.

Pour

Rotate and return an exclusively held object about its internal axis.

PourGoal

Rotate the object currently held by the bound manipulator.

PourOptions

Per-invocation pouring behavior.

Press

Open-loop motion primitive that approaches, presses, and retracts.

PressGoal

Target object described by a press affordance.

PressOptions

Per-invocation pressing behavior.

PushObject

Close the end effector, contact a rigid object, and push it in-plane.

PushObjectGoal

Push one rigid object toward a target pose on the target support plane.

PushObjectOptions

Per-invocation planar pushing behavior.

PushObjectToolCalibration

End-effector calibration selected by a bound motion control part.

Slide

Open-loop approach, grasp, and axis-constrained sliding motion.

SlideGoal

Translating articulation link described by a slide affordance.

SlideOptions

Per-invocation sliding behavior for a translating articulation link.

Twist

Open-loop approach, grasp, twist, release, and retract motion.

TwistGoal

Target object described by a twist affordance.

TwistOptions

Per-invocation twisting behavior.

Data:

BUILTIN_ACTION_TYPES

Built-in action implementations instantiated once per action engine.

class embodichain.lab.sim.atomic_actions.primitives.AssembleGoal[source]

Place a held assemble object onto a base object at a relative pose.

The base object pose is a late-bound SceneEntityPose. The assemble object’s target pose is base_pose @ assemble_to_base_pose. The held-object transform (object_to_eef) is read from PlanningContext for the place control part, which a prior PickUp populates.

Methods:

__init__(affordance, base_pose)

Attributes:

affordance

Assembly affordance anchoring the assemble object to the base object.

base_pose

Late-bound base-object pose used for snapshot-consistent planning.

__init__(affordance, base_pose)
affordance: AssembleAffordance

Assembly affordance anchoring the assemble object to the base object.

base_pose: SceneEntityPose

Late-bound base-object pose used for snapshot-consistent planning.

class embodichain.lab.sim.atomic_actions.primitives.AxisAlign[source]

Grasp an object and align its local axis to a world axis.

Classes:

GoalType

alias of AxisAlignGoal

OptionsType

alias of AxisAlignOptions

Attributes:

binding_contract

Explicit robot-independent requirements for semantic discovery.

open_loop

Whether the skill intentionally declares no verified physical effect.

skill_id

Stable registry identifier for this skill.

GoalType

alias of AxisAlignGoal

OptionsType

alias of AxisAlignOptions

binding_contract: ClassVar[SkillBindingContract] = SkillBindingContract(slots=(SkillResourceSlot(slot_id='primary', endpoints=(SkillEndpointRequirement(endpoint_id='motion', capabilities=frozenset({'kinematics.forward', 'motion.cartesian_pose'}), required_commands=mappingproxy({})), SkillEndpointRequirement(endpoint_id='grasp', capabilities=frozenset({'interaction.grasp'}), required_commands=mappingproxy({'open': <class 'embodichain.lab.sim.atomic_actions.control.JointPositionCommand'>, 'grasp': <class 'embodichain.lab.sim.atomic_actions.control.JointPositionCommand'>}))), constraints=(DisjointSlotEndpoints(endpoint_ids=('motion', 'grasp')),)),), constraints=())

Explicit robot-independent requirements for semantic discovery.

Concrete action classes must declare this attribute in their own class body to opt into the semantic catalog. Inheriting another action’s contract does not silently expose a new skill identifier.

open_loop: ClassVar[bool] = True

Whether the skill intentionally declares no verified physical effect.

skill_id: ClassVar[str] = 'axis_align'

Stable registry identifier for this skill.

class embodichain.lab.sim.atomic_actions.primitives.AxisAlignGoal[source]

Object whose local axis should be aligned after an antipodal grasp.

Methods:

__init__(semantics[, grasp_xpos])

Attributes:

grasp_xpos

Optional explicit end-effector grasp pose; omitted poses are sampled.

__init__(semantics, grasp_xpos=None)
grasp_xpos: Tensor | SceneEntityPose | None

Optional explicit end-effector grasp pose; omitted poses are sampled.

class embodichain.lab.sim.atomic_actions.primitives.AxisAlignOptions[source]

Per-invocation grasp-and-axis-alignment behavior.

Methods:

__init__([hand_interp_steps, ...])

Attributes:

target_axis

Desired world-frame axis, shape (3,) or (B, 3).

__init__(hand_interp_steps=5, grasp_settle_steps=0, pick_object_part='center', lift_height=0.1, pre_grasp_distance=0.15, approach_direction=tensor([0., 0., -1.]), approach_alignment_max_angle=None, downstream_object_target_poses=(), obj_upright_direction=None, rotate_upright=None, grasp_frame_to_eef=tensor([[1., 0., 0., 0.], [0., 1., 0., 0.], [0., 0., 1., 0.], [0., 0., 0., 1.]]), fixed_object_to_eef=None, target_axis=tensor([0., 0., 1.]))
target_axis: Tensor

Desired world-frame axis, shape (3,) or (B, 3).

embodichain.lab.sim.atomic_actions.primitives.BUILTIN_ACTION_TYPES: tuple[type[AtomicAction], ...] = (<class 'embodichain.lab.sim.atomic_actions.primitives.move_end_effector.MoveEndEffector'>, <class 'embodichain.lab.sim.atomic_actions.primitives.move_joints.MoveJoints'>, <class 'embodichain.lab.sim.atomic_actions.primitives.pick_up.PickUp'>, <class 'embodichain.lab.sim.atomic_actions.primitives.axis_align.AxisAlign'>, <class 'embodichain.lab.sim.atomic_actions.primitives.move_held_object.MoveHeldObject'>, <class 'embodichain.lab.sim.atomic_actions.primitives.place.Place'>, <class 'embodichain.lab.sim.atomic_actions.primitives.pour.Pour'>, <class 'embodichain.lab.sim.atomic_actions.primitives.push_object.PushObject'>, <class 'embodichain.lab.sim.atomic_actions.primitives.press.Press'>, <class 'embodichain.lab.sim.atomic_actions.primitives.slide.Slide'>, <class 'embodichain.lab.sim.atomic_actions.primitives.open_door.OpenDoor'>, <class 'embodichain.lab.sim.atomic_actions.primitives.twist.Twist'>, <class 'embodichain.lab.sim.atomic_actions.primitives.coordinated_pickment.CoordinatedPickment'>, <class 'embodichain.lab.sim.atomic_actions.primitives.coordinated_placement.CoordinatedPlacement'>, <class 'embodichain.lab.sim.atomic_actions.primitives.hand_over.HandOver'>)

Built-in action implementations instantiated once per action engine.

class embodichain.lab.sim.atomic_actions.primitives.CoordinatedPickGoal[source]

Object-centric target for picking and moving one object with two hands.

The left/right grasp poses are not supplied by the caller; they are sampled by the parallel-jaw grasp-pose service at planning time using the dual-arm direction and approach direction declared on CoordinatedPickmentOptions.

Methods:

__init__(semantics, object_target_pose[, ...])

Attributes:

object_initial_pose

Optional initial object pose.

object_target_pose

Target pose for the shared object, shape (4, 4) or (num_envs, 4, 4).

__init__(semantics, object_target_pose, object_initial_pose=None)
object_initial_pose: Tensor | SceneEntityPose | None

Optional initial object pose.

When omitted, the pose is grounded through the semantic object’s stable scene identity.

object_target_pose: Tensor | SceneEntityPose

Target pose for the shared object, shape (4, 4) or (num_envs, 4, 4).

class embodichain.lab.sim.atomic_actions.primitives.CoordinatedPickment[source]

Pick and move a single object pinched by two hands.

Classes:

GoalType

alias of CoordinatedPickGoal

OptionsType

alias of CoordinatedPickmentOptions

Attributes:

binding_contract

Explicit robot-independent requirements for semantic discovery.

skill_id

Stable registry identifier for this skill.

GoalType

alias of CoordinatedPickGoal

OptionsType

alias of CoordinatedPickmentOptions

binding_contract: ClassVar[SkillBindingContract] = SkillBindingContract(slots=(SkillResourceSlot(slot_id='left', endpoints=(SkillEndpointRequirement(endpoint_id='motion', capabilities=frozenset({'kinematics.inverse'}), required_commands=mappingproxy({})), SkillEndpointRequirement(endpoint_id='grasp', capabilities=frozenset({'interaction.grasp'}), required_commands=mappingproxy({'open': <class 'embodichain.lab.sim.atomic_actions.control.JointPositionCommand'>, 'grasp': <class 'embodichain.lab.sim.atomic_actions.control.JointPositionCommand'>}))), constraints=(DisjointSlotEndpoints(endpoint_ids=('motion', 'grasp')),)), SkillResourceSlot(slot_id='right', endpoints=(SkillEndpointRequirement(endpoint_id='motion', capabilities=frozenset({'kinematics.inverse'}), required_commands=mappingproxy({})), SkillEndpointRequirement(endpoint_id='grasp', capabilities=frozenset({'interaction.grasp'}), required_commands=mappingproxy({'open': <class 'embodichain.lab.sim.atomic_actions.control.JointPositionCommand'>, 'grasp': <class 'embodichain.lab.sim.atomic_actions.control.JointPositionCommand'>}))), constraints=(DisjointSlotEndpoints(endpoint_ids=('motion', 'grasp')),))), constraints=(DisjointResourceSlots(slots=('left', 'right')),))

Explicit robot-independent requirements for semantic discovery.

Concrete action classes must declare this attribute in their own class body to opt into the semantic catalog. Inheriting another action’s contract does not silently expose a new skill identifier.

skill_id: ClassVar[str] = 'coordinated_pickment'

Stable registry identifier for this skill.

class embodichain.lab.sim.atomic_actions.primitives.CoordinatedPickmentOptions[source]

Per-invocation coordinated pickup behavior.

Left/right grasps are sampled from target-local affordance geometry by the engine’s parallel-jaw grasp-pose service. The dual-arm direction splits the object into left/right grasp regions and the approach direction filters the sampled antipodal pairs.

Methods:

__init__([object_motion_keyframes, ...])

Attributes:

approach_direction

World-frame direction used to sample and approach both grasps, shape (3,).

hand_interp_steps

Number of waypoints used for the simultaneous hand-close segment.

hold_steps

Number of waypoints to hold the final object target pose.

left_to_right_arm_direction

World-frame direction from the left arm base to the right arm base, shape (3,).

lift_height

World-Z lift distance before moving to the object target pose.

middle_empty_ratio

Fraction of the object's left-to-right extent left grasp-free in the middle so the two grippers pinch opposite ends.

object_motion_keyframes

Number of object-pose keyframes solved by IK before joint-space interpolation.

pre_grasp_distance

World distance to retreat from each grasp pose along negative TCP z.

__init__(object_motion_keyframes=6, pre_grasp_distance=0.1, lift_height=0.08, hand_interp_steps=10, hold_steps=4, approach_direction=tensor([0., 0., -1.]), left_to_right_arm_direction=tensor([1., 0., 0.]), middle_empty_ratio=0.4)
approach_direction: Tensor

World-frame direction used to sample and approach both grasps, shape (3,).

hand_interp_steps: int

Number of waypoints used for the simultaneous hand-close segment.

hold_steps: int

Number of waypoints to hold the final object target pose.

left_to_right_arm_direction: Tensor

World-frame direction from the left arm base to the right arm base, shape (3,). It partitions the object into left/right grasp regions and should be a finite, non-zero vector; it is normalized at planning time.

lift_height: float

World-Z lift distance before moving to the object target pose.

middle_empty_ratio: float

Fraction of the object’s left-to-right extent left grasp-free in the middle so the two grippers pinch opposite ends. Must be in [0, 1].

object_motion_keyframes: int

Number of object-pose keyframes solved by IK before joint-space interpolation.

pre_grasp_distance: float

World distance to retreat from each grasp pose along negative TCP z.

class embodichain.lab.sim.atomic_actions.primitives.CoordinatedPlacement[source]

Coordinate two held objects: support object below, placing object above.

Classes:

GoalType

alias of CoordinatedPlacementGoal

OptionsType

alias of CoordinatedPlacementOptions

Attributes:

binding_contract

Explicit robot-independent requirements for semantic discovery.

skill_id

Stable registry identifier for this skill.

GoalType

alias of CoordinatedPlacementGoal

OptionsType

alias of CoordinatedPlacementOptions

binding_contract: ClassVar[SkillBindingContract] = SkillBindingContract(slots=(SkillResourceSlot(slot_id='placing', endpoints=(SkillEndpointRequirement(endpoint_id='motion', capabilities=frozenset({'motion.cartesian_pose'}), required_commands=mappingproxy({})), SkillEndpointRequirement(endpoint_id='grasp', capabilities=frozenset({'interaction.grasp'}), required_commands=mappingproxy({'open': <class 'embodichain.lab.sim.atomic_actions.control.JointPositionCommand'>, 'grasp': <class 'embodichain.lab.sim.atomic_actions.control.JointPositionCommand'>}))), constraints=(DisjointSlotEndpoints(endpoint_ids=('motion', 'grasp')),)), SkillResourceSlot(slot_id='support', endpoints=(SkillEndpointRequirement(endpoint_id='motion', capabilities=frozenset({'motion.cartesian_pose'}), required_commands=mappingproxy({})), SkillEndpointRequirement(endpoint_id='grasp', capabilities=frozenset({'interaction.grasp'}), required_commands=mappingproxy({'grasp': <class 'embodichain.lab.sim.atomic_actions.control.JointPositionCommand'>}))), constraints=(DisjointSlotEndpoints(endpoint_ids=('motion', 'grasp')),))), constraints=(DisjointResourceSlots(slots=('placing', 'support')),))

Explicit robot-independent requirements for semantic discovery.

Concrete action classes must declare this attribute in their own class body to opt into the semantic catalog. Inheriting another action’s contract does not silently expose a new skill identifier.

skill_id: ClassVar[str] = 'coordinated_placement'

Stable registry identifier for this skill.

class embodichain.lab.sim.atomic_actions.primitives.CoordinatedPlacementGoal[source]

Object-centric target for dual-arm coordinated placement.

Methods:

__init__(placing_object_target_pose, ...[, ...])

Attributes:

placing_height_offset

World-Z offset above the placing object target pose.

placing_object_target_pose

Target pose for the object released by the placing arm.

release

Whether the placing hand releases.

support_height_offset

World-Z offset above the support object target pose.

support_object_target_pose

Target pose for the object held by the support arm.

__init__(placing_object_target_pose, support_object_target_pose, placing_height_offset=None, support_height_offset=None, release=None)
placing_height_offset: float | None

World-Z offset above the placing object target pose.

placing_object_target_pose: Tensor | SceneEntityPose

Target pose for the object released by the placing arm.

release: bool | None

Whether the placing hand releases. None uses invocation options.

support_height_offset: float | None

World-Z offset above the support object target pose.

support_object_target_pose: Tensor | SceneEntityPose

Target pose for the object held by the support arm.

class embodichain.lab.sim.atomic_actions.primitives.CoordinatedPlacementOptions[source]

Per-invocation coordinated placement behavior.

Methods:

__init__([release, placing_height_offset, ...])

Attributes:

hand_interp_steps

Number of waypoints for the placing-hand release interpolation.

hold_steps

Number of waypoints to hold alignment before releasing.

lift_height

World-Z lift distance for the placing arm after release.

placing_height_offset

Default World-Z offset above the placing object target pose.

release

Whether to open the placing hand at the aligned placement pose.

retreat_steps

Number of waypoints used for the placing-arm lift retreat.

support_height_offset

Default World-Z offset above the support object target pose.

__init__(release=True, placing_height_offset=0.0, support_height_offset=0.0, lift_height=0.08, hand_interp_steps=10, hold_steps=4, retreat_steps=16)
hand_interp_steps: int

Number of waypoints for the placing-hand release interpolation.

hold_steps: int

Number of waypoints to hold alignment before releasing.

lift_height: float

World-Z lift distance for the placing arm after release.

placing_height_offset: float

Default World-Z offset above the placing object target pose.

release: bool

Whether to open the placing hand at the aligned placement pose.

retreat_steps: int

Number of waypoints used for the placing-arm lift retreat.

support_height_offset: float

Default World-Z offset above the support object target pose.

class embodichain.lab.sim.atomic_actions.primitives.EndEffectorPoseGoal[source]

End-effector pose goal with optional batched intermediate waypoints.

Methods:

__init__(xpos)

Attributes:

xpos

Homogeneous pose with shape (4,4), (B,4,4) or (B,N,4,4).

__init__(xpos)
xpos: Tensor | SceneEntityPose

Homogeneous pose with shape (4,4), (B,4,4) or (B,N,4,4).

class embodichain.lab.sim.atomic_actions.primitives.GraspGoal[source]

Pickup target with an affordance-selected or supplied grasp pose.

Methods:

__init__(semantics[, grasp_xpos])

Attributes:

grasp_xpos

Optional end-effector grasp pose.

__init__(semantics, grasp_xpos=None)
grasp_xpos: Tensor | SceneEntityPose | None

Optional end-effector grasp pose.

When omitted, PickUp uses the configured fixed object-relative grasp when available, otherwise it selects one from the target affordance. An explicit tensor or late-bound SceneEntityPose skips grasp sampling. Late-bound poses also declare the scene dependency used by closed-loop execution recovery.

class embodichain.lab.sim.atomic_actions.primitives.HandOver[source]

Pick an object with the nearer arm, hand it over, and place it.

For each environment, the action chooses the arm whose root link is closer to the observed object pose. It samples at most 1000 mesh-surface points and applies SVD in the current object pose to find obj_longest_axis. When that axis is closer to world Z than to the horizontal plane, both grasp approaches point toward the object horizontally and tilt downward by 45 degrees. Otherwise both approaches are world-Z downward.

The first arm grasps the projected end of obj_longest_axis nearest its current TCP; the receiving arm grasps the opposite end at the predicted middle object pose. This keeps the two hands from selecting the same object region regardless of whether a long object is standing or lying down.

After each grasp waypoint, subsequent EEF waypoints preserve that grasp rotation and change translation only. In particular, placement first moves strictly horizontally at the handover height and then lowers to the final target pose before releasing the object.

Classes:

GoalType

alias of HandOverGoal

OptionsType

alias of HandOverOptions

Attributes:

binding_contract

Explicit robot-independent requirements for semantic discovery.

open_loop

Whether the skill intentionally declares no verified physical effect.

skill_id

Stable registry identifier for this skill.

GoalType

alias of HandOverGoal

OptionsType

alias of HandOverOptions

binding_contract: ClassVar[SkillBindingContract] = SkillBindingContract(slots=(SkillResourceSlot(slot_id='source', endpoints=(SkillEndpointRequirement(endpoint_id='motion', capabilities=frozenset({'kinematics.forward', 'motion.cartesian_pose'}), required_commands=mappingproxy({})), SkillEndpointRequirement(endpoint_id='grasp', capabilities=frozenset({'interaction.grasp'}), required_commands=mappingproxy({'open': <class 'embodichain.lab.sim.atomic_actions.control.JointPositionCommand'>, 'grasp': <class 'embodichain.lab.sim.atomic_actions.control.JointPositionCommand'>}))), constraints=(DisjointSlotEndpoints(endpoint_ids=('motion', 'grasp')),)), SkillResourceSlot(slot_id='destination', endpoints=(SkillEndpointRequirement(endpoint_id='motion', capabilities=frozenset({'kinematics.forward', 'motion.cartesian_pose'}), required_commands=mappingproxy({})), SkillEndpointRequirement(endpoint_id='grasp', capabilities=frozenset({'interaction.grasp'}), required_commands=mappingproxy({'open': <class 'embodichain.lab.sim.atomic_actions.control.JointPositionCommand'>, 'grasp': <class 'embodichain.lab.sim.atomic_actions.control.JointPositionCommand'>}))), constraints=(DisjointSlotEndpoints(endpoint_ids=('motion', 'grasp')),))), constraints=(DisjointResourceSlots(slots=('source', 'destination')),))

Explicit robot-independent requirements for semantic discovery.

Concrete action classes must declare this attribute in their own class body to opt into the semantic catalog. Inheriting another action’s contract does not silently expose a new skill identifier.

open_loop: ClassVar[bool] = True

Whether the skill intentionally declares no verified physical effect.

skill_id: ClassVar[str] = 'hand_over'

Stable registry identifier for this skill.

class embodichain.lab.sim.atomic_actions.primitives.HandOverGoal[source]

Object to pick and hand over, plus its final object pose.

Methods:

__init__(semantics, target_pose)

Attributes:

target_pose

Final object pose after the receiving arm lowers and releases it.

__init__(semantics, target_pose)
target_pose: PoseGoalValue

Final object pose after the receiving arm lowers and releases it.

class embodichain.lab.sim.atomic_actions.primitives.HandOverOptions[source]

Per-invocation pick-up, handover, and placement behavior.

Methods:

__init__([pre_grasp_distance, lift_height, ...])

Attributes:

hand_interp_steps

Waypoints used by every gripper open/close interpolation.

lift_height

World-Z distance used to lift the object after the first grasp.

pre_grasp_distance

Distance from each grasp pose to its approach pose, in metres.

__init__(pre_grasp_distance=0.1, lift_height=0.1, hand_interp_steps=10)
hand_interp_steps: int

Waypoints used by every gripper open/close interpolation.

lift_height: float

World-Z distance used to lift the object after the first grasp.

pre_grasp_distance: float

Distance from each grasp pose to its approach pose, in metres.

class embodichain.lab.sim.atomic_actions.primitives.HeldObjectPoseGoal[source]

Desired pose for the object held by this action’s control part.

Methods:

__init__(object_target_pose)

Attributes:

object_target_pose

Target object pose, shape (4, 4) or (num_envs, 4, 4).

__init__(object_target_pose)
object_target_pose: Tensor | SceneEntityPose

Target object pose, shape (4, 4) or (num_envs, 4, 4).

class embodichain.lab.sim.atomic_actions.primitives.JointPositionGoal[source]

Explicit or named joint-space goal for a bound robot resource.

Methods:

__init__(target)

Attributes:

target

Joint qpos/waypoints or a named control-part profile command.

__init__(target)
target: Tensor | str

Joint qpos/waypoints or a named control-part profile command.

class embodichain.lab.sim.atomic_actions.primitives.MoveEndEffector[source]

Plan a free-space move for a bound manipulator.

Classes:

GoalType

alias of EndEffectorPoseGoal

OptionsType

alias of MoveEndEffectorOptions

Attributes:

binding_contract

Explicit robot-independent requirements for semantic discovery.

skill_id

Stable registry identifier for this skill.

GoalType

alias of EndEffectorPoseGoal

OptionsType

alias of MoveEndEffectorOptions

binding_contract: ClassVar[SkillBindingContract] = SkillBindingContract(slots=(SkillResourceSlot(slot_id='primary', endpoints=(SkillEndpointRequirement(endpoint_id='motion', capabilities=frozenset({'motion.cartesian_pose'}), required_commands=mappingproxy({})),), constraints=()),), constraints=())

Explicit robot-independent requirements for semantic discovery.

Concrete action classes must declare this attribute in their own class body to opt into the semantic catalog. Inheriting another action’s contract does not silently expose a new skill identifier.

skill_id: ClassVar[str] = 'move_end_effector'

Stable registry identifier for this skill.

class embodichain.lab.sim.atomic_actions.primitives.MoveEndEffectorOptions[source]

Per-invocation behavior for MoveEndEffector.

Methods:

__init__()

__init__()
class embodichain.lab.sim.atomic_actions.primitives.MoveHeldObject[source]

Move the held object to the exact target object pose with a closed hand.

The requested object orientation is preserved exactly. Callers that need a transport orientation must encode it in HeldObjectPoseGoal; this action never substitutes an implicit end-effector orientation.

Classes:

GoalType

alias of HeldObjectPoseGoal

OptionsType

alias of MoveHeldObjectOptions

Attributes:

binding_contract

Explicit robot-independent requirements for semantic discovery.

skill_id

Stable registry identifier for this skill.

GoalType

alias of HeldObjectPoseGoal

OptionsType

alias of MoveHeldObjectOptions

binding_contract: ClassVar[SkillBindingContract] = SkillBindingContract(slots=(SkillResourceSlot(slot_id='primary', endpoints=(SkillEndpointRequirement(endpoint_id='motion', capabilities=frozenset({'kinematics.forward', 'motion.cartesian_pose'}), required_commands=mappingproxy({})), SkillEndpointRequirement(endpoint_id='grasp', capabilities=frozenset({'interaction.grasp'}), required_commands=mappingproxy({'grasp': <class 'embodichain.lab.sim.atomic_actions.control.JointPositionCommand'>}))), constraints=(DisjointSlotEndpoints(endpoint_ids=('motion', 'grasp')),)),), constraints=())

Explicit robot-independent requirements for semantic discovery.

Concrete action classes must declare this attribute in their own class body to opt into the semantic catalog. Inheriting another action’s contract does not silently expose a new skill identifier.

skill_id: ClassVar[str] = 'move_held_object'

Stable registry identifier for this skill.

class embodichain.lab.sim.atomic_actions.primitives.MoveHeldObjectOptions[source]

Per-invocation held-object transport behavior.

Methods:

__init__()

__init__()
class embodichain.lab.sim.atomic_actions.primitives.MoveJoints[source]

Plan joint motion from the observed state to one or more waypoints.

Classes:

GoalType

alias of JointPositionGoal

OptionsType

alias of MoveJointsOptions

Attributes:

agent_visible

Whether an Action Agent should expose this skill by default.

binding_contract

Explicit robot-independent requirements for semantic discovery.

skill_id

Stable registry identifier for this skill.

GoalType

alias of JointPositionGoal

OptionsType

alias of MoveJointsOptions

agent_visible: ClassVar[bool] = False

Whether an Action Agent should expose this skill by default.

binding_contract: ClassVar[SkillBindingContract] = SkillBindingContract(slots=(SkillResourceSlot(slot_id='primary', endpoints=(SkillEndpointRequirement(endpoint_id='motion', capabilities=frozenset({'motion.joint_position'}), required_commands=mappingproxy({})),), constraints=()),), constraints=())

Explicit robot-independent requirements for semantic discovery.

Concrete action classes must declare this attribute in their own class body to opt into the semantic catalog. Inheriting another action’s contract does not silently expose a new skill identifier.

skill_id: ClassVar[str] = 'move_joints'

Stable registry identifier for this skill.

class embodichain.lab.sim.atomic_actions.primitives.MoveJointsOptions[source]

Per-invocation behavior for MoveJoints.

Methods:

__init__()

__init__()
class embodichain.lab.sim.atomic_actions.primitives.OpenDoor[source]

Approach, grasp, rotate a door about its hinge, release, and retract.

Classes:

GoalType

alias of OpenDoorGoal

OptionsType

alias of OpenDoorOptions

Attributes:

binding_contract

Explicit robot-independent requirements for semantic discovery.

open_loop

Whether the skill intentionally declares no verified physical effect.

skill_id

Stable registry identifier for this skill.

GoalType

alias of OpenDoorGoal

OptionsType

alias of OpenDoorOptions

binding_contract: ClassVar[SkillBindingContract] = SkillBindingContract(slots=(SkillResourceSlot(slot_id='primary', endpoints=(SkillEndpointRequirement(endpoint_id='motion', capabilities=frozenset({'motion.cartesian_pose'}), required_commands=mappingproxy({})), SkillEndpointRequirement(endpoint_id='grasp', capabilities=frozenset({'interaction.grasp'}), required_commands=mappingproxy({'open': <class 'embodichain.lab.sim.atomic_actions.control.JointPositionCommand'>, 'grasp': <class 'embodichain.lab.sim.atomic_actions.control.JointPositionCommand'>}))), constraints=(DisjointSlotEndpoints(endpoint_ids=('motion', 'grasp')),)),), constraints=())

Explicit robot-independent requirements for semantic discovery.

Concrete action classes must declare this attribute in their own class body to opt into the semantic catalog. Inheriting another action’s contract does not silently expose a new skill identifier.

open_loop: ClassVar[bool] = True

Whether the skill intentionally declares no verified physical effect.

skill_id: ClassVar[str] = 'open_door'

Stable registry identifier for this skill.

class embodichain.lab.sim.atomic_actions.primitives.OpenDoorGoal[source]

Door handle and desired absolute opening state.

Methods:

__init__(semantics, target_pose, open_fraction)

Attributes:

open_fraction

Desired hinge position normalized from its closed to open legal endpoint.

target_pose

Handle-link pose snapshot or late-bound scene-entity reference.

__init__(semantics, target_pose, open_fraction)
open_fraction: float | Tensor

Desired hinge position normalized from its closed to open legal endpoint.

target_pose: Tensor | SceneEntityPose

Handle-link pose snapshot or late-bound scene-entity reference.

class embodichain.lab.sim.atomic_actions.primitives.OpenDoorOptions[source]

Per-invocation approach, interpolation, release, and retract behavior.

Methods:

__init__([hand_interp_steps, ...])

Attributes:

approach_distance

Pre-grasp distance opposite the automatically inferred approach axis.

door_waypoint_count

Number of Cartesian keyframes along the handle's circular arc.

hand_interp_steps

Number of waypoints used for each close/open hand segment.

joint_position_tolerance

Tolerance for legal-limit and already-open comparisons in radians.

retract_distance

Post-release retreat distance opposite the rotated approach axis.

__init__(hand_interp_steps=5, door_waypoint_count=20, approach_distance=0.1, retract_distance=0.1, joint_position_tolerance=0.0001)
approach_distance: float

Pre-grasp distance opposite the automatically inferred approach axis.

door_waypoint_count: int

Number of Cartesian keyframes along the handle’s circular arc.

hand_interp_steps: int

Number of waypoints used for each close/open hand segment.

joint_position_tolerance: float

Tolerance for legal-limit and already-open comparisons in radians.

retract_distance: float

Post-release retreat distance opposite the rotated approach axis.

class embodichain.lab.sim.atomic_actions.primitives.PickUp[source]

Approach a grasp pose, close the gripper, lift.

Classes:

GoalType

alias of GraspGoal

OptionsType

alias of PickUpOptions

Attributes:

binding_contract

Explicit robot-independent requirements for semantic discovery.

skill_id

Stable registry identifier for this skill.

GoalType

alias of GraspGoal

OptionsType

alias of PickUpOptions

binding_contract: ClassVar[SkillBindingContract] = SkillBindingContract(slots=(SkillResourceSlot(slot_id='primary', endpoints=(SkillEndpointRequirement(endpoint_id='motion', capabilities=frozenset({'kinematics.forward', 'kinematics.batch_inverse', 'motion.cartesian_pose'}), required_commands=mappingproxy({})), SkillEndpointRequirement(endpoint_id='grasp', capabilities=frozenset({'interaction.grasp'}), required_commands=mappingproxy({'open': <class 'embodichain.lab.sim.atomic_actions.control.JointPositionCommand'>, 'grasp': <class 'embodichain.lab.sim.atomic_actions.control.JointPositionCommand'>}))), constraints=(DisjointSlotEndpoints(endpoint_ids=('motion', 'grasp')),)),), constraints=())

Explicit robot-independent requirements for semantic discovery.

Concrete action classes must declare this attribute in their own class body to opt into the semantic catalog. Inheriting another action’s contract does not silently expose a new skill identifier.

skill_id: ClassVar[str] = 'pick_up'

Stable registry identifier for this skill.

class embodichain.lab.sim.atomic_actions.primitives.PickUpOptions[source]

Per-invocation pickup behavior.

Methods:

__init__([hand_interp_steps, ...])

Attributes:

approach_alignment_max_angle

Optional maximum TCP z-axis deviation from the approach direction.

approach_direction

World-frame direction from the pre-grasp pose to the grasp pose.

downstream_object_target_poses

Future object poses that must be reachable with the selected grasp.

fixed_object_to_eef

Optional object-frame to end-effector SE(3) grasp calibration.

grasp_frame_to_eef

Canonical grasp-frame to robot end-effector SE(3) calibration.

grasp_settle_steps

Fully closed hold frames before lifting the end-effector.

hand_interp_steps

Number of waypoints for the gripper-close interpolation segment.

lift_height

Height (m) to lift the end-effector after closing the gripper.

obj_upright_direction

Optional object local direction used to choose the upright grasp rotation.

pick_object_part

Name of the object part to pick up (used for grasp pose generation).

pre_grasp_distance

Distance to offset back from the grasp pose along the approach direction.

rotate_upright

Optional rotation (radians) about the grasp x-axis to apply after grasp selection.

__init__(hand_interp_steps=5, grasp_settle_steps=0, pick_object_part='center', lift_height=0.1, pre_grasp_distance=0.15, approach_direction=tensor([0., 0., -1.]), approach_alignment_max_angle=None, downstream_object_target_poses=(), obj_upright_direction=None, rotate_upright=None, grasp_frame_to_eef=tensor([[1., 0., 0., 0.], [0., 1., 0., 0.], [0., 0., 1., 0.], [0., 0., 0., 1.]]), fixed_object_to_eef=None)
approach_alignment_max_angle: float | None

Optional maximum TCP z-axis deviation from the approach direction.

approach_direction: Tensor

World-frame direction from the pre-grasp pose to the grasp pose.

downstream_object_target_poses: tuple[Tensor | SceneEntityPose, ...]

Future object poses that must be reachable with the selected grasp.

fixed_object_to_eef: Tensor | None

Optional object-frame to end-effector SE(3) grasp calibration.

When no explicit goal grasp is supplied, this transform bypasses affordance sampling and the sampled-grasp orientation/calibration adjustments.

grasp_frame_to_eef: Tensor

Canonical grasp-frame to robot end-effector SE(3) calibration.

grasp_settle_steps: int

Fully closed hold frames before lifting the end-effector.

hand_interp_steps: int

Number of waypoints for the gripper-close interpolation segment.

lift_height: float

Height (m) to lift the end-effector after closing the gripper.

obj_upright_direction: Tensor | None

Optional object local direction used to choose the upright grasp rotation.

pick_object_part: str

Name of the object part to pick up (used for grasp pose generation). Currently support [center | top | bottom].

pre_grasp_distance: float

Distance to offset back from the grasp pose along the approach direction.

rotate_upright: float | None

Optional rotation (radians) about the grasp x-axis to apply after grasp selection.

class embodichain.lab.sim.atomic_actions.primitives.Place[source]

Lower the held object to a place pose, open the gripper, retract.

The PlaceGoal may carry either a single waypoint (num_envs, 4, 4) (or a broadcastable (4, 4)) or a multi-waypoint trajectory (num_envs, n_waypoint, 4, 4). In the multi-waypoint case the approach segment visits every waypoint in order; approaching from above the first waypoint, descending through each waypoint, then opening the gripper at the final waypoint and retracting to above the last waypoint. Starting joint positions are inherited from PlanningContext.

An AssembleGoal replaces the explicit EEF pose with an assembly affordance: the place pose is derived from the base object’s snapshot pose and assemble_to_base_pose, converted to an EEF pose through the held object’s object_to_eef (read from PlanningContext).

Attributes:

GoalType

Concrete goal dataclass or dataclasses accepted by this skill.

binding_contract

Explicit robot-independent requirements for semantic discovery.

skill_id

Stable registry identifier for this skill.

Classes:

OptionsType

alias of PlaceOptions

GoalType: ClassVar[type | tuple[type, ...]] = (<class 'embodichain.lab.sim.atomic_actions.primitives.place.PlaceGoal'>, <class 'embodichain.lab.sim.atomic_actions.primitives.place.AssembleGoal'>)

Concrete goal dataclass or dataclasses accepted by this skill.

OptionsType

alias of PlaceOptions

binding_contract: ClassVar[SkillBindingContract] = SkillBindingContract(slots=(SkillResourceSlot(slot_id='primary', endpoints=(SkillEndpointRequirement(endpoint_id='motion', capabilities=frozenset({'kinematics.forward', 'motion.cartesian_pose'}), required_commands=mappingproxy({})), SkillEndpointRequirement(endpoint_id='grasp', capabilities=frozenset({'interaction.grasp'}), required_commands=mappingproxy({'open': <class 'embodichain.lab.sim.atomic_actions.control.JointPositionCommand'>, 'grasp': <class 'embodichain.lab.sim.atomic_actions.control.JointPositionCommand'>}))), constraints=(DisjointSlotEndpoints(endpoint_ids=('motion', 'grasp')),)),), constraints=())

Explicit robot-independent requirements for semantic discovery.

Concrete action classes must declare this attribute in their own class body to opt into the semantic catalog. Inheriting another action’s contract does not silently expose a new skill identifier.

skill_id: ClassVar[str] = 'place'

Stable registry identifier for this skill.

class embodichain.lab.sim.atomic_actions.primitives.PlaceGoal[source]

End-effector release-pose target used by Place.

Methods:

__init__(xpos[, tcp_symmetry])

Attributes:

tcp_symmetry

Optional TCP-frame symmetry allowed by the placement semantics.

xpos

Target end-effector release pose.

__init__(xpos, tcp_symmetry='none')
tcp_symmetry: Literal['none', 'z_roll_180']

Optional TCP-frame symmetry allowed by the placement semantics.

"none" preserves the pose exactly. "z_roll_180" lets placement choose between the pose and its TCP z-roll 180 equivalent, which flips TCP x/y while preserving TCP z and translation.

xpos: Tensor | SceneEntityPose

Target end-effector release pose.

Accepts (4, 4), (num_envs, 4, 4), or (num_envs, n_waypoint, 4, 4).

class embodichain.lab.sim.atomic_actions.primitives.PlaceOptions[source]

Per-invocation placement behavior.

Methods:

__init__([hand_interp_steps, ...])

Attributes:

cartesian_waypoint_count

Number of fixed-orientation Cartesian keyframes per translation segment.

hand_interp_steps

Number of waypoints for the gripper-open interpolation segment.

lift_height

Height (m) to retract the end-effector after opening the gripper.

max_approach_retract_z

Optional maximum world-frame TCP z for approach and retract poses (m).

preserve_current_object_orientation

Keep the held object's observed world orientation at the place target.

release_settle_steps

Fully open hold frames before retracting the end-effector.

__init__(hand_interp_steps=5, release_settle_steps=0, lift_height=0.1, max_approach_retract_z=None, cartesian_waypoint_count=1, preserve_current_object_orientation=False)
cartesian_waypoint_count: int

Number of fixed-orientation Cartesian keyframes per translation segment.

hand_interp_steps: int

Number of waypoints for the gripper-open interpolation segment.

lift_height: float

Height (m) to retract the end-effector after opening the gripper.

max_approach_retract_z: float | None

Optional maximum world-frame TCP z for approach and retract poses (m).

preserve_current_object_orientation: bool

Keep the held object’s observed world orientation at the place target.

release_settle_steps: int

Fully open hold frames before retracting the end-effector.

class embodichain.lab.sim.atomic_actions.primitives.Pour[source]

Rotate and return an exclusively held object about its internal axis.

Classes:

GoalType

alias of PourGoal

OptionsType

alias of PourOptions

Attributes:

binding_contract

Explicit robot-independent requirements for semantic discovery.

open_loop

Whether the skill intentionally declares no verified physical effect.

skill_id

Stable registry identifier for this skill.

GoalType

alias of PourGoal

OptionsType

alias of PourOptions

binding_contract: ClassVar[SkillBindingContract] = SkillBindingContract(slots=(SkillResourceSlot(slot_id='primary', endpoints=(SkillEndpointRequirement(endpoint_id='motion', capabilities=frozenset({'kinematics.forward', 'motion.cartesian_pose'}), required_commands=mappingproxy({})), SkillEndpointRequirement(endpoint_id='grasp', capabilities=frozenset({'interaction.grasp'}), required_commands=mappingproxy({'grasp': <class 'embodichain.lab.sim.atomic_actions.control.JointPositionCommand'>}))), constraints=(DisjointSlotEndpoints(endpoint_ids=('motion', 'grasp')),)),), constraints=())

Explicit robot-independent requirements for semantic discovery.

Concrete action classes must declare this attribute in their own class body to opt into the semantic catalog. Inheriting another action’s contract does not silently expose a new skill identifier.

open_loop: ClassVar[bool] = True

Whether the skill intentionally declares no verified physical effect.

skill_id: ClassVar[str] = 'pour'

Stable registry identifier for this skill.

class embodichain.lab.sim.atomic_actions.primitives.PourGoal[source]

Rotate the object currently held by the bound manipulator.

Methods:

__init__()

__init__()
class embodichain.lab.sim.atomic_actions.primitives.PourOptions[source]

Per-invocation pouring behavior.

Methods:

__init__([rotate_angle])

Attributes:

rotate_angle

Signed rotation about the held object's local internal axis, in radians.

__init__(rotate_angle=0.7853981633974483)
rotate_angle: float

Signed rotation about the held object’s local internal axis, in radians.

class embodichain.lab.sim.atomic_actions.primitives.Press[source]

Open-loop motion primitive that approaches, presses, and retracts.

Classes:

GoalType

alias of PressGoal

OptionsType

alias of PressOptions

Attributes:

binding_contract

Explicit robot-independent requirements for semantic discovery.

open_loop

Whether the skill intentionally declares no verified physical effect.

skill_id

Stable registry identifier for this skill.

GoalType

alias of PressGoal

OptionsType

alias of PressOptions

binding_contract: ClassVar[SkillBindingContract] = SkillBindingContract(slots=(SkillResourceSlot(slot_id='primary', endpoints=(SkillEndpointRequirement(endpoint_id='motion', capabilities=frozenset({'kinematics.forward', 'motion.cartesian_pose'}), required_commands=mappingproxy({})), SkillEndpointRequirement(endpoint_id='grasp', capabilities=frozenset({'interaction.grasp'}), required_commands=mappingproxy({'grasp': <class 'embodichain.lab.sim.atomic_actions.control.JointPositionCommand'>}))), constraints=(DisjointSlotEndpoints(endpoint_ids=('motion', 'grasp')),)),), constraints=())

Explicit robot-independent requirements for semantic discovery.

Concrete action classes must declare this attribute in their own class body to opt into the semantic catalog. Inheriting another action’s contract does not silently expose a new skill identifier.

open_loop: ClassVar[bool] = True

Whether the skill intentionally declares no verified physical effect.

skill_id: ClassVar[str] = 'press'

Stable registry identifier for this skill.

class embodichain.lab.sim.atomic_actions.primitives.PressGoal[source]

Target object described by a press affordance.

Methods:

__init__(semantics, target_pose)

Attributes:

target_pose

Target pose snapshot or late-bound stable scene-entity reference.

__init__(semantics, target_pose)
target_pose: Tensor | SceneEntityPose

Target pose snapshot or late-bound stable scene-entity reference.

class embodichain.lab.sim.atomic_actions.primitives.PressOptions[source]

Per-invocation pressing behavior.

Methods:

__init__([hand_interp_steps, ...])

Attributes:

approach_distance

Distance from the press position opposite the press direction.

hand_interp_steps

Number of waypoints used to close the hand.

press_distance

Distance traveled into the target along its press axis.

press_position

Optional local-frame position overriding the affordance press position.

__init__(hand_interp_steps=5, approach_distance=0.1, press_distance=0.05, press_position=None)
approach_distance: float

Distance from the press position opposite the press direction.

hand_interp_steps: int

Number of waypoints used to close the hand.

press_distance: float

Distance traveled into the target along its press axis.

press_position: tuple[float, float, float] | None

Optional local-frame position overriding the affordance press position.

class embodichain.lab.sim.atomic_actions.primitives.PushObject[source]

Close the end effector, contact a rigid object, and push it in-plane.

Classes:

GoalType

alias of PushObjectGoal

OptionsType

alias of PushObjectOptions

Attributes:

binding_contract

Explicit robot-independent requirements for semantic discovery.

open_loop

Whether the skill intentionally declares no verified physical effect.

skill_id

Stable registry identifier for this skill.

GoalType

alias of PushObjectGoal

OptionsType

alias of PushObjectOptions

binding_contract: ClassVar[SkillBindingContract] = SkillBindingContract(slots=(SkillResourceSlot(slot_id='primary', endpoints=(SkillEndpointRequirement(endpoint_id='motion', capabilities=frozenset({'motion.cartesian_pose'}), required_commands=mappingproxy({})), SkillEndpointRequirement(endpoint_id='grasp', capabilities=frozenset({'interaction.grasp'}), required_commands=mappingproxy({'grasp': <class 'embodichain.lab.sim.atomic_actions.control.JointPositionCommand'>}))), constraints=(DisjointSlotEndpoints(endpoint_ids=('motion', 'grasp')),)),), constraints=())

Explicit robot-independent requirements for semantic discovery.

Concrete action classes must declare this attribute in their own class body to opt into the semantic catalog. Inheriting another action’s contract does not silently expose a new skill identifier.

open_loop: ClassVar[bool] = True

Whether the skill intentionally declares no verified physical effect.

skill_id: ClassVar[str] = 'push_object'

Stable registry identifier for this skill.

class embodichain.lab.sim.atomic_actions.primitives.PushObjectGoal[source]

Push one rigid object toward a target pose on the target support plane.

Methods:

__init__(semantics, target_pose)

Attributes:

target_pose

Desired object pose or a late-bound scene-entity target reference.

__init__(semantics, target_pose)
target_pose: PoseGoalValue

Desired object pose or a late-bound scene-entity target reference.

class embodichain.lab.sim.atomic_actions.primitives.PushObjectOptions[source]

Per-invocation planar pushing behavior.

Methods:

__init__([hand_interp_steps, ...])

Attributes:

approach_height

Distance above the contact pose used for the free-space approach.

completion_tolerance

Planar target distance at which the action succeeds without moving.

contact_distance

Initial planar clearance behind the object along the push direction.

contact_frame_to_eef

Contact-frame to robot end-effector SE(3) calibration.

hand_interp_steps

Number of waypoints used to close the end effector before approach.

object_contact_offset

Object-local point used as the center of the planar contact frame.

push_overshoot

Additional end-effector travel beyond the object's target displacement.

retract_height

Distance above the pushed pose used for the final retraction.

support_frame_planar_contact_offset

Optional target-support-frame override for the contact's planar offset.

tool_calibrations

Per-control-part tool-frame overrides for asymmetric robot arms.

__init__(hand_interp_steps=5, approach_height=0.1, retract_height=0.1, contact_distance=0.03, push_overshoot=0.0, completion_tolerance=0.0, object_contact_offset=tensor([0., 0., 0.]), support_frame_planar_contact_offset=None, contact_frame_to_eef=tensor([[1., 0., 0., 0.], [0., 1., 0., 0.], [0., 0., 1., 0.], [0., 0., 0., 1.]]), tool_calibrations=())
approach_height: float

Distance above the contact pose used for the free-space approach.

completion_tolerance: float

Planar target distance at which the action succeeds without moving.

contact_distance: float

Initial planar clearance behind the object along the push direction.

contact_frame_to_eef: Tensor

Contact-frame to robot end-effector SE(3) calibration.

hand_interp_steps: int

Number of waypoints used to close the end effector before approach.

object_contact_offset: Tensor

Object-local point used as the center of the planar contact frame.

push_overshoot: float

Additional end-effector travel beyond the object’s target displacement.

retract_height: float

Distance above the pushed pose used for the final retraction.

support_frame_planar_contact_offset: Tensor | None

Optional target-support-frame override for the contact’s planar offset.

tool_calibrations: tuple[PushObjectToolCalibration, ...]

Per-control-part tool-frame overrides for asymmetric robot arms.

class embodichain.lab.sim.atomic_actions.primitives.PushObjectToolCalibration[source]

End-effector calibration selected by a bound motion control part.

Parameters:
  • control_part (str) – Exact motion control-part identifier that selects this calibration.

  • contact_frame_to_eef (Tensor) – Contact-frame to robot end-effector SE(3) calibration.

  • contact_distance (float | None) – Optional tool-specific planar clearance behind the object. None uses PushObjectOptions’ default.

Methods:

__init__(control_part, contact_frame_to_eef)

Attributes:

contact_distance

Optional tool-specific planar clearance behind the object.

contact_frame_to_eef

Contact-frame to robot end-effector SE(3) calibration.

control_part

Exact motion control-part identifier that selects this calibration.

__init__(control_part, contact_frame_to_eef, contact_distance=None)
contact_distance: float | None

Optional tool-specific planar clearance behind the object.

contact_frame_to_eef: Tensor

Contact-frame to robot end-effector SE(3) calibration.

control_part: str

Exact motion control-part identifier that selects this calibration.

class embodichain.lab.sim.atomic_actions.primitives.Slide[source]

Open-loop approach, grasp, and axis-constrained sliding motion.

Classes:

GoalType

alias of SlideGoal

OptionsType

alias of SlideOptions

Attributes:

binding_contract

Explicit robot-independent requirements for semantic discovery.

open_loop

Whether the skill intentionally declares no verified physical effect.

skill_id

Stable registry identifier for this skill.

GoalType

alias of SlideGoal

OptionsType

alias of SlideOptions

binding_contract: ClassVar[SkillBindingContract] = SkillBindingContract(slots=(SkillResourceSlot(slot_id='primary', endpoints=(SkillEndpointRequirement(endpoint_id='motion', capabilities=frozenset({'motion.cartesian_pose'}), required_commands=mappingproxy({})), SkillEndpointRequirement(endpoint_id='grasp', capabilities=frozenset({'interaction.grasp'}), required_commands=mappingproxy({'open': <class 'embodichain.lab.sim.atomic_actions.control.JointPositionCommand'>, 'grasp': <class 'embodichain.lab.sim.atomic_actions.control.JointPositionCommand'>}))), constraints=(DisjointSlotEndpoints(endpoint_ids=('motion', 'grasp')),)),), constraints=())

Explicit robot-independent requirements for semantic discovery.

Concrete action classes must declare this attribute in their own class body to opt into the semantic catalog. Inheriting another action’s contract does not silently expose a new skill identifier.

open_loop: ClassVar[bool] = True

Whether the skill intentionally declares no verified physical effect.

skill_id: ClassVar[str] = 'slide'

Stable registry identifier for this skill.

class embodichain.lab.sim.atomic_actions.primitives.SlideGoal[source]

Translating articulation link described by a slide affordance.

Methods:

__init__(semantics, target_pose)

Attributes:

target_pose

Link pose snapshot or late-bound stable scene-entity reference.

__init__(semantics, target_pose)
target_pose: Tensor | SceneEntityPose

Link pose snapshot or late-bound stable scene-entity reference.

class embodichain.lab.sim.atomic_actions.primitives.SlideOptions[source]

Per-invocation sliding behavior for a translating articulation link.

Methods:

__init__([direction, hand_interp_steps, ...])

Attributes:

approach_distance

Pre-grasp distance opposite the approach/push axis.

direction

Whether to pull the part open or push it closed.

hand_interp_steps

Number of waypoints used for each close/open hand segment.

translation_distance

Distance traveled along the pull or push direction.

__init__(direction='pull', hand_interp_steps=5, approach_distance=0.1, translation_distance=0.15)
approach_distance: float

Pre-grasp distance opposite the approach/push axis.

direction: Literal['pull', 'push']

Whether to pull the part open or push it closed.

hand_interp_steps: int

Number of waypoints used for each close/open hand segment.

translation_distance: float

Distance traveled along the pull or push direction.

class embodichain.lab.sim.atomic_actions.primitives.Twist[source]

Open-loop approach, grasp, twist, release, and retract motion.

Classes:

GoalType

alias of TwistGoal

OptionsType

alias of TwistOptions

Attributes:

binding_contract

Explicit robot-independent requirements for semantic discovery.

open_loop

Whether the skill intentionally declares no verified physical effect.

skill_id

Stable registry identifier for this skill.

GoalType

alias of TwistGoal

OptionsType

alias of TwistOptions

binding_contract: ClassVar[SkillBindingContract] = SkillBindingContract(slots=(SkillResourceSlot(slot_id='primary', endpoints=(SkillEndpointRequirement(endpoint_id='motion', capabilities=frozenset({'kinematics.forward', 'motion.cartesian_pose'}), required_commands=mappingproxy({})), SkillEndpointRequirement(endpoint_id='grasp', capabilities=frozenset({'interaction.grasp'}), required_commands=mappingproxy({'open': <class 'embodichain.lab.sim.atomic_actions.control.JointPositionCommand'>, 'grasp': <class 'embodichain.lab.sim.atomic_actions.control.JointPositionCommand'>}))), constraints=(DisjointSlotEndpoints(endpoint_ids=('motion', 'grasp')),)),), constraints=())

Explicit robot-independent requirements for semantic discovery.

Concrete action classes must declare this attribute in their own class body to opt into the semantic catalog. Inheriting another action’s contract does not silently expose a new skill identifier.

open_loop: ClassVar[bool] = True

Whether the skill intentionally declares no verified physical effect.

skill_id: ClassVar[str] = 'twist'

Stable registry identifier for this skill.

class embodichain.lab.sim.atomic_actions.primitives.TwistGoal[source]

Target object described by a twist affordance.

Methods:

__init__(semantics, target_pose)

Attributes:

target_pose

Target pose snapshot or late-bound stable scene-entity reference.

__init__(semantics, target_pose)
target_pose: Tensor | SceneEntityPose

Target pose snapshot or late-bound stable scene-entity reference.

class embodichain.lab.sim.atomic_actions.primitives.TwistOptions[source]

Per-invocation twisting behavior.

Methods:

__init__([hand_interp_steps, ...])

Attributes:

hand_interp_steps

Number of waypoints used for each close/open hand segment.

pre_grasp_distance

Distance from the grasp pose along its negative z-axis.

twist_angle

Requested twist rotation in radians.

twist_waypoint_count

Number of Cartesian keyframes along the target's circular twist arc.

__init__(hand_interp_steps=5, twist_waypoint_count=8, pre_grasp_distance=0.1, twist_angle=0.7853981633974483)
hand_interp_steps: int

Number of waypoints used for each close/open hand segment.

pre_grasp_distance: float

Distance from the grasp pose along its negative z-axis.

twist_angle: float

Requested twist rotation in radians.

twist_waypoint_count: int

Number of Cartesian keyframes along the target’s circular twist arc.

Overview#

Concrete implementations of the built-in atomic-action primitives. Each primitive is an AtomicAction that accepts a ResolvedActionRequest and a PlanningContext. Planning returns a side-effect-free ActionPlan with a full-robot timed trajectory and uncommitted expected effects.

Built-in Primitive Actions

MoveEndEffector

Plan a free-space move for a bound manipulator.

MoveEndEffectorOptions

Per-invocation behavior for MoveEndEffector.

MoveJoints

Plan joint motion from the observed state to one or more waypoints.

MoveJointsOptions

Per-invocation behavior for MoveJoints.

PickUp

Approach a grasp pose, close the gripper, lift.

PickUpOptions

Per-invocation pickup behavior.

AxisAlign

Grasp an object and align its local axis to a world axis.

AxisAlignOptions

Per-invocation grasp-and-axis-alignment behavior.

MoveHeldObject

Move the held object to the exact target object pose with a closed hand.

MoveHeldObjectOptions

Per-invocation held-object transport behavior.

Pour

Rotate and return an exclusively held object about its internal axis.

PourOptions

Per-invocation pouring behavior.

PushObject

Close the end effector, contact a rigid object, and push it in-plane.

PushObjectOptions

Per-invocation planar pushing behavior.

PushObjectToolCalibration

End-effector calibration selected by a bound motion control part.

Place

Lower the held object to a place pose, open the gripper, retract.

PlaceOptions

Per-invocation placement behavior.

Press

Open-loop motion primitive that approaches, presses, and retracts.

PressOptions

Per-invocation pressing behavior.

Slide

Open-loop approach, grasp, and axis-constrained sliding motion.

SlideOptions

Per-invocation sliding behavior for a translating articulation link.

OpenDoor

Approach, grasp, rotate a door about its hinge, release, and retract.

OpenDoorOptions

Per-invocation approach, interpolation, release, and retract behavior.

Twist

Open-loop approach, grasp, twist, release, and retract motion.

TwistOptions

Per-invocation twisting behavior.

CoordinatedPickment

Pick and move a single object pinched by two hands.

CoordinatedPickmentOptions

Per-invocation coordinated pickup behavior.

CoordinatedPlacement

Coordinate two held objects: support object below, placing object above.

CoordinatedPlacementOptions

Per-invocation coordinated placement behavior.

HandOver

Pick an object with the nearer arm, hand it over, and place it.

HandOverGoal

Object to pick and hand over, plus its final object pose.

HandOverOptions

Per-invocation pick-up, handover, and placement behavior.

Built-in Goal Contracts

EndEffectorPoseGoal

End-effector pose goal with optional batched intermediate waypoints.

JointPositionGoal

Explicit or named joint-space goal for a bound robot resource.

GraspGoal

Pickup target with an affordance-selected or supplied grasp pose.

AxisAlignGoal

Object whose local axis should be aligned after an antipodal grasp.

HeldObjectPoseGoal

Desired pose for the object held by this action's control part.

PourGoal

Rotate the object currently held by the bound manipulator.

PushObjectGoal

Push one rigid object toward a target pose on the target support plane.

PlaceGoal

End-effector release-pose target used by Place.

AssembleGoal

Place a held assemble object onto a base object at a relative pose.

PressGoal

Target object described by a press affordance.

SlideGoal

Translating articulation link described by a slide affordance.

OpenDoorGoal

Door handle and desired absolute opening state.

TwistGoal

Target object described by a twist affordance.

CoordinatedPickGoal

Object-centric target for picking and moving one object with two hands.

CoordinatedPlacementGoal

Object-centric target for dual-arm coordinated placement.

HandOverGoal

Object to pick and hand over, plus its final object pose.

MoveEndEffector#

MoveEndEffector atomic action implementation.

Classes:

EndEffectorPoseGoal

End-effector pose goal with optional batched intermediate waypoints.

MoveEndEffector

Plan a free-space move for a bound manipulator.

MoveEndEffectorOptions

Per-invocation behavior for MoveEndEffector.

class embodichain.lab.sim.atomic_actions.primitives.move_end_effector.EndEffectorPoseGoal[source]#

Bases: object

End-effector pose goal with optional batched intermediate waypoints.

Attributes:

xpos

Homogeneous pose with shape (4,4), (B,4,4) or (B,N,4,4).

xpos: Tensor | SceneEntityPose#

Homogeneous pose with shape (4,4), (B,4,4) or (B,N,4,4).

class embodichain.lab.sim.atomic_actions.primitives.move_end_effector.MoveEndEffector[source]#

Bases: AtomicAction[EndEffectorPoseGoal, MoveEndEffectorOptions]

Plan a free-space move for a bound manipulator.

Classes:

Attributes:

binding_contract

Explicit robot-independent requirements for semantic discovery.

skill_id

Stable registry identifier for this skill.

GoalType#

alias of EndEffectorPoseGoal

OptionsType#

alias of MoveEndEffectorOptions

binding_contract: ClassVar[SkillBindingContract] = SkillBindingContract(slots=(SkillResourceSlot(slot_id='primary', endpoints=(SkillEndpointRequirement(endpoint_id='motion', capabilities=frozenset({'motion.cartesian_pose'}), required_commands=mappingproxy({})),), constraints=()),), constraints=())#

Explicit robot-independent requirements for semantic discovery.

Concrete action classes must declare this attribute in their own class body to opt into the semantic catalog. Inheriting another action’s contract does not silently expose a new skill identifier.

skill_id: ClassVar[str] = 'move_end_effector'#

Stable registry identifier for this skill.

class embodichain.lab.sim.atomic_actions.primitives.move_end_effector.MoveEndEffectorOptions[source]#

Bases: ActionOptions

Per-invocation behavior for MoveEndEffector.

MoveJoints#

MoveJoints atomic action implementation.

Classes:

JointPositionGoal

Explicit or named joint-space goal for a bound robot resource.

MoveJoints

Plan joint motion from the observed state to one or more waypoints.

MoveJointsOptions

Per-invocation behavior for MoveJoints.

class embodichain.lab.sim.atomic_actions.primitives.move_joints.JointPositionGoal[source]#

Bases: object

Explicit or named joint-space goal for a bound robot resource.

Attributes:

target

Joint qpos/waypoints or a named control-part profile command.

target: Tensor | str#

Joint qpos/waypoints or a named control-part profile command.

class embodichain.lab.sim.atomic_actions.primitives.move_joints.MoveJoints[source]#

Bases: AtomicAction[JointPositionGoal, MoveJointsOptions]

Plan joint motion from the observed state to one or more waypoints.

Classes:

Attributes:

agent_visible

Whether an Action Agent should expose this skill by default.

binding_contract

Explicit robot-independent requirements for semantic discovery.

skill_id

Stable registry identifier for this skill.

GoalType#

alias of JointPositionGoal

OptionsType#

alias of MoveJointsOptions

agent_visible: ClassVar[bool] = False#

Whether an Action Agent should expose this skill by default.

binding_contract: ClassVar[SkillBindingContract] = SkillBindingContract(slots=(SkillResourceSlot(slot_id='primary', endpoints=(SkillEndpointRequirement(endpoint_id='motion', capabilities=frozenset({'motion.joint_position'}), required_commands=mappingproxy({})),), constraints=()),), constraints=())#

Explicit robot-independent requirements for semantic discovery.

Concrete action classes must declare this attribute in their own class body to opt into the semantic catalog. Inheriting another action’s contract does not silently expose a new skill identifier.

skill_id: ClassVar[str] = 'move_joints'#

Stable registry identifier for this skill.

class embodichain.lab.sim.atomic_actions.primitives.move_joints.MoveJointsOptions[source]#

Bases: ActionOptions

Per-invocation behavior for MoveJoints.

PickUp#

PickUp atomic action implementation.

Classes:

GraspGoal

Pickup target with an affordance-selected or supplied grasp pose.

PickUp

Approach a grasp pose, close the gripper, lift.

PickUpOptions

Per-invocation pickup behavior.

class embodichain.lab.sim.atomic_actions.primitives.pick_up.GraspGoal[source]#

Bases: ObjectActionGoal

Pickup target with an affordance-selected or supplied grasp pose.

Attributes:

grasp_xpos

Optional end-effector grasp pose.

grasp_xpos: Tensor | SceneEntityPose | None#

Optional end-effector grasp pose.

When omitted, PickUp uses the configured fixed object-relative grasp when available, otherwise it selects one from the target affordance. An explicit tensor or late-bound SceneEntityPose skips grasp sampling. Late-bound poses also declare the scene dependency used by closed-loop execution recovery.

class embodichain.lab.sim.atomic_actions.primitives.pick_up.PickUp[source]#

Bases: AtomicAction[GraspGoal, PickUpOptions]

Approach a grasp pose, close the gripper, lift.

Classes:

Attributes:

binding_contract

Explicit robot-independent requirements for semantic discovery.

skill_id

Stable registry identifier for this skill.

GoalType#

alias of GraspGoal

OptionsType#

alias of PickUpOptions

binding_contract: ClassVar[SkillBindingContract] = SkillBindingContract(slots=(SkillResourceSlot(slot_id='primary', endpoints=(SkillEndpointRequirement(endpoint_id='motion', capabilities=frozenset({'kinematics.forward', 'kinematics.batch_inverse', 'motion.cartesian_pose'}), required_commands=mappingproxy({})), SkillEndpointRequirement(endpoint_id='grasp', capabilities=frozenset({'interaction.grasp'}), required_commands=mappingproxy({'open': <class 'embodichain.lab.sim.atomic_actions.control.JointPositionCommand'>, 'grasp': <class 'embodichain.lab.sim.atomic_actions.control.JointPositionCommand'>}))), constraints=(DisjointSlotEndpoints(endpoint_ids=('motion', 'grasp')),)),), constraints=())#

Explicit robot-independent requirements for semantic discovery.

Concrete action classes must declare this attribute in their own class body to opt into the semantic catalog. Inheriting another action’s contract does not silently expose a new skill identifier.

skill_id: ClassVar[str] = 'pick_up'#

Stable registry identifier for this skill.

class embodichain.lab.sim.atomic_actions.primitives.pick_up.PickUpOptions[source]#

Bases: ActionOptions

Per-invocation pickup behavior.

Attributes:

approach_alignment_max_angle

Optional maximum TCP z-axis deviation from the approach direction.

approach_direction

World-frame direction from the pre-grasp pose to the grasp pose.

downstream_object_target_poses

Future object poses that must be reachable with the selected grasp.

fixed_object_to_eef

Optional object-frame to end-effector SE(3) grasp calibration.

grasp_frame_to_eef

Canonical grasp-frame to robot end-effector SE(3) calibration.

grasp_settle_steps

Fully closed hold frames before lifting the end-effector.

hand_interp_steps

Number of waypoints for the gripper-close interpolation segment.

lift_height

Height (m) to lift the end-effector after closing the gripper.

obj_upright_direction

Optional object local direction used to choose the upright grasp rotation.

pick_object_part

Name of the object part to pick up (used for grasp pose generation).

pre_grasp_distance

Distance to offset back from the grasp pose along the approach direction.

rotate_upright

Optional rotation (radians) about the grasp x-axis to apply after grasp selection.

approach_alignment_max_angle: float | None#

Optional maximum TCP z-axis deviation from the approach direction.

approach_direction: Tensor#

World-frame direction from the pre-grasp pose to the grasp pose.

downstream_object_target_poses: tuple[Tensor | SceneEntityPose, ...]#

Future object poses that must be reachable with the selected grasp.

fixed_object_to_eef: Tensor | None#

Optional object-frame to end-effector SE(3) grasp calibration.

When no explicit goal grasp is supplied, this transform bypasses affordance sampling and the sampled-grasp orientation/calibration adjustments.

grasp_frame_to_eef: Tensor#

Canonical grasp-frame to robot end-effector SE(3) calibration.

grasp_settle_steps: int#

Fully closed hold frames before lifting the end-effector.

hand_interp_steps: int#

Number of waypoints for the gripper-close interpolation segment.

lift_height: float#

Height (m) to lift the end-effector after closing the gripper.

obj_upright_direction: Tensor | None#

Optional object local direction used to choose the upright grasp rotation.

pick_object_part: str#

Name of the object part to pick up (used for grasp pose generation). Currently support [center | top | bottom].

pre_grasp_distance: float#

Distance to offset back from the grasp pose along the approach direction.

rotate_upright: float | None#

Optional rotation (radians) about the grasp x-axis to apply after grasp selection.

AxisAlign#

AxisAlign atomic action implementation.

Classes:

AxisAlign

Grasp an object and align its local axis to a world axis.

AxisAlignGoal

Object whose local axis should be aligned after an antipodal grasp.

AxisAlignOptions

Per-invocation grasp-and-axis-alignment behavior.

class embodichain.lab.sim.atomic_actions.primitives.axis_align.AxisAlign[source]#

Bases: AtomicAction[AxisAlignGoal, AxisAlignOptions]

Grasp an object and align its local axis to a world axis.

Classes:

Attributes:

binding_contract

Explicit robot-independent requirements for semantic discovery.

open_loop

Whether the skill intentionally declares no verified physical effect.

skill_id

Stable registry identifier for this skill.

GoalType#

alias of AxisAlignGoal

OptionsType#

alias of AxisAlignOptions

binding_contract: ClassVar[SkillBindingContract] = SkillBindingContract(slots=(SkillResourceSlot(slot_id='primary', endpoints=(SkillEndpointRequirement(endpoint_id='motion', capabilities=frozenset({'kinematics.forward', 'motion.cartesian_pose'}), required_commands=mappingproxy({})), SkillEndpointRequirement(endpoint_id='grasp', capabilities=frozenset({'interaction.grasp'}), required_commands=mappingproxy({'open': <class 'embodichain.lab.sim.atomic_actions.control.JointPositionCommand'>, 'grasp': <class 'embodichain.lab.sim.atomic_actions.control.JointPositionCommand'>}))), constraints=(DisjointSlotEndpoints(endpoint_ids=('motion', 'grasp')),)),), constraints=())#

Explicit robot-independent requirements for semantic discovery.

Concrete action classes must declare this attribute in their own class body to opt into the semantic catalog. Inheriting another action’s contract does not silently expose a new skill identifier.

open_loop: ClassVar[bool] = True#

Whether the skill intentionally declares no verified physical effect.

skill_id: ClassVar[str] = 'axis_align'#

Stable registry identifier for this skill.

class embodichain.lab.sim.atomic_actions.primitives.axis_align.AxisAlignGoal[source]#

Bases: ObjectActionGoal

Object whose local axis should be aligned after an antipodal grasp.

Attributes:

grasp_xpos

Optional explicit end-effector grasp pose; omitted poses are sampled.

grasp_xpos: Tensor | SceneEntityPose | None#

Optional explicit end-effector grasp pose; omitted poses are sampled.

class embodichain.lab.sim.atomic_actions.primitives.axis_align.AxisAlignOptions[source]#

Bases: PickUpOptions

Per-invocation grasp-and-axis-alignment behavior.

Attributes:

target_axis

Desired world-frame axis, shape (3,) or (B, 3).

target_axis: Tensor#

Desired world-frame axis, shape (3,) or (B, 3).

MoveHeldObject#

MoveHeldObject atomic action implementation.

Classes:

HeldObjectPoseGoal

Desired pose for the object held by this action's control part.

MoveHeldObject

Move the held object to the exact target object pose with a closed hand.

MoveHeldObjectOptions

Per-invocation held-object transport behavior.

class embodichain.lab.sim.atomic_actions.primitives.move_held_object.HeldObjectPoseGoal[source]#

Bases: object

Desired pose for the object held by this action’s control part.

Attributes:

object_target_pose

Target object pose, shape (4, 4) or (num_envs, 4, 4).

object_target_pose: Tensor | SceneEntityPose#

Target object pose, shape (4, 4) or (num_envs, 4, 4).

class embodichain.lab.sim.atomic_actions.primitives.move_held_object.MoveHeldObject[source]#

Bases: AtomicAction[HeldObjectPoseGoal, MoveHeldObjectOptions]

Move the held object to the exact target object pose with a closed hand.

The requested object orientation is preserved exactly. Callers that need a transport orientation must encode it in HeldObjectPoseGoal; this action never substitutes an implicit end-effector orientation.

Classes:

Attributes:

binding_contract

Explicit robot-independent requirements for semantic discovery.

skill_id

Stable registry identifier for this skill.

GoalType#

alias of HeldObjectPoseGoal

OptionsType#

alias of MoveHeldObjectOptions

binding_contract: ClassVar[SkillBindingContract] = SkillBindingContract(slots=(SkillResourceSlot(slot_id='primary', endpoints=(SkillEndpointRequirement(endpoint_id='motion', capabilities=frozenset({'kinematics.forward', 'motion.cartesian_pose'}), required_commands=mappingproxy({})), SkillEndpointRequirement(endpoint_id='grasp', capabilities=frozenset({'interaction.grasp'}), required_commands=mappingproxy({'grasp': <class 'embodichain.lab.sim.atomic_actions.control.JointPositionCommand'>}))), constraints=(DisjointSlotEndpoints(endpoint_ids=('motion', 'grasp')),)),), constraints=())#

Explicit robot-independent requirements for semantic discovery.

Concrete action classes must declare this attribute in their own class body to opt into the semantic catalog. Inheriting another action’s contract does not silently expose a new skill identifier.

skill_id: ClassVar[str] = 'move_held_object'#

Stable registry identifier for this skill.

class embodichain.lab.sim.atomic_actions.primitives.move_held_object.MoveHeldObjectOptions[source]#

Bases: ActionOptions

Per-invocation held-object transport behavior.

Pour#

Pour atomic action implementation.

Classes:

Pour

Rotate and return an exclusively held object about its internal axis.

PourGoal

Rotate the object currently held by the bound manipulator.

PourOptions

Per-invocation pouring behavior.

class embodichain.lab.sim.atomic_actions.primitives.pour.Pour[source]#

Bases: AtomicAction[PourGoal, PourOptions]

Rotate and return an exclusively held object about its internal axis.

Classes:

Attributes:

binding_contract

Explicit robot-independent requirements for semantic discovery.

open_loop

Whether the skill intentionally declares no verified physical effect.

skill_id

Stable registry identifier for this skill.

GoalType#

alias of PourGoal

OptionsType#

alias of PourOptions

binding_contract: ClassVar[SkillBindingContract] = SkillBindingContract(slots=(SkillResourceSlot(slot_id='primary', endpoints=(SkillEndpointRequirement(endpoint_id='motion', capabilities=frozenset({'kinematics.forward', 'motion.cartesian_pose'}), required_commands=mappingproxy({})), SkillEndpointRequirement(endpoint_id='grasp', capabilities=frozenset({'interaction.grasp'}), required_commands=mappingproxy({'grasp': <class 'embodichain.lab.sim.atomic_actions.control.JointPositionCommand'>}))), constraints=(DisjointSlotEndpoints(endpoint_ids=('motion', 'grasp')),)),), constraints=())#

Explicit robot-independent requirements for semantic discovery.

Concrete action classes must declare this attribute in their own class body to opt into the semantic catalog. Inheriting another action’s contract does not silently expose a new skill identifier.

open_loop: ClassVar[bool] = True#

Whether the skill intentionally declares no verified physical effect.

skill_id: ClassVar[str] = 'pour'#

Stable registry identifier for this skill.

class embodichain.lab.sim.atomic_actions.primitives.pour.PourGoal[source]#

Bases: object

Rotate the object currently held by the bound manipulator.

class embodichain.lab.sim.atomic_actions.primitives.pour.PourOptions[source]#

Bases: ActionOptions

Per-invocation pouring behavior.

Attributes:

rotate_angle

Signed rotation about the held object's local internal axis, in radians.

rotate_angle: float#

Signed rotation about the held object’s local internal axis, in radians.

PushObject#

Planar rigid-object pushing atomic action.

Classes:

PushObject

Close the end effector, contact a rigid object, and push it in-plane.

PushObjectGoal

Push one rigid object toward a target pose on the target support plane.

PushObjectOptions

Per-invocation planar pushing behavior.

PushObjectToolCalibration

End-effector calibration selected by a bound motion control part.

class embodichain.lab.sim.atomic_actions.primitives.push_object.PushObject[source]#

Bases: AtomicAction[PushObjectGoal, PushObjectOptions]

Close the end effector, contact a rigid object, and push it in-plane.

Classes:

Attributes:

binding_contract

Explicit robot-independent requirements for semantic discovery.

open_loop

Whether the skill intentionally declares no verified physical effect.

skill_id

Stable registry identifier for this skill.

GoalType#

alias of PushObjectGoal

OptionsType#

alias of PushObjectOptions

binding_contract: ClassVar[SkillBindingContract] = SkillBindingContract(slots=(SkillResourceSlot(slot_id='primary', endpoints=(SkillEndpointRequirement(endpoint_id='motion', capabilities=frozenset({'motion.cartesian_pose'}), required_commands=mappingproxy({})), SkillEndpointRequirement(endpoint_id='grasp', capabilities=frozenset({'interaction.grasp'}), required_commands=mappingproxy({'grasp': <class 'embodichain.lab.sim.atomic_actions.control.JointPositionCommand'>}))), constraints=(DisjointSlotEndpoints(endpoint_ids=('motion', 'grasp')),)),), constraints=())#

Explicit robot-independent requirements for semantic discovery.

Concrete action classes must declare this attribute in their own class body to opt into the semantic catalog. Inheriting another action’s contract does not silently expose a new skill identifier.

open_loop: ClassVar[bool] = True#

Whether the skill intentionally declares no verified physical effect.

skill_id: ClassVar[str] = 'push_object'#

Stable registry identifier for this skill.

class embodichain.lab.sim.atomic_actions.primitives.push_object.PushObjectGoal[source]#

Bases: ObjectActionGoal

Push one rigid object toward a target pose on the target support plane.

Attributes:

target_pose

Desired object pose or a late-bound scene-entity target reference.

target_pose: PoseGoalValue#

Desired object pose or a late-bound scene-entity target reference.

class embodichain.lab.sim.atomic_actions.primitives.push_object.PushObjectOptions[source]#

Bases: ActionOptions

Per-invocation planar pushing behavior.

Attributes:

approach_height

Distance above the contact pose used for the free-space approach.

completion_tolerance

Planar target distance at which the action succeeds without moving.

contact_distance

Initial planar clearance behind the object along the push direction.

contact_frame_to_eef

Contact-frame to robot end-effector SE(3) calibration.

hand_interp_steps

Number of waypoints used to close the end effector before approach.

object_contact_offset

Object-local point used as the center of the planar contact frame.

push_overshoot

Additional end-effector travel beyond the object's target displacement.

retract_height

Distance above the pushed pose used for the final retraction.

support_frame_planar_contact_offset

Optional target-support-frame override for the contact's planar offset.

tool_calibrations

Per-control-part tool-frame overrides for asymmetric robot arms.

approach_height: float#

Distance above the contact pose used for the free-space approach.

completion_tolerance: float#

Planar target distance at which the action succeeds without moving.

contact_distance: float#

Initial planar clearance behind the object along the push direction.

contact_frame_to_eef: Tensor#

Contact-frame to robot end-effector SE(3) calibration.

hand_interp_steps: int#

Number of waypoints used to close the end effector before approach.

object_contact_offset: Tensor#

Object-local point used as the center of the planar contact frame.

push_overshoot: float#

Additional end-effector travel beyond the object’s target displacement.

retract_height: float#

Distance above the pushed pose used for the final retraction.

support_frame_planar_contact_offset: Tensor | None#

Optional target-support-frame override for the contact’s planar offset.

tool_calibrations: tuple[PushObjectToolCalibration, ...]#

Per-control-part tool-frame overrides for asymmetric robot arms.

class embodichain.lab.sim.atomic_actions.primitives.push_object.PushObjectToolCalibration[source]#

Bases: object

End-effector calibration selected by a bound motion control part.

Parameters:
  • control_part (str) – Exact motion control-part identifier that selects this calibration.

  • contact_frame_to_eef (Tensor) – Contact-frame to robot end-effector SE(3) calibration.

  • contact_distance (float | None) – Optional tool-specific planar clearance behind the object. None uses PushObjectOptions’ default.

Attributes:

contact_distance

Optional tool-specific planar clearance behind the object.

contact_frame_to_eef

Contact-frame to robot end-effector SE(3) calibration.

control_part

Exact motion control-part identifier that selects this calibration.

contact_distance: float | None#

Optional tool-specific planar clearance behind the object.

contact_frame_to_eef: Tensor#

Contact-frame to robot end-effector SE(3) calibration.

control_part: str#

Exact motion control-part identifier that selects this calibration.

Place#

Place atomic action implementation.

Classes:

AssembleGoal

Place a held assemble object onto a base object at a relative pose.

Place

Lower the held object to a place pose, open the gripper, retract.

PlaceGoal

End-effector release-pose target used by Place.

PlaceOptions

Per-invocation placement behavior.

class embodichain.lab.sim.atomic_actions.primitives.place.AssembleGoal[source]#

Bases: object

Place a held assemble object onto a base object at a relative pose.

The base object pose is a late-bound SceneEntityPose. The assemble object’s target pose is base_pose @ assemble_to_base_pose. The held-object transform (object_to_eef) is read from PlanningContext for the place control part, which a prior PickUp populates.

Attributes:

affordance

Assembly affordance anchoring the assemble object to the base object.

base_pose

Late-bound base-object pose used for snapshot-consistent planning.

affordance: AssembleAffordance#

Assembly affordance anchoring the assemble object to the base object.

base_pose: SceneEntityPose#

Late-bound base-object pose used for snapshot-consistent planning.

class embodichain.lab.sim.atomic_actions.primitives.place.Place[source]#

Bases: AtomicAction[PlaceGoal | AssembleGoal, PlaceOptions]

Lower the held object to a place pose, open the gripper, retract.

The PlaceGoal may carry either a single waypoint (num_envs, 4, 4) (or a broadcastable (4, 4)) or a multi-waypoint trajectory (num_envs, n_waypoint, 4, 4). In the multi-waypoint case the approach segment visits every waypoint in order; approaching from above the first waypoint, descending through each waypoint, then opening the gripper at the final waypoint and retracting to above the last waypoint. Starting joint positions are inherited from PlanningContext.

An AssembleGoal replaces the explicit EEF pose with an assembly affordance: the place pose is derived from the base object’s snapshot pose and assemble_to_base_pose, converted to an EEF pose through the held object’s object_to_eef (read from PlanningContext).

Attributes:

GoalType

Concrete goal dataclass or dataclasses accepted by this skill.

binding_contract

Explicit robot-independent requirements for semantic discovery.

skill_id

Stable registry identifier for this skill.

Classes:

GoalType: ClassVar[type | tuple[type, ...]] = (<class 'embodichain.lab.sim.atomic_actions.primitives.place.PlaceGoal'>, <class 'embodichain.lab.sim.atomic_actions.primitives.place.AssembleGoal'>)#

Concrete goal dataclass or dataclasses accepted by this skill.

OptionsType#

alias of PlaceOptions

binding_contract: ClassVar[SkillBindingContract] = SkillBindingContract(slots=(SkillResourceSlot(slot_id='primary', endpoints=(SkillEndpointRequirement(endpoint_id='motion', capabilities=frozenset({'kinematics.forward', 'motion.cartesian_pose'}), required_commands=mappingproxy({})), SkillEndpointRequirement(endpoint_id='grasp', capabilities=frozenset({'interaction.grasp'}), required_commands=mappingproxy({'open': <class 'embodichain.lab.sim.atomic_actions.control.JointPositionCommand'>, 'grasp': <class 'embodichain.lab.sim.atomic_actions.control.JointPositionCommand'>}))), constraints=(DisjointSlotEndpoints(endpoint_ids=('motion', 'grasp')),)),), constraints=())#

Explicit robot-independent requirements for semantic discovery.

Concrete action classes must declare this attribute in their own class body to opt into the semantic catalog. Inheriting another action’s contract does not silently expose a new skill identifier.

skill_id: ClassVar[str] = 'place'#

Stable registry identifier for this skill.

class embodichain.lab.sim.atomic_actions.primitives.place.PlaceGoal[source]#

Bases: object

End-effector release-pose target used by Place.

Attributes:

tcp_symmetry

Optional TCP-frame symmetry allowed by the placement semantics.

xpos

Target end-effector release pose.

tcp_symmetry: Literal['none', 'z_roll_180']#

Optional TCP-frame symmetry allowed by the placement semantics.

"none" preserves the pose exactly. "z_roll_180" lets placement choose between the pose and its TCP z-roll 180 equivalent, which flips TCP x/y while preserving TCP z and translation.

xpos: Tensor | SceneEntityPose#

Target end-effector release pose.

Accepts (4, 4), (num_envs, 4, 4), or (num_envs, n_waypoint, 4, 4).

class embodichain.lab.sim.atomic_actions.primitives.place.PlaceOptions[source]#

Bases: ActionOptions

Per-invocation placement behavior.

Attributes:

cartesian_waypoint_count

Number of fixed-orientation Cartesian keyframes per translation segment.

hand_interp_steps

Number of waypoints for the gripper-open interpolation segment.

lift_height

Height (m) to retract the end-effector after opening the gripper.

max_approach_retract_z

Optional maximum world-frame TCP z for approach and retract poses (m).

preserve_current_object_orientation

Keep the held object's observed world orientation at the place target.

release_settle_steps

Fully open hold frames before retracting the end-effector.

cartesian_waypoint_count: int#

Number of fixed-orientation Cartesian keyframes per translation segment.

hand_interp_steps: int#

Number of waypoints for the gripper-open interpolation segment.

lift_height: float#

Height (m) to retract the end-effector after opening the gripper.

max_approach_retract_z: float | None#

Optional maximum world-frame TCP z for approach and retract poses (m).

preserve_current_object_orientation: bool#

Keep the held object’s observed world orientation at the place target.

release_settle_steps: int#

Fully open hold frames before retracting the end-effector.

Press#

Press atomic action implementation.

Classes:

Press

Open-loop motion primitive that approaches, presses, and retracts.

PressGoal

Target object described by a press affordance.

PressOptions

Per-invocation pressing behavior.

class embodichain.lab.sim.atomic_actions.primitives.press.Press[source]#

Bases: AtomicAction[PressGoal, PressOptions]

Open-loop motion primitive that approaches, presses, and retracts.

Classes:

Attributes:

binding_contract

Explicit robot-independent requirements for semantic discovery.

open_loop

Whether the skill intentionally declares no verified physical effect.

skill_id

Stable registry identifier for this skill.

GoalType#

alias of PressGoal

OptionsType#

alias of PressOptions

binding_contract: ClassVar[SkillBindingContract] = SkillBindingContract(slots=(SkillResourceSlot(slot_id='primary', endpoints=(SkillEndpointRequirement(endpoint_id='motion', capabilities=frozenset({'kinematics.forward', 'motion.cartesian_pose'}), required_commands=mappingproxy({})), SkillEndpointRequirement(endpoint_id='grasp', capabilities=frozenset({'interaction.grasp'}), required_commands=mappingproxy({'grasp': <class 'embodichain.lab.sim.atomic_actions.control.JointPositionCommand'>}))), constraints=(DisjointSlotEndpoints(endpoint_ids=('motion', 'grasp')),)),), constraints=())#

Explicit robot-independent requirements for semantic discovery.

Concrete action classes must declare this attribute in their own class body to opt into the semantic catalog. Inheriting another action’s contract does not silently expose a new skill identifier.

open_loop: ClassVar[bool] = True#

Whether the skill intentionally declares no verified physical effect.

skill_id: ClassVar[str] = 'press'#

Stable registry identifier for this skill.

class embodichain.lab.sim.atomic_actions.primitives.press.PressGoal[source]#

Bases: ObjectActionGoal

Target object described by a press affordance.

Attributes:

target_pose

Target pose snapshot or late-bound stable scene-entity reference.

target_pose: Tensor | SceneEntityPose#

Target pose snapshot or late-bound stable scene-entity reference.

class embodichain.lab.sim.atomic_actions.primitives.press.PressOptions[source]#

Bases: ActionOptions

Per-invocation pressing behavior.

Attributes:

approach_distance

Distance from the press position opposite the press direction.

hand_interp_steps

Number of waypoints used to close the hand.

press_distance

Distance traveled into the target along its press axis.

press_position

Optional local-frame position overriding the affordance press position.

approach_distance: float#

Distance from the press position opposite the press direction.

hand_interp_steps: int#

Number of waypoints used to close the hand.

press_distance: float#

Distance traveled into the target along its press axis.

press_position: tuple[float, float, float] | None#

Optional local-frame position overriding the affordance press position.

Slide#

Slide atomic action implementation.

Classes:

Slide

Open-loop approach, grasp, and axis-constrained sliding motion.

SlideGoal

Translating articulation link described by a slide affordance.

SlideOptions

Per-invocation sliding behavior for a translating articulation link.

class embodichain.lab.sim.atomic_actions.primitives.slide.Slide[source]#

Bases: AtomicAction[SlideGoal, SlideOptions]

Open-loop approach, grasp, and axis-constrained sliding motion.

Classes:

Attributes:

binding_contract

Explicit robot-independent requirements for semantic discovery.

open_loop

Whether the skill intentionally declares no verified physical effect.

skill_id

Stable registry identifier for this skill.

GoalType#

alias of SlideGoal

OptionsType#

alias of SlideOptions

binding_contract: ClassVar[SkillBindingContract] = SkillBindingContract(slots=(SkillResourceSlot(slot_id='primary', endpoints=(SkillEndpointRequirement(endpoint_id='motion', capabilities=frozenset({'motion.cartesian_pose'}), required_commands=mappingproxy({})), SkillEndpointRequirement(endpoint_id='grasp', capabilities=frozenset({'interaction.grasp'}), required_commands=mappingproxy({'open': <class 'embodichain.lab.sim.atomic_actions.control.JointPositionCommand'>, 'grasp': <class 'embodichain.lab.sim.atomic_actions.control.JointPositionCommand'>}))), constraints=(DisjointSlotEndpoints(endpoint_ids=('motion', 'grasp')),)),), constraints=())#

Explicit robot-independent requirements for semantic discovery.

Concrete action classes must declare this attribute in their own class body to opt into the semantic catalog. Inheriting another action’s contract does not silently expose a new skill identifier.

open_loop: ClassVar[bool] = True#

Whether the skill intentionally declares no verified physical effect.

skill_id: ClassVar[str] = 'slide'#

Stable registry identifier for this skill.

class embodichain.lab.sim.atomic_actions.primitives.slide.SlideGoal[source]#

Bases: ObjectActionGoal

Translating articulation link described by a slide affordance.

Attributes:

target_pose

Link pose snapshot or late-bound stable scene-entity reference.

target_pose: Tensor | SceneEntityPose#

Link pose snapshot or late-bound stable scene-entity reference.

class embodichain.lab.sim.atomic_actions.primitives.slide.SlideOptions[source]#

Bases: ActionOptions

Per-invocation sliding behavior for a translating articulation link.

Attributes:

approach_distance

Pre-grasp distance opposite the approach/push axis.

direction

Whether to pull the part open or push it closed.

hand_interp_steps

Number of waypoints used for each close/open hand segment.

translation_distance

Distance traveled along the pull or push direction.

approach_distance: float#

Pre-grasp distance opposite the approach/push axis.

direction: Literal['pull', 'push']#

Whether to pull the part open or push it closed.

hand_interp_steps: int#

Number of waypoints used for each close/open hand segment.

translation_distance: float#

Distance traveled along the pull or push direction.

OpenDoor#

OpenDoor atomic action implementation.

Classes:

OpenDoor

Approach, grasp, rotate a door about its hinge, release, and retract.

OpenDoorGoal

Door handle and desired absolute opening state.

OpenDoorOptions

Per-invocation approach, interpolation, release, and retract behavior.

class embodichain.lab.sim.atomic_actions.primitives.open_door.OpenDoor[source]#

Bases: AtomicAction[OpenDoorGoal, OpenDoorOptions]

Approach, grasp, rotate a door about its hinge, release, and retract.

Classes:

Attributes:

binding_contract

Explicit robot-independent requirements for semantic discovery.

open_loop

Whether the skill intentionally declares no verified physical effect.

skill_id

Stable registry identifier for this skill.

GoalType#

alias of OpenDoorGoal

OptionsType#

alias of OpenDoorOptions

binding_contract: ClassVar[SkillBindingContract] = SkillBindingContract(slots=(SkillResourceSlot(slot_id='primary', endpoints=(SkillEndpointRequirement(endpoint_id='motion', capabilities=frozenset({'motion.cartesian_pose'}), required_commands=mappingproxy({})), SkillEndpointRequirement(endpoint_id='grasp', capabilities=frozenset({'interaction.grasp'}), required_commands=mappingproxy({'open': <class 'embodichain.lab.sim.atomic_actions.control.JointPositionCommand'>, 'grasp': <class 'embodichain.lab.sim.atomic_actions.control.JointPositionCommand'>}))), constraints=(DisjointSlotEndpoints(endpoint_ids=('motion', 'grasp')),)),), constraints=())#

Explicit robot-independent requirements for semantic discovery.

Concrete action classes must declare this attribute in their own class body to opt into the semantic catalog. Inheriting another action’s contract does not silently expose a new skill identifier.

open_loop: ClassVar[bool] = True#

Whether the skill intentionally declares no verified physical effect.

skill_id: ClassVar[str] = 'open_door'#

Stable registry identifier for this skill.

class embodichain.lab.sim.atomic_actions.primitives.open_door.OpenDoorGoal[source]#

Bases: ObjectActionGoal

Door handle and desired absolute opening state.

Attributes:

open_fraction

Desired hinge position normalized from its closed to open legal endpoint.

target_pose

Handle-link pose snapshot or late-bound scene-entity reference.

open_fraction: float | Tensor#

Desired hinge position normalized from its closed to open legal endpoint.

target_pose: Tensor | SceneEntityPose#

Handle-link pose snapshot or late-bound scene-entity reference.

class embodichain.lab.sim.atomic_actions.primitives.open_door.OpenDoorOptions[source]#

Bases: ActionOptions

Per-invocation approach, interpolation, release, and retract behavior.

Attributes:

approach_distance

Pre-grasp distance opposite the automatically inferred approach axis.

door_waypoint_count

Number of Cartesian keyframes along the handle's circular arc.

hand_interp_steps

Number of waypoints used for each close/open hand segment.

joint_position_tolerance

Tolerance for legal-limit and already-open comparisons in radians.

retract_distance

Post-release retreat distance opposite the rotated approach axis.

approach_distance: float#

Pre-grasp distance opposite the automatically inferred approach axis.

door_waypoint_count: int#

Number of Cartesian keyframes along the handle’s circular arc.

hand_interp_steps: int#

Number of waypoints used for each close/open hand segment.

joint_position_tolerance: float#

Tolerance for legal-limit and already-open comparisons in radians.

retract_distance: float#

Post-release retreat distance opposite the rotated approach axis.

Twist#

Twist atomic action implementation.

Classes:

Twist

Open-loop approach, grasp, twist, release, and retract motion.

TwistGoal

Target object described by a twist affordance.

TwistOptions

Per-invocation twisting behavior.

class embodichain.lab.sim.atomic_actions.primitives.twist.Twist[source]#

Bases: AtomicAction[TwistGoal, TwistOptions]

Open-loop approach, grasp, twist, release, and retract motion.

Classes:

Attributes:

binding_contract

Explicit robot-independent requirements for semantic discovery.

open_loop

Whether the skill intentionally declares no verified physical effect.

skill_id

Stable registry identifier for this skill.

GoalType#

alias of TwistGoal

OptionsType#

alias of TwistOptions

binding_contract: ClassVar[SkillBindingContract] = SkillBindingContract(slots=(SkillResourceSlot(slot_id='primary', endpoints=(SkillEndpointRequirement(endpoint_id='motion', capabilities=frozenset({'kinematics.forward', 'motion.cartesian_pose'}), required_commands=mappingproxy({})), SkillEndpointRequirement(endpoint_id='grasp', capabilities=frozenset({'interaction.grasp'}), required_commands=mappingproxy({'open': <class 'embodichain.lab.sim.atomic_actions.control.JointPositionCommand'>, 'grasp': <class 'embodichain.lab.sim.atomic_actions.control.JointPositionCommand'>}))), constraints=(DisjointSlotEndpoints(endpoint_ids=('motion', 'grasp')),)),), constraints=())#

Explicit robot-independent requirements for semantic discovery.

Concrete action classes must declare this attribute in their own class body to opt into the semantic catalog. Inheriting another action’s contract does not silently expose a new skill identifier.

open_loop: ClassVar[bool] = True#

Whether the skill intentionally declares no verified physical effect.

skill_id: ClassVar[str] = 'twist'#

Stable registry identifier for this skill.

class embodichain.lab.sim.atomic_actions.primitives.twist.TwistGoal[source]#

Bases: ObjectActionGoal

Target object described by a twist affordance.

Attributes:

target_pose

Target pose snapshot or late-bound stable scene-entity reference.

target_pose: Tensor | SceneEntityPose#

Target pose snapshot or late-bound stable scene-entity reference.

class embodichain.lab.sim.atomic_actions.primitives.twist.TwistOptions[source]#

Bases: ActionOptions

Per-invocation twisting behavior.

Attributes:

hand_interp_steps

Number of waypoints used for each close/open hand segment.

pre_grasp_distance

Distance from the grasp pose along its negative z-axis.

twist_angle

Requested twist rotation in radians.

twist_waypoint_count

Number of Cartesian keyframes along the target's circular twist arc.

hand_interp_steps: int#

Number of waypoints used for each close/open hand segment.

pre_grasp_distance: float#

Distance from the grasp pose along its negative z-axis.

twist_angle: float#

Requested twist rotation in radians.

twist_waypoint_count: int#

Number of Cartesian keyframes along the target’s circular twist arc.

CoordinatedPickment#

CoordinatedPickment atomic action implementation.

Classes:

CoordinatedPickGoal

Object-centric target for picking and moving one object with two hands.

CoordinatedPickment

Pick and move a single object pinched by two hands.

CoordinatedPickmentOptions

Per-invocation coordinated pickup behavior.

class embodichain.lab.sim.atomic_actions.primitives.coordinated_pickment.CoordinatedPickGoal[source]#

Bases: ObjectActionGoal

Object-centric target for picking and moving one object with two hands.

The left/right grasp poses are not supplied by the caller; they are sampled by the parallel-jaw grasp-pose service at planning time using the dual-arm direction and approach direction declared on CoordinatedPickmentOptions.

Attributes:

object_initial_pose

Optional initial object pose.

object_target_pose

Target pose for the shared object, shape (4, 4) or (num_envs, 4, 4).

object_initial_pose: Tensor | SceneEntityPose | None#

Optional initial object pose.

When omitted, the pose is grounded through the semantic object’s stable scene identity.

object_target_pose: Tensor | SceneEntityPose#

Target pose for the shared object, shape (4, 4) or (num_envs, 4, 4).

class embodichain.lab.sim.atomic_actions.primitives.coordinated_pickment.CoordinatedPickment[source]#

Bases: AtomicAction[CoordinatedPickGoal, CoordinatedPickmentOptions]

Pick and move a single object pinched by two hands.

Classes:

Attributes:

binding_contract

Explicit robot-independent requirements for semantic discovery.

skill_id

Stable registry identifier for this skill.

GoalType#

alias of CoordinatedPickGoal

OptionsType#

alias of CoordinatedPickmentOptions

binding_contract: ClassVar[SkillBindingContract] = SkillBindingContract(slots=(SkillResourceSlot(slot_id='left', endpoints=(SkillEndpointRequirement(endpoint_id='motion', capabilities=frozenset({'kinematics.inverse'}), required_commands=mappingproxy({})), SkillEndpointRequirement(endpoint_id='grasp', capabilities=frozenset({'interaction.grasp'}), required_commands=mappingproxy({'open': <class 'embodichain.lab.sim.atomic_actions.control.JointPositionCommand'>, 'grasp': <class 'embodichain.lab.sim.atomic_actions.control.JointPositionCommand'>}))), constraints=(DisjointSlotEndpoints(endpoint_ids=('motion', 'grasp')),)), SkillResourceSlot(slot_id='right', endpoints=(SkillEndpointRequirement(endpoint_id='motion', capabilities=frozenset({'kinematics.inverse'}), required_commands=mappingproxy({})), SkillEndpointRequirement(endpoint_id='grasp', capabilities=frozenset({'interaction.grasp'}), required_commands=mappingproxy({'open': <class 'embodichain.lab.sim.atomic_actions.control.JointPositionCommand'>, 'grasp': <class 'embodichain.lab.sim.atomic_actions.control.JointPositionCommand'>}))), constraints=(DisjointSlotEndpoints(endpoint_ids=('motion', 'grasp')),))), constraints=(DisjointResourceSlots(slots=('left', 'right')),))#

Explicit robot-independent requirements for semantic discovery.

Concrete action classes must declare this attribute in their own class body to opt into the semantic catalog. Inheriting another action’s contract does not silently expose a new skill identifier.

skill_id: ClassVar[str] = 'coordinated_pickment'#

Stable registry identifier for this skill.

class embodichain.lab.sim.atomic_actions.primitives.coordinated_pickment.CoordinatedPickmentOptions[source]#

Bases: ActionOptions

Per-invocation coordinated pickup behavior.

Left/right grasps are sampled from target-local affordance geometry by the engine’s parallel-jaw grasp-pose service. The dual-arm direction splits the object into left/right grasp regions and the approach direction filters the sampled antipodal pairs.

Attributes:

approach_direction

World-frame direction used to sample and approach both grasps, shape (3,).

hand_interp_steps

Number of waypoints used for the simultaneous hand-close segment.

hold_steps

Number of waypoints to hold the final object target pose.

left_to_right_arm_direction

World-frame direction from the left arm base to the right arm base, shape (3,).

lift_height

World-Z lift distance before moving to the object target pose.

middle_empty_ratio

Fraction of the object's left-to-right extent left grasp-free in the middle so the two grippers pinch opposite ends.

object_motion_keyframes

Number of object-pose keyframes solved by IK before joint-space interpolation.

pre_grasp_distance

World distance to retreat from each grasp pose along negative TCP z.

approach_direction: Tensor#

World-frame direction used to sample and approach both grasps, shape (3,).

hand_interp_steps: int#

Number of waypoints used for the simultaneous hand-close segment.

hold_steps: int#

Number of waypoints to hold the final object target pose.

left_to_right_arm_direction: Tensor#

World-frame direction from the left arm base to the right arm base, shape (3,). It partitions the object into left/right grasp regions and should be a finite, non-zero vector; it is normalized at planning time.

lift_height: float#

World-Z lift distance before moving to the object target pose.

middle_empty_ratio: float#

Fraction of the object’s left-to-right extent left grasp-free in the middle so the two grippers pinch opposite ends. Must be in [0, 1].

object_motion_keyframes: int#

Number of object-pose keyframes solved by IK before joint-space interpolation.

pre_grasp_distance: float#

World distance to retreat from each grasp pose along negative TCP z.

CoordinatedPlacement#

CoordinatedPlacement atomic action implementation.

Classes:

CoordinatedPlacement

Coordinate two held objects: support object below, placing object above.

CoordinatedPlacementGoal

Object-centric target for dual-arm coordinated placement.

CoordinatedPlacementOptions

Per-invocation coordinated placement behavior.

class embodichain.lab.sim.atomic_actions.primitives.coordinated_placement.CoordinatedPlacement[source]#

Bases: AtomicAction[CoordinatedPlacementGoal, CoordinatedPlacementOptions]

Coordinate two held objects: support object below, placing object above.

Classes:

Attributes:

binding_contract

Explicit robot-independent requirements for semantic discovery.

skill_id

Stable registry identifier for this skill.

GoalType#

alias of CoordinatedPlacementGoal

OptionsType#

alias of CoordinatedPlacementOptions

binding_contract: ClassVar[SkillBindingContract] = SkillBindingContract(slots=(SkillResourceSlot(slot_id='placing', endpoints=(SkillEndpointRequirement(endpoint_id='motion', capabilities=frozenset({'motion.cartesian_pose'}), required_commands=mappingproxy({})), SkillEndpointRequirement(endpoint_id='grasp', capabilities=frozenset({'interaction.grasp'}), required_commands=mappingproxy({'open': <class 'embodichain.lab.sim.atomic_actions.control.JointPositionCommand'>, 'grasp': <class 'embodichain.lab.sim.atomic_actions.control.JointPositionCommand'>}))), constraints=(DisjointSlotEndpoints(endpoint_ids=('motion', 'grasp')),)), SkillResourceSlot(slot_id='support', endpoints=(SkillEndpointRequirement(endpoint_id='motion', capabilities=frozenset({'motion.cartesian_pose'}), required_commands=mappingproxy({})), SkillEndpointRequirement(endpoint_id='grasp', capabilities=frozenset({'interaction.grasp'}), required_commands=mappingproxy({'grasp': <class 'embodichain.lab.sim.atomic_actions.control.JointPositionCommand'>}))), constraints=(DisjointSlotEndpoints(endpoint_ids=('motion', 'grasp')),))), constraints=(DisjointResourceSlots(slots=('placing', 'support')),))#

Explicit robot-independent requirements for semantic discovery.

Concrete action classes must declare this attribute in their own class body to opt into the semantic catalog. Inheriting another action’s contract does not silently expose a new skill identifier.

skill_id: ClassVar[str] = 'coordinated_placement'#

Stable registry identifier for this skill.

class embodichain.lab.sim.atomic_actions.primitives.coordinated_placement.CoordinatedPlacementGoal[source]#

Bases: object

Object-centric target for dual-arm coordinated placement.

Attributes:

placing_height_offset

World-Z offset above the placing object target pose.

placing_object_target_pose

Target pose for the object released by the placing arm.

release

Whether the placing hand releases.

support_height_offset

World-Z offset above the support object target pose.

support_object_target_pose

Target pose for the object held by the support arm.

placing_height_offset: float | None#

World-Z offset above the placing object target pose.

placing_object_target_pose: Tensor | SceneEntityPose#

Target pose for the object released by the placing arm.

release: bool | None#

Whether the placing hand releases. None uses invocation options.

support_height_offset: float | None#

World-Z offset above the support object target pose.

support_object_target_pose: Tensor | SceneEntityPose#

Target pose for the object held by the support arm.

class embodichain.lab.sim.atomic_actions.primitives.coordinated_placement.CoordinatedPlacementOptions[source]#

Bases: ActionOptions

Per-invocation coordinated placement behavior.

Attributes:

hand_interp_steps

Number of waypoints for the placing-hand release interpolation.

hold_steps

Number of waypoints to hold alignment before releasing.

lift_height

World-Z lift distance for the placing arm after release.

placing_height_offset

Default World-Z offset above the placing object target pose.

release

Whether to open the placing hand at the aligned placement pose.

retreat_steps

Number of waypoints used for the placing-arm lift retreat.

support_height_offset

Default World-Z offset above the support object target pose.

hand_interp_steps: int#

Number of waypoints for the placing-hand release interpolation.

hold_steps: int#

Number of waypoints to hold alignment before releasing.

lift_height: float#

World-Z lift distance for the placing arm after release.

placing_height_offset: float#

Default World-Z offset above the placing object target pose.

release: bool#

Whether to open the placing hand at the aligned placement pose.

retreat_steps: int#

Number of waypoints used for the placing-arm lift retreat.

support_height_offset: float#

Default World-Z offset above the support object target pose.

HandOver#

Pick-up-and-handover atomic action implementation.

Classes:

HandOver

Pick an object with the nearer arm, hand it over, and place it.

HandOverGoal

Object to pick and hand over, plus its final object pose.

HandOverOptions

Per-invocation pick-up, handover, and placement behavior.

class embodichain.lab.sim.atomic_actions.primitives.hand_over.HandOver[source]#

Bases: AtomicAction[HandOverGoal, HandOverOptions]

Pick an object with the nearer arm, hand it over, and place it.

For each environment, the action chooses the arm whose root link is closer to the observed object pose. It samples at most 1000 mesh-surface points and applies SVD in the current object pose to find obj_longest_axis. When that axis is closer to world Z than to the horizontal plane, both grasp approaches point toward the object horizontally and tilt downward by 45 degrees. Otherwise both approaches are world-Z downward.

The first arm grasps the projected end of obj_longest_axis nearest its current TCP; the receiving arm grasps the opposite end at the predicted middle object pose. This keeps the two hands from selecting the same object region regardless of whether a long object is standing or lying down.

After each grasp waypoint, subsequent EEF waypoints preserve that grasp rotation and change translation only. In particular, placement first moves strictly horizontally at the handover height and then lowers to the final target pose before releasing the object.

Classes:

Attributes:

binding_contract

Explicit robot-independent requirements for semantic discovery.

open_loop

Whether the skill intentionally declares no verified physical effect.

skill_id

Stable registry identifier for this skill.

GoalType#

alias of HandOverGoal

OptionsType#

alias of HandOverOptions

binding_contract: ClassVar[SkillBindingContract] = SkillBindingContract(slots=(SkillResourceSlot(slot_id='source', endpoints=(SkillEndpointRequirement(endpoint_id='motion', capabilities=frozenset({'kinematics.forward', 'motion.cartesian_pose'}), required_commands=mappingproxy({})), SkillEndpointRequirement(endpoint_id='grasp', capabilities=frozenset({'interaction.grasp'}), required_commands=mappingproxy({'open': <class 'embodichain.lab.sim.atomic_actions.control.JointPositionCommand'>, 'grasp': <class 'embodichain.lab.sim.atomic_actions.control.JointPositionCommand'>}))), constraints=(DisjointSlotEndpoints(endpoint_ids=('motion', 'grasp')),)), SkillResourceSlot(slot_id='destination', endpoints=(SkillEndpointRequirement(endpoint_id='motion', capabilities=frozenset({'kinematics.forward', 'motion.cartesian_pose'}), required_commands=mappingproxy({})), SkillEndpointRequirement(endpoint_id='grasp', capabilities=frozenset({'interaction.grasp'}), required_commands=mappingproxy({'open': <class 'embodichain.lab.sim.atomic_actions.control.JointPositionCommand'>, 'grasp': <class 'embodichain.lab.sim.atomic_actions.control.JointPositionCommand'>}))), constraints=(DisjointSlotEndpoints(endpoint_ids=('motion', 'grasp')),))), constraints=(DisjointResourceSlots(slots=('source', 'destination')),))#

Explicit robot-independent requirements for semantic discovery.

Concrete action classes must declare this attribute in their own class body to opt into the semantic catalog. Inheriting another action’s contract does not silently expose a new skill identifier.

open_loop: ClassVar[bool] = True#

Whether the skill intentionally declares no verified physical effect.

skill_id: ClassVar[str] = 'hand_over'#

Stable registry identifier for this skill.

class embodichain.lab.sim.atomic_actions.primitives.hand_over.HandOverGoal[source]#

Bases: ObjectActionGoal

Object to pick and hand over, plus its final object pose.

Attributes:

target_pose

Final object pose after the receiving arm lowers and releases it.

target_pose: PoseGoalValue#

Final object pose after the receiving arm lowers and releases it.

class embodichain.lab.sim.atomic_actions.primitives.hand_over.HandOverOptions[source]#

Bases: ActionOptions

Per-invocation pick-up, handover, and placement behavior.

Attributes:

hand_interp_steps

Waypoints used by every gripper open/close interpolation.

lift_height

World-Z distance used to lift the object after the first grasp.

pre_grasp_distance

Distance from each grasp pose to its approach pose, in metres.

hand_interp_steps: int#

Waypoints used by every gripper open/close interpolation.

lift_height: float#

World-Z distance used to lift the object after the first grasp.

pre_grasp_distance: float#

Distance from each grasp pose to its approach pose, in metres.