Implementation:ARISE Initiative Robosuite TwoArmLift Environment
| Knowledge Sources | |
|---|---|
| Domains | Robotics, Simulation, Manipulation |
| Last Updated | 2026-02-15 07:00 GMT |
Overview
Concrete tool for simulating a two-arm cooperative pot lifting manipulation task provided by robosuite.
Description
The TwoArmLift class implements a bimanual lifting task where two robot arms must cooperate to lift a pot with handles from a tabletop. The pot has two handles (handle0 and handle1), and each arm is assigned to grasp its respective handle. The arms must coordinate to simultaneously grasp both handles and lift the pot above a height threshold while keeping it approximately level (within 30 degrees of horizontal).
The reward function supports both sparse and dense modes. In sparse mode, a discrete reward of 3.0 is provided when the pot is lifted above the table by more than 10cm and is tilted less than 30 degrees from horizontal. In dense (shaped) mode, three components are summed: per-arm reaching (each in [0, 0.5], proportional to distance between each gripper and its handle, with 0.5 awarded at contact), per-arm grasping (each in {0, 0.25}, binary for correct handle grasp), and lifting (in [0, 1.5], proportional to the pot's height above the table, capped at a threshold, and only awarded when the pot is tilted less than 30 degrees). The final reward is scaled by reward_scale / 3.0.
The environment supports three robot configurations: a single bimanual robot ("single-robot"), two robots facing each other ("opposed"), or two robots side by side ("parallel"). The pot is initialized with random position and rotation using a UniformRandomSampler. Success requires the pot bottom height to exceed the table height by 10cm.
Usage
Use this environment for training and evaluating bimanual coordination policies that require synchronized grasping and cooperative lifting. The pot's two-handle design inherently requires both arms to participate, making this a natural testbed for coordinated manipulation.
Code Reference
Source Location
- Repository: ARISE_Initiative_Robosuite
- File: robosuite/environments/manipulation/two_arm_lift.py
- Lines: 1-552
Signature
class TwoArmLift(TwoArmEnv):
def __init__(
self,
robots,
env_configuration="default",
controller_configs=None,
gripper_types="default",
initialization_noise="default",
table_full_size=(0.8, 0.8, 0.05),
table_friction=(1.0, 5e-3, 1e-4),
use_camera_obs=True,
use_object_obs=True,
reward_scale=1.0,
reward_shaping=False,
placement_initializer=None,
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_lift import TwoArmLift
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") |
| table_full_size | 3-tuple | No | (x, y, z) dimensions of the table. Default: (0.8, 0.8, 0.05) |
| table_friction | 3-tuple | No | MuJoCo friction parameters. Default: (1.0, 5e-3, 1e-4) |
| reward_scale | None or float | No | Scales the normalized reward. Default: 1.0 |
| reward_shaping | bool | No | If True, uses dense summed rewards. Default: False |
| placement_initializer | ObjectPositionSampler | No | Custom placement sampler for the pot. Default: UniformRandomSampler |
| horizon | int | No | Episode length in timesteps. Default: 1000 |
Outputs
| Name | Type | Description |
|---|---|---|
| pot_pos | np.array (3,) | 3D position of the pot body |
| pot_quat | np.array (4,) | Quaternion orientation (xyzw) of the pot body |
| handle0_xpos | np.array (3,) | 3D position of pot handle 0 (left) |
| handle1_xpos | np.array (3,) | 3D position of pot handle 1 (right) |
| gripper{i}_to_handle{i} | np.array (3,) | Vector from each gripper to its assigned handle |
| reward | float | Scalar reward value per step |
Usage Examples
import robosuite as suite
import numpy as np
# Create a TwoArmLift environment with two Panda robots
env = suite.make(
env_name="TwoArmLift",
robots=["Panda", "Panda"],
env_configuration="opposed",
has_renderer=False,
has_offscreen_renderer=False,
use_camera_obs=False,
use_object_obs=True,
reward_shaping=True,
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()