jeffacce
initial commit
393d3de
import re
from libero.envs.objects import OBJECTS_DICT
from libero.utils.bddl_generation_utils import (
get_affordance_region_kwargs_list_from_fixture_info,
get_object_dict,
)
from libero.utils.object_utils import get_affordance_regions
MU_DICT = {}
SCENE_DICT = {}
def register_mu(scene_type="general"):
def _func(target_class):
"""For reusing initial conditions easily, we register each pre-defined initial conditions in a dictionary."""
key = "_".join(
re.sub(r"([A-Z])", r" \1", target_class.__name__).split()
).lower()
MU_DICT[key.lower()] = target_class
if scene_type not in SCENE_DICT:
SCENE_DICT[scene_type.lower()] = []
SCENE_DICT[scene_type.lower()].append(target_class)
return target_class
return _func
def get_scene_dict(scene_type=None):
if scene_type is None:
return SCENE_DICT
else:
return SCENE_DICT[scene_type.lower()]
def get_scene_class(scene_name):
return MU_DICT[scene_name.lower()]
class InitialSceneTemplates:
def __init__(
self, workspace_name="main_table", fixture_num_info={}, object_num_info={}
):
self.workspace_name = workspace_name
# print(self.workspace_name)
self.fixture_object_dict = get_object_dict(fixture_num_info)
self.movable_object_dict = get_object_dict(object_num_info)
affordances = get_affordance_regions(OBJECTS_DICT)
affordance_fixture_info_dict = {}
for fixture_category_name in self.fixture_object_dict.keys():
if (
fixture_category_name != self.workspace_name
and fixture_category_name != "table"
and fixture_category_name != "living_room_table"
and fixture_category_name != "study_table"
and fixture_category_name != "kitchen_table"
):
for fixture_name in self.fixture_object_dict[fixture_category_name]:
affordance_fixture_info_dict[fixture_name] = affordances[
fixture_category_name
]
for category_name in self.movable_object_dict.keys():
if category_name in affordances:
for object_name in self.movable_object_dict[category_name]:
affordance_fixture_info_dict[object_name] = affordances[
category_name
]
# print(affordance_fixture_info_dict)
self.affordance_region_kwargs_list = (
get_affordance_region_kwargs_list_from_fixture_info(
affordance_fixture_info_dict
)
)
self.regions = {}
self.define_regions()
@property
def possible_objects_of_interest(self):
# objects_of_interest = list(self.fixture_object_dict.keys()) + list(self.movable_object_dict.keys())
# return objects_of_interest
objects_of_interest = []
for category_name in self.fixture_object_dict.keys():
objects_of_interest += self.fixture_object_dict[category_name]
for category_name in self.movable_object_dict.keys():
objects_of_interest += self.movable_object_dict[category_name]
return objects_of_interest
@property
def movable_objects(self):
return list(self.movable_object_dict)
def define_regions(self):
"""Override this method to define the layout of a scene."""
raise NotImplementedError
def get_region_dict(
self,
region_centroid_xy,
region_name,
target_name=None,
region_half_len=0.02,
yaw_rotation=(0.0, 0.0),
):
"""This is a function that creates a default region with rectangular shape."""
if target_name is None:
target_name = self.workspace_name
region_key_value = {
region_name: {
"target": target_name,
"ranges": [
(
region_centroid_xy[0] - region_half_len,
region_centroid_xy[1] - region_half_len,
region_centroid_xy[0] + region_half_len,
region_centroid_xy[1] + region_half_len,
)
],
"yaw_rotation": [yaw_rotation],
}
}
print
return region_key_value
@property
def init_states(self):
raise NotImplementedError