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 import pybullet as p class BallTowerInZones(Task): """Pick up each sphere and stack it on top of the stand of the same color while maintaining the balance. However, the stacking should be done in a specific color sequence - blue at the bottom, followed by green, and finally red at the top. The spheres and stands are each placed within separate zones.""" def __init__(self): super().__init__() self.max_steps = 10 self.lang_template = "stack the {color} sphere on the {color} stand" self.task_completed_desc = "done stacking spheres." self.additional_reset() def reset(self, env): super().reset(env) # Add zones. zone_size = (0.12, 0.12, 0) zone_urdf = 'zone/zone.urdf' zone_poses = [] for _ in range(3): zone_pose = self.get_random_pose(env, zone_size) env.add_object(zone_urdf, zone_pose, 'fixed') zone_poses.append(zone_pose) # Sphere and stand colors. colors = [ utils.COLORS['blue'], utils.COLORS['green'], utils.COLORS['red'] ] # Add spheres and stands. sphere_size = (0.04, 0.04, 0.04) sphere_urdf = 'sphere/sphere.urdf' stand_size = (0.05, 0.05, 0.05) stand_urdf = 'stacking/stand.urdf' spheres = [] stands = [] for i in range(3): sphere_pose = self.get_random_pose(env, sphere_size) sphere_id = env.add_object(sphere_urdf, sphere_pose, color=colors[i]) spheres.append(sphere_id) stand_pose = self.get_random_pose(env, stand_size) stand_id = env.add_object(stand_urdf, stand_pose, color=colors[i]) stands.append(stand_id) # Goal: each sphere is stacked on the stand of the same color in the correct zone. for i in range(3): self.add_goal(objs=[spheres[i]], matches=np.ones((1, 1)), targ_poses=[zone_poses[i]], replace=False, rotations=True, metric='pose', params=None, step_max_reward=1 / 3) self.lang_goals.append(self.lang_template.format(color=colors[i])) # Add distractors. n_distractors = 0 while n_distractors < 6: is_sphere = np.random.rand() > 0.5 urdf = sphere_urdf if is_sphere else stand_urdf size = sphere_size if is_sphere else stand_size pose = self.get_random_pose(env, obj_size=size) color = colors[n_distractors % len(colors)] obj_id = env.add_object(urdf, pose, color=color) n_distractors += 1