GenSim / cliport /generated_tasks /build_bridge.py
LeroyWaa's picture
add gensim code
8fc2b4e
raw
history blame
3.77 kB
import numpy as np
import os
import pybullet as p
import random
from cliport.tasks import primitives
from cliport.tasks.grippers import Spatula
from cliport.tasks.task import Task
from cliport.utils import utils
class BuildBridge(Task):
"""Construct a bridge using two yellow blocks and three blue blocks.
Firstly, place the two yellow blocks on each of the two bases parallel to each other with a fair amount of space in between.
Then, place the blue block horizontally on top of the yellow blocks."""
def __init__(self):
super().__init__()
self.max_steps = 20
self.lang_template = "build a bridge using four yellow blocks and one long blue block"
self.task_completed_desc = "done building bridge."
def reset(self, env):
super().reset(env)
# Add yellow blocks.
base_length = 0.04
base_size = (base_length, base_length, base_length)
base_block_urdf = "box/box-template.urdf"
bridge_pose = ((0.5, 0.0, 0.0), (0, 0, 0, 1)) # fixed pose
self.add_corner_anchor_for_pose(env, bridge_pose)
base_block_urdf = self.fill_template(base_block_urdf, {'DIM': base_size})
anchor_base_poses = [(utils.apply(bridge_pose, (- 3 * base_length / 2, 0, 0.001)), bridge_pose[1]),
(utils.apply(bridge_pose, ( 3 * base_length / 2, 0, 0.001)), bridge_pose[1]),
(utils.apply(bridge_pose, (- 3 * base_length / 2, 0, 0.041)), bridge_pose[1]),
(utils.apply(bridge_pose, ( 3 * base_length / 2, 0, 0.041)), bridge_pose[1])]
base_blocks = []
for idx in range(4):
base_block_pose = self.get_random_pose(env, base_size)
base_block_id = env.add_object(base_block_urdf, base_block_pose, color=utils.COLORS['yellow'])
base_blocks.append(base_block_id)
# Add car body block.
body_size = (0.12, 0.04, 0.02) # x, y, z dimensions for the asset size
body_block_urdf = "box/box-template.urdf"
body_block_urdf = self.fill_template(body_block_urdf, {'DIM': body_size})
body_block_pose = self.get_random_pose(env, body_size)
body_block_id = env.add_object(body_block_urdf, body_block_pose, color=utils.COLORS['blue'])
anchor_body_poses = [bridge_pose]
# Goal: Firstly, create the base of the car by positioning two red blocks side by side.
self.add_goal(objs=base_blocks[:2],
matches=np.ones((2, 2)),
targ_poses=anchor_base_poses,
replace=False,
rotations=True,
metric='pose',
params=None,
step_max_reward=1./4)
self.add_goal(objs=base_blocks[2:],
matches=np.ones((2, 2)),
targ_poses=anchor_base_poses,
replace=False,
rotations=True,
metric='pose',
params=None,
step_max_reward=1./2)
self.lang_goals.append("Firstly, place the two yellow blocks on each of the two bases parallel to each other with a fair amount of space in between.")
# Then, add the car body by stacking a blue block on top of the base.
self.add_goal(objs=[body_block_id],
matches=np.ones((1, 1)),
targ_poses=anchor_body_poses,
replace=False,
rotations=True,
metric='pose',
params=None,
step_max_reward=1./4)
self.lang_goals.append("Then, place the blue block horizontally on top of the yellow blocks.")