|
|
|
from xml.etree import ElementTree |
|
|
|
from libero.envs.objects import OBJECTS_DICT, get_object_fn |
|
|
|
EXCEPTION_DICT = {"flat_stove": "flat_stove_burner"} |
|
|
|
|
|
def update_exception_dict(object_name, site_name): |
|
"""Update EXCEPTION_DICT information. This is to handle some special case of affordance region naming. |
|
|
|
Args: |
|
object_name (str): object name |
|
site_name (str): site name |
|
""" |
|
EXCEPTION_DICT[object_name] = site_name |
|
|
|
|
|
def get_affordance_regions(objects, verbose=False): |
|
"""_summary_ |
|
|
|
Args: |
|
objects (MujocoObject): a dictionary of objects |
|
verbose (bool, optional): Print additional debug information. Defaults to False. |
|
|
|
Returns: |
|
dict: a dictionary of object names and their affordance regions. |
|
""" |
|
affordances = {} |
|
for object_name in objects.keys(): |
|
try: |
|
obj = get_object_fn(object_name)() |
|
|
|
object_affordance = [] |
|
for site in obj.root.findall(".//site"): |
|
site_name = site.get("name") |
|
if "site" not in site_name and ( |
|
object_name not in EXCEPTION_DICT |
|
or object_name in EXCEPTION_DICT |
|
and site_name not in EXCEPTION_DICT[object_name] |
|
): |
|
|
|
|
|
object_affordance.append(site_name.replace(f"{object_name}_", "")) |
|
if len(object_affordance) > 0: |
|
affordances[object_name] = object_affordance |
|
except: |
|
if verbose: |
|
print(f"Skipping {object_name}") |
|
|
|
return affordances |
|
|