embodichain.lab.sim.atomic_actions.primitives#
Built-in atomic action primitive implementations.
Classes:
|
Place a held assemble object onto a base object at a relative pose. |
|
Grasp an object and align its local axis to a world axis. |
|
Object whose local axis should be aligned after an antipodal grasp. |
|
Per-invocation grasp-and-axis-alignment behavior. |
|
Object-centric target for picking and moving one object with two hands. |
|
Pick and move a single object pinched by two hands. |
|
Per-invocation coordinated pickup behavior. |
|
Coordinate two held objects: support object below, placing object above. |
|
Object-centric target for dual-arm coordinated placement. |
|
Per-invocation coordinated placement behavior. |
|
End-effector pose goal with optional batched intermediate waypoints. |
|
Pickup target with an affordance-selected or supplied grasp pose. |
|
Pick an object with the nearer arm, hand it over, and place it. |
|
Object to pick and hand over, plus its final object pose. |
|
Per-invocation pick-up, handover, and placement behavior. |
|
Desired pose for the object held by this action's control part. |
|
Explicit or named joint-space goal for a bound robot resource. |
|
Plan a free-space move for a bound manipulator. |
|
Per-invocation behavior for |
|
Move the held object to the exact target object pose with a closed hand. |
|
Per-invocation held-object transport behavior. |
|
Plan joint motion from the observed state to one or more waypoints. |
|
Per-invocation behavior for |
|
Approach, grasp, rotate a door about its hinge, release, and retract. |
|
Door handle and desired absolute opening state. |
|
Per-invocation approach, interpolation, release, and retract behavior. |
|
Approach a grasp pose, close the gripper, lift. |
|
Per-invocation pickup behavior. |
|
Lower the held object to a place pose, open the gripper, retract. |
|
End-effector release-pose target used by |
|
Per-invocation placement behavior. |
|
Rotate and return an exclusively held object about its internal axis. |
|
Rotate the object currently held by the bound manipulator. |
|
Per-invocation pouring behavior. |
|
Open-loop motion primitive that approaches, presses, and retracts. |
|
Target object described by a press affordance. |
|
Per-invocation pressing behavior. |
|
Close the end effector, contact a rigid object, and push it in-plane. |
|
Push one rigid object toward a target pose on the target support plane. |
|
Per-invocation planar pushing behavior. |
|
End-effector calibration selected by a bound motion control part. |
|
Open-loop approach, grasp, and axis-constrained sliding motion. |
|
Translating articulation link described by a slide affordance. |
|
Per-invocation sliding behavior for a translating articulation link. |
|
Open-loop approach, grasp, twist, release, and retract motion. |
|
Target object described by a twist affordance. |
|
Per-invocation twisting behavior. |
Data:
|
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 isbase_pose @ assemble_to_base_pose. The held-object transform (object_to_eef) is read fromPlanningContextfor the place control part, which a priorPickUppopulates.Methods:
__init__(affordance, base_pose)Attributes:
affordanceAssembly affordance anchoring the assemble object to the base object.
base_poseLate-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:
GoalTypealias of
AxisAlignGoalOptionsTypealias of
AxisAlignOptionsAttributes:
binding_contractExplicit robot-independent requirements for semantic discovery.
open_loopWhether the skill intentionally declares no verified physical effect.
skill_idStable 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_xposOptional 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_axisDesired 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_poseOptional initial object pose.
object_target_poseTarget 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:
GoalTypealias of
CoordinatedPickGoalOptionsTypealias of
CoordinatedPickmentOptionsAttributes:
binding_contractExplicit robot-independent requirements for semantic discovery.
skill_idStable 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_directionWorld-frame direction used to sample and approach both grasps, shape
(3,).hand_interp_stepsNumber of waypoints used for the simultaneous hand-close segment.
hold_stepsNumber of waypoints to hold the final object target pose.
left_to_right_arm_directionWorld-frame direction from the left arm base to the right arm base, shape
(3,).lift_heightWorld-Z lift distance before moving to the object target pose.
middle_empty_ratioFraction of the object's left-to-right extent left grasp-free in the middle so the two grippers pinch opposite ends.
object_motion_keyframesNumber of object-pose keyframes solved by IK before joint-space interpolation.
pre_grasp_distanceWorld 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:
GoalTypealias of
CoordinatedPlacementGoalOptionsTypealias of
CoordinatedPlacementOptionsAttributes:
binding_contractExplicit robot-independent requirements for semantic discovery.
skill_idStable 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_offsetWorld-Z offset above the placing object target pose.
placing_object_target_poseTarget pose for the object released by the placing arm.
releaseWhether the placing hand releases.
support_height_offsetWorld-Z offset above the support object target pose.
support_object_target_poseTarget 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.
Noneuses 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_stepsNumber of waypoints for the placing-hand release interpolation.
hold_stepsNumber of waypoints to hold alignment before releasing.
lift_heightWorld-Z lift distance for the placing arm after release.
placing_height_offsetDefault World-Z offset above the placing object target pose.
releaseWhether to open the placing hand at the aligned placement pose.
retreat_stepsNumber of waypoints used for the placing-arm lift retreat.
support_height_offsetDefault 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:
xposHomogeneous 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_xposOptional end-effector grasp pose.
- __init__(semantics, grasp_xpos=None)
-
grasp_xpos:
Tensor|SceneEntityPose|None Optional end-effector grasp pose.
When omitted,
PickUpuses the configured fixed object-relative grasp when available, otherwise it selects one from the target affordance. An explicit tensor or late-boundSceneEntityPoseskips 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_axisnearest 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:
GoalTypealias of
HandOverGoalOptionsTypealias of
HandOverOptionsAttributes:
binding_contractExplicit robot-independent requirements for semantic discovery.
open_loopWhether the skill intentionally declares no verified physical effect.
skill_idStable 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_poseFinal 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_stepsWaypoints used by every gripper open/close interpolation.
lift_heightWorld-Z distance used to lift the object after the first grasp.
pre_grasp_distanceDistance 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_poseTarget 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:
targetJoint 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:
GoalTypealias of
EndEffectorPoseGoalOptionsTypealias of
MoveEndEffectorOptionsAttributes:
binding_contractExplicit robot-independent requirements for semantic discovery.
skill_idStable 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:
GoalTypealias of
HeldObjectPoseGoalOptionsTypealias of
MoveHeldObjectOptionsAttributes:
binding_contractExplicit robot-independent requirements for semantic discovery.
skill_idStable 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:
GoalTypealias of
JointPositionGoalOptionsTypealias of
MoveJointsOptionsAttributes:
agent_visibleWhether an Action Agent should expose this skill by default.
binding_contractExplicit robot-independent requirements for semantic discovery.
skill_idStable 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:
GoalTypealias of
OpenDoorGoalOptionsTypealias of
OpenDoorOptionsAttributes:
binding_contractExplicit robot-independent requirements for semantic discovery.
open_loopWhether the skill intentionally declares no verified physical effect.
skill_idStable 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_fractionDesired hinge position normalized from its closed to open legal endpoint.
target_poseHandle-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_distancePre-grasp distance opposite the automatically inferred approach axis.
door_waypoint_countNumber of Cartesian keyframes along the handle's circular arc.
hand_interp_stepsNumber of waypoints used for each close/open hand segment.
joint_position_toleranceTolerance for legal-limit and already-open comparisons in radians.
retract_distancePost-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:
GoalTypealias of
GraspGoalOptionsTypealias of
PickUpOptionsAttributes:
binding_contractExplicit robot-independent requirements for semantic discovery.
skill_idStable 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_angleOptional maximum TCP z-axis deviation from the approach direction.
approach_directionWorld-frame direction from the pre-grasp pose to the grasp pose.
downstream_object_target_posesFuture object poses that must be reachable with the selected grasp.
fixed_object_to_eefOptional object-frame to end-effector SE(3) grasp calibration.
grasp_frame_to_eefCanonical grasp-frame to robot end-effector SE(3) calibration.
grasp_settle_stepsFully closed hold frames before lifting the end-effector.
hand_interp_stepsNumber of waypoints for the gripper-close interpolation segment.
lift_heightHeight (m) to lift the end-effector after closing the gripper.
obj_upright_directionOptional object local direction used to choose the upright grasp rotation.
pick_object_partName of the object part to pick up (used for grasp pose generation).
pre_grasp_distanceDistance to offset back from the grasp pose along the approach direction.
rotate_uprightOptional 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
PlaceGoalmay 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 fromPlanningContext.An
AssembleGoalreplaces the explicit EEF pose with an assembly affordance: the place pose is derived from the base object’s snapshot pose andassemble_to_base_pose, converted to an EEF pose through the held object’sobject_to_eef(read fromPlanningContext).Attributes:
GoalTypeConcrete goal dataclass or dataclasses accepted by this skill.
binding_contractExplicit robot-independent requirements for semantic discovery.
skill_idStable registry identifier for this skill.
Classes:
OptionsTypealias 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_symmetryOptional TCP-frame symmetry allowed by the placement semantics.
xposTarget 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_countNumber of fixed-orientation Cartesian keyframes per translation segment.
hand_interp_stepsNumber of waypoints for the gripper-open interpolation segment.
lift_heightHeight (m) to retract the end-effector after opening the gripper.
max_approach_retract_zOptional maximum world-frame TCP z for approach and retract poses (m).
preserve_current_object_orientationKeep the held object's observed world orientation at the place target.
release_settle_stepsFully 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:
GoalTypealias of
PourGoalOptionsTypealias of
PourOptionsAttributes:
binding_contractExplicit robot-independent requirements for semantic discovery.
open_loopWhether the skill intentionally declares no verified physical effect.
skill_idStable 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_angleSigned 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:
GoalTypealias of
PressGoalOptionsTypealias of
PressOptionsAttributes:
binding_contractExplicit robot-independent requirements for semantic discovery.
open_loopWhether the skill intentionally declares no verified physical effect.
skill_idStable 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_poseTarget 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_distanceDistance from the press position opposite the press direction.
hand_interp_stepsNumber of waypoints used to close the hand.
press_distanceDistance traveled into the target along its press axis.
press_positionOptional 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:
GoalTypealias of
PushObjectGoalOptionsTypealias of
PushObjectOptionsAttributes:
binding_contractExplicit robot-independent requirements for semantic discovery.
open_loopWhether the skill intentionally declares no verified physical effect.
skill_idStable 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_poseDesired 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_heightDistance above the contact pose used for the free-space approach.
completion_tolerancePlanar target distance at which the action succeeds without moving.
contact_distanceInitial planar clearance behind the object along the push direction.
contact_frame_to_eefContact-frame to robot end-effector SE(3) calibration.
hand_interp_stepsNumber of waypoints used to close the end effector before approach.
object_contact_offsetObject-local point used as the center of the planar contact frame.
push_overshootAdditional end-effector travel beyond the object's target displacement.
retract_heightDistance above the pushed pose used for the final retraction.
support_frame_planar_contact_offsetOptional target-support-frame override for the contact's planar offset.
tool_calibrationsPer-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.NoneusesPushObjectOptions’ default.
Methods:
__init__(control_part, contact_frame_to_eef)Attributes:
contact_distanceOptional tool-specific planar clearance behind the object.
contact_frame_to_eefContact-frame to robot end-effector SE(3) calibration.
control_partExact 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:
GoalTypealias of
SlideGoalOptionsTypealias of
SlideOptionsAttributes:
binding_contractExplicit robot-independent requirements for semantic discovery.
open_loopWhether the skill intentionally declares no verified physical effect.
skill_idStable 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_poseLink 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_distancePre-grasp distance opposite the approach/push axis.
directionWhether to pull the part open or push it closed.
hand_interp_stepsNumber of waypoints used for each close/open hand segment.
translation_distanceDistance 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:
GoalTypealias of
TwistGoalOptionsTypealias of
TwistOptionsAttributes:
binding_contractExplicit robot-independent requirements for semantic discovery.
open_loopWhether the skill intentionally declares no verified physical effect.
skill_idStable 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_poseTarget 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_stepsNumber of waypoints used for each close/open hand segment.
pre_grasp_distanceDistance from the grasp pose along its negative z-axis.
twist_angleRequested twist rotation in radians.
twist_waypoint_countNumber 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
MoveEndEffectorPlan a free-space move for a bound manipulator.
MoveEndEffectorOptionsPer-invocation behavior for
MoveEndEffector.
MoveJointsPlan joint motion from the observed state to one or more waypoints.
MoveJointsOptionsPer-invocation behavior for
MoveJoints.
PickUpApproach a grasp pose, close the gripper, lift.
PickUpOptionsPer-invocation pickup behavior.
AxisAlignGrasp an object and align its local axis to a world axis.
AxisAlignOptionsPer-invocation grasp-and-axis-alignment behavior.
MoveHeldObjectMove the held object to the exact target object pose with a closed hand.
MoveHeldObjectOptionsPer-invocation held-object transport behavior.
PourRotate and return an exclusively held object about its internal axis.
PourOptionsPer-invocation pouring behavior.
PushObjectClose the end effector, contact a rigid object, and push it in-plane.
PushObjectOptionsPer-invocation planar pushing behavior.
PushObjectToolCalibrationEnd-effector calibration selected by a bound motion control part.
PlaceLower the held object to a place pose, open the gripper, retract.
PlaceOptionsPer-invocation placement behavior.
PressOpen-loop motion primitive that approaches, presses, and retracts.
PressOptionsPer-invocation pressing behavior.
SlideOpen-loop approach, grasp, and axis-constrained sliding motion.
SlideOptionsPer-invocation sliding behavior for a translating articulation link.
OpenDoorApproach, grasp, rotate a door about its hinge, release, and retract.
OpenDoorOptionsPer-invocation approach, interpolation, release, and retract behavior.
TwistOpen-loop approach, grasp, twist, release, and retract motion.
TwistOptionsPer-invocation twisting behavior.
CoordinatedPickmentPick and move a single object pinched by two hands.
CoordinatedPickmentOptionsPer-invocation coordinated pickup behavior.
CoordinatedPlacementCoordinate two held objects: support object below, placing object above.
CoordinatedPlacementOptionsPer-invocation coordinated placement behavior.
HandOverPick an object with the nearer arm, hand it over, and place it.
HandOverGoalObject to pick and hand over, plus its final object pose.
HandOverOptionsPer-invocation pick-up, handover, and placement behavior.
Built-in Goal Contracts
EndEffectorPoseGoalEnd-effector pose goal with optional batched intermediate waypoints.
JointPositionGoalExplicit or named joint-space goal for a bound robot resource.
GraspGoalPickup target with an affordance-selected or supplied grasp pose.
AxisAlignGoalObject whose local axis should be aligned after an antipodal grasp.
HeldObjectPoseGoalDesired pose for the object held by this action's control part.
PourGoalRotate the object currently held by the bound manipulator.
PushObjectGoalPush one rigid object toward a target pose on the target support plane.
PlaceGoalEnd-effector release-pose target used by
Place.
AssembleGoalPlace a held assemble object onto a base object at a relative pose.
PressGoalTarget object described by a press affordance.
SlideGoalTranslating articulation link described by a slide affordance.
OpenDoorGoalDoor handle and desired absolute opening state.
TwistGoalTarget object described by a twist affordance.
CoordinatedPickGoalObject-centric target for picking and moving one object with two hands.
CoordinatedPlacementGoalObject-centric target for dual-arm coordinated placement.
HandOverGoalObject to pick and hand over, plus its final object pose.
MoveEndEffector#
MoveEndEffector atomic action implementation.
Classes:
End-effector pose goal with optional batched intermediate waypoints. |
|
Plan a free-space move for a bound manipulator. |
|
Per-invocation behavior for |
- class embodichain.lab.sim.atomic_actions.primitives.move_end_effector.EndEffectorPoseGoal[source]#
Bases:
objectEnd-effector pose goal with optional batched intermediate waypoints.
Attributes:
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).
-
xpos:
- 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:
alias of
EndEffectorPoseGoalalias of
MoveEndEffectorOptionsAttributes:
Explicit robot-independent requirements for semantic discovery.
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:
ActionOptionsPer-invocation behavior for
MoveEndEffector.
MoveJoints#
MoveJoints atomic action implementation.
Classes:
Explicit or named joint-space goal for a bound robot resource. |
|
Plan joint motion from the observed state to one or more waypoints. |
|
Per-invocation behavior for |
- class embodichain.lab.sim.atomic_actions.primitives.move_joints.JointPositionGoal[source]#
Bases:
objectExplicit or named joint-space goal for a bound robot resource.
Attributes:
Joint qpos/waypoints or a named control-part profile command.
-
target:
Tensor|str# Joint qpos/waypoints or a named control-part profile command.
-
target:
- 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:
alias of
JointPositionGoalalias of
MoveJointsOptionsAttributes:
Whether an Action Agent should expose this skill by default.
Explicit robot-independent requirements for semantic discovery.
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:
ActionOptionsPer-invocation behavior for
MoveJoints.
PickUp#
PickUp atomic action implementation.
Classes:
Pickup target with an affordance-selected or supplied grasp pose. |
|
Approach a grasp pose, close the gripper, lift. |
|
Per-invocation pickup behavior. |
- class embodichain.lab.sim.atomic_actions.primitives.pick_up.GraspGoal[source]#
Bases:
ObjectActionGoalPickup target with an affordance-selected or supplied grasp pose.
Attributes:
Optional end-effector grasp pose.
-
grasp_xpos:
Tensor|SceneEntityPose|None# Optional end-effector grasp pose.
When omitted,
PickUpuses the configured fixed object-relative grasp when available, otherwise it selects one from the target affordance. An explicit tensor or late-boundSceneEntityPoseskips grasp sampling. Late-bound poses also declare the scene dependency used by closed-loop execution recovery.
-
grasp_xpos:
- class embodichain.lab.sim.atomic_actions.primitives.pick_up.PickUp[source]#
Bases:
AtomicAction[GraspGoal,PickUpOptions]Approach a grasp pose, close the gripper, lift.
Classes:
alias of
GraspGoalalias of
PickUpOptionsAttributes:
Explicit robot-independent requirements for semantic discovery.
Stable registry identifier for this skill.
- 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:
ActionOptionsPer-invocation pickup behavior.
Attributes:
Optional maximum TCP z-axis deviation from the approach direction.
World-frame direction from the pre-grasp pose to the grasp pose.
Future object poses that must be reachable with the selected grasp.
Optional object-frame to end-effector SE(3) grasp calibration.
Canonical grasp-frame to robot end-effector SE(3) calibration.
Fully closed hold frames before lifting the end-effector.
Number of waypoints for the gripper-close interpolation segment.
Height (m) to lift the end-effector after closing the gripper.
Optional object local direction used to choose the upright grasp rotation.
Name of the object part to pick up (used for grasp pose generation).
Distance to offset back from the grasp pose along the approach direction.
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.
-
approach_alignment_max_angle:
AxisAlign#
AxisAlign atomic action implementation.
Classes:
Grasp an object and align its local axis to a world axis. |
|
Object whose local axis should be aligned after an antipodal grasp. |
|
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:
alias of
AxisAlignGoalalias of
AxisAlignOptionsAttributes:
Explicit robot-independent requirements for semantic discovery.
Whether the skill intentionally declares no verified physical effect.
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:
ObjectActionGoalObject whose local axis should be aligned after an antipodal grasp.
Attributes:
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.
-
grasp_xpos:
- class embodichain.lab.sim.atomic_actions.primitives.axis_align.AxisAlignOptions[source]#
Bases:
PickUpOptionsPer-invocation grasp-and-axis-alignment behavior.
Attributes:
Desired world-frame axis, shape
(3,)or(B, 3).-
target_axis:
Tensor# Desired world-frame axis, shape
(3,)or(B, 3).
-
target_axis:
MoveHeldObject#
MoveHeldObject atomic action implementation.
Classes:
Desired pose for the object held by this action's control part. |
|
Move the held object to the exact target object pose with a closed hand. |
|
Per-invocation held-object transport behavior. |
- class embodichain.lab.sim.atomic_actions.primitives.move_held_object.HeldObjectPoseGoal[source]#
Bases:
objectDesired pose for the object held by this action’s control part.
Attributes:
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).
-
object_target_pose:
- 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:
alias of
HeldObjectPoseGoalalias of
MoveHeldObjectOptionsAttributes:
Explicit robot-independent requirements for semantic discovery.
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:
ActionOptionsPer-invocation held-object transport behavior.
Pour#
Pour atomic action implementation.
Classes:
Rotate and return an exclusively held object about its internal axis. |
|
Rotate the object currently held by the bound manipulator. |
|
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:
alias of
PourGoalalias of
PourOptionsAttributes:
Explicit robot-independent requirements for semantic discovery.
Whether the skill intentionally declares no verified physical effect.
Stable registry identifier for this skill.
- 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:
objectRotate the object currently held by the bound manipulator.
- class embodichain.lab.sim.atomic_actions.primitives.pour.PourOptions[source]#
Bases:
ActionOptionsPer-invocation pouring behavior.
Attributes:
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.
-
rotate_angle:
PushObject#
Planar rigid-object pushing atomic action.
Classes:
Close the end effector, contact a rigid object, and push it in-plane. |
|
Push one rigid object toward a target pose on the target support plane. |
|
Per-invocation planar pushing behavior. |
|
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:
alias of
PushObjectGoalalias of
PushObjectOptionsAttributes:
Explicit robot-independent requirements for semantic discovery.
Whether the skill intentionally declares no verified physical effect.
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:
ObjectActionGoalPush one rigid object toward a target pose on the target support plane.
Attributes:
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:
ActionOptionsPer-invocation planar pushing behavior.
Attributes:
Distance above the contact pose used for the free-space approach.
Planar target distance at which the action succeeds without moving.
Initial planar clearance behind the object along the push direction.
Contact-frame to robot end-effector SE(3) calibration.
Number of waypoints used to close the end effector before approach.
Object-local point used as the center of the planar contact frame.
Additional end-effector travel beyond the object's target displacement.
Distance above the pushed pose used for the final retraction.
Optional target-support-frame override for the contact's planar offset.
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.
-
approach_height:
- class embodichain.lab.sim.atomic_actions.primitives.push_object.PushObjectToolCalibration[source]#
Bases:
objectEnd-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.NoneusesPushObjectOptions’ default.
Attributes:
Optional tool-specific planar clearance behind the object.
Contact-frame to robot end-effector SE(3) calibration.
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:
Place a held assemble object onto a base object at a relative pose. |
|
Lower the held object to a place pose, open the gripper, retract. |
|
End-effector release-pose target used by |
|
Per-invocation placement behavior. |
- class embodichain.lab.sim.atomic_actions.primitives.place.AssembleGoal[source]#
Bases:
objectPlace 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 isbase_pose @ assemble_to_base_pose. The held-object transform (object_to_eef) is read fromPlanningContextfor the place control part, which a priorPickUppopulates.Attributes:
Assembly affordance anchoring the assemble object to the base object.
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.
-
affordance:
- 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
PlaceGoalmay 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 fromPlanningContext.An
AssembleGoalreplaces the explicit EEF pose with an assembly affordance: the place pose is derived from the base object’s snapshot pose andassemble_to_base_pose, converted to an EEF pose through the held object’sobject_to_eef(read fromPlanningContext).Attributes:
Concrete goal dataclass or dataclasses accepted by this skill.
Explicit robot-independent requirements for semantic discovery.
Stable registry identifier for this skill.
Classes:
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.place.PlaceGoal[source]#
Bases:
objectEnd-effector release-pose target used by
Place.Attributes:
Optional TCP-frame symmetry allowed by the placement semantics.
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).
-
tcp_symmetry:
- class embodichain.lab.sim.atomic_actions.primitives.place.PlaceOptions[source]#
Bases:
ActionOptionsPer-invocation placement behavior.
Attributes:
Number of fixed-orientation Cartesian keyframes per translation segment.
Number of waypoints for the gripper-open interpolation segment.
Height (m) to retract the end-effector after opening the gripper.
Optional maximum world-frame TCP z for approach and retract poses (m).
Keep the held object's observed world orientation at the place target.
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.
-
cartesian_waypoint_count:
Press#
Press atomic action implementation.
Classes:
Open-loop motion primitive that approaches, presses, and retracts. |
|
Target object described by a press affordance. |
|
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:
alias of
PressGoalalias of
PressOptionsAttributes:
Explicit robot-independent requirements for semantic discovery.
Whether the skill intentionally declares no verified physical effect.
Stable registry identifier for this skill.
- 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:
ObjectActionGoalTarget object described by a press affordance.
Attributes:
Target pose snapshot or late-bound stable scene-entity reference.
-
target_pose:
Tensor|SceneEntityPose# Target pose snapshot or late-bound stable scene-entity reference.
-
target_pose:
- class embodichain.lab.sim.atomic_actions.primitives.press.PressOptions[source]#
Bases:
ActionOptionsPer-invocation pressing behavior.
Attributes:
Distance from the press position opposite the press direction.
Number of waypoints used to close the hand.
Distance traveled into the target along its press axis.
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.
-
approach_distance:
Slide#
Slide atomic action implementation.
Classes:
Open-loop approach, grasp, and axis-constrained sliding motion. |
|
Translating articulation link described by a slide affordance. |
|
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:
alias of
SlideGoalalias of
SlideOptionsAttributes:
Explicit robot-independent requirements for semantic discovery.
Whether the skill intentionally declares no verified physical effect.
Stable registry identifier for this skill.
- 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:
ObjectActionGoalTranslating articulation link described by a slide affordance.
Attributes:
Link pose snapshot or late-bound stable scene-entity reference.
-
target_pose:
Tensor|SceneEntityPose# Link pose snapshot or late-bound stable scene-entity reference.
-
target_pose:
- class embodichain.lab.sim.atomic_actions.primitives.slide.SlideOptions[source]#
Bases:
ActionOptionsPer-invocation sliding behavior for a translating articulation link.
Attributes:
Pre-grasp distance opposite the approach/push axis.
Whether to pull the part open or push it closed.
Number of waypoints used for each close/open hand segment.
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.
-
approach_distance:
OpenDoor#
OpenDoor atomic action implementation.
Classes:
Approach, grasp, rotate a door about its hinge, release, and retract. |
|
Door handle and desired absolute opening state. |
|
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:
alias of
OpenDoorGoalalias of
OpenDoorOptionsAttributes:
Explicit robot-independent requirements for semantic discovery.
Whether the skill intentionally declares no verified physical effect.
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:
ObjectActionGoalDoor handle and desired absolute opening state.
Attributes:
Desired hinge position normalized from its closed to open legal endpoint.
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.
-
open_fraction:
- class embodichain.lab.sim.atomic_actions.primitives.open_door.OpenDoorOptions[source]#
Bases:
ActionOptionsPer-invocation approach, interpolation, release, and retract behavior.
Attributes:
Pre-grasp distance opposite the automatically inferred approach axis.
Number of Cartesian keyframes along the handle's circular arc.
Number of waypoints used for each close/open hand segment.
Tolerance for legal-limit and already-open comparisons in radians.
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.
-
approach_distance:
Twist#
Twist atomic action implementation.
Classes:
Open-loop approach, grasp, twist, release, and retract motion. |
|
Target object described by a twist affordance. |
|
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:
alias of
TwistGoalalias of
TwistOptionsAttributes:
Explicit robot-independent requirements for semantic discovery.
Whether the skill intentionally declares no verified physical effect.
Stable registry identifier for this skill.
- 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:
ObjectActionGoalTarget object described by a twist affordance.
Attributes:
Target pose snapshot or late-bound stable scene-entity reference.
-
target_pose:
Tensor|SceneEntityPose# Target pose snapshot or late-bound stable scene-entity reference.
-
target_pose:
- class embodichain.lab.sim.atomic_actions.primitives.twist.TwistOptions[source]#
Bases:
ActionOptionsPer-invocation twisting behavior.
Attributes:
Number of waypoints used for each close/open hand segment.
Distance from the grasp pose along its negative z-axis.
Requested twist rotation in radians.
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.
-
hand_interp_steps:
CoordinatedPickment#
CoordinatedPickment atomic action implementation.
Classes:
Object-centric target for picking and moving one object with two hands. |
|
Pick and move a single object pinched by two hands. |
|
Per-invocation coordinated pickup behavior. |
- class embodichain.lab.sim.atomic_actions.primitives.coordinated_pickment.CoordinatedPickGoal[source]#
Bases:
ObjectActionGoalObject-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:
Optional initial object 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).
-
object_initial_pose:
- 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:
alias of
CoordinatedPickGoalalias of
CoordinatedPickmentOptionsAttributes:
Explicit robot-independent requirements for semantic discovery.
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:
ActionOptionsPer-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:
World-frame direction used to sample and approach both grasps, shape
(3,).Number of waypoints used for the simultaneous hand-close segment.
Number of waypoints to hold the final object target pose.
World-frame direction from the left arm base to the right arm base, shape
(3,).World-Z lift distance before moving to the object target pose.
Fraction of the object's left-to-right extent left grasp-free in the middle so the two grippers pinch opposite ends.
Number of object-pose keyframes solved by IK before joint-space interpolation.
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.
-
approach_direction:
CoordinatedPlacement#
CoordinatedPlacement atomic action implementation.
Classes:
Coordinate two held objects: support object below, placing object above. |
|
Object-centric target for dual-arm coordinated placement. |
|
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:
alias of
CoordinatedPlacementGoalalias of
CoordinatedPlacementOptionsAttributes:
Explicit robot-independent requirements for semantic discovery.
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:
objectObject-centric target for dual-arm coordinated placement.
Attributes:
World-Z offset above the placing object target pose.
Target pose for the object released by the placing arm.
Whether the placing hand releases.
World-Z offset above the 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.
Noneuses 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.
-
placing_height_offset:
- class embodichain.lab.sim.atomic_actions.primitives.coordinated_placement.CoordinatedPlacementOptions[source]#
Bases:
ActionOptionsPer-invocation coordinated placement behavior.
Attributes:
Number of waypoints for the placing-hand release interpolation.
Number of waypoints to hold alignment before releasing.
World-Z lift distance for the placing arm after release.
Default World-Z offset above the placing object target pose.
Whether to open the placing hand at the aligned placement pose.
Number of waypoints used for the placing-arm lift retreat.
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.
-
hand_interp_steps:
HandOver#
Pick-up-and-handover atomic action implementation.
Classes:
Pick an object with the nearer arm, hand it over, and place it. |
|
Object to pick and hand over, plus its final object pose. |
|
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_axisnearest 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:
alias of
HandOverGoalalias of
HandOverOptionsAttributes:
Explicit robot-independent requirements for semantic discovery.
Whether the skill intentionally declares no verified physical effect.
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:
ObjectActionGoalObject to pick and hand over, plus its final object pose.
Attributes:
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:
ActionOptionsPer-invocation pick-up, handover, and placement behavior.
Attributes:
Waypoints used by every gripper open/close interpolation.
World-Z distance used to lift the object after the first grasp.
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.
-
hand_interp_steps: