embodichain.lab.sim.planners#
Classes
BasePlannerCfg(robot_uid: str = <factory>, planner_type: str = <factory>) |
|
Base class for trajectory planners. |
|
ToppraPlannerCfg(robot_uid: str = <factory>, planner_type: str = <factory>, max_workers: int | None = <factory>, mp_context: str | None = <factory>) |
|
MotionGenCfg(planner_cfg: embodichain.lab.sim.planners.base_planner.BasePlannerCfg = <factory>) |
|
Unified motion generator for robot trajectory planning. |
|
Enumeration for different trajectory sampling methods. |
|
Enumeration for different robot parts to move. |
|
Enumeration for different types of movements. |
|
Data class representing the result of a motion plan (env-batched). |
|
Data class representing the state for a motion plan (env-batched). |
Base Planner#
- class embodichain.lab.sim.planners.BasePlannerCfg[source]#
BasePlannerCfg(robot_uid: str = <factory>, planner_type: str = <factory>)
Attributes:
UID of the robot to control.
- robot_uid: str#
UID of the robot to control. Must correspond to a robot added to the simulation with this UID.
- class embodichain.lab.sim.planners.BasePlanner[source]#
Bases:
ABCBase class for trajectory planners.
This class provides common functionality that can be shared across different planner implementations.
- Parameters:
cfg (
BasePlannerCfg) – Configuration object for the planner.
Methods:
__init__(cfg)is_satisfied_constraint(vels, accs, constraints)Check if the trajectory satisfies velocity and acceleration constraints.
plan(target_states[, options])Execute trajectory planning.
- is_satisfied_constraint(vels, accs, constraints)[source]#
Check if the trajectory satisfies velocity and acceleration constraints.
This method checks whether the given velocities and accelerations satisfy the constraints defined in constraints. It allows for some tolerance to account for numerical errors in dense waypoint scenarios.
- Parameters:
vels (
Tensor) – Velocity tensor (…, DOF) where the last dimension is DOFaccs (
Tensor) – Acceleration tensor (…, DOF) where the last dimension is DOFconstraints (
dict) – Dictionary containing ‘velocity’ and ‘acceleration’ limits
- Returns:
True if all constraints are satisfied, False otherwise
- Return type:
bool
Note
Allows 10% tolerance for velocity constraints
Allows 25% tolerance for acceleration constraints
Prints exceed information if constraints are violated
Assumes symmetric constraints (velocities and accelerations can be positive or negative)
Supports batch dimension computation, e.g. (B, N, DOF) or (N, DOF)
- abstractmethod plan(target_states, options=PlanOptions())[source]#
Execute trajectory planning.
This method must be implemented by subclasses to provide the specific planning algorithm.
- Parameters:
target_states (
list[PlanState]) – list ofPlanStatewaypoints. Tensor fields carry a leading batch dimB(e.g.qposis(B, DOF)).- Returns:
- An env-batched object containing:
success: torch.Tensor
(B,)bool, per-env successpositions: torch.Tensor
(B, N, DOF), joint positionsvelocities: torch.Tensor
(B, N, DOF)orNone, joint velocities. Populated by planners that compute dynamics; may beNonefor planners that do not.accelerations: torch.Tensor
(B, N, DOF)orNone, joint accelerations. Populated by planners that compute dynamics; may beNonefor planners that do not.dt: torch.Tensor
(B, N), per-point time deltasduration: torch.Tensor
(B,), total trajectory duration per env
- Return type:
Toppra Planner#
- class embodichain.lab.sim.planners.ToppraPlannerCfg[source]#
ToppraPlannerCfg(robot_uid: str = <factory>, planner_type: str = <factory>, max_workers: int | None = <factory>, mp_context: str | None = <factory>)
Attributes:
Worker process count for the batched fan-out.
Multiprocessing start method for the batched fan-out.
UID of the robot to control.
- max_workers: int | None#
Worker process count for the batched fan-out. None => min(cpu_count()//2, B).
- mp_context: str | None#
Multiprocessing start method for the batched fan-out.
None(default) auto-selects based on the simulation device:'fork'on CPU and'spawn'on GPU.'fork'is faster — workers inherit the parent’s already-loaded modules, so pool startup is near-instant — and is safe here because the TOPPRA worker (_toppra_solve_one_env()) is pure numpy/scipy and never touches the parent’s Vulkan/Warp/CUDA context or render threads;_worker_initclears the inherited atexit registry and installsprctl(PR_SET_PDEATHSIG)so workers are reaped when the parent dies (incl. theos._exitpath).'spawn'is the safer choice when the parent has initialized CUDA physics (sim_device='cuda') — fork-after-CUDA-init is the officially unsupported case — or if fork deadlocks are observed, at the cost of re-importing modules per worker.
- robot_uid: str#
UID of the robot to control. Must correspond to a robot added to the simulation with this UID.
- class embodichain.lab.sim.planners.ToppraPlanner[source]#
Bases:
BasePlannerMethods:
__init__(cfg)Initialize the TOPPRA trajectory planner.
is_satisfied_constraint(vels, accs, constraints)Check if the trajectory satisfies velocity and acceleration constraints.
plan(target_states[, options])Execute trajectory planning.
- __init__(cfg)[source]#
Initialize the TOPPRA trajectory planner.
References
TOPPRA: Time-Optimal Path Parameterization for Robotic Systems (hungpham2511/toppra)
- Parameters:
cfg (
ToppraPlannerCfg) – Configuration object containing ToppraPlanner settings
- is_satisfied_constraint(vels, accs, constraints)#
Check if the trajectory satisfies velocity and acceleration constraints.
This method checks whether the given velocities and accelerations satisfy the constraints defined in constraints. It allows for some tolerance to account for numerical errors in dense waypoint scenarios.
- Parameters:
vels (
Tensor) – Velocity tensor (…, DOF) where the last dimension is DOFaccs (
Tensor) – Acceleration tensor (…, DOF) where the last dimension is DOFconstraints (
dict) – Dictionary containing ‘velocity’ and ‘acceleration’ limits
- Returns:
True if all constraints are satisfied, False otherwise
- Return type:
bool
Note
Allows 10% tolerance for velocity constraints
Allows 25% tolerance for acceleration constraints
Prints exceed information if constraints are violated
Assumes symmetric constraints (velocities and accelerations can be positive or negative)
Supports batch dimension computation, e.g. (B, N, DOF) or (N, DOF)
- plan(target_states, options=ToppraPlanOptions(constraints={'velocity': 0.2, 'acceleration': 0.5}, sample_method=<TrajectorySampleMethod.QUANTITY: 'quantity'>, sample_interval=0.01))[source]#
Execute trajectory planning.
- Parameters:
- Return type:
- Returns:
PlanResult containing the planned trajectory details. All tensor fields are env-batched with leading dim
B:success(B,),positions/velocities/accelerations(B, N, DOF),dt(B, N),duration(B,).
Motion Generator#
- class embodichain.lab.sim.planners.MotionGenCfg[source]#
MotionGenCfg(planner_cfg: embodichain.lab.sim.planners.base_planner.BasePlannerCfg = <factory>)
Attributes:
Configuration for the underlying planner.
- planner_cfg: BasePlannerCfg#
Configuration for the underlying planner. Must include ‘planner_type’ attribute to specify which planner to use, and any additional parameters required by that planner.
- class embodichain.lab.sim.planners.MotionGenerator[source]#
Bases:
objectUnified motion generator for robot trajectory planning.
This class provides a unified interface for trajectory planning with and without collision checking.
- Parameters:
cfg (
MotionGenCfg) – Configuration object for motion generation, must include ‘planner_cfg’ attribute
Methods:
__init__(cfg)Estimate the number of trajectory sampling points required.
generate(target_states[, options])Generate motion with given options.
interpolate_trajectory([control_part, ...])Interpolate trajectory based on provided waypoints.
plot_trajectory(positions[, vels, accs])Plot trajectory data.
register_planner_type(name, planner_class, ...)Register a new planner type.
- estimate_trajectory_sample_count(xpos_list=None, qpos_list=None, step_size=0.01, angle_step=0.03490658503988659, control_part=None)[source]#
Estimate the number of trajectory sampling points required.
This function estimates the total number of sampling points needed to generate a trajectory based on the given waypoints and sampling parameters. Supports parallel computation for batched input trajectories.
- Parameters:
xpos_list (
Tensor|list[Tensor] |None) – Tensor of 4x4 transformation matrices, shape [B, N, 4, 4] or [N, 4, 4]qpos_list (
Tensor|list[Tensor] |None) – Tensor of joint positions, shape [B, N, D] or [N, D] (optional)step_size (
float|Tensor) – Maximum allowed distance between points (meters). Float or Tensor [B]angle_step (
float|Tensor) – Maximum allowed angular difference between points (radians). Float or Tensor [B]
- Returns:
- Estimated number of sampling points per trajectory, shape [B]
(or scalar tensor if single trajectory)
- Return type:
torch.Tensor
- generate(target_states, options=MotionGenOptions(start_qpos=None, control_part=None, plan_opts=None, is_interpolate=False, interpolate_nums=10, is_linear=False, interpolate_position_step=0.002, interpolate_angle_step=0.03490658503988659))[source]#
Generate motion with given options.
This method generates a smooth trajectory using the selected planner that satisfies constraints and perform pre-interpolation if specified in the options.
- Parameters:
target_states (
List[PlanState]) – List[PlanState].options (
MotionGenOptions) – MotionGenOptions.
- Return type:
- Returns:
PlanResult containing the planned trajectory details.
- interpolate_trajectory(control_part=None, xpos_list=None, qpos_list=None, options=MotionGenOptions(start_qpos=None, control_part=None, plan_opts=None, is_interpolate=False, interpolate_nums=10, is_linear=False, interpolate_position_step=0.002, interpolate_angle_step=0.03490658503988659))[source]#
Interpolate trajectory based on provided waypoints.
This method performs interpolation on the provided waypoints to generate a smoother trajectory. It supports both Cartesian (end-effector) and joint space interpolation based on the control part and options specified.
- Parameters:
control_part (
str|None) – Name of the robot part to control, e.g. ‘left_arm’. Must correspond to a valid control part defined in the robot’s configuration.xpos_list (
Tensor|None) – End-effector poses, shape(B, N, 4, 4)or(N, 4, 4). Required if control_part is an end-effector control part.qpos_list (
Tensor|None) – Joint positions, shape(B, N, DOF)or(N, DOF). Required if control_part is a joint control part.options (
MotionGenOptions) – MotionGenOptions containing interpolation settings such as step size and whether to use linear interpolation.
- Returns:
interpolate_qpos_list: Interpolated joint positions, shape
(B, M, DOF).feasible_pose_targets: Corresponding end-effector poses, shape
(B, M, 4, 4), orNoneif not applicable.
- Return type:
Tuple containing
- plot_trajectory(positions, vels=None, accs=None)[source]#
Plot trajectory data.
This method visualizes the trajectory by plotting position, velocity, and acceleration curves for each joint over time. It also displays the constraint limits for reference. Supports plotting batched trajectories.
- Parameters:
positions (
Tensor) – Position tensor (N, DOF) or (B, N, DOF)vels (
Tensor|None) – Velocity tensor (N, DOF) or (B, N, DOF), optionalaccs (
Tensor|None) – Acceleration tensor (N, DOF) or (B, N, DOF), optional
- Return type:
None
Note
Creates a multi-subplot figure (position, and optional velocity/acceleration)
Shows constraint limits as dashed lines
If input is (B, N, DOF), plots elements separately per batch sequence.
Requires matplotlib to be installed
Utilities#
- class embodichain.lab.sim.planners.TrajectorySampleMethod[source]#
Bases:
EnumEnumeration for different trajectory sampling methods.
This enum defines various methods for sampling trajectories, providing meaningful names for different sampling strategies.
Attributes:
Sample based on distance intervals.
Sample based on a specified number of points.
Sample based on time intervals.
Methods:
from_str(value)- DISTANCE = 'distance'#
Sample based on distance intervals.
- QUANTITY = 'quantity'#
Sample based on a specified number of points.
- TIME = 'time'#
Sample based on time intervals.
- class embodichain.lab.sim.planners.MovePart[source]#
Bases:
EnumEnumeration for different robot parts to move.
Defines robot part selection for motion planning.
- LEFT#
left arm or end-effector.
- Type:
int
- RIGHT#
right arm or end-effector.
- Type:
int
- BOTH#
both arms or end-effectors.
- Type:
int
- TORSO#
torso for humanoid robot.
- Type:
int
- ALL#
all joints of the robot (joint control only).
- Type:
int
Attributes:
- ALL = 4#
- BOTH = 2#
- LEFT = 0#
- RIGHT = 1#
- TORSO = 3#
- class embodichain.lab.sim.planners.MoveType[source]#
Bases:
EnumEnumeration for different types of movements.
Defines movement types for robot planning.
- TOOL#
Tool open or close.
- Type:
int
- EEF_MOVE#
Move end-effector to target pose (IK + trajectory).
- Type:
int
- JOINT_MOVE#
Move joints to target angles (trajectory planning).
- Type:
int
- SYNC#
Synchronized left/right arm movement (dual-arm robots).
- Type:
int
- PAUSE#
Pause for specified duration (see PlanState.pause_seconds).
- Type:
int
Attributes:
- EEF_MOVE = 1#
- JOINT_MOVE = 2#
- PAUSE = 4#
- SYNC = 3#
- TOOL = 0#
- class embodichain.lab.sim.planners.PlanResult[source]#
Bases:
objectData class representing the result of a motion plan (env-batched).
Methods:
__init__([success, xpos_list, positions, ...])Return True only when every env succeeded.
Attributes:
Joint accelerations, shape
(B, N, DOF).Per-env time deltas, shape
(B, N).Per-env total duration, shape
(B,).Joint positions, shape
(B, N, DOF).Per-env success, shape
(B,)bool tensor (or scalar bool).Joint velocities, shape
(B, N, DOF).End-effector poses, shape
(B, N, 4, 4).- __init__(success=False, xpos_list=None, positions=None, velocities=None, accelerations=None, dt=None, duration=0.0)#
- accelerations: Tensor | None = None#
Joint accelerations, shape
(B, N, DOF).
- dt: Tensor | None = None#
Per-env time deltas, shape
(B, N).
- duration: float | Tensor = 0.0#
Per-env total duration, shape
(B,).
- positions: Tensor | None = None#
Joint positions, shape
(B, N, DOF).
- success: bool | Tensor = False#
Per-env success, shape
(B,)bool tensor (or scalar bool).
- velocities: Tensor | None = None#
Joint velocities, shape
(B, N, DOF).
- xpos_list: Tensor | None = None#
End-effector poses, shape
(B, N, 4, 4).
- class embodichain.lab.sim.planners.PlanState[source]#
Bases:
objectData class representing the state for a motion plan (env-batched).
Tensor fields carry a leading batch dim
B:qpos:(B, DOF),xpos:(B, 4, 4). Enum/scalar fields are shared acrossB(vectorized envs share the same task skeleton).Methods:
__init__([move_type, move_part, xpos, qpos, ...])from_qpos(qpos, *[, move_type, move_part])Create a PlanState from batched joint positions
(B, DOF).from_xpos(xpos, *[, move_type, move_part])Create a PlanState from batched end-effector poses
(B, 4, 4).single(*[, qpos, xpos, move_type, move_part])B=1 convenience constructor: unsqueezes a single-env qpos/xpos.
Attributes:
For
MoveType.TOOL, indicates whether to open (True) or close (False) the tool.Trueif the target pose is in world coordinates,Falseif relative to the current pose.Robot part that should move.
Type of movement used by the plan.
Duration of a pause when
move_typeisMoveType.PAUSE.Target joint accelerations for
MoveType.JOINT_MOVEwith shape(B, DOF).Target joint angles for
MoveType.JOINT_MOVEwith shape(B, DOF).Target joint velocities for
MoveType.JOINT_MOVEwith shape(B, DOF).Target TCP pose (Bx4x4) for
MoveType.EEF_MOVE.- __init__(move_type=MoveType.JOINT_MOVE, move_part=MovePart.LEFT, xpos=None, qpos=None, qvel=None, qacc=None, is_open=True, is_world_coordinate=True, pause_seconds=0.0)#
- classmethod from_qpos(qpos, *, move_type=MoveType.JOINT_MOVE, move_part=MovePart.LEFT, **kwargs)[source]#
Create a PlanState from batched joint positions
(B, DOF).- Return type:
- classmethod from_xpos(xpos, *, move_type=MoveType.EEF_MOVE, move_part=MovePart.LEFT, **kwargs)[source]#
Create a PlanState from batched end-effector poses
(B, 4, 4).- Return type:
- is_open: bool = True#
For
MoveType.TOOL, indicates whether to open (True) or close (False) the tool.
- is_world_coordinate: bool = True#
Trueif the target pose is in world coordinates,Falseif relative to the current pose.
- pause_seconds: float = 0.0#
Duration of a pause when
move_typeisMoveType.PAUSE.
- qacc: Tensor | None = None#
Target joint accelerations for
MoveType.JOINT_MOVEwith shape(B, DOF).
- qpos: Tensor | None = None#
Target joint angles for
MoveType.JOINT_MOVEwith shape(B, DOF).
- qvel: Tensor | None = None#
Target joint velocities for
MoveType.JOINT_MOVEwith shape(B, DOF).
- classmethod single(*, qpos=None, xpos=None, move_type=MoveType.JOINT_MOVE, move_part=MovePart.LEFT, **kwargs)[source]#
B=1 convenience constructor: unsqueezes a single-env qpos/xpos.
Already-batched tensors (2D qpos / 3D xpos) pass through unchanged (idempotent).
- Return type:
- xpos: Tensor | None = None#
Target TCP pose (Bx4x4) for
MoveType.EEF_MOVE.