Implementation:ARISE Initiative Robosuite TwoArmTransport Environment
| Knowledge Sources | |
|---|---|
| Domains | Robotics, Simulation, Manipulation |
| Last Updated | 2026-02-15 07:00 GMT |
Overview
Concrete tool for simulating a two-arm transport and sorting manipulation task provided by robosuite.
Description
The TwoArmTransport class implements a complex bimanual transport task where two robot arms must cooperate to move a payload from a starting bin to a target bin, while also clearing trash from the target bin to a trash bin. The workspace consists of two tables (arranged using a MultiTableArena) with bins positioned on each table. A start bin on one table contains a payload (a hammer object) covered by a lid, while a target bin on the other table contains a trash object (a small red cube). The robot must remove the lid, pick up and transport the payload to the target bin, and move the trash from the target bin to a dedicated trash bin.
The reward function currently only supports sparse rewards. A discrete reward of 1.0 is provided when both conditions are satisfied: the payload is in the target bin and the trash is in the trash bin. Dense reward shaping is noted as a planned feature but is not yet implemented; enabling it will print a warning and fall back to sparse rewards. The final reward is scaled by reward_scale / 1.0.
The environment uses a SequentialCompositeSampler to initialize six objects (start_bin, lid, payload, target_bin, trash, trash_bin) at calibrated positions on their respective tables. During reset, the lid is placed directly on top of the start bin, the payload is placed inside the start bin, and the trash is placed inside the target bin. The TransportGroup model manages the composite object relationships and provides convenience properties for checking whether the payload and trash are in their target locations.
Usage
Use this environment for training and evaluating complex multi-step bimanual manipulation policies that require both spatial reasoning (navigating between tables) and task planning (sequencing lid removal, payload transport, and trash clearing). This is one of the most challenging two-arm tasks in robosuite.
Code Reference
Source Location
- Repository: ARISE_Initiative_Robosuite
- File: robosuite/environments/manipulation/two_arm_transport.py
- Lines: 1-604
Signature
class TwoArmTransport(TwoArmEnv):
def __init__(
self,
robots,
env_configuration="default",
controller_configs=None,
gripper_types="default",
initialization_noise="default",
tables_boundary=(0.8, 1.2, 0.05),
table_friction=(1.0, 5e-3, 1e-4),
bin_size=(0.3, 0.3, 0.15),
use_camera_obs=True,
use_object_obs=True,
reward_scale=1.0,
reward_shaping=False,
has_renderer=False,
has_offscreen_renderer=True,
render_camera="frontview",
render_collision_mesh=False,
render_visual_mesh=True,
render_gpu_device_id=-1,
control_freq=20,
lite_physics=True,
horizon=1000,
ignore_done=False,
hard_reset=True,
camera_names="agentview",
camera_heights=256,
camera_widths=256,
camera_depths=False,
camera_segmentations=None,
renderer="mjviewer",
renderer_config=None,
seed=None,
):
Import
from robosuite.environments.manipulation.two_arm_transport import TwoArmTransport
I/O Contract
Inputs
| Name | Type | Required | Description |
|---|---|---|---|
| robots | str or list of str | Yes | Either 2 single-arm robots or 1 bimanual robot |
| env_configuration | str | No | "opposed" or "parallel" for two-robot setups. Default: "default" (maps to "opposed") |
| tables_boundary | 3-tuple | No | (x, y, z) dimensions of the overall table boundary. Default: (0.8, 1.2, 0.05) |
| table_friction | 3-tuple | No | MuJoCo friction parameters for each table. Default: (1.0, 5e-3, 1e-4) |
| bin_size | 3-tuple | No | (x, y, z) dimensions of the bins. Default: (0.3, 0.3, 0.15) |
| reward_scale | None or float | No | Scales the normalized reward. Default: 1.0 |
| reward_shaping | bool | No | If True, attempts to use dense rewards (not yet implemented; falls back to sparse). Default: False |
| horizon | int | No | Episode length in timesteps. Default: 1000 |
Outputs
| Name | Type | Description |
|---|---|---|
| payload_pos | np.array (3,) | 3D position of the payload (hammer) |
| payload_quat | np.array (4,) | Quaternion orientation of the payload |
| trash_pos | np.array (3,) | 3D position of the trash object |
| trash_quat | np.array (4,) | Quaternion orientation of the trash |
| lid_handle_pos | np.array (3,) | 3D position of the lid handle |
| lid_handle_quat | np.array (4,) | Quaternion orientation of the lid handle |
| target_bin_pos | np.array (3,) | 3D position of the target bin |
| trash_bin_pos | np.array (3,) | 3D position of the trash bin |
| payload_in_target_bin | bool | Whether the payload is in the target bin |
| trash_in_trash_bin | bool | Whether the trash is in the trash bin |
| gripper{i}_to_payload | np.array (3,) | Vector from each gripper to the payload |
| reward | float | Scalar reward value per step |
Usage Examples
import robosuite as suite
import numpy as np
# Create a TwoArmTransport environment with two Panda robots
env = suite.make(
env_name="TwoArmTransport",
robots=["Panda", "Panda"],
env_configuration="opposed",
has_renderer=False,
has_offscreen_renderer=False,
use_camera_obs=False,
use_object_obs=True,
reward_shaping=False,
horizon=1000,
)
obs = env.reset()
for i in range(1000):
action = np.random.randn(env.action_dim)
obs, reward, done, info = env.step(action)
if done:
break
env.close()