Skip to content
Open
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.47.1"
version = "0.47.2"

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

0.47.2 (2025-10-23)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

syntax: date format is MM-DD instead of YYYY-MM-DD - should be 2025-01-23 not 2025-10-23 based on the pattern in the file (version 0.47.1 is dated 2025-10-17, and versions progress chronologically)

~~~~~~~~~~~~~~~~~~~

Added
^^^^^

* Added ``num_rerenders_on_reset`` parameter to ManagerBasedEnvCfg and DirectRLEnvCfg to configure the number
of render steps to perform after reset. This enables more control over DLSS rendering behavior after reset.

Changed
^^^^^^^

* Added deprecation warning for ``rerender_on_reset`` parameter in ManagerBasedEnv and DirectRLEnv.


0.47.1 (2025-10-17)
~~~~~~~~~~~~~~~~~~~

Expand Down
21 changes: 17 additions & 4 deletions source/isaaclab/isaaclab/envs/direct_rl_env.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import math
import numpy as np
import torch
import warnings
import weakref
from abc import abstractmethod
from collections.abc import Sequence
Expand Down Expand Up @@ -219,6 +220,16 @@ def __init__(self, cfg: DirectRLEnvCfg, render_mode: str | None = None, **kwargs
# video matches the simulation
self.metadata["render_fps"] = 1 / self.step_dt

# show deprecation message for rerender_on_reset
if self.cfg.rerender_on_reset:
warnings.warn(
"\033[93m\033[1m[DEPRECATION WARNING] DirectRLEnvCfg.rerender_on_reset is deprecated. Use"
" DirectRLEnvCfg.num_rerenders_on_reset instead.\033[0m",
FutureWarning,
stacklevel=2,
)
self.cfg.num_rerenders_on_reset = 1

# print the environment information
print("[INFO]: Completed setting up the environment...")

Expand Down Expand Up @@ -300,8 +311,9 @@ def reset(self, seed: int | None = None, options: dict[str, Any] | None = None)
self.sim.forward()

# if sensors are added to the scene, make sure we render to reflect changes in reset
if self.sim.has_rtx_sensors() and self.cfg.rerender_on_reset:
self.sim.render()
if self.sim.has_rtx_sensors() and self.cfg.num_rerenders_on_reset > 0:
for _ in range(self.cfg.num_rerenders_on_reset):
self.sim.render()

if self.cfg.wait_for_textures and self.sim.has_rtx_sensors():
while SimulationManager.assets_loading():
Expand Down Expand Up @@ -377,8 +389,9 @@ def step(self, action: torch.Tensor) -> VecEnvStepReturn:
if len(reset_env_ids) > 0:
self._reset_idx(reset_env_ids)
# if sensors are added to the scene, make sure we render to reflect changes in reset
if self.sim.has_rtx_sensors() and self.cfg.rerender_on_reset:
self.sim.render()
if self.sim.has_rtx_sensors() and self.cfg.num_rerenders_on_reset > 0:
for _ in range(self.cfg.num_rerenders_on_reset):
self.sim.render()

# post-step: step interval event
if self.cfg.events:
Expand Down
16 changes: 16 additions & 0 deletions source/isaaclab/isaaclab/envs/direct_rl_env_cfg.py
Original file line number Diff line number Diff line change
Expand Up @@ -222,6 +222,22 @@ class DirectRLEnvCfg:
to reflect the latest states from the reset. This comes at a cost of performance as an additional render
step will be performed after each time an environment is reset.

.. deprecated:: 0.47.2
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

syntax: blank line after deprecated directive prevents proper rendering in documentation - should be removed

This attribute is deprecated and will be removed in the future. Please use
:attr:`num_rerenders_on_reset` instead.

To get the same behaviour as setting this parameter to ``True`` or ``False``, set
:attr:`num_rerenders_on_reset` to 1 or 0, respectively.
"""

num_rerenders_on_reset: int = 0
"""Number of render steps to perform after reset. Defaults to 0, which means no render step will be performed after reset.

* When this is 0, no render step will be performed after reset. Data collected from sensors after performing reset will be stale and will not reflect the
latest states in simulation caused by the reset.
* When this is greater than 0, the specified number of extra render steps will be performed to update the sensor data
to reflect the latest states from the reset. This comes at a cost of performance as additional render
steps will be performed after each time an environment is reset.
"""

wait_for_textures: bool = True
Expand Down
21 changes: 17 additions & 4 deletions source/isaaclab/isaaclab/envs/manager_based_env.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@

import builtins
import torch
import warnings
from collections.abc import Sequence
from typing import Any

Expand Down Expand Up @@ -190,6 +191,16 @@ def __init__(self, cfg: ManagerBasedEnvCfg):
if self.cfg.export_io_descriptors:
self.export_IO_descriptors()

# show deprecation message for rerender_on_reset
if self.cfg.rerender_on_reset:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You can throw the warning and then internally set the variable num_rerenders_on_reset to 1. This then simplifies your check at other places. Also could you use deprecate warning from python instead of omni logger: https://docs.python.org/3/library/warnings.html

warnings.warn(
"\033[93m\033[1m[DEPRECATION WARNING] ManagerBasedEnvCfg.rerender_on_reset is deprecated. Use"
" ManagerBasedEnvCfg.num_rerenders_on_reset instead.\033[0m",
FutureWarning,
stacklevel=2,
)
self.cfg.num_rerenders_on_reset = 1
Comment on lines +195 to +202
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

logic: deprecation warning check executes unconditionally on every init rather than only when the deprecated parameter is actually used (should check truthiness before setting to 1). Should the assignment self.cfg.num_rerenders_on_reset = 1 only occur when the deprecated parameter is explicitly set to True, or should it also trigger for any truthy value?


def __del__(self):
"""Cleanup for the environment."""
self.close()
Expand Down Expand Up @@ -353,8 +364,9 @@ def reset(
self.scene.write_data_to_sim()
self.sim.forward()
# if sensors are added to the scene, make sure we render to reflect changes in reset
if self.sim.has_rtx_sensors() and self.cfg.rerender_on_reset:
self.sim.render()
if self.sim.has_rtx_sensors() and self.cfg.num_rerenders_on_reset > 0:
for _ in range(self.cfg.num_rerenders_on_reset):
self.sim.render()
Comment on lines +367 to +369
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

style: render loop could be inefficient if num_rerenders_on_reset is set to a high value - consider adding an upper bound check or warning for large values


# trigger recorder terms for post-reset calls
self.recorder_manager.record_post_reset(env_ids)
Expand Down Expand Up @@ -413,8 +425,9 @@ def reset_to(
self.sim.forward()

# if sensors are added to the scene, make sure we render to reflect changes in reset
if self.sim.has_rtx_sensors() and self.cfg.rerender_on_reset:
self.sim.render()
if self.sim.has_rtx_sensors() and self.cfg.num_rerenders_on_reset > 0:
for _ in range(self.cfg.num_rerenders_on_reset):
self.sim.render()

# trigger recorder terms for post-reset calls
self.recorder_manager.record_post_reset(env_ids)
Expand Down
16 changes: 16 additions & 0 deletions source/isaaclab/isaaclab/envs/manager_based_env_cfg.py
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,22 @@ class ManagerBasedEnvCfg:
to reflect the latest states from the reset. This comes at a cost of performance as an additional render
step will be performed after each time an environment is reset.

.. deprecated:: 0.47.2
This attribute is deprecated and will be removed in the future. Please use
:attr:`num_rerenders_on_reset` instead.

To get the same behaviour as setting this parameter to ``True`` or ``False``, set
:attr:`num_rerenders_on_reset` to 1 or 0, respectively.
"""

num_rerenders_on_reset: int = 0
"""Number of render steps to perform after reset. Defaults to 0, which means no render step will be performed after reset.

* When this is 0, no render step will be performed after reset. Data collected from sensors after performing reset will be stale and will not reflect the
latest states in simulation caused by the reset.
* When this is greater than 0, the specified number of extra render steps will be performed to update the sensor data
to reflect the latest states from the reset. This comes at a cost of performance as additional render
steps will be performed after each time an environment is reset.
"""
Comment on lines +126 to 134
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

style: Consider adding validation to ensure num_rerenders_on_reset is non-negative, either through a validator or in the environment initialization code


wait_for_textures: bool = True
Expand Down
5 changes: 3 additions & 2 deletions source/isaaclab/isaaclab/envs/manager_based_rl_env.py
Original file line number Diff line number Diff line change
Expand Up @@ -222,8 +222,9 @@ def step(self, action: torch.Tensor) -> VecEnvStepReturn:
self._reset_idx(reset_env_ids)

# if sensors are added to the scene, make sure we render to reflect changes in reset
if self.sim.has_rtx_sensors() and self.cfg.rerender_on_reset:
self.sim.render()
if self.sim.has_rtx_sensors() and self.cfg.num_rerenders_on_reset > 0:
for _ in range(self.cfg.num_rerenders_on_reset):
self.sim.render()

# trigger recorder terms for post-reset calls
self.recorder_manager.record_post_reset(reset_env_ids)
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.11.1"
version = "0.11.2"

# 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.11.2 (2025-10-23)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

syntax: Date is in the future (2025-10-23) - should likely be 2024-10-23

~~~~~~~~~~~~~~~~~~~~

Changed
^^^^^^^

* Changed to use of ``num_rerenders_on_reset`` and ``DLAA`` in visuomotor imitation learning environments.


0.11.1 (2025-09-24)
~~~~~~~~~~~~~~~~~~~~

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -320,9 +320,9 @@ def __post_init__(self):
self.sim.dt = 1 / 100
self.sim.render_interval = 2

# # Set settings for camera rendering
self.rerender_on_reset = True
self.sim.render.antialiasing_mode = "OFF" # disable dlss
# Set settings for camera rendering
self.num_rerenders_on_reset = 3
self.sim.render.antialiasing_mode = "DLAA" # Use DLAA for higher quality rendering

# List of image observations in policy observations
self.image_obs_list = ["robot_pov_cam"]
Original file line number Diff line number Diff line change
Expand Up @@ -356,8 +356,8 @@ def __post_init__(self):
self.sim.render_interval = 2

# Set settings for camera rendering
self.rerender_on_reset = True
self.sim.render.antialiasing_mode = "OFF" # disable dlss
self.num_rerenders_on_reset = 3
self.sim.render.antialiasing_mode = "DLAA" # Use DLAA for higher quality rendering

# List of image observations in policy observations
self.image_obs_list = ["robot_pov_cam"]
Original file line number Diff line number Diff line change
Expand Up @@ -156,8 +156,8 @@ def __post_init__(self):
)

