Action Terms¶
Action terms turn the policy's action vector into commands for an entity: joint-space PD and velocity controllers, task-space controllers (differential IK, absolute-pose IK, operational-space control), floating-base pose control, grippers and welds. The actions guide explains how to choose and configure them; the term catalog lists every parameter.
from eden import actions
# excerpted from eden/tasks/benchmark/reacher/config.py
actions.ImplicitPDController.configure(entity_name="robot", dofs_name="joint*", scale=0.05)
The action-term base class ActionTerm is on the managers page.
Joint-space controllers¶
ImplicitPDController lets Genesis integrate the PD law (position mode); ExplicitPDController computes the
torque itself (control_dofs_force), so its damping is explicit under every integrator.
Joint-space PD and velocity action terms (implicit/explicit controllers).
Attributes¶
Classes¶
ImplicitPDController
¶
ImplicitPDController(env: EnvBase, options: ActionTermOptions)
Bases: _JointPDControllerBase
Implicit joint PD controller using Genesis's built-in position control.
Uses control_dofs_pos which leverages Genesis's implicit integration scheme:
the PD target is recomputed at every physics substep and an implicit damping term
(kd * substep_dt) is added to the mass matrix for numerical stability. This matches
the behavior of MuJoCo, making it suitable for sim2sim transfer.
Source code in eden/managers/terms/actions/joint_actions.py
ExplicitPDController
¶
ExplicitPDController(env: EnvBase, options: ActionTermOptions)
Bases: _JointPDControllerBase
Explicit joint PD controller using manual torque computation.
Computes PD torques explicitly and applies them via control_dofs_force.
This is more physically accurate as it matches real-world motor control where
only torque commands are valid. Better suited for sim2real transfer and easier
to extend with domain randomization (e.g., randomizing kp/kd, adding motor delays).
An optional modifier can be provided to compose post-processing steps
(delay, backlash, DC saturation, friction, effort clipping, motor strength scaling)
on top of the PD controller::
ExplicitPDController.configure(
entity_name="robot",
dofs_name=["joint1", "joint2"],
modifier=Compose.configure(
modifiers=[
ActionDelay.configure(delay_range_steps=(1, 3)),
FrictionModel.configure(static_friction=2.4, dynamic_friction=0.24),
EffortClip.configure(driving_torque_limit=111.0, ...),
MotorStrength.configure(motor_strength=0.8),
]
),
)
Note
Requires sim_substeps=1 so that PD torques are recomputed at every physics
substep. Adjust decimation accordingly to maintain the desired control frequency.
The -kd * qdot term is explicit under every EnvOptions.integrator: Genesis' implicit
passes only damp the DOFs it drives itself (:class:ImplicitPDController), and the entity's
kd * substep_dt armature fold runs under "euler" only. A kd stable through
ImplicitPDController at a given substep can therefore diverge here.
Source code in eden/managers/terms/actions/joint_actions.py
Methods:¶
build
¶
Source code in eden/managers/terms/actions/joint_actions.py
reset
¶
reset(envs_idx: slice | Tensor | None = None) -> None
Source code in eden/managers/terms/actions/joint_actions.py
apply_actions
¶
Source code in eden/managers/terms/actions/joint_actions.py
VelocityFeedforwardPDController
¶
VelocityFeedforwardPDController(env: EnvBase, options: ActionTermOptions)
Bases: _JointPDControllerBase
Explicit joint PD controller with velocity feedforward.
Extends the explicit PD controller by accepting both target joint positions and target joint velocities as actions. The torque is computed as:
.. math:: \tau = k_p (q_{target} + q_{offset} - q_{current} + q_{motor_offset}) + k_d (-\dot{q}{current} + \dot{q})} \cdot r_{ff
where :math:r_{ff} is the velocity feedforward ratio. Post-processing
(motor strength scaling, torque offset injection, effort clipping, etc.)
is opt-in via the modifier parameter — see the composable modifiers in
:mod:eden.managers.modifiers.actions.actuators.
| PARAMETER | DESCRIPTION |
|---|---|
entity_name
|
The name of the entity to control.
|
dofs_name
|
The names of the DOFs to control.
|
reference_source
|
Source of the reference offset added on top of the position action.
|
scale
|
The scale to apply to the position actions;
|
offset
|
The offset to apply to the position actions.
|
velocity_scale
|
The scale to apply to the velocity actions.
|
feed_forward_ratio
|
The ratio for the velocity feedforward term.
|
Source code in eden/managers/terms/actions/joint_actions.py
Attributes¶
Methods:¶
build
¶
Source code in eden/managers/terms/actions/joint_actions.py
reset
¶
reset(envs_idx: slice | Tensor | None = None) -> None
Source code in eden/managers/terms/actions/joint_actions.py
compute
¶
Source code in eden/managers/terms/actions/joint_actions.py
apply_actions
¶
Source code in eden/managers/terms/actions/joint_actions.py
ImplicitVelocityController
¶
ImplicitVelocityController(env: EnvBase, options: ActionTermOptions)
Bases: _JointPDControllerBase
Joint velocity control through Genesis's built-in velocity mode.
Source code in eden/managers/terms/actions/joint_actions.py
Attributes¶
reference_source
class-attribute
instance-attribute
¶
reference_source: ReferenceSource = ReferenceSource.ZERO
Methods:¶
build
¶
Source code in eden/managers/terms/actions/joint_actions.py
ExplicitVelocityController
¶
ExplicitVelocityController(env: EnvBase, options: ActionTermOptions)
Bases: _JointPDControllerBase
Explicit joint velocity controller using manual torque computation.
The policy action is interpreted as a target joint velocity. Torque is computed as a proportional law on the velocity error:
.. math:: \tau = k_p (\dot{q}_{target} - \dot{q})
This matches the behavior of MuJoCo's velocity actuator and the implicit
counterpart :class:ImplicitVelocityController. Use this variant when an
explicit, auditable torque is required (e.g., sim2real, modifier composition,
domain randomization of the gain).
The gain is derived from the DOF force range so it is automatically scaled to each joint's effort capacity:
.. math:: k_p = (F_{max} - F_{min}) \cdot \text{velocity_gain}
| PARAMETER | DESCRIPTION |
|---|---|
entity_name
|
The name of the entity to control.
TYPE:
|
dofs_name
|
The names of the DOFs to control. Supports glob patterns. |
velocity_gain
|
Scales the force range to produce :math:
TYPE:
|
modifier
|
Optional composable action modifier (e.g., effort clip, friction).
TYPE:
|
Source code in eden/managers/terms/actions/joint_actions.py
Attributes¶
reference_source
class-attribute
instance-attribute
¶
reference_source: ReferenceSource = ReferenceSource.ZERO
Methods:¶
build
¶
Source code in eden/managers/terms/actions/joint_actions.py
reset
¶
reset(envs_idx: slice | Tensor | None = None) -> None
Source code in eden/managers/terms/actions/joint_actions.py
apply_actions
¶
Source code in eden/managers/terms/actions/joint_actions.py
NullJointAction
¶
NullJointAction(env: EnvBase, options: ActionTermOptions)
Bases: ActionTerm
Virtually fix the DoFs to the default positions.
Consumes no policy output: the DOFs are held at default_dofs_pos for the whole episode,
so there is nothing for the policy to decide and :attr:action_dim is 0. The term still
commands its DOFs — processed_action stays (num_envs, num_dofs) and reaches
hardware through the usual deployment map — it just draws none of the action vector.
| PARAMETER | DESCRIPTION |
|---|---|
entity_name
|
The name of the entity to control.
|
dofs_name
|
The names of the DOFs to control.
|
Source code in eden/managers/terms/actions/joint_actions.py
Attributes¶
action_dim
property
¶
action_dim: int
No policy output: this term pins its DOFs rather than steering them.
The base class returns the DOF count, which would have ActionManager reserve a slice of
the action vector per pinned DOF — columns the policy would learn to emit and compute
would discard, since it is a no-op. num_dofs is left alone: the term commands those DOFs,
it just takes no input for them. That is also what keeps this term out of
ActionManager._reject_no_op_terms, which rejects any term whose action_dim and
num_dofs are both zero — a dofs_name-less term that would command nothing.
Methods:¶
build
¶
Source code in eden/managers/terms/actions/joint_actions.py
compute
¶
apply_actions
¶
Source code in eden/managers/terms/actions/joint_actions.py
Functions:¶
is_joint_position_controller
¶
is_joint_position_controller(term: type | ActionTerm) -> bool
Whether term (a term class or instance) is a joint PD controller that commands positions.
True for :class:ImplicitPDController, :class:ExplicitPDController,
:class:VelocityFeedforwardPDController and their subclasses; False for the velocity
controllers, which share the PD base for its scale/offset plumbing but command a velocity, and
for every other action term. This is the set a robot's position action scale, and a joint-zero
offset such as :class:~eden.managers.terms.events.domain_rand.RandomizeDofsPosOffset, apply to.
| PARAMETER | DESCRIPTION |
|---|---|
term
|
An action term class, or a built term instance.
TYPE:
|
Source code in eden/managers/terms/actions/joint_actions.py
Task-space controllers¶
Task-space action terms: differential IK, absolute pose IK, and operational-space control.
Attributes¶
Classes¶
DifferentialIKController
¶
DifferentialIKController(env: EnvBase, options: ActionTermOptions)
Bases: ActionTerm
Action term that maps task-space commands to joint targets via differential IK.
| PARAMETER | DESCRIPTION |
|---|---|
entity_name
|
The name of the entity to control.
|
dofs_name
|
The names of the DOFs to control.
|
ee_link_name
|
The name of the end-effector link.
|
ee_local_pos
|
Control-point position in the end-effector link frame, in metres: the point the position rows move, and the point a rotation command turns the link about. The default is the link origin.
|
position_scale
|
Metres per normalized action unit for the position axes. A scalar applies to x, y, and z; a length-3 list configures the axes independently.
|
orientation_scale
|
Radians per normalized action unit for the orientation axes. A scalar applies to rx, ry, and rz; a length-3 list configures the axes independently.
|
damping
|
Levenberg-Marquardt damping
|
max_dq
|
Optional per-step clamp (rad) on the IK joint delta, mirroring mjlab's
|
position_weight
|
Task-space weight on the position (x, y, z) rows of the IK solve.
|
orientation_weight
|
Task-space weight on the orientation (rx, ry, rz) rows of the IK solve,
mirroring mjlab's
|
Source code in eden/managers/terms/actions/task_space_actions.py
Attributes¶
ee_local_pos
class-attribute
instance-attribute
¶
position_scale
class-attribute
instance-attribute
¶
orientation_scale
class-attribute
instance-attribute
¶
effective_scale
property
¶
Return the resolved task-space scale in (x, y, z, rx, ry, rz) order.
Methods:¶
build
¶
Source code in eden/managers/terms/actions/task_space_actions.py
compute
¶
Source code in eden/managers/terms/actions/task_space_actions.py
reset
¶
OperationalSpaceController
¶
OperationalSpaceController(env: EnvBase, options: ActionTermOptions)
Bases: ActionTerm
Operational-space control to a persistent relative position/pose target.
Policy actions are clipped, scaled, and composed with the measured world-frame control-point pose in
:meth:compute. The resulting absolute target stays fixed while :meth:apply_actions recomputes feedback,
Jacobian, inertia, nullspace, and DOF force on every physics substep. Gravity compensation is configured on the
rigid material of the kinematic-tree root, including the root parent rather than only the controlled child in a
welded tree. This controller does not add Coriolis or centrifugal bias forces. The entity's configured force range
saturates the controller command, not the total effective effort including material gravity compensation.
The controller supports fixed entities and entities welded through a static parent chain. dofs_name defines one
ordered controller space shared by the Jacobian, mass matrix, DOF state, nullspace objective, and output force.
When dynamics are enabled, build rejects a selected DOF set that omits an ancestor DOF of the control-point link.
The selected mass submatrix further assumes remaining excluded branch DOFs are fixed or held so their acceleration
can be neglected, or are dynamically decoupled; assigning them another controller does not by itself remove dynamic
coupling. Operational inertia uses a relative Tikhonov approximation to the Moore-Penrose pseudoinverse, so a
rank-deficient Jacobian has a finite damped minimum-norm response.
Planned extensions
TODO(generic-osc-extensions): Add absolute pose targets, configurable task/root/world command frames, per-axis motion selection, absolute wrench and hybrid motion-force control, variable impedance, and command interpolation as concrete Eden callers require them. Extend the dynamics contract to floating bases and passive coupled coordinates only with an explicit generalized-coordinate index space. Keep multi-end-effector, mobile-manipulator, and whole-body coordination in a composite layer above this single-control-point action term.
| PARAMETER | DESCRIPTION |
|---|---|
ee_link_name
|
Link carrying the controlled point.
TYPE:
|
ee_local_pos
|
Control-point position in the end-effector link frame, in metres. |
ee_local_quat
|
Control-point orientation in the end-effector link frame as a normalized wxyz quaternion. |
control_mode
|
Whether actions command three world-frame translation deltas or translation plus world-frame axis-angle rotation deltas.
TYPE:
|
position_scale
|
Metres per translation action unit, scalar or axis-wise. |
orientation_scale
|
Radians per axis-angle rotation action unit, scalar or axis-wise. Ignored in position mode. |
action_clip
|
Symmetric pre-scaling action limit for each controlled task axis. |
kp
|
Nonnegative task-space proportional gains for the controlled axes. |
damping_ratio
|
Nonnegative damping ratios. Derivative gains are 2 * damping_ratio * sqrt(kp). |
inertial_decoupling
|
none maps the feedback wrench directly, full multiplies it by the coupled operational inertia, and position_orientation uses separate translational and rotational operational inertias.
TYPE:
|
operational_inertia_damping
|
Positive dimensionless Tikhonov ridge coefficient relative to the squared largest absolute entry of each task-space inverse-inertia matrix.
TYPE:
|
nullspace_kp
|
Positive DOF-space posture gain, or None to disable the secondary posture objective. Enabling it requires more selected DOFs than controlled task axes.
TYPE:
|
nullspace_damping_ratio
|
Nonnegative damping ratio for the nullspace posture objective.
TYPE:
|
nullspace_reference
|
Track the entity default DOF positions or the measured DOF positions at the most recent reset.
TYPE:
|
Source code in eden/managers/terms/actions/task_space_actions.py
Attributes¶
ee_local_pos
class-attribute
instance-attribute
¶
ee_local_quat
class-attribute
instance-attribute
¶
control_mode
class-attribute
instance-attribute
¶
control_mode: Literal['position', 'pose'] = 'pose'
position_scale
class-attribute
instance-attribute
¶
orientation_scale
class-attribute
instance-attribute
¶
inertial_decoupling
class-attribute
instance-attribute
¶
inertial_decoupling: Literal['none', 'full', 'position_orientation'] = 'none'
operational_inertia_damping
class-attribute
instance-attribute
¶
operational_inertia_damping: float = 1e-06
nullspace_reference
class-attribute
instance-attribute
¶
nullspace_reference: Literal['default', 'reset_pose'] = 'default'
effective_scale
property
¶
Return the resolved scale in position-then-orientation axis order.
Methods:¶
build
¶
Source code in eden/managers/terms/actions/task_space_actions.py
compute
¶
Source code in eden/managers/terms/actions/task_space_actions.py
reset
¶
reset(envs_idx: slice | Tensor | None = None) -> None
Source code in eden/managers/terms/actions/task_space_actions.py
apply_actions
¶
Source code in eden/managers/terms/actions/task_space_actions.py
596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 | |
IKPoseController
¶
IKPoseController(env: EnvBase, options: ActionTermOptions)
Bases: ActionTerm
Absolute task-space pose controller: solve IK for a base-frame target pose each step.
The action is a base-frame target pose [x, y, z, qw, qx, qy, qz] (wxyz) for the
end-effector link, optionally expressed at a virtual tool frame offset from that link.
Each control step the target is transformed to the world frame, the tool offset is
removed, and Genesis' IK is solved from the measured joint configuration so the
resulting joint targets stay on the current elbow branch. Policies that emit
accumulated Cartesian targets (RobotArena-style delta accumulation, DROID Cartesian
velocity effectors) drive this term; a policy that emits per-step deltas relative to
the measured pose should use :class:DifferentialIKController instead.
| PARAMETER | DESCRIPTION |
|---|---|
entity_name
|
The name of the entity to control.
|
dofs_name
|
The arm DOFs the IK solution is applied to.
|
ee_link_name
|
The end-effector link the target pose refers to.
|
ee_link_offset_pos
|
Position of the virtual tool frame in the end-effector link frame. The link is driven to the pose that places this offset frame at the target.
|
ee_link_offset_quat
|
Orientation (wxyz) of the virtual tool frame in the end-effector link frame.
|
max_joint_delta
|
Per-step clamp (rad) on every joint's change from its measured position; also
turns an IK branch discontinuity into a bounded step.
|
joint_limit_margin
|
Keep commanded joints at least this far (rad) inside their limits.
|
max_ik_position_error
|
Reject an IK solution whose position residual (m) exceeds this and hold the
measured arm pose instead.
|
max_ik_rotation_error
|
Same for the rotation residual (rad).
|
Source code in eden/managers/terms/actions/task_space_actions.py
Attributes¶
ee_link_offset_pos
class-attribute
instance-attribute
¶
ee_link_offset_quat
class-attribute
instance-attribute
¶
max_ik_position_error
class-attribute
instance-attribute
¶
max_ik_position_error: float | None = None
max_ik_rotation_error
class-attribute
instance-attribute
¶
max_ik_rotation_error: float | None = None
Methods:¶
build
¶
Source code in eden/managers/terms/actions/task_space_actions.py
compute
¶
Source code in eden/managers/terms/actions/task_space_actions.py
754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 | |
reset
¶
Functions:¶
Floating-base pose control¶
Pose control of a floating base: a hand or gripper that flies, with no arm under it.
Attributes¶
Classes¶
FreeBasePoseController
¶
FreeBasePoseController(env: EnvBase, options: ActionTermOptions)
Bases: ActionTerm
Drive a floating base to a pose near its default root pose (Genesis free-joint PD).
For an entity that stands on nothing (a dexterous hand or a gripper with no arm: a "flying" end effector), this
term is the arm. Its action is six numbers per environment: a translation along the world axes, at
position_scale metres per unit, then a rotation vector about the world axes, at orientation_scale
radians per unit. Both are applied to the entity's default root pose, about its authored origin (a hand's
wrist), so the target is absolute: a zero action holds the default pose.
The target orientation is composed as a quaternion and only then written as the free joint's intrinsic xyz Euler angles, which Genesis turns straight back into a quaternion to take a rotation-vector error. Nothing is added in Euler space, so a default orientation at the Euler singularity (pitch at 90 degrees, which a palm-down hand is) costs nothing.
Genesis position control places the solver frame, which for a re-origined body is not the authored frame that
default_root_pos / default_root_quat describe (see docs/guides/entities.md). The offset between them
is measured once at build and applied to every target.
The gains below are written to the six free-joint DOFs at build. Nothing else sets them: Eden applies
default_dofs_kp / default_dofs_kd to the joints in dofs_name only, and Genesis leaves a free joint
at zero gain with an unbounded force range. Gravity is not in the loop. Give the entity
RigidMaterialOptions(gravity_compensation=1.0), as a real arm's controller would, or it hangs
m * g / position_kp below its target and the orientation loop carries the weight's moment about the origin.
| PARAMETER | DESCRIPTION |
|---|---|
entity_name
|
The floating-base entity. It must have exactly one free joint and must not be attached to another entity.
TYPE:
|
position_scale
|
Metres per unit of translation action, scalar or per world axis. |
orientation_scale
|
Radians per unit of rotation-vector action, scalar or per world axis. |
position_kp
|
Translational stiffness, N/m.
TYPE:
|
position_kd
|
Translational damping, N·s/m.
TYPE:
|
orientation_kp
|
Rotational stiffness, N·m/rad.
TYPE:
|
orientation_kd
|
Rotational damping, N·m·s/rad.
TYPE:
|
force_limit
|
Bound on each translational DOF's control force, N.
TYPE:
|
torque_limit
|
Bound on each rotational DOF's control torque, N·m.
TYPE:
|
Source code in eden/managers/action_manager.py
Attributes¶
position_scale
class-attribute
instance-attribute
¶
orientation_scale
class-attribute
instance-attribute
¶
Methods:¶
build
¶
Source code in eden/managers/terms/actions/free_base_actions.py
target_pose
¶
target_pose(actions: Tensor) -> tuple[Tensor, Tensor]
The authored-frame pose actions asks for: the default root pose, moved and then turned.
| PARAMETER | DESCRIPTION |
|---|---|
actions
|
TYPE:
|
| RETURNS | DESCRIPTION |
|---|---|
tuple[Tensor, Tensor]
|
Position |
Source code in eden/managers/terms/actions/free_base_actions.py
compute
¶
Source code in eden/managers/terms/actions/free_base_actions.py
Functions:¶
Grippers¶
Binary (open/close) gripper action terms.
Attributes¶
GripperInput
module-attribute
¶
GripperInput = Literal['sign', 'open_sign', 'closedness', 'openness']
Classes¶
BinaryJointController
¶
BinaryJointController(env: EnvBase, options: ActionTermOptions)
Bases: ActionTerm
A binary joint controller for a parallel-jaw gripper.
When the action is applied, the joints are opened or closed.
| PARAMETER | DESCRIPTION |
|---|---|
entity_name
|
The name of the entity to control.
|
dofs_name
|
The names of the DOFs to control.
|
open_action
|
The action to open the joints.
|
close_action
|
The action to close the joints.
|
scale
|
The scale to apply to the actions.
|
Note
action is a boolean tensor, True: close, False: open if float is used, >0: close, <=0: open
Source code in eden/managers/terms/actions/binary_actions.py
Attributes¶
open_targets
property
¶
(1, num_dofs) joint targets sent to open the gripper.
Column i is dofs_name[i], driven at genesis_dofs_idx[i].
close_targets
property
¶
(1, num_dofs) joint targets sent to close the gripper.
Column i is dofs_name[i], driven at genesis_dofs_idx[i].
Methods:¶
build
¶
Source code in eden/managers/terms/actions/binary_actions.py
compute
¶
Source code in eden/managers/terms/actions/binary_actions.py
reset
¶
GripperDecisionController
¶
GripperDecisionController(env: EnvBase, options: ActionTermOptions)
Bases: BinaryJointController
Gripper controller that decides open/close from a policy scalar.
Policy servers describe the gripper in different units and conventions (> 0 means
close for some, open for others; a closedness or an openness in [0, 1] for others),
often with noise that wants hysteresis, a hold, or a latch. This term takes the raw
scalar and decides, so a client only slices its action vector. With the defaults it
behaves exactly like :class:BinaryJointController.
| PARAMETER | DESCRIPTION |
|---|---|
input
|
Meaning of the scalar:
|
threshold
|
Binarisation point for
|
open_threshold
|
Hysteresis on closedness: once closed, open only below
|
close_threshold
|
Hysteresis on closedness: once closed, open only below
|
hold_steps
|
After a state change, the new state lasts at least this many decisions, counting the
one that changed it (hysteresis mode only;
|
sticky_repeats
|
Fractal / Google-robot latch (SimplerEnv CogACT / SpatialVLA
|
zero_holds
|
With a
|
continuous
|
Interpolate the DOF targets between
|
snap_threshold
|
See
|
on_missing
|
What a
|
Notes
Under on_missing="hold", a NaN before any command was received is seeded from
the measured DOF position (the gripper is where it physically is).
In place of a NaN, :attr:action (and so the ActionManager's buffers) records the
command acted on, in the input's units: that measured seed, or the held previous command.
Per-env decision state resets with the env (reset(envs_idx)).
Source code in eden/managers/terms/actions/binary_actions.py
Attributes¶
last_decision
property
¶
Env 0's last decision, for debugging (reading it syncs with the device).
Methods:¶
build
¶
Source code in eden/managers/terms/actions/binary_actions.py
compute
¶
Source code in eden/managers/terms/actions/binary_actions.py
reset
¶
Source code in eden/managers/terms/actions/binary_actions.py
Functions:¶
Welding¶
Welding action terms for suction-cup and parallel-jaw attach/detach.
Attributes¶
Classes¶
SuctionCupWelding
¶
SuctionCupWelding(env: EnvBase, options: ActionTermOptions)
Bases: _WeldingBase
Collision-aware welding of an object link to the suction-cup end-effector link.
When the action is applied and the end-effector link is in contact with an object link, the end-effector link and the object link are welded together.
| PARAMETER | DESCRIPTION |
|---|---|
entity_name
|
The name of the entity to control.
|
ee_link_name
|
The name of the end-effector link.
|
ignore_entities_name
|
The names of the entities to exclude from welding (e.g., "table", "floor").
|
ignore_links_idx
|
The rigid-solver (scene-global) link indices to exclude from welding, e.g.
|
Note
action is a boolean tensor, True: suction, False: release if float is used, >0: suction, <=0: release
Source code in eden/managers/terms/actions/welding_actions.py
Attributes¶
Methods:¶
apply_actions
¶
Source code in eden/managers/terms/actions/welding_actions.py
ParallelJawWelding
¶
ParallelJawWelding(env: EnvBase, options: ActionTermOptions)
Bases: _WeldingBase
Weld the link a parallel-jaw gripper is squeezing to the end-effector link.
While the action is on, an env with no weld welds a link to ee_link_name once both pads
press that same link with contact force along the closing direction above
grasp_force_threshold (:func:~eden.managers.terms.utils.parallel_jaw_is_grasping with
object_link_idx). A link touching only one pad is never welded, and neither are two links
each pressed by one pad: a grasp that spans two links of a multi-link object welds nothing.
Releasing the action deletes the weld. An env holds at most one weld; if several links pass in
the same step, the one with the lowest solver index is welded.
The force test is sign-agnostic, so both pads scraping the same surface while closing can pass
it: list support surfaces (table, floor) in ignore_entities_name.
| PARAMETER | DESCRIPTION |
|---|---|
entity_name
|
The name of the entity to control. (e.g., "robot")
|
ee_link_name
|
The name of the end-effector link. (e.g., "hand")
|
ignore_entities_name
|
The names of the entities to exclude from welding (e.g., "table", "floor").
|
ignore_links_idx
|
The rigid-solver (scene-global) link indices to exclude from welding, e.g.
|
left_gripper_link_name
|
The name of the left gripper link. (e.g., "left_gripper_pad")
|
right_gripper_link_name
|
The name of the right gripper link. (e.g., "right_gripper_pad")
|
grasp_force_threshold
|
Minimum projected contact force (N) on each pad from the candidate link;
|