|
import os |
|
from collections import namedtuple |
|
|
|
from libero.utils.mu_utils import get_scene_class |
|
from libero.utils.bddl_generation_utils import * |
|
|
|
TASK_INFO = {} |
|
|
|
TaskInfoTuple = namedtuple( |
|
"TaskInfoTuple", "scene_name language objects_of_interest goal_states" |
|
) |
|
|
|
|
|
def register_task_info(language, scene_name, objects_of_interest=[], goal_states=[]): |
|
|
|
if scene_name not in TASK_INFO: |
|
TASK_INFO[scene_name] = [] |
|
|
|
scene = get_scene_class(scene_name)() |
|
possible_objects_of_interest = scene.possible_objects_of_interest |
|
for object_name in objects_of_interest: |
|
if object_name not in possible_objects_of_interest: |
|
print(f"Error!! {scene_name} not having valid objects: {object_name}") |
|
print(possible_objects_of_interest) |
|
raise ValueError |
|
task_goal = [("And", *goal_states)] |
|
TASK_INFO[scene_name].append( |
|
TaskInfoTuple(scene_name, language, objects_of_interest, task_goal) |
|
) |
|
|
|
|
|
def get_task_info(scene_name=None): |
|
if scene_name is None: |
|
return TASK_INFO |
|
else: |
|
return TASK_INFO[scene_name] |
|
|
|
|
|
def get_suite_generator_func(workspace_name): |
|
if workspace_name == "main_table": |
|
return tabletop_task_suites_generator |
|
elif workspace_name == "kitchen_table": |
|
return kitchen_table_task_suites_generator |
|
elif workspace_name == "living_room_table": |
|
return living_room_table_task_suites_generator |
|
elif workspace_name == "study_table": |
|
return study_table_task_suites_generator |
|
elif workspace_name == "coffee_table": |
|
return coffee_table_task_suites_generator |
|
else: |
|
return floor_task_suites_generator |
|
|
|
|
|
def generate_bddl_from_task_info(folder="/tmp/pddl"): |
|
results = [] |
|
failures = [] |
|
bddl_file_names = [] |
|
os.makedirs(folder, exist_ok=True) |
|
|
|
registered_task_info_dict = get_task_info() |
|
for scene_name in registered_task_info_dict: |
|
for task_info_tuple in registered_task_info_dict[scene_name]: |
|
scene_name = task_info_tuple.scene_name |
|
language = task_info_tuple.language |
|
objects_of_interest = task_info_tuple.objects_of_interest |
|
goal_states = task_info_tuple.goal_states |
|
scene = get_scene_class(scene_name)() |
|
|
|
try: |
|
result = get_suite_generator_func(scene.workspace_name)( |
|
language=language, |
|
xy_region_kwargs_list=scene.xy_region_kwargs_list, |
|
affordance_region_kwargs_list=scene.affordance_region_kwargs_list, |
|
fixture_object_dict=scene.fixture_object_dict, |
|
movable_object_dict=scene.movable_object_dict, |
|
objects_of_interest=objects_of_interest, |
|
init_states=scene.init_states, |
|
goal_states=goal_states, |
|
) |
|
result = get_result(result) |
|
bddl_file_name = save_to_file( |
|
result, scene_name=scene_name, language=language, folder=folder |
|
) |
|
if bddl_file_name in bddl_file_names: |
|
print(bddl_file_name) |
|
bddl_file_names.append(bddl_file_name) |
|
results.append(result) |
|
except: |
|
failures.append((scene_name, language)) |
|
print(f"Succefully generated: {len(results)}") |
|
return bddl_file_names, failures |
|
|