Skip to content

Commit d3f5754

Browse files
authored
Merge branch 'main' into dev/stevfeng/unify_assets
2 parents 084e25e + 7e2aba2 commit d3f5754

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+709
-609
lines changed

CONTRIBUTORS.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ Guidelines for modifications:
2121

2222
* Antonio Serrano-Muñoz
2323
* Ben Johnston
24+
* Brian McCann
2425
* Clemens Schwarke
2526
* David Hoeller
2627
* Farbod Farshidian

docs/source/features/reproducibility.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ or soft bodies. For more information, please refer to the `PhysX Determinism doc
1010
Based on above, Isaac Lab provides a deterministic simulation that ensures consistent simulation
1111
results across different runs. This is achieved by using the same random seed for the
1212
simulation environment and the physics engine. At construction of the environment, the random seed
13-
is set to a fixed value using the :meth:`~isaacsim.core.utils.torch.set_seed` method. This method sets the
13+
is set to a fixed value using the :meth:`~isaaclab.utils.seed.configure_seed` method. This method sets the
1414
random seed for both the CPU and GPU globally across different libraries, including PyTorch and
1515
NumPy.
1616

docs/source/how-to/cloudxr_teleoperation.rst

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -935,18 +935,15 @@ The retargeting system is designed to be extensible. You can create custom retar
935935
# Return control commands in appropriate format
936936
return torch.tensor([0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0]) # Example output
937937
938-
3. Register your retargeter with the factory by adding it to the ``RETARGETER_MAP``:
938+
3. Register your retargeter by setting ``retargeter_type`` on the config class:
939939

940940
.. code-block:: python
941941
942942
# Import your retargeter at the top of your module
943943
from my_package.retargeters import MyCustomRetargeter, MyCustomRetargeterCfg
944944
945-
# Add your retargeter to the factory
946-
from isaaclab.devices.teleop_device_factory import RETARGETER_MAP
947-
948-
# Register your retargeter type with its constructor
949-
RETARGETER_MAP[MyCustomRetargeterCfg] = MyCustomRetargeter
945+
# Link the config to the implementation for factory construction
946+
MyCustomRetargeterCfg.retargeter_type = MyCustomRetargeter
950947
951948
4. Now you can use your custom retargeter in teleop device configurations:
952949

source/isaaclab/config/extension.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
[package]
22

33
# Note: Semantic Versioning is used: https://semver.org/
4-
version = "0.48.0"
4+
version = "0.48.4"
55

66
# Description
77
title = "Isaac Lab framework for Robot Learning"

source/isaaclab/docs/CHANGELOG.rst

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,34 @@
11
Changelog
22
---------
33

4+
0.48.4 (2025-11-14)
5+
~~~~~~~~~~~~~~~~~~~
6+
7+
Changed
8+
^^^^^^^
9+
10+
* Refactored modules related to the actuator configs in order to remediate a circular import necessary to support future
11+
actuator drive model improvements.
12+
13+
14+
0.48.3 (2025-11-13)
15+
~~~~~~~~~~~~~~~~~~~
16+
17+
Changed
18+
^^^^^^^
19+
20+
* Moved retargeter and device declaration out of factory and into the devices/retargeters themselves.
21+
22+
23+
0.48.2 (2025-11-13)
24+
~~~~~~~~~~~~~~~~~~~
25+
26+
Changed
27+
^^^^^^^
28+
29+
* Changed from using :meth:`isaacsim.core.utils.torch.set_seed` to :meth:`~isaaclab.utils.seed.configure_seed`
30+
31+
432
0.48.1 (2025-11-10)
533
~~~~~~~~~~~~~~~~~~~
634

@@ -12,7 +40,6 @@ Added
1240
* Added demo script ``scripts/demos/haply_teleoperation.py`` and documentation guide in
1341
``docs/source/how-to/haply_teleoperation.rst`` for Haply-based robot teleoperation.
1442

15-
1643
0.48.0 (2025-11-03)
1744
~~~~~~~~~~~~~~~~~~~
1845

source/isaaclab/isaaclab/actuators/__init__.py

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,15 +23,14 @@
2323
"""
2424

2525
from .actuator_base import ActuatorBase
26-
from .actuator_cfg import (
27-
ActuatorBaseCfg,
28-
ActuatorNetLSTMCfg,
29-
ActuatorNetMLPCfg,
26+
from .actuator_base_cfg import ActuatorBaseCfg
27+
from .actuator_net import ActuatorNetLSTM, ActuatorNetMLP
28+
from .actuator_net_cfg import ActuatorNetLSTMCfg, ActuatorNetMLPCfg
29+
from .actuator_pd import DCMotor, DelayedPDActuator, IdealPDActuator, ImplicitActuator, RemotizedPDActuator
30+
from .actuator_pd_cfg import (
3031
DCMotorCfg,
3132
DelayedPDActuatorCfg,
3233
IdealPDActuatorCfg,
3334
ImplicitActuatorCfg,
3435
RemotizedPDActuatorCfg,
3536
)
36-
from .actuator_net import ActuatorNetLSTM, ActuatorNetMLP
37-
from .actuator_pd import DCMotor, DelayedPDActuator, IdealPDActuator, ImplicitActuator, RemotizedPDActuator

source/isaaclab/isaaclab/actuators/actuator_base.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
from isaaclab.utils.types import ArticulationActions
1515

1616
if TYPE_CHECKING:
17-
from .actuator_cfg import ActuatorBaseCfg
17+
from .actuator_base_cfg import ActuatorBaseCfg
1818

1919

2020
class ActuatorBase(ABC):
Lines changed: 165 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,165 @@
1+
# Copyright (c) 2022-2025, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md).
2+
# All rights reserved.
3+
#
4+
# SPDX-License-Identifier: BSD-3-Clause
5+
6+
from dataclasses import MISSING
7+
8+
from isaaclab.utils import configclass
9+
10+
11+
@configclass
12+
class ActuatorBaseCfg:
13+
"""Configuration for default actuators in an articulation."""
14+
15+
class_type: type = MISSING
16+
"""The associated actuator class.
17+
18+
The class should inherit from :class:`isaaclab.actuators.ActuatorBase`.
19+
"""
20+
21+
joint_names_expr: list[str] = MISSING
22+
"""Articulation's joint names that are part of the group.
23+
24+
Note:
25+
This can be a list of joint names or a list of regex expressions (e.g. ".*").
26+
"""
27+
28+
effort_limit: dict[str, float] | float | None = None
29+
"""Force/Torque limit of the joints in the group. Defaults to None.
30+
31+
This limit is used to clip the computed torque sent to the simulation. If None, the
32+
limit is set to the value specified in the USD joint prim.
33+
34+
.. attention::
35+
36+
The :attr:`effort_limit_sim` attribute should be used to set the effort limit for
37+
the simulation physics solver.
38+
39+
The :attr:`effort_limit` attribute is used for clipping the effort output of the
40+
actuator model **only** in the case of explicit actuators, such as the
41+
:class:`~isaaclab.actuators.IdealPDActuator`.
42+
43+
.. note::
44+
45+
For implicit actuators, the attributes :attr:`effort_limit` and :attr:`effort_limit_sim`
46+
are equivalent. However, we suggest using the :attr:`effort_limit_sim` attribute because
47+
it is more intuitive.
48+
49+
"""
50+
51+
velocity_limit: dict[str, float] | float | None = None
52+
"""Velocity limit of the joints in the group. Defaults to None.
53+
54+
This limit is used by the actuator model. If None, the limit is set to the value specified
55+
in the USD joint prim.
56+
57+
.. attention::
58+
59+
The :attr:`velocity_limit_sim` attribute should be used to set the velocity limit for
60+
the simulation physics solver.
61+
62+
The :attr:`velocity_limit` attribute is used for clipping the effort output of the
63+
actuator model **only** in the case of explicit actuators, such as the
64+
:class:`~isaaclab.actuators.IdealPDActuator`.
65+
66+
.. note::
67+
68+
For implicit actuators, the attribute :attr:`velocity_limit` is not used. This is to stay
69+
backwards compatible with previous versions of the Isaac Lab, where this parameter was
70+
unused since PhysX did not support setting the velocity limit for the joints using the
71+
PhysX Tensor API.
72+
"""
73+
74+
effort_limit_sim: dict[str, float] | float | None = None
75+
"""Effort limit of the joints in the group applied to the simulation physics solver. Defaults to None.
76+
77+
The effort limit is used to constrain the computed joint efforts in the physics engine. If the
78+
computed effort exceeds this limit, the physics engine will clip the effort to this value.
79+
80+
Since explicit actuators (e.g. DC motor), compute and clip the effort in the actuator model, this
81+
limit is by default set to a large value to prevent the physics engine from any additional clipping.
82+
However, at times, it may be necessary to set this limit to a smaller value as a safety measure.
83+
84+
If None, the limit is resolved based on the type of actuator model:
85+
86+
* For implicit actuators, the limit is set to the value specified in the USD joint prim.
87+
* For explicit actuators, the limit is set to 1.0e9.
88+
89+
"""
90+
91+
velocity_limit_sim: dict[str, float] | float | None = None
92+
"""Velocity limit of the joints in the group applied to the simulation physics solver. Defaults to None.
93+
94+
The velocity limit is used to constrain the joint velocities in the physics engine. The joint will only
95+
be able to reach this velocity if the joint's effort limit is sufficiently large. If the joint is moving
96+
faster than this velocity, the physics engine will actually try to brake the joint to reach this velocity.
97+
98+
If None, the limit is set to the value specified in the USD joint prim for both implicit and explicit actuators.
99+
100+
.. tip::
101+
If the velocity limit is too tight, the physics engine may have trouble converging to a solution.
102+
In such cases, we recommend either keeping this value sufficiently large or tuning the stiffness and
103+
damping parameters of the joint to ensure the limits are not violated.
104+
105+
"""
106+
107+
stiffness: dict[str, float] | float | None = MISSING
108+
"""Stiffness gains (also known as p-gain) of the joints in the group.
109+
110+
The behavior of the stiffness is different for implicit and explicit actuators. For implicit actuators,
111+
the stiffness gets set into the physics engine directly. For explicit actuators, the stiffness is used
112+
by the actuator model to compute the joint efforts.
113+
114+
If None, the stiffness is set to the value from the USD joint prim.
115+
"""
116+
117+
damping: dict[str, float] | float | None = MISSING
118+
"""Damping gains (also known as d-gain) of the joints in the group.
119+
120+
The behavior of the damping is different for implicit and explicit actuators. For implicit actuators,
121+
the damping gets set into the physics engine directly. For explicit actuators, the damping gain is used
122+
by the actuator model to compute the joint efforts.
123+
124+
If None, the damping is set to the value from the USD joint prim.
125+
"""
126+
127+
armature: dict[str, float] | float | None = None
128+
"""Armature of the joints in the group. Defaults to None.
129+
130+
The armature is directly added to the corresponding joint-space inertia. It helps improve the
131+
simulation stability by reducing the joint velocities.
132+
133+
It is a physics engine solver parameter that gets set into the simulation.
134+
135+
If None, the armature is set to the value from the USD joint prim.
136+
"""
137+
138+
friction: dict[str, float] | float | None = None
139+
r"""The static friction coefficient of the joints in the group. Defaults to None.
140+
141+
The joint static friction is a unitless quantity. It relates the magnitude of the spatial force transmitted
142+
from the parent body to the child body to the maximal static friction force that may be applied by the solver
143+
to resist the joint motion.
144+
145+
Mathematically, this means that: :math:`F_{resist} \leq \mu F_{spatial}`, where :math:`F_{resist}`
146+
is the resisting force applied by the solver and :math:`F_{spatial}` is the spatial force
147+
transmitted from the parent body to the child body. The simulated static friction effect is therefore
148+
similar to static and Coulomb static friction.
149+
150+
If None, the joint static friction is set to the value from the USD joint prim.
151+
152+
Note: In Isaac Sim 4.5, this parameter is modeled as a coefficient. In Isaac Sim 5.0 and later,
153+
it is modeled as an effort (torque or force).
154+
"""
155+
156+
dynamic_friction: dict[str, float] | float | None = None
157+
"""The dynamic friction coefficient of the joints in the group. Defaults to None.
158+
159+
Note: In Isaac Sim 4.5, this parameter is modeled as a coefficient. In Isaac Sim 5.0 and later,
160+
it is modeled as an effort (torque or force).
161+
"""
162+
163+
viscous_friction: dict[str, float] | float | None = None
164+
"""The viscous friction coefficient of the joints in the group. Defaults to None.
165+
"""

0 commit comments

Comments
 (0)