Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
165 changes: 126 additions & 39 deletions isaaclab_arena/assets/object_library.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,16 +45,22 @@ class LibraryObject(Object):
asset_cfg_addon: dict[str, Any] = {}

def __init__(
self, instance_name: str | None = None, prim_path: str | None = None, initial_pose: Pose | None = None, **kwargs
self,
instance_name: str | None = None,
prim_path: str | None = None,
initial_pose: Pose | None = None,
scale: tuple[float, float, float] | None = None,
**kwargs,
):
name = instance_name if instance_name is not None else self.name
scale = scale if scale is not None else self.scale
super().__init__(
name=name,
prim_path=prim_path,
tags=self.tags,
usd_path=self.usd_path,
object_type=self.object_type,
scale=self.scale,
scale=scale,
initial_pose=initial_pose,
spawn_cfg_addon=self.spawn_cfg_addon,
asset_cfg_addon=self.asset_cfg_addon,
Expand All @@ -73,9 +79,13 @@ class CrackerBox(LibraryObject):
usd_path = f"{ISAAC_NUCLEUS_DIR}/Props/YCB/Axis_Aligned_Physics/003_cracker_box.usd"

def __init__(
self, instance_name: str | None = None, prim_path: str | None = None, initial_pose: Pose | None = None
self,
instance_name: str | None = None,
prim_path: str | None = None,
initial_pose: Pose | None = None,
scale: tuple[float, float, float] | None = None,
):
super().__init__(instance_name=instance_name, prim_path=prim_path, initial_pose=initial_pose)
super().__init__(instance_name=instance_name, prim_path=prim_path, initial_pose=initial_pose, scale=scale)


@register_asset
Expand All @@ -89,9 +99,13 @@ class MustardBottle(LibraryObject):
usd_path = f"{ISAAC_NUCLEUS_DIR}/Props/YCB/Axis_Aligned_Physics/006_mustard_bottle.usd"

def __init__(
self, instance_name: str | None = None, prim_path: str | None = None, initial_pose: Pose | None = None
self,
instance_name: str | None = None,
prim_path: str | None = None,
initial_pose: Pose | None = None,
scale: tuple[float, float, float] | None = None,
):
super().__init__(instance_name=instance_name, prim_path=prim_path, initial_pose=initial_pose)
super().__init__(instance_name=instance_name, prim_path=prim_path, initial_pose=initial_pose, scale=scale)


@register_asset
Expand All @@ -105,9 +119,13 @@ class SugarBox(LibraryObject):
usd_path = f"{ISAAC_NUCLEUS_DIR}/Props/YCB/Axis_Aligned_Physics/004_sugar_box.usd"

def __init__(
self, instance_name: str | None = None, prim_path: str | None = None, initial_pose: Pose | None = None
self,
instance_name: str | None = None,
prim_path: str | None = None,
initial_pose: Pose | None = None,
scale: tuple[float, float, float] | None = None,
):
super().__init__(instance_name=instance_name, prim_path=prim_path, initial_pose=initial_pose)
super().__init__(instance_name=instance_name, prim_path=prim_path, initial_pose=initial_pose, scale=scale)


@register_asset
Expand All @@ -121,9 +139,13 @@ class TomatoSoupCan(LibraryObject):
usd_path = f"{ISAAC_NUCLEUS_DIR}/Props/YCB/Axis_Aligned_Physics/005_tomato_soup_can.usd"

def __init__(
self, instance_name: str | None = None, prim_path: str | None = None, initial_pose: Pose | None = None
self,
instance_name: str | None = None,
prim_path: str | None = None,
initial_pose: Pose | None = None,
scale: tuple[float, float, float] | None = None,
):
super().__init__(instance_name=instance_name, prim_path=prim_path, initial_pose=initial_pose)
super().__init__(instance_name=instance_name, prim_path=prim_path, initial_pose=initial_pose, scale=scale)


@register_asset
Expand All @@ -137,9 +159,13 @@ class PowerDrill(LibraryObject):
usd_path = f"{ISAACLAB_NUCLEUS_DIR}/Arena/assets/object_library/power_drill_physics/power_drill_physics.usd"

def __init__(
self, instance_name: str | None = None, prim_path: str | None = None, initial_pose: Pose | None = None
self,
instance_name: str | None = None,
prim_path: str | None = None,
initial_pose: Pose | None = None,
scale: tuple[float, float, float] | None = None,
):
super().__init__(instance_name=instance_name, prim_path=prim_path, initial_pose=initial_pose)
super().__init__(instance_name=instance_name, prim_path=prim_path, initial_pose=initial_pose, scale=scale)


@register_asset
Expand Down Expand Up @@ -251,9 +277,13 @@ class OfficeTable(LibraryObject):
scale = (1.0, 1.0, 0.7)

def __init__(
self, instance_name: str | None = None, prim_path: str | None = None, initial_pose: Pose | None = None
self,
instance_name: str | None = None,
prim_path: str | None = None,
initial_pose: Pose | None = None,
scale: tuple[float, float, float] | None = None,
):
super().__init__(instance_name=instance_name, prim_path=prim_path, initial_pose=initial_pose)
super().__init__(instance_name=instance_name, prim_path=prim_path, initial_pose=initial_pose, scale=scale)


@register_asset
Expand All @@ -268,9 +298,13 @@ class BlueSortingBin(LibraryObject):
scale = (4.0, 2.0, 1.0)

def __init__(
self, instance_name: str | None = None, prim_path: str | None = None, initial_pose: Pose | None = None
self,
instance_name: str | None = None,
prim_path: str | None = None,
initial_pose: Pose | None = None,
scale: tuple[float, float, float] | None = None,
):
super().__init__(prim_path=prim_path, initial_pose=initial_pose)
super().__init__(instance_name=instance_name, prim_path=prim_path, initial_pose=initial_pose, scale=scale)


@register_asset
Expand All @@ -285,9 +319,13 @@ class BlueExhaustPipe(LibraryObject):
scale = (0.55, 0.55, 1.4)

def __init__(
self, instance_name: str | None = None, prim_path: str | None = None, initial_pose: Pose | None = None
self,
instance_name: str | None = None,
prim_path: str | None = None,
initial_pose: Pose | None = None,
scale: tuple[float, float, float] | None = None,
):
super().__init__(instance_name=instance_name, prim_path=prim_path, initial_pose=initial_pose)
super().__init__(instance_name=instance_name, prim_path=prim_path, initial_pose=initial_pose, scale=scale)


@register_asset
Expand All @@ -302,9 +340,13 @@ class BrownBox(LibraryObject):
scale = (1.0, 1.0, 1.0)

def __init__(
self, instance_name: str | None = None, prim_path: str | None = None, initial_pose: Pose | None = None
self,
instance_name: str | None = None,
prim_path: str | None = None,
initial_pose: Pose | None = None,
scale: tuple[float, float, float] | None = None,
):
super().__init__(instance_name=instance_name, prim_path=prim_path, initial_pose=initial_pose)
super().__init__(instance_name=instance_name, prim_path=prim_path, initial_pose=initial_pose, scale=scale)


@register_asset
Expand All @@ -324,12 +366,17 @@ class Mug(LibraryObject, Placeable):
orientation_threshold = 0.5

def __init__(
self, instance_name: str | None = None, prim_path: str | None = None, initial_pose: Pose | None = None
self,
instance_name: str | None = None,
prim_path: str | None = None,
initial_pose: Pose | None = None,
scale: tuple[float, float, float] | None = None,
):
super().__init__(
instance_name=instance_name,
prim_path=prim_path,
initial_pose=initial_pose,
scale=scale,
upright_axis_name=self.upright_axis_name,
orientation_threshold=self.orientation_threshold,
)
Expand Down Expand Up @@ -406,9 +453,13 @@ class DexCube(LibraryObject):
object_type = ObjectType.RIGID

def __init__(
self, instance_name: str | None = None, prim_path: str | None = None, initial_pose: Pose | None = None
self,
instance_name: str | None = None,
prim_path: str | None = None,
initial_pose: Pose | None = None,
scale: tuple[float, float, float] | None = None,
):
super().__init__(instance_name=instance_name, prim_path=prim_path, initial_pose=initial_pose)
super().__init__(instance_name=instance_name, prim_path=prim_path, initial_pose=initial_pose, scale=scale)


@register_asset
Expand Down Expand Up @@ -555,9 +606,13 @@ class Broccoli(LibraryObject):
object_type = ObjectType.RIGID

def __init__(
self, instance_name: str | None = None, prim_path: str | None = None, initial_pose: Pose | None = None
self,
instance_name: str | None = None,
prim_path: str | None = None,
initial_pose: Pose | None = None,
scale: tuple[float, float, float] | None = None,
):
super().__init__(instance_name=instance_name, prim_path=prim_path, initial_pose=initial_pose)
super().__init__(instance_name=instance_name, prim_path=prim_path, initial_pose=initial_pose, scale=scale)


@register_asset
Expand All @@ -579,9 +634,13 @@ class SweetPotato(LibraryObject):
scale = (1.5, 1.5, 1.5)

def __init__(
self, instance_name: str | None = None, prim_path: str | None = None, initial_pose: Pose | None = None
self,
instance_name: str | None = None,
prim_path: str | None = None,
initial_pose: Pose | None = None,
scale: tuple[float, float, float] | None = None,
):
super().__init__(instance_name=instance_name, prim_path=prim_path, initial_pose=initial_pose)
super().__init__(instance_name=instance_name, prim_path=prim_path, initial_pose=initial_pose, scale=scale)


@register_asset
Expand All @@ -603,9 +662,13 @@ class Jug(LibraryObject):
scale = (2.0, 2.0, 2.0)

def __init__(
self, instance_name: str | None = None, prim_path: str | None = None, initial_pose: Pose | None = None
self,
instance_name: str | None = None,
prim_path: str | None = None,
initial_pose: Pose | None = None,
scale: tuple[float, float, float] | None = None,
):
super().__init__(instance_name=instance_name, prim_path=prim_path, initial_pose=initial_pose)
super().__init__(instance_name=instance_name, prim_path=prim_path, initial_pose=initial_pose, scale=scale)


@register_asset
Expand All @@ -621,9 +684,13 @@ class RanchDressingBottle(LibraryObject):
scale = (0.8, 0.8, 1.2)

def __init__(
self, instance_name: str | None = None, prim_path: str | None = None, initial_pose: Pose | None = None
self,
instance_name: str | None = None,
prim_path: str | None = None,
initial_pose: Pose | None = None,
scale: tuple[float, float, float] | None = None,
):
super().__init__(instance_name=instance_name, prim_path=prim_path, initial_pose=initial_pose)
super().__init__(instance_name=instance_name, prim_path=prim_path, initial_pose=initial_pose, scale=scale)


@register_asset
Expand All @@ -646,8 +713,13 @@ class RedCube(LibraryObject):
default_prim_path = "{ENV_REGEX_NS}/RedCube"
scale = (0.02, 0.02, 0.02)

def __init__(self, prim_path: str | None = None, initial_pose: Pose | None = None):
super().__init__(prim_path=prim_path, initial_pose=initial_pose)
def __init__(
self,
prim_path: str | None = None,
initial_pose: Pose | None = None,
scale: tuple[float, float, float] | None = None,
):
super().__init__(prim_path=prim_path, initial_pose=initial_pose, scale=scale)


@register_asset
Expand All @@ -669,8 +741,13 @@ class GreenCube(LibraryObject):
default_prim_path = "{ENV_REGEX_NS}/GreenCube"
scale = (0.02, 0.02, 0.02)

def __init__(self, prim_path: str | None = None, initial_pose: Pose | None = None):
super().__init__(prim_path=prim_path, initial_pose=initial_pose)
def __init__(
self,
prim_path: str | None = None,
initial_pose: Pose | None = None,
scale: tuple[float, float, float] | None = None,
):
super().__init__(prim_path=prim_path, initial_pose=initial_pose, scale=scale)


@register_asset
Expand All @@ -686,8 +763,13 @@ class RedContainer(LibraryObject):
default_prim_path = "{ENV_REGEX_NS}/red_container"
scale = (0.5, 0.5, 0.5)

def __init__(self, prim_path: str | None = None, initial_pose: Pose | None = None):
super().__init__(prim_path=prim_path, initial_pose=initial_pose)
def __init__(
self,
prim_path: str | None = None,
initial_pose: Pose | None = None,
scale: tuple[float, float, float] | None = None,
):
super().__init__(prim_path=prim_path, initial_pose=initial_pose, scale=scale)


@register_asset
Expand All @@ -703,5 +785,10 @@ class GreenContainer(LibraryObject):
default_prim_path = "{ENV_REGEX_NS}/green_container"
scale = (0.5, 0.5, 0.5)

def __init__(self, prim_path: str | None = None, initial_pose: Pose | None = None):
super().__init__(prim_path=prim_path, initial_pose=initial_pose)
def __init__(
self,
prim_path: str | None = None,
initial_pose: Pose | None = None,
scale: tuple[float, float, float] | None = None,
):
super().__init__(prim_path=prim_path, initial_pose=initial_pose, scale=scale)
49 changes: 49 additions & 0 deletions isaaclab_arena/tests/test_object_scale.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
# Copyright (c) 2026, The Isaac Lab Arena Project Developers (https://github.com/isaac-sim/IsaacLab-Arena/blob/main/CONTRIBUTORS.md).
# All rights reserved.
#
# SPDX-License-Identifier: Apache-2.0

"""Tests for object scale parameter (LibraryObject and subclasses)."""

from isaaclab_arena.tests.utils.subprocess import run_simulation_app_function

HEADLESS = True


def _test_object_scale_default_and_override(simulation_app):
from isaaclab_arena.assets.asset_registry import AssetRegistry

asset_registry = AssetRegistry()

cracker_box_default = asset_registry.get_asset_by_name("cracker_box")()
assert cracker_box_default.scale == (1.0, 1.0, 1.0)

# Same object with explicit scale override
custom_scale = (2.0, 2.0, 2.0)
cracker_box_scaled = asset_registry.get_asset_by_name("cracker_box")(scale=custom_scale)
assert cracker_box_scaled.scale == custom_scale

dex_cube_default = asset_registry.get_asset_by_name("dex_cube")()
assert dex_cube_default.scale == (0.8, 0.8, 0.8)

# Override object's own scale
override_scale = (0.5, 0.5, 0.5)
dex_cube_scaled = asset_registry.get_asset_by_name("dex_cube")(scale=override_scale)
assert dex_cube_scaled.scale == override_scale

dex_cube_none = asset_registry.get_asset_by_name("dex_cube")(scale=None)
assert dex_cube_none.scale == (0.8, 0.8, 0.8)

return True


def test_object_scale_default_and_override():
result = run_simulation_app_function(
_test_object_scale_default_and_override,
headless=HEADLESS,
)
assert result, "Test failed"


if __name__ == "__main__":
test_object_scale_default_and_override()