|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
from dataclasses import dataclass, field |
|
|
from enum import Enum |
|
|
|
|
|
from dataclasses_json import DataClassJsonMixin |
|
|
|
|
|
__all__ = [ |
|
|
"RenderItems", |
|
|
"Scene3DItemEnum", |
|
|
"SpatialRelationEnum", |
|
|
"RobotItemEnum", |
|
|
"LayoutInfo", |
|
|
"AssetType", |
|
|
"SimAssetMapper", |
|
|
] |
|
|
|
|
|
|
|
|
@dataclass |
|
|
class RenderItems(str, Enum): |
|
|
"""Enumeration of render item types for 3D scenes. |
|
|
|
|
|
Attributes: |
|
|
IMAGE: Color image. |
|
|
ALPHA: Mask image. |
|
|
VIEW_NORMAL: View-space normal image. |
|
|
GLOBAL_NORMAL: World-space normal image. |
|
|
POSITION_MAP: Position map image. |
|
|
DEPTH: Depth image. |
|
|
ALBEDO: Albedo image. |
|
|
DIFFUSE: Diffuse image. |
|
|
""" |
|
|
|
|
|
IMAGE = "image_color" |
|
|
ALPHA = "image_mask" |
|
|
VIEW_NORMAL = "image_view_normal" |
|
|
GLOBAL_NORMAL = "image_global_normal" |
|
|
POSITION_MAP = "image_position" |
|
|
DEPTH = "image_depth" |
|
|
ALBEDO = "image_albedo" |
|
|
DIFFUSE = "image_diffuse" |
|
|
|
|
|
|
|
|
@dataclass |
|
|
class Scene3DItemEnum(str, Enum): |
|
|
"""Enumeration of 3D scene item categories. |
|
|
|
|
|
Attributes: |
|
|
BACKGROUND: Background objects. |
|
|
CONTEXT: Contextual objects. |
|
|
ROBOT: Robot entity. |
|
|
MANIPULATED_OBJS: Objects manipulated by the robot. |
|
|
DISTRACTOR_OBJS: Distractor objects. |
|
|
OTHERS: Other objects. |
|
|
|
|
|
Methods: |
|
|
object_list(layout_relation): Returns a list of objects in the scene. |
|
|
object_mapping(layout_relation): Returns a mapping from object to category. |
|
|
""" |
|
|
|
|
|
BACKGROUND = "background" |
|
|
CONTEXT = "context" |
|
|
ROBOT = "robot" |
|
|
MANIPULATED_OBJS = "manipulated_objs" |
|
|
DISTRACTOR_OBJS = "distractor_objs" |
|
|
OTHERS = "others" |
|
|
|
|
|
@classmethod |
|
|
def object_list(cls, layout_relation: dict) -> list: |
|
|
"""Returns a list of objects in the scene. |
|
|
|
|
|
Args: |
|
|
layout_relation: Dictionary mapping categories to objects. |
|
|
|
|
|
Returns: |
|
|
List of objects in the scene. |
|
|
""" |
|
|
return ( |
|
|
[ |
|
|
layout_relation[cls.BACKGROUND.value], |
|
|
layout_relation[cls.CONTEXT.value], |
|
|
] |
|
|
+ layout_relation[cls.MANIPULATED_OBJS.value] |
|
|
+ layout_relation[cls.DISTRACTOR_OBJS.value] |
|
|
) |
|
|
|
|
|
@classmethod |
|
|
def object_mapping(cls, layout_relation): |
|
|
"""Returns a mapping from object to category. |
|
|
|
|
|
Args: |
|
|
layout_relation: Dictionary mapping categories to objects. |
|
|
|
|
|
Returns: |
|
|
Dictionary mapping object names to their category. |
|
|
""" |
|
|
relation_mapping = { |
|
|
|
|
|
layout_relation[cls.BACKGROUND.value]: cls.BACKGROUND.value, |
|
|
layout_relation[cls.CONTEXT.value]: cls.CONTEXT.value, |
|
|
} |
|
|
relation_mapping.update( |
|
|
{ |
|
|
item: cls.MANIPULATED_OBJS.value |
|
|
for item in layout_relation[cls.MANIPULATED_OBJS.value] |
|
|
} |
|
|
) |
|
|
relation_mapping.update( |
|
|
{ |
|
|
item: cls.DISTRACTOR_OBJS.value |
|
|
for item in layout_relation[cls.DISTRACTOR_OBJS.value] |
|
|
} |
|
|
) |
|
|
|
|
|
return relation_mapping |
|
|
|
|
|
|
|
|
@dataclass |
|
|
class SpatialRelationEnum(str, Enum): |
|
|
"""Enumeration of spatial relations for objects in a scene. |
|
|
|
|
|
Attributes: |
|
|
ON: Objects on a surface (e.g., table). |
|
|
IN: Objects in a container or room. |
|
|
INSIDE: Objects inside a shelf or rack. |
|
|
FLOOR: Objects on the floor. |
|
|
""" |
|
|
|
|
|
ON = "ON" |
|
|
IN = "IN" |
|
|
INSIDE = "INSIDE" |
|
|
FLOOR = "FLOOR" |
|
|
|
|
|
|
|
|
@dataclass |
|
|
class RobotItemEnum(str, Enum): |
|
|
"""Enumeration of supported robot types. |
|
|
|
|
|
Attributes: |
|
|
FRANKA: Franka robot. |
|
|
UR5: UR5 robot. |
|
|
PIPER: Piper robot. |
|
|
""" |
|
|
|
|
|
FRANKA = "franka" |
|
|
UR5 = "ur5" |
|
|
PIPER = "piper" |
|
|
|
|
|
|
|
|
@dataclass |
|
|
class LayoutInfo(DataClassJsonMixin): |
|
|
"""Data structure for layout information in a 3D scene. |
|
|
|
|
|
Attributes: |
|
|
tree: Hierarchical structure of scene objects. |
|
|
relation: Spatial relations between objects. |
|
|
objs_desc: Descriptions of objects. |
|
|
objs_mapping: Mapping from object names to categories. |
|
|
assets: Asset file paths for objects. |
|
|
quality: Quality information for assets. |
|
|
position: Position coordinates for objects. |
|
|
""" |
|
|
|
|
|
tree: dict[str, list] |
|
|
relation: dict[str, str | list[str]] |
|
|
objs_desc: dict[str, str] = field(default_factory=dict) |
|
|
objs_mapping: dict[str, str] = field(default_factory=dict) |
|
|
assets: dict[str, str] = field(default_factory=dict) |
|
|
quality: dict[str, str] = field(default_factory=dict) |
|
|
position: dict[str, list[float]] = field(default_factory=dict) |
|
|
|
|
|
|
|
|
@dataclass |
|
|
class AssetType(str): |
|
|
"""Enumeration for asset types. |
|
|
|
|
|
Supported types: |
|
|
MJCF: MuJoCo XML format. |
|
|
USD: Universal Scene Description format. |
|
|
URDF: Unified Robot Description Format. |
|
|
MESH: Mesh file format. |
|
|
""" |
|
|
|
|
|
MJCF = "mjcf" |
|
|
USD = "usd" |
|
|
URDF = "urdf" |
|
|
MESH = "mesh" |
|
|
|
|
|
|
|
|
class SimAssetMapper: |
|
|
"""Maps simulator names to asset types. |
|
|
|
|
|
Provides a mapping from simulator names to their corresponding asset type. |
|
|
|
|
|
Example: |
|
|
```py |
|
|
from embodied_gen.utils.enum import SimAssetMapper |
|
|
asset_type = SimAssetMapper["isaacsim"] |
|
|
print(asset_type) # Output: 'usd' |
|
|
``` |
|
|
|
|
|
Methods: |
|
|
__class_getitem__(key): Returns the asset type for a given simulator name. |
|
|
""" |
|
|
|
|
|
_mapping = dict( |
|
|
ISAACSIM=AssetType.USD, |
|
|
ISAACGYM=AssetType.URDF, |
|
|
MUJOCO=AssetType.MJCF, |
|
|
GENESIS=AssetType.MJCF, |
|
|
SAPIEN=AssetType.URDF, |
|
|
PYBULLET=AssetType.URDF, |
|
|
) |
|
|
|
|
|
@classmethod |
|
|
def __class_getitem__(cls, key: str): |
|
|
"""Returns the asset type for a given simulator name. |
|
|
|
|
|
Args: |
|
|
key: Name of the simulator. |
|
|
|
|
|
Returns: |
|
|
AssetType corresponding to the simulator. |
|
|
|
|
|
Raises: |
|
|
KeyError: If the simulator name is not recognized. |
|
|
""" |
|
|
key = key.upper() |
|
|
if key.startswith("SAPIEN"): |
|
|
key = "SAPIEN" |
|
|
return cls._mapping[key] |
|
|
|