Assets Design#

Assets are the building blocks of simulation environments - robots, objects, backgrounds, and scene elements. The asset system provides a registry system for managing these components.

Core Architecture#

The asset system uses a hierarchical class structure:

class Asset:
    """Base class for all assets."""
    def __init__(self, name: str, tags: list[str] | None = None, **kwargs):
        self._name = name
        self.tags = tags

class ObjectBase(Asset):
    """Physical objects that can be spawned."""
    def __init__(self, object_type: ObjectType, prim_path: str, **kwargs):
        self.object_type = object_type
        self.prim_path = prim_path
        self.object_cfg = self.get_cfg()

    def get_cfg(self) -> dict[str, Any]:
        """Generate Isaac Lab configurations."""

The system supports complex compositions through mixins like affordances while automatically generating Isaac Lab-compatible configurations.

Assets in Detail#

Asset Hierarchy

Three-tier architecture from generic to specialized:

  • Asset: Base class providing name, tags, and identification

  • ObjectBase: Adds physics types, pose management, and configuration generation

  • Specialized Classes: Object, Background, ObjectReference, EmbodimentBase for specific use cases

Physics Types

Support for different simulation behaviors:

  • BASE: Static objects without physics (backgrounds, markers)

  • RIGID: Single rigid body physics (boxes, tools, furniture)

  • ARTICULATION: Multi-body with joints (robots, doors, appliances)

Registration System

Automatic asset discovery through decorators:

@register_asset
class CrackerBox(LibraryObject):
    name = "cracker_box"
    tags = ["object"]
    usd_path = "path/to/cracker_box.usd"
    object_type = ObjectType.RIGID
Discovery Mechanisms

Multiple ways to find and instantiate assets:

  • By Name: asset_registry.get_asset_by_name("cracker_box")()

  • By Tags: asset_registry.get_assets_by_tag("object")

  • Random Selection: asset_registry.get_random_asset_by_tag("object")()

Configuration Generation

Automatic Isaac Lab configuration creation based on object type and properties, handling physics setup, contact sensors, and collision detection internally.

Environment Integration#

# Asset creation and positioning
background = asset_registry.get_asset_by_name("kitchen")()
pick_object = asset_registry.get_asset_by_name("cracker_box")()
pick_object.set_initial_pose(Pose(position_xyz=(0.4, 0.0, 0.1)))

# Scene composition
scene = Scene(assets=[background, pick_object])

# Environment integration
environment = IsaacLabArenaEnvironment(
    name="manipulation_task",
    embodiment=embodiment,
    scene=scene,
    task=task
)

Usage Examples#

Asset Discovery

# Direct asset creation
kitchen = asset_registry.get_asset_by_name("kitchen")()
objects = asset_registry.get_assets_by_tag("object")

Affordance Integration

# Objects with interaction capabilities
microwave = asset_registry.get_asset_by_name("microwave")()  # Has Openable mixin
task = OpenDoorTask(microwave, openness_threshold=0.8)

Object References

# Reference existing scene elements
destination = ObjectReference(
    name="kitchen_drawer",
    prim_path="{ENV_REGEX_NS}/kitchen/Cabinet_B_02",
    parent_asset=kitchen_background,
    object_type=ObjectType.RIGID
)