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 import numpy as np from cliport.tasks.task import Task from cliport.utils import utils class ContainerPyramidConstruction(Task): """Construct a pyramid of containers with specific color and shape arrangement.""" def __init__(self): super().__init__() self.max_steps = 10 self.lang_template = "stack the {color} {shape} container on the {level} level" self.task_completed_desc = "done constructing container pyramid." self.additional_reset() def reset(self, env): super().reset(env) # Add pallet. pallet_size = (0.35, 0.35, 0.01) pallet_pose = self.get_random_pose(env, pallet_size) pallet_urdf = 'pallet/pallet.urdf' env.add_object(pallet_urdf, pallet_pose, 'fixed') # Define container shapes and colors. shapes = ['square', 'circle', 'triangle'] colors = ['red', 'blue', 'green'] levels = ['bottom', 'middle', 'top'] # Add containers. container_urdf = 'container/container-template.urdf' containers = [] for i in range(3): for j in range(3 - i): # Define container size and color. container_size = (0.1, 0.1, 0.1) container_color = colors[i] # Define container pose. x_offset = 0.05 * (j - (3 - i - 1) / 2) z_offset = 0.1 * i container_pose = (pallet_pose[0] + x_offset, pallet_pose[1], pallet_pose[2] + z_offset) # Add container to the environment. replace = {'DIM': container_size, 'HALF': (container_size[0] / 2, container_size[1] / 2, container_size[2] / 2)} container_urdf_filled = self.fill_template(container_urdf, replace) container_id = env.add_object(container_urdf_filled, container_pose, color=container_color) containers.append(container_id) # Add goals. for i in range(3): for j in range(3 - i): idx = int(i * (i + 1) / 2 + j) language_goal = self.lang_template.format(color=colors[i], shape=shapes[j], level=levels[i]) self.add_goal(objs=[containers[idx]], matches=np.ones((1, 1)), targ_poses=[pallet_pose], replace=False, rotations=True, metric='pose', params=None, step_max_reward=1 / 6, language_goal=language_goal)