Spaces:
Runtime error
Runtime error
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.") | |