Workspace Layout#
Workspace layout answers two questions:
Where is the robot base placed in the world?
Given that base pose, what region of space is considered “in-bounds” for the robot?
Robot base placement#
DexSuite places robots using dexsuite.options.LayoutOptions.
Single-arm#
Single-arm robots use one base pose (PoseOptions). If you do not pass an
explicit pose, the default is the origin.
Bimanual#
Bimanual robots have a left and right base pose. DexSuite uses named layout presets to keep these placements consistent across tasks.
Presets live under Dexsuite/dexsuite/config/presets/. For example, the
default preset file defines:
side_by_sideface_to_faceright_angle
Workspaces and AABBs#
Each manipulator has a default workspace AABB in
Dexsuite/dexsuite/config/workspaces.yaml. This AABB is defined in the
manipulator base frame.
At runtime, DexSuite transforms this AABB into the world frame using the robot base pose and exposes:
env.world_aabb: union workspace used by most tasks.env.get_workspace_aabbs(): dict with keysunion,left,right, andoverlap.
These AABBs are commonly used for:
Sampling initial object poses.
Clamping targets into reachable space.
Detecting out-of-bounds TCP behavior.
Visualizing the workspace#
You can visualize workspace corners by enabling visualize_aabb on your robot
options. This draws small markers at the eight AABB corners during environment
construction.
Examples#
Pick a bimanual preset (flat API)#
import dexsuite as ds
env = ds.make(
"bimanual_reach",
manipulator=("franka", "franka"),
gripper="robotiq",
arm_control="osc_pose",
gripper_control="joint_position",
layout="face_to_face",
render_mode="human",
)
Set explicit base poses (component API)#
import dexsuite as ds
from dexsuite.options import CamerasOptions, LayoutOptions, PoseOptions, RobotOptions, SimOptions
robot = RobotOptions(
type_of_robot="bimanual",
layout=LayoutOptions(
left=PoseOptions(pos=(0.0, 0.35, 0.0), yaw_rad=0.0),
right=PoseOptions(pos=(0.0, -0.35, 0.0), yaw_rad=0.0),
),
)
env = ds.make(
"bimanual_reach",
robot=robot,
sim=SimOptions(n_envs=1, control_hz=20),
cameras=CamerasOptions(modalities=("rgb",)),
render_mode="human",
)
Override a workspace AABB (component API)#
import dexsuite as ds
from dexsuite.options import AABBOptions, ArmOptions, RobotOptions
robot = RobotOptions(
type_of_robot="single",
single=ArmOptions(
manipulator="franka",
workspace=AABBOptions(min=(0.2, -0.3, 0.0), max=(0.6, 0.3, 0.6)),
),
visualize_aabb=True,
)
env = ds.make("reach", robot=robot, render_mode="human")