Spaces:
Runtime error
Runtime error
# Python 2D robot control script | |
import numpy as np | |
from env_utils import put_first_on_second, get_obj_pos, get_obj_names, say, get_corner_name, get_side_name, is_obj_visible, stack_objects_in_order | |
from plan_utils import parse_obj_name, parse_position, parse_question, transform_shape_pts | |
objects = ['yellow block', 'green block', 'yellow bowl', 'blue block', 'blue bowl', 'green bowl'] | |
# place the yellow block on the yellow bowl. | |
say('Ok - putting the yellow block on the yellow bowl') | |
put_first_on_second('yellow block', 'yellow bowl') | |
objects = ['yellow block', 'green block', 'yellow bowl', 'blue block', 'blue bowl', 'green bowl'] | |
# which block did you move. | |
say('I moved the yellow block') | |
objects = ['yellow block', 'green block', 'yellow bowl', 'blue block', 'blue bowl', 'green bowl'] | |
# move the green block to the top right corner. | |
say('Got it - putting the green block on the top right corner') | |
corner_pos = parse_position('top right corner') | |
put_first_on_second('green block', corner_pos) | |
objects = ['yellow block', 'green block', 'yellow bowl', 'blue block', 'blue bowl', 'green bowl'] | |
# stack the blue bowl on the yellow bowl on the green block. | |
order_bottom_to_top = ['green block', 'yellow block', 'blue bowl'] | |
say(f'Sure - stacking from top to bottom: {", ".join(order_bottom_to_top)}') | |
stack_objects_in_order(object_names=order_bottom_to_top) | |
objects = ['cyan block', 'white block', 'cyan bowl', 'blue block', 'blue bowl', 'white bowl'] | |
# move the cyan block into its corresponding bowl. | |
matches = {'cyan block': 'cyan bowl'} | |
say('Got it - placing the cyan block on the cyan bowl') | |
for first, second in matches.items(): | |
put_first_on_second(first, get_obj_pos(second)) | |
objects = ['cyan block', 'white block', 'cyan bowl', 'blue block', 'blue bowl', 'white bowl'] | |
# make a line of blocks on the right side. | |
say('No problem! Making a line of blocks on the right side') | |
block_names = parse_obj_name('the blocks', f'objects = {get_obj_names()}') | |
line_pts = parse_position(f'a 30cm vertical line on the right with {len(block_names)} points') | |
for block_name, pt in zip(block_names, line_pts): | |
put_first_on_second(block_name, pt) | |
objects = ['yellow block', 'red block', 'yellow bowl', 'gray block', 'gray bowl', 'red bowl'] | |
# put the small banana colored thing in between the blue bowl and green block. | |
say('Sure thing - putting the yellow block between the blue bowl and the green block') | |
target_pos = parse_position('a point in the middle betweeen the blue bowl and the green block') | |
put_first_on_second('yellow block', target_pos) | |
objects = ['yellow block', 'red block', 'yellow bowl', 'gray block', 'gray bowl', 'red bowl'] | |
# can you cut the bowls in half. | |
say('no, I can only move objects around') | |
objects = ['yellow block', 'green block', 'yellow bowl', 'gray block', 'gray bowl', 'green bowl'] | |
# stack the blocks on the right side with the gray one on the bottom. | |
say('Ok. stacking the blocks on the right side with the gray block on the bottom') | |
right_side = parse_position('the right side') | |
put_first_on_second('gray block', right_side) | |
order_bottom_to_top = ['gray block', 'green block', 'yellow block'] | |
stack_objects_in_order(object_names=order_bottom_to_top) | |
objects = ['yellow block', 'green block', 'yellow bowl', 'blue block', 'blue bowl', 'green bowl'] | |
# hide the blue bowl. | |
bowl_name = np.random.choice(['yellow bowl', 'green bowl']) | |
say(f'Sounds good! Hiding the blue bowl under the {bowl_name}') | |
put_first_on_second(bowl_name, 'blue bowl') | |
objects = ['pink block', 'green block', 'pink bowl', 'blue block', 'blue bowl', 'green bowl'] | |
# move the grass-colored bowl to the left. | |
say('Sure - moving the green bowl left by 10 centimeters') | |
left_pos = parse_position('a point 10cm left of the green bowl') | |
put_first_on_second('green bowl', left_pos) | |
objects = ['pink block', 'green block', 'pink bowl', 'blue block', 'blue bowl', 'green bowl'] | |
# why did you move the red bowl. | |
say(f'I did not move the red bowl') | |
objects = ['pink block', 'green block', 'pink bowl', 'blue block', 'blue bowl', 'green bowl'] | |
# undo that. | |
say('Sure - moving the green bowl right by 10 centimeters') | |
left_pos = parse_position('a point 10cm right of the green bowl') | |
put_first_on_second('green bowl', left_pos) | |
objects = ['brown bowl', 'green block', 'brown block', 'green bowl', 'blue bowl', 'blue block'] | |
# place the top most block to the corner closest to the bottom most block. | |
top_block_name = parse_obj_name('top most block', f'objects = {get_obj_names()}') | |
bottom_block_name = parse_obj_name('bottom most block', f'objects = {get_obj_names()}') | |
closest_corner_pos = parse_position(f'the corner closest to the {bottom_block_name}', f'objects = {get_obj_names()}') | |
say(f'Putting the {top_block_name} on the {get_corner_name(closest_corner_pos)}') | |
put_first_on_second(top_block_name, closest_corner_pos) | |
objects = ['brown bowl', 'green block', 'brown block', 'green bowl', 'blue bowl', 'blue block'] | |
# move the brown bowl to the side closest to the green block. | |
closest_side_position = parse_position('the side closest to the green block') | |
say(f'Got it - putting the brown bowl on the {get_side_name(closest_side_position)}') | |
put_first_on_second('brown bowl', closest_side_position) | |
objects = ['brown bowl', 'green block', 'brown block', 'green bowl', 'blue bowl', 'blue block'] | |
# place the green block to the right of the bowl that has the blue block. | |
bowl_name = parse_obj_name('the bowl that has the blue block', f'objects = {get_obj_names()}') | |
if bowl_name: | |
target_pos = parse_position(f'a point 10cm to the right of the {bowl_name}') | |
say(f'No problem - placing the green block to the right of the {bowl_name}') | |
put_first_on_second('green block', target_pos) | |
else: | |
say('There are no bowls that has the blue block') | |
objects = ['brown bowl', 'green block', 'brown block', 'green bowl', 'blue bowl', 'blue block'] | |
# move the other blocks to the bottom corners. | |
block_names = parse_obj_name('blocks other than the blue block', f'objects = {get_obj_names()}') | |
corners = parse_position('the bottom corners') | |
for block_name, pos in zip(block_names, corners): | |
put_first_on_second(block_name, pos) | |
objects = ['pink block', 'gray block', 'orange block'] | |
# move the pinkish colored block on the bottom side. | |
say('Ok - putting the pink block on the bottom side') | |
bottom_side_pos = parse_position('the bottom side') | |
put_first_on_second('pink block', bottom_side_pos) | |
objects = ['yellow bowl', 'blue block', 'yellow block', 'blue bowl'] | |
# is the blue block to the right of the yellow bowl? | |
if parse_question('is the blue block to the right of the yellow bowl?', f'objects = {get_obj_names()}'): | |
say('yes, there is a blue block to the right of the yellow bow') | |
else: | |
say('no, there is\'t a blue block to the right of the yellow bow') | |
objects = ['yellow bowl', 'blue block', 'yellow block', 'blue bowl'] | |
# how many yellow objects are there? | |
n_yellow_objs = parse_question('how many yellow objects are there', f'objects = {get_obj_names()}') | |
say(f'there are {n_yellow_objs} yellow object') | |
objects = ['pink block', 'green block', 'pink bowl', 'blue block', 'blue bowl', 'green bowl'] | |
# move the left most block to the green bowl. | |
left_block_name = parse_obj_name('left most block', f'objects = {get_obj_names()}') | |
say(f'Moving the {left_block_name} on the green bowl') | |
put_first_on_second(left_block_name, 'green bowl') | |
objects = ['pink block', 'green block', 'pink bowl', 'blue block', 'blue bowl', 'green bowl'] | |
# move the other blocks to different corners. | |
block_names = parse_obj_name(f'blocks other than the {left_block_name}', f'objects = {get_obj_names()}') | |
corners = parse_position('the corners') | |
say(f'Ok - moving the other {len(block_names)} blocks to different corners') | |
for block_name, pos in zip(block_names, corners): | |
put_first_on_second(block_name, pos) | |
objects = ['pink block', 'green block', 'pink bowl', 'blue block', 'blue bowl', 'green bowl'] | |
# is the pink block on the green bowl. | |
if parse_question('is the pink block on the green bowl', f'objects = {get_obj_names()}'): | |
say('Yes - the pink block is on the green bowl.') | |
else: | |
say('No - the pink block is not on the green bowl.') | |
objects = ['pink block', 'green block', 'pink bowl', 'blue block', 'blue bowl', 'green bowl'] | |
# what are the blocks left of the green bowl. | |
left_block_names = parse_question('what are the blocks left of the green bowl', f'objects = {get_obj_names()}') | |
if len(left_block_names) > 0: | |
say(f'These blocks are left of the green bowl: {", ".join(left_block_names)}') | |
else: | |
say('There are no blocks left of the green bowl') | |
objects = ['yellow block', 'green block', 'yellow bowl', 'blue block', 'blue bowl', 'green bowl'] | |
# imagine that the bowls are different biomes on earth and imagine that the blocks are parts of a building. | |
say('ok') | |
objects = ['yellow block', 'green block', 'yellow bowl', 'blue block', 'blue bowl', 'green bowl'] | |
# now build a tower in the grasslands. | |
order_bottom_to_top = ['green bowl', 'blue block', 'green block', 'yellow block'] | |
say('stacking the blocks on the green bowl') | |
stack_objects_in_order(object_names=order_bottom_to_top) | |
objects = ['yellow block', 'green block', 'yellow bowl', 'gray block', 'gray bowl', 'green bowl'] | |
# show me what happens when the desert gets flooded by the ocean. | |
say('putting the yellow bowl on the blue bowl') | |
put_first_on_second('yellow bowl', 'blue bowl') | |
objects = ['pink block', 'gray block', 'orange block'] | |
# move all blocks 5cm toward the top. | |
say('Ok - moving all blocks 5cm toward the top') | |
block_names = parse_obj_name('the blocks', f'objects = {get_obj_names()}') | |
for block_name in block_names: | |
target_pos = parse_position(f'a point 5cm above the {block_name}') | |
put_first_on_second(block_name, target_pos) | |
objects = ['cyan block', 'white block', 'purple bowl', 'blue block', 'blue bowl', 'white bowl'] | |
# make a triangle of blocks in the middle. | |
block_names = parse_obj_name('the blocks', f'objects = {get_obj_names()}') | |
triangle_pts = parse_position(f'a triangle with size 10cm around the middle with {len(block_names)} points') | |
say('Making a triangle of blocks around the middle of the workspace') | |
for block_name, pt in zip(block_names, triangle_pts): | |
put_first_on_second(block_name, pt) | |
objects = ['cyan block', 'white block', 'purple bowl', 'blue block', 'blue bowl', 'white bowl'] | |
# make the triangle smaller. | |
triangle_pts = transform_shape_pts('scale it by 0.5x', shape_pts=triangle_pts) | |
say('Making the triangle smaller') | |
block_names = parse_obj_name('the blocks', f'objects = {get_obj_names()}') | |
for block_name, pt in zip(block_names, triangle_pts): | |
put_first_on_second(block_name, pt) | |
objects = ['brown bowl', 'red block', 'brown block', 'red bowl', 'pink bowl', 'pink block'] | |
# put the red block on the farthest bowl. | |
farthest_bowl_name = parse_obj_name('the bowl farthest from the red block', f'objects = {get_obj_names()}') | |
say(f'Putting the red block on the {farthest_bowl_name}') | |
put_first_on_second('red block', farthest_bowl_name) |