Skip to content

Commit

Permalink
Merge branch 'main' into patch-1
Browse files Browse the repository at this point in the history
  • Loading branch information
Mayankm96 authored Feb 20, 2025
2 parents 785e912 + 49faf52 commit abcbaa1
Show file tree
Hide file tree
Showing 16 changed files with 359 additions and 132 deletions.
22 changes: 22 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,19 @@ We wholeheartedly welcome contributions from the community to make this framewor
These may happen as bug reports, feature requests, or code contributions. For details, please check our
[contribution guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html).

## Show & Tell: Share Your Inspiration

We encourage you to utilize our [Show & Tell](https://github.com/isaac-sim/IsaacLab/discussions/categories/show-and-tell) area in the
`Discussions` section of this repository. This space is designed for you to:

* Share the tutorials you've created
* Showcase your learning content
* Present exciting projects you've developed

By sharing your work, you'll inspire others and contribute to the collective knowledge
of our community. Your contributions can spark new ideas and collaborations, fostering
innovation in robotics and simulation.

## Troubleshooting

Please see the [troubleshooting](https://isaac-sim.github.io/IsaacLab/main/source/refs/troubleshooting.html) section for
Expand All @@ -56,6 +69,15 @@ or opening a question on its [forums](https://forums.developer.nvidia.com/c/agx-
* Please use GitHub [Discussions](https://github.com/isaac-sim/IsaacLab/discussions) for discussing ideas, asking questions, and requests for new features.
* Github [Issues](https://github.com/isaac-sim/IsaacLab/issues) should only be used to track executable pieces of work with a definite scope and a clear deliverable. These can be fixing bugs, documentation issues, new features, or general updates.

## Connect with the NVIDIA Omniverse Community

Have a project or resource you'd like to share more widely? We'd love to hear from you! Reach out to the
NVIDIA Omniverse Community team at [email protected] to discuss potential opportunities
for broader dissemination of your work.

Join us in building a vibrant, collaborative ecosystem where creativity and technology intersect. Your
contributions can make a significant impact on the Isaac Lab community and beyond!

## License

The Isaac Lab framework is released under [BSD-3 License](LICENSE). The `isaaclab_mimic` extension and its corresponding standalone scripts are released under [Apache 2.0](LICENSE-mimic). The license files of its dependencies and assets are present in the [`docs/licenses`](docs/licenses) directory.
Expand Down
38 changes: 38 additions & 0 deletions SECURITY.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
# Security

NVIDIA is dedicated to the security and trust of our software products and services, including all source code
repositories managed through our organization.

If you need to report a security issue, please use the appropriate contact points outlined below. **Please do
not report security vulnerabilities through GitHub.**

## Reporting Potential Security Vulnerability in an NVIDIA Product

To report a potential security vulnerability in any NVIDIA product:

- Web: [Security Vulnerability Submission Form](https://www.nvidia.com/object/submit-security-vulnerability.html)

- E-Mail: [email protected]

- We encourage you to use the following PGP key for secure email communication: [NVIDIA public PGP Key for communication](https://www.nvidia.com/en-us/security/pgp-key)

- Please include the following information:

- Product/Driver name and version/branch that contains the vulnerability

- Type of vulnerability (code execution, denial of service, buffer overflow, etc.)

- Instructions to reproduce the vulnerability

- Proof-of-concept or exploit code

- Potential impact of the vulnerability, including how an attacker could exploit the vulnerability

While NVIDIA currently does not have a bug bounty program, we do offer acknowledgement when an
externally reported security issue is addressed under our coordinated vulnerability disclosure policy. Please
visit our [Product Security Incident Response Team (PSIRT)](https://www.nvidia.com/en-us/security/psirt-policies/)
policies page for more information.

## NVIDIA Product Security

For all security-related concerns, please visit NVIDIA's Product Security portal at: https://www.nvidia.com/en-us/security
273 changes: 166 additions & 107 deletions docs/source/refs/release_notes.rst

Large diffs are not rendered by default.

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 = "0.33.16"
version = "0.34.1"

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

0.34.1 (2025-02-17)
~~~~~~~~~~~~~~~~~~~

Fixed
^^^^^

* Ensured that the loaded torch JIT models inside actuator networks are correctly set to eval mode
to prevent any unexpected behavior during inference.


0.34.0 (2025-02-14)
~~~~~~~~~~~~~~~~~~~

Fixed
^^^^^

* Adds attributes velocity_limits_sim and effort_limits_sim to :class:`isaaclab.actuators.AssetBaseCfg` to separate
solver limits from actuator limits.


0.33.17 (2025-02-13)
~~~~~~~~~~~~~~~~~~~~

Fixed
^^^^^

* Fixed Imu sensor based observations at first step by updating scene during initialization for
:class:`~isaaclab.envs.ManagerBasedEnv`, :class:`~isaaclab.envs.DirectRLEnv`, and :class:`~isaaclab.envs.DirectMARLEnv`


0.33.16 (2025-02-09)
~~~~~~~~~~~~~~~~~~~~

Expand All @@ -27,6 +57,7 @@ Fixed

* Fixed not updating the timestamp of ``body_link_state_w`` and ``body_com_state_w`` when ``write_root_pose_to_sim`` and ``write_joint_state_to_sim`` in the ``Articulation`` class are called.


0.33.13 (2025-01-30)
~~~~~~~~~~~~~~~~~~~~

Expand Down
2 changes: 2 additions & 0 deletions source/isaaclab/isaaclab/actuators/actuator_base.py
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,8 @@ def __init__(
# note: for velocity limits, we don't have USD parameter, so default is infinity
self.effort_limit = self._parse_joint_parameter(self.cfg.effort_limit, effort_limit)
self.velocity_limit = self._parse_joint_parameter(self.cfg.velocity_limit, velocity_limit)
self.effort_limit_sim = self._parse_joint_parameter(self.cfg.effort_limit_sim, effort_limit)
self.velocity_limit_sim = self._parse_joint_parameter(self.cfg.velocity_limit_sim, velocity_limit)

# create commands buffers for allocation
self.computed_effort = torch.zeros(self._num_envs, self.num_joints, device=self._device)
Expand Down
36 changes: 34 additions & 2 deletions source/isaaclab/isaaclab/actuators/actuator_cfg.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,13 +33,45 @@ class ActuatorBaseCfg:
effort_limit: dict[str, float] | float | None = None
"""Force/Torque limit of the joints in the group. Defaults to None.
If None, the limit is set to the value specified in the USD joint prim.
This limit is used to clip the computed torque sent to the simulation. If None, the limit is set to the value
specified in the USD joint prim.
.. note::
For ImplicitActuators this value will be collapsed with effort_limit_sim due to duplicating functionality. If
both are set the effort_limit_sim will be used priority.
"""

velocity_limit: dict[str, float] | float | None = None
"""Velocity limit of the joints in the group. Defaults to None.
If None, the limit is set to the value specified in the USD joint prim.
This limit is used by the actuator model. If None, the limit is set to the value specified in the USD joint prim.
.. note::
velocity_limit is not used in ActuatorBaseCfg but is provided for inherited version like
:class:`isaaclab.actuators.DCMotor`.
.. note::
For ImplicitActuators this value will be collapsed with velocity_limit_sim due to duplicating functionality. If
both are set the effort_limit_sim will be used priority.
"""

effort_limit_sim: dict[str, float] | float | None = None
"""Force/Torque limit of the joints in the group that will be propagated to the simulation physics solver. Defaults to None.
If None, the limit is set to the value specified in the USD joint prim for ImplicitActuators or 1.0e9 for explicit
actuators (e.g. IdealPDActuator). The simulation effort limits prevent computed torques from exceeding the specified
limit. If effort limits are too tight issues with solver convergence may occur. It is suggested to keep these value large.
"""

velocity_limit_sim: dict[str, float] | float | None = None
"""Velocity limit of the joints in the group that will be propagated to the simulation physics solver. Defaults to None.
If None, the limit is set to the value specified in the USD joint prim. Resulting solver solutions will constrain
velocities by these limits. If velocity_limit_sim is too tight issues with solver convergence may occur. It is
suggested to keep these value large.
"""

stiffness: dict[str, float] | float | None = MISSING
Expand Down
7 changes: 4 additions & 3 deletions source/isaaclab/isaaclab/actuators/actuator_net.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ def __init__(self, cfg: ActuatorNetLSTMCfg, *args, **kwargs):

# load the model from JIT file
file_bytes = read_file(self.cfg.network_file)
self.network = torch.jit.load(file_bytes, map_location=self._device)
self.network = torch.jit.load(file_bytes, map_location=self._device).eval()

# extract number of lstm layers and hidden dim from the shape of weights
num_layers = len(self.network.lstm.state_dict()) // 4
Expand Down Expand Up @@ -126,7 +126,7 @@ def __init__(self, cfg: ActuatorNetMLPCfg, *args, **kwargs):

# load the model from JIT file
file_bytes = read_file(self.cfg.network_file)
self.network = torch.jit.load(file_bytes, map_location=self._device)
self.network = torch.jit.load(file_bytes, map_location=self._device).eval()

# create buffers for MLP history
history_length = max(self.cfg.input_idx) + 1
Expand Down Expand Up @@ -175,7 +175,8 @@ def compute(
)

# run network inference
torques = self.network(network_input).view(self._num_envs, self.num_joints)
with torch.inference_mode():
torques = self.network(network_input).view(self._num_envs, self.num_joints)
self.computed_effort = torques.view(self._num_envs, self.num_joints) * self.cfg.torque_scale

# clip the computed effort based on the motor limits
Expand Down
36 changes: 32 additions & 4 deletions source/isaaclab/isaaclab/assets/articulation/articulation.py
Original file line number Diff line number Diff line change
Expand Up @@ -1339,20 +1339,48 @@ def _process_actuators_cfg(self):
# set the passed gains and limits into the simulation
if isinstance(actuator, ImplicitActuator):
self._has_implicit_actuators = True
# resolve actuator limit duplication for ImplicitActuators
# effort limits
if actuator.effort_limit_sim is None and actuator.effort_limit is not None:
omni.log.warn(
f"ImplicitActuatorCfg {actuator_name} has effort_limit_sim=None but is specifying effort_limit."
"effort_limit will be applied to effort_limit_sim for ImplicitActuators."
)
actuator.effort_limit_sim = actuator.effort_limit
elif actuator.effort_limit_sim is not None and actuator.effort_limit is not None:
omni.log.warn(
f"ImplicitActuatorCfg {actuator_name} has set both effort_limit_sim and effort_limit."
"Only effort_limit_sim will be used for ImplicitActuators."
)
# velocity limits
if actuator.velocity_limit_sim is None and actuator.velocity_limit is not None:
omni.log.warn(
f"ImplicitActuatorCfg {actuator_name} has velocity_limit_sim=None but is specifying"
" velocity_limit.velocity_limit will be applied to velocity_limit_sim for ImplicitActuators."
)
actuator.velocity_limit_sim = actuator.velocity_limit
elif actuator.velocity_limit_sim is not None and actuator.velocity_limit is not None:
omni.log.warn(
f"ImplicitActuatorCfg {actuator_name} has set both velocity_limit_sim and velocity_limit."
"Only velocity_limit_sim will be used for ImplicitActuators."
)
# the gains and limits are set into the simulation since actuator model is implicit
self.write_joint_stiffness_to_sim(actuator.stiffness, joint_ids=actuator.joint_indices)
self.write_joint_damping_to_sim(actuator.damping, joint_ids=actuator.joint_indices)
self.write_joint_effort_limit_to_sim(actuator.effort_limit, joint_ids=actuator.joint_indices)
self.write_joint_velocity_limit_to_sim(actuator.velocity_limit, joint_ids=actuator.joint_indices)
self.write_joint_effort_limit_to_sim(actuator.effort_limit_sim, joint_ids=actuator.joint_indices)
self.write_joint_velocity_limit_to_sim(actuator.velocity_limit_sim, joint_ids=actuator.joint_indices)
self.write_joint_armature_to_sim(actuator.armature, joint_ids=actuator.joint_indices)
self.write_joint_friction_to_sim(actuator.friction, joint_ids=actuator.joint_indices)
else:
# the gains and limits are processed by the actuator model
# we set gains to zero, and torque limit to a high value in simulation to avoid any interference
self.write_joint_stiffness_to_sim(0.0, joint_ids=actuator.joint_indices)
self.write_joint_damping_to_sim(0.0, joint_ids=actuator.joint_indices)
self.write_joint_effort_limit_to_sim(1.0e9, joint_ids=actuator.joint_indices)
self.write_joint_velocity_limit_to_sim(actuator.velocity_limit, joint_ids=actuator.joint_indices)
self.write_joint_effort_limit_to_sim(
1.0e9 if actuator.effort_limit_sim is None else actuator.effort_limit_sim,
joint_ids=actuator.joint_indices,
)
self.write_joint_velocity_limit_to_sim(actuator.velocity_limit_sim, joint_ids=actuator.joint_indices)
self.write_joint_armature_to_sim(actuator.armature, joint_ids=actuator.joint_indices)
self.write_joint_friction_to_sim(actuator.friction, joint_ids=actuator.joint_indices)
# Store the actual default stiffness and damping values for explicit and implicit actuators (not written the sim)
Expand Down
4 changes: 4 additions & 0 deletions source/isaaclab/isaaclab/envs/direct_marl_env.py
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,10 @@ def __init__(self, cfg: DirectMARLEnvCfg, render_mode: str | None = None, **kwar
print("[INFO]: Starting the simulation. This may take a few seconds. Please wait...")
with Timer("[INFO]: Time taken for simulation start", "simulation_start"):
self.sim.reset()
# update scene to pre populate data buffers for assets and sensors.
# this is needed for the observation manager to get valid tensors for initialization.
# this shouldn't cause an issue since later on, users do a reset over all the environments so the lazy buffers would be reset.
self.scene.update(dt=self.physics_dt)

# -- event manager used for randomization
if self.cfg.events:
Expand Down
4 changes: 4 additions & 0 deletions source/isaaclab/isaaclab/envs/direct_rl_env.py
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,10 @@ def __init__(self, cfg: DirectRLEnvCfg, render_mode: str | None = None, **kwargs
print("[INFO]: Starting the simulation. This may take a few seconds. Please wait...")
with Timer("[INFO]: Time taken for simulation start", "simulation_start"):
self.sim.reset()
# update scene to pre populate data buffers for assets and sensors.
# this is needed for the observation manager to get valid tensors for initialization.
# this shouldn't cause an issue since later on, users do a reset over all the environments so the lazy buffers would be reset.
self.scene.update(dt=self.physics_dt)

# -- event manager used for randomization
if self.cfg.events:
Expand Down
4 changes: 4 additions & 0 deletions source/isaaclab/isaaclab/envs/manager_based_env.py
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,10 @@ def __init__(self, cfg: ManagerBasedEnvCfg):
print("[INFO]: Starting the simulation. This may take a few seconds. Please wait...")
with Timer("[INFO]: Time taken for simulation start", "simulation_start"):
self.sim.reset()
# update scene to pre populate data buffers for assets and sensors.
# this is needed for the observation manager to get valid tensors for initialization.
# this shouldn't cause an issue since later on, users do a reset over all the environments so the lazy buffers would be reset.
self.scene.update(dt=self.physics_dt)
# add timeline event to load managers
self.load_managers()

Expand Down
14 changes: 7 additions & 7 deletions source/isaaclab/test/assets/test_articulation.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,8 @@ def generate_articulation_cfg(
articulation_type: Literal["humanoid", "panda", "anymal", "shadow_hand", "single_joint"],
stiffness: float | None = 10.0,
damping: float | None = 2.0,
vel_limit: float | None = 100.0,
effort_limit: float | None = 400.0,
vel_limit_sim: float | None = None,
effort_limit_sim: float | None = None,
) -> ArticulationCfg:
"""Generate an articulation configuration.
Expand Down Expand Up @@ -75,8 +75,8 @@ def generate_articulation_cfg(
actuators={
"joint": ImplicitActuatorCfg(
joint_names_expr=[".*"],
effort_limit=effort_limit,
velocity_limit=vel_limit,
effort_limit_sim=effort_limit_sim,
velocity_limit_sim=vel_limit_sim,
stiffness=0.0,
damping=10.0,
),
Expand Down Expand Up @@ -900,7 +900,7 @@ def test_setting_gains_from_cfg_dict(self):
torch.testing.assert_close(articulation.actuators["body"].stiffness, expected_stiffness)
torch.testing.assert_close(articulation.actuators["body"].damping, expected_damping)

def test_setting_velocity_limits(self):
def test_setting_velocity_sim_limits(self):
"""Test that velocity limits are loaded form the configuration correctly."""
for num_articulations in (1, 2):
for device in ("cuda:0", "cpu"):
Expand All @@ -911,7 +911,7 @@ def test_setting_velocity_limits(self):
) as sim:
sim._app_control_on_stop_handle = None
articulation_cfg = generate_articulation_cfg(
articulation_type="single_joint", vel_limit=limit, effort_limit=limit
articulation_type="single_joint", vel_limit_sim=limit, effort_limit_sim=limit
)
articulation, _ = generate_articulation(
articulation_cfg=articulation_cfg, num_articulations=num_articulations, device=device
Expand All @@ -928,7 +928,7 @@ def test_setting_velocity_limits(self):
)
# Check that gains are loaded from USD file
torch.testing.assert_close(
articulation.actuators["joint"].velocity_limit, expected_velocity_limit
articulation.actuators["joint"].velocity_limit_sim, expected_velocity_limit
)
torch.testing.assert_close(
articulation.data.joint_velocity_limits, expected_velocity_limit
Expand Down
2 changes: 1 addition & 1 deletion source/isaaclab_tasks/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 = "0.10.23"
version = "0.10.24"

# Description
title = "Isaac Lab Environments"
Expand Down
9 changes: 9 additions & 0 deletions source/isaaclab_tasks/docs/CHANGELOG.rst
Original file line number Diff line number Diff line change
@@ -1,6 +1,15 @@
Changelog
---------

0.10.24 (2025-02-13)
~~~~~~~~~~~~~~~~~~~~

Changed
^^^^^^^

* Set ``Isaac-Stack-Cube-Franka-IK-Rel-v0`` to use sim parameters from base ``StackEnvCfg``, improving simulation stability.


0.10.23 (2025-02-11)
~~~~~~~~~~~~~~~~~~~~

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,10 +34,3 @@ def __post_init__(self):
scale=0.5,
body_offset=DifferentialInverseKinematicsActionCfg.OffsetCfg(pos=[0.0, 0.0, 0.107]),
)

# Set the simulation parameters
self.sim.dt = 1 / 60
self.sim.render_interval = 1

self.decimation = 3
self.episode_length_s = 20.0

0 comments on commit abcbaa1

Please sign in to comment.