| 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 BuildCircle(Task): |
| """Pick up six blocks of different colors (red, blue, green, yellow, orange, and purple) |
| and place them on a tabletop in a circle arrangement. The arrangement should start with |
| red at the top and continue clockwise in this order: blue, green, yellow, orange, and finally purple.""" |
|
|
| def __init__(self): |
| super().__init__() |
| self.max_steps = 20 |
| self.lang_template = "place the {color} block at the {position} of the circle" |
| self.task_completed_desc = "done building circle." |
| self.colors = ['red', 'blue', 'green', 'yellow', 'orange', 'purple'] |
| self.positions = ['top', 'top right', 'bottom right', 'bottom', 'bottom left', 'top left'] |
| self.additional_reset() |
|
|
| def reset(self, env): |
| super().reset(env) |
|
|
| # Add blocks. |
| block_size = (0.04, 0.04, 0.04) |
| block_urdf = 'block/block.urdf' |
| blocks = [] |
| for i in range(6): |
| block_pose = self.get_random_pose(env, block_size) |
| block_id = env.add_object(block_urdf, block_pose, color=utils.COLORS[self.colors[i]]) |
| blocks.append(block_id) |
|
|
| # Define target poses for the blocks in a circle arrangement. |
| radius = 0.1 |
| center = (0.5, 0.5, 0) |
| angles = np.linspace(0, 2*np.pi, 7)[:-1] |
| targ_poses = [(center[0] + radius*np.cos(angle), center[1] + radius*np.sin(angle), block_size[2]/2) for angle in angles] |
| targ_poses = [(pose, (0, 0, 0, 1)) for pose in targ_poses] # add default quaternion for orientation |
|
|
| # Add goals. |
| for i in range(6): |
| language_goal = self.lang_template.format(color=self.colors[i], position=self.positions[i]) |
| self.add_goal(objs=[blocks[i]], matches=np.ones((1, 1)), targ_poses=[targ_poses[i]], replace=False, |
| rotations=False, metric='pose', params=None, step_max_reward=1/6, language_goal=language_goal) |