GenSim / cliport /generated_tasks /build_two_circles.py
LeroyWaa's picture
add gensim code
8fc2b4e
raw
history blame
2.96 kB
import numpy as np
from cliport.tasks.task import Task
from cliport.utils import utils
class BuildTwoCircles(Task):
"""Construct two distinct circles on the tabletop using 10 red and 10 blue blocks.
Each circle should consist of blocks of the same color, with the blue circle larger and surrounding the red circle."""
def __init__(self):
super().__init__()
self.max_steps = 30
self.lang_template = "construct two distinct circles on the tabletop using 6 red and 6 blue blocks"
self.task_completed_desc = "done building two circles."
def reset(self, env):
super().reset(env)
# Add blocks.
block_urdf = 'block/block.urdf'
block_size = (0.04, 0.04, 0.04)
# Add 6 red blocks.
red_blocks = []
red_circle_poses = []
circle_radius = 0.1
circle_center = (0, 0, block_size[2] / 2)
angles = np.linspace(0, 2 * np.pi, 6, endpoint=False)
circle_pose = ((0.4, 0.3, 0.0), (0, 0, 0, 1)) # fixed pose
self.add_corner_anchor_for_pose(env, circle_pose)
# Define initial and target poses for the red and blue circles.
for angle in angles:
pos = (circle_center[0] + circle_radius * np.cos(angle),
circle_center[1] + circle_radius * np.sin(angle),
circle_center[2])
block_pose = (utils.apply(circle_pose, pos), circle_pose[1])
block_id = env.add_object(block_urdf, self.get_random_pose(env, block_size), color=utils.COLORS['red'])
red_circle_poses.append(block_pose)
red_blocks.append(block_id)
# Add 6 blue blocks.
blue_blocks = []
blue_circle_poses = []
circle_radius = 0.1
circle_center = (0, 0, block_size[2] / 2)
circle_pose = ((0.4, -0.3, 0.0), (0,0,0,1)) # fixed pose
self.add_corner_anchor_for_pose(env, circle_pose)
for angle in angles:
pos = (circle_center[0] + circle_radius * np.cos(angle),
circle_center[1] + circle_radius * np.sin(angle),
circle_center[2])
block_pose = (utils.apply(circle_pose, pos), circle_pose[1])
block_id = env.add_object(block_urdf, self.get_random_pose(env, block_size), color=utils.COLORS['blue'])
blue_circle_poses.append(block_pose)
blue_blocks.append(block_id)
# Goal: each red block is in the red circle, each blue block is in the blue circle.
self.add_goal(objs=red_blocks, matches=np.ones((6, 6)), targ_poses=red_circle_poses, replace=False,
rotations=True, metric='pose', params=None, step_max_reward=1 / 2)
self.add_goal(objs=blue_blocks, matches=np.ones((6, 6)), targ_poses=blue_circle_poses, replace=False,
rotations=True, metric='pose', params=None, step_max_reward=1 / 2)
self.lang_goals.append(self.lang_template)