# Set settings for camera rendering
self.rerender_on_reset = True
self.sim.render.antialiasing_mode = "OFF" # disable dlss
self.num_rerenders_on_reset = 1
self.sim.render.antialiasing_mode = "OFF"

# List of image observations in policy observations
self.image_obs_list = ["table_cam", "wrist_cam"]
Original file line number Diff line number Diff line change
Expand Up @@ -231,8 +231,8 @@ def __post_init__(self):
)

# Set settings for camera rendering
self.rerender_on_reset = True
self.sim.render.antialiasing_mode = "OFF" # disable dlss
self.num_rerenders_on_reset = 3
self.sim.render.antialiasing_mode = "DLAA" # Use DLAA for higher quality rendering

# List of image observations in policy observations
self.image_obs_list = ["table_cam", "wrist_cam"]
Original file line number Diff line number Diff line change
Expand Up @@ -230,8 +230,8 @@ def __post_init__(self):
)

# Set settings for camera rendering
self.rerender_on_reset = True
self.sim.render.antialiasing_mode = "OFF" # disable dlss
self.num_rerenders_on_reset = 3
self.sim.render.antialiasing_mode = "DLAA" # Use DLAA for higher quality rendering

# List of image observations in policy observations
self.image_obs_list = ["ego_cam", "left_wrist_cam", "right_wrist_cam"]
Expand Down
Loading