Lift Pot#
Grasp a kitchen pot by both handles and lift it above the table without tilting.
Task Description#
The robot must:
Grasp the pot by both handles using both grippers
Lift the pot at least 0.10 m above its initial height
Keep the pot’s symmetry axis within 20° of vertical
Avoid colliding with surrounding cabinets
Key Skills:
Bimanual coordination
Symmetric grasping
Orientation control
Spatial awareness
Success Criteria#
Pot not colliding with either cabinet
Pot lifted ≥ 0.10 m above starting height (SUCCESS_HEIGHT = INITIAL_HEIGHT + 0.1)
Pot orientation within 20° of vertical (phi and theta angles checked)
Failure Conditions:
Pot colliding with floor
Task Stages#
Variations#
LiftPot (Base)#
from roboeval.envs.lift_pot import LiftPot
env = LiftPot(
action_mode=JointPositionActionMode(),
robot_cls=BimanualPanda
)
Characteristics:
Pot always appears in same position
Same orientation every episode
Good for initial learning
LiftPotPosition#
from roboeval.envs.lift_pot import LiftPotPosition
Randomization:
Position: Random within 0.2m radius
Orientation: Fixed
LiftPotOrientation#
from roboeval.envs.lift_pot import LiftPotOrientation
Randomization:
Position: Fixed
Orientation: ±30° around Z-axis
LiftPotPositionAndOrientation#
from roboeval.envs.lift_pot import LiftPotPositionAndOrientation
Randomization:
Position: Random within workspace
Orientation: ±30° around Z-axis
Most challenging variation
Common Challenges#
- Symmetric Grasping
Both grippers must grasp handles simultaneously for balanced lift
- Collision Avoidance
Cabinets on both sides require careful arm movements
- Orientation Control
Maintaining pot level while lifting requires coordination
Example Usage#
from roboeval.envs.lift_pot import LiftPotPositionAndOrientation
from roboeval.action_modes import JointPositionActionMode
from roboeval.robots.configs.panda import BimanualPanda
env = LiftPotPositionAndOrientation(
action_mode=JointPositionActionMode(absolute=True),
render_mode="human",
robot_cls=BimanualPanda,
control_frequency=20
)
obs, info = env.reset()
for step in range(1000):
action = policy.predict(obs)
obs, reward, terminated, truncated, info = env.step(action)
if 'metrics' in info:
print(f"Stage: {info['metrics']['stage']}")
if terminated or truncated:
print(f"Success: {info.get('success', False)}")
break
Metrics#
Standard metrics provided:
success: Task completionstage: Current progression stage (0-4)pot_height: Current pot height above tablepot_tilt: Pot orientation deviation from verticalcollision: Whether collision occurred
Access metrics:
obs, reward, terminated, truncated, info = env.step(action)
if 'metrics' in info:
metrics = info['metrics']
print(f"Pot height: {metrics['pot_height']:.3f}m")
print(f"Pot tilt: {metrics['pot_tilt']:.1f}°")
Demonstrations#
Load demonstrations for this task:
from roboeval.demonstrations.demo_store import DemoStore
from roboeval.demonstrations.utils import Metadata
metadata = Metadata.from_env(env)
demo_store = DemoStore()
# Get demonstrations for base task
demos = demo_store.get_demos(metadata, amount=50)
# Or specify task variation
demos = demo_store.get_demos_for_task("LiftPotPosition", amount=50)
Tips#
Grasp handles symmetrically for better balance
Lift slowly to maintain orientation
Start with base variation before trying randomized versions
Use stage information to debug partial successes
See Also#
Tasks Overview - All tasks overview
Environments - Environment configuration
Metrics - Detailed metrics guide