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
2 changes: 1 addition & 1 deletion source/isaaclab/config/extension.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
[package]

# Note: Semantic Versioning is used: https://semver.org/
version = "4.2.2"
version = "4.3.0"

# Description
title = "Isaac Lab framework for Robot Learning"
Expand Down
16 changes: 16 additions & 0 deletions source/isaaclab/docs/CHANGELOG.rst
Original file line number Diff line number Diff line change
@@ -1,6 +1,22 @@
Changelog
---------

4.3.0 (2026-02-26)
~~~~~~~~~~~~~~~~~~

Changed
^^^^^^^

* Added lazy callable-string resolution for config fields through
:class:`~isaaclab.utils.string.ResolvableString` in :mod:`isaaclab.utils.configclass`.
Config values such as ``class_type``/``func`` can now remain as strings until first
use and then resolve/cached automatically.

* Added ``{DIR}`` callable-string shorthand support in :mod:`isaaclab.utils.configclass`
for config defaults. ``"{DIR}.module:Symbol"`` now expands to the declaring config
module directory before resolution.


4.2.2 (2026-02-26)
~~~~~~~~~~~~~~~~~~

Expand Down
10 changes: 6 additions & 4 deletions source/isaaclab/isaaclab/actuators/actuator_net_cfg.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,19 +5,21 @@

from collections.abc import Iterable
from dataclasses import MISSING
from typing import Literal
from typing import TYPE_CHECKING, Literal

from isaaclab.utils import configclass

from . import actuator_net
from .actuator_pd_cfg import DCMotorCfg

if TYPE_CHECKING:
from .actuator_net import ActuatorNetLSTM, ActuatorNetMLP


@configclass
class ActuatorNetLSTMCfg(DCMotorCfg):
"""Configuration for LSTM-based actuator model."""

class_type: type = actuator_net.ActuatorNetLSTM
class_type: type["ActuatorNetLSTM"] | str = "{DIR}.actuator_net:ActuatorNetLSTM"
# we don't use stiffness and damping for actuator net
stiffness = None
damping = None
Expand All @@ -30,7 +32,7 @@ class ActuatorNetLSTMCfg(DCMotorCfg):
class ActuatorNetMLPCfg(DCMotorCfg):
"""Configuration for MLP-based actuator model."""

class_type: type = actuator_net.ActuatorNetMLP
class_type: type["ActuatorNetMLP"] | str = "{DIR}.actuator_net:ActuatorNetMLP"
# we don't use stiffness and damping for actuator net

stiffness = None
Expand Down
15 changes: 9 additions & 6 deletions source/isaaclab/isaaclab/actuators/actuator_pd_cfg.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,15 @@
# SPDX-License-Identifier: BSD-3-Clause

from dataclasses import MISSING
from typing import TYPE_CHECKING

from isaaclab.utils import configclass

from . import actuator_pd
from .actuator_base_cfg import ActuatorBaseCfg

if TYPE_CHECKING:
from .actuator_pd import DCMotor, DelayedPDActuator, IdealPDActuator, ImplicitActuator, RemotizedPDActuator

"""
Implicit Actuator Models.
"""
Expand All @@ -23,7 +26,7 @@ class ImplicitActuatorCfg(ActuatorBaseCfg):
The PD control is handled implicitly by the simulation.
"""

class_type: type = actuator_pd.ImplicitActuator
class_type: type["ImplicitActuator"] | str = "{DIR}.actuator_pd:ImplicitActuator"


"""
Expand All @@ -35,14 +38,14 @@ class ImplicitActuatorCfg(ActuatorBaseCfg):
class IdealPDActuatorCfg(ActuatorBaseCfg):
"""Configuration for an ideal PD actuator."""

class_type: type = actuator_pd.IdealPDActuator
class_type: type["IdealPDActuator"] | str = "{DIR}.actuator_pd:IdealPDActuator"


@configclass
class DCMotorCfg(IdealPDActuatorCfg):
"""Configuration for direct control (DC) motor actuator model."""

class_type: type = actuator_pd.DCMotor
class_type: type["DCMotor"] | str = "{DIR}.actuator_pd:DCMotor"

saturation_effort: float = MISSING
"""Peak motor force/torque of the electric DC motor (in N-m)."""
Expand All @@ -52,7 +55,7 @@ class DCMotorCfg(IdealPDActuatorCfg):
class DelayedPDActuatorCfg(IdealPDActuatorCfg):
"""Configuration for a delayed PD actuator."""

class_type: type = actuator_pd.DelayedPDActuator
class_type: type["DelayedPDActuator"] | str = "{DIR}.actuator_pd:DelayedPDActuator"

min_delay: int = 0
"""Minimum number of physics time-steps with which the actuator command may be delayed. Defaults to 0."""
Expand All @@ -71,7 +74,7 @@ class RemotizedPDActuatorCfg(DelayedPDActuatorCfg):
the output torques.
"""

class_type: type = actuator_pd.RemotizedPDActuator
class_type: type["RemotizedPDActuator"] | str = "{DIR}.actuator_pd:RemotizedPDActuator"

joint_parameter_lookup: list[list[float]] = MISSING
"""Joint parameter lookup table. Shape is (num_lookup_points, 3).
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,15 @@
from __future__ import annotations

from dataclasses import MISSING
from typing import TYPE_CHECKING

from isaaclab.actuators import ActuatorBaseCfg
from isaaclab.utils import configclass

from ..asset_base_cfg import AssetBaseCfg
from .articulation import Articulation

if TYPE_CHECKING:
from .articulation import Articulation


@configclass
Expand All @@ -38,7 +41,7 @@ class InitialStateCfg(AssetBaseCfg.InitialStateCfg):
# Initialize configurations.
##

class_type: type = Articulation
class_type: type[Articulation] | str = "{DIR}.articulation:Articulation"

articulation_root_prim_path: str | None = None
"""Path to the articulation root prim under the :attr:`prim_path`. Defaults to None, in which case the class
Expand Down
6 changes: 3 additions & 3 deletions source/isaaclab/isaaclab/assets/asset_base.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
import warp as wp

import isaaclab.sim as sim_utils
from isaaclab.physics import PhysicsEvent, PhysicsManager
from isaaclab.physics import PhysicsEvent
from isaaclab.sim.simulation_context import SimulationContext
from isaaclab.sim.utils.stage import get_current_stage

Expand Down Expand Up @@ -381,8 +381,8 @@ def _initialize_callback(self, event):
:attr:`PhysicsEvent.PHYSICS_READY` is dispatched by the current backend.
"""
if not self._is_initialized:
self._backend = PhysicsManager.get_backend()
self._device = PhysicsManager.get_device()
self._backend = SimulationContext.instance().physics_manager.get_backend()
self._device = SimulationContext.instance().physics_manager.get_device()
try:
self._initialize_impl()
except Exception as e:
Expand Down
4 changes: 1 addition & 3 deletions source/isaaclab/isaaclab/assets/asset_base_cfg.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,6 @@
from isaaclab.sim import SpawnerCfg
from isaaclab.utils import configclass

from .asset_base import AssetBase


@configclass
class AssetBaseCfg:
Expand Down Expand Up @@ -41,7 +39,7 @@ class InitialStateCfg:
Defaults to (0.0, 0.0, 0.0, 1.0).
"""

class_type: type[AssetBase] = None
class_type: type | str | None = None
"""The associated asset class. Defaults to None, which means that the asset will be spawned
but cannot be interacted with via the asset class.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,14 @@
#
# SPDX-License-Identifier: BSD-3-Clause

from typing import TYPE_CHECKING

from isaaclab.utils import configclass

from ..asset_base_cfg import AssetBaseCfg
from .rigid_object import RigidObject

if TYPE_CHECKING:
from .rigid_object import RigidObject


@configclass
Expand All @@ -26,7 +30,7 @@ class InitialStateCfg(AssetBaseCfg.InitialStateCfg):
# Initialize configurations.
##

class_type: type = RigidObject
class_type: type["RigidObject"] | str = "{DIR}.rigid_object:RigidObject"

init_state: InitialStateCfg = InitialStateCfg()
"""Initial state of the rigid object. Defaults to identity pose with zero velocity."""
Original file line number Diff line number Diff line change
Expand Up @@ -4,18 +4,20 @@
# SPDX-License-Identifier: BSD-3-Clause

from dataclasses import MISSING
from typing import TYPE_CHECKING

from isaaclab.assets.rigid_object import RigidObjectCfg
from isaaclab.utils import configclass

from .rigid_object_collection import RigidObjectCollection
if TYPE_CHECKING:
from .rigid_object_collection import RigidObjectCollection


@configclass
class RigidObjectCollectionCfg:
"""Configuration parameters for a rigid object collection."""

class_type: type = RigidObjectCollection
class_type: type["RigidObjectCollection"] | str = "{DIR}.rigid_object_collection:RigidObjectCollection"
"""The associated asset class.
The class should inherit from :class:`isaaclab.assets.asset_base.AssetBase`.
Expand Down
7 changes: 4 additions & 3 deletions source/isaaclab/isaaclab/controllers/differential_ik_cfg.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,18 +6,19 @@
from __future__ import annotations

from dataclasses import MISSING
from typing import Literal
from typing import TYPE_CHECKING, Literal

from isaaclab.utils import configclass

from .differential_ik import DifferentialIKController
if TYPE_CHECKING:
from .differential_ik import DifferentialIKController


@configclass
class DifferentialIKControllerCfg:
"""Configuration for differential inverse kinematics controller."""

class_type: type = DifferentialIKController
class_type: type[DifferentialIKController] | str = "{DIR}.differential_ik:DifferentialIKController"
"""The associated controller class."""

command_type: Literal["position", "pose"] = MISSING
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,17 +7,19 @@

from collections.abc import Sequence
from dataclasses import MISSING
from typing import TYPE_CHECKING

from isaaclab.utils import configclass

from .operational_space import OperationalSpaceController
if TYPE_CHECKING:
from .operational_space import OperationalSpaceController


@configclass
class OperationalSpaceControllerCfg:
"""Configuration for operational-space controller."""

class_type: type = OperationalSpaceController
class_type: type[OperationalSpaceController] | str = "{DIR}.operational_space:OperationalSpaceController"
"""The associated controller class."""

target_types: Sequence[str] = MISSING
Expand Down
7 changes: 5 additions & 2 deletions source/isaaclab/isaaclab/devices/gamepad/se2_gamepad_cfg.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,12 @@
from __future__ import annotations

from dataclasses import dataclass
from typing import TYPE_CHECKING

from ..device_base import DeviceCfg
from .se2_gamepad import Se2Gamepad

if TYPE_CHECKING:
from .se2_gamepad import Se2Gamepad


@dataclass
Expand All @@ -21,4 +24,4 @@ class Se2GamepadCfg(DeviceCfg):
v_y_sensitivity: float = 1.0
omega_z_sensitivity: float = 1.0
dead_zone: float = 0.01
class_type: type | str = Se2Gamepad
class_type: type[Se2Gamepad] | str = "{DIR}.se2_gamepad:Se2Gamepad"
7 changes: 5 additions & 2 deletions source/isaaclab/isaaclab/devices/gamepad/se3_gamepad_cfg.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,12 @@
from __future__ import annotations

from dataclasses import dataclass
from typing import TYPE_CHECKING

from ..device_base import DeviceCfg
from .se3_gamepad import Se3Gamepad

if TYPE_CHECKING:
from .se3_gamepad import Se3Gamepad


@dataclass
Expand All @@ -21,4 +24,4 @@ class Se3GamepadCfg(DeviceCfg):
dead_zone: float = 0.01
pos_sensitivity: float = 1.0
rot_sensitivity: float = 1.6
class_type: type | str = Se3Gamepad
class_type: type[Se3Gamepad] | str = "{DIR}.se3_gamepad:Se3Gamepad"
7 changes: 5 additions & 2 deletions source/isaaclab/isaaclab/devices/keyboard/se2_keyboard_cfg.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,12 @@
from __future__ import annotations

from dataclasses import dataclass
from typing import TYPE_CHECKING

from ..device_base import DeviceCfg
from .se2_keyboard import Se2Keyboard

if TYPE_CHECKING:
from .se2_keyboard import Se2Keyboard


@dataclass
Expand All @@ -20,4 +23,4 @@ class Se2KeyboardCfg(DeviceCfg):
v_x_sensitivity: float = 0.8
v_y_sensitivity: float = 0.4
omega_z_sensitivity: float = 1.0
class_type: type | str = Se2Keyboard
class_type: type[Se2Keyboard] | str = "{DIR}.se2_keyboard:Se2Keyboard"
7 changes: 5 additions & 2 deletions source/isaaclab/isaaclab/devices/keyboard/se3_keyboard_cfg.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,12 @@
from __future__ import annotations

from dataclasses import dataclass
from typing import TYPE_CHECKING

from ..device_base import DeviceCfg
from .se3_keyboard import Se3Keyboard

if TYPE_CHECKING:
from .se3_keyboard import Se3Keyboard


@dataclass
Expand All @@ -21,4 +24,4 @@ class Se3KeyboardCfg(DeviceCfg):
pos_sensitivity: float = 0.4
rot_sensitivity: float = 0.8
retargeters: None = None
class_type: type | str = Se3Keyboard
class_type: type[Se3Keyboard] | str = "{DIR}.se3_keyboard:Se3Keyboard"
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,10 @@
from isaaclab.utils.array import convert_to_torch

from ..device_base import DeviceBase
from .utils import convert_buffer

if TYPE_CHECKING:
from .se2_spacemouse_cfg import Se2SpaceMouseCfg
from .utils import convert_buffer


class Se2SpaceMouse(DeviceBase):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,12 @@
from __future__ import annotations

from dataclasses import dataclass
from typing import TYPE_CHECKING

from ..device_base import DeviceCfg
from .se2_spacemouse import Se2SpaceMouse

if TYPE_CHECKING:
from .se2_spacemouse import Se2SpaceMouse


@dataclass
Expand All @@ -20,4 +23,4 @@ class Se2SpaceMouseCfg(DeviceCfg):
v_x_sensitivity: float = 0.8
v_y_sensitivity: float = 0.4
omega_z_sensitivity: float = 1.0
class_type: type | str = Se2SpaceMouse
class_type: type[Se2SpaceMouse] | str = "{DIR}.se2_spacemouse:Se2SpaceMouse"
Loading
Loading