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

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

4.5.21 (2026-03-13)
~~~~~~~~~~~~~~~~~~~

Changed
^^^^^^^

* Allow app launcher to set visualizer type when headless is used.
* Invalidate render update when reset is called.


4.5.20 (2026-03-13)
~~~~~~~~~~~~~~~~~~~

Expand Down
6 changes: 3 additions & 3 deletions source/isaaclab/isaaclab/app/app_launcher.py
Original file line number Diff line number Diff line change
Expand Up @@ -698,10 +698,10 @@ def _resolve_headless_settings(self, launcher_args: dict, livestream_arg: int, l
if self._cli_visualizer_explicit:
logger.warning(
"Both '--headless' and '--visualizer/--viz' were provided. "
"Deprecated '--headless' takes precedence and disables all visualizers."
"Visualizers are still enabled so viewport/camera pipeline runs correctly in headless."
)
Comment on lines 698 to 702
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Misleading warning fires for --headless --viz none

The second warning says "Visualizers are still enabled so viewport/camera pipeline runs correctly in headless", but this fires whenever self._cli_visualizer_explicit is True — including when the user passes --headless --viz none, which sets self._cli_visualizer_disable_all = True and does disable all visualizers. The guard should exclude the "disable all" case so the message only fires when visualizers are actually being kept active.

Suggested change
if self._cli_visualizer_explicit:
logger.warning(
"Both '--headless' and '--visualizer/--viz' were provided. "
"Deprecated '--headless' takes precedence and disables all visualizers."
"Visualizers are still enabled so viewport/camera pipeline runs correctly in headless."
)
if self._cli_visualizer_explicit and not self._cli_visualizer_disable_all:
logger.warning(
"Both '--headless' and '--visualizer/--viz' were provided. "
"Visualizers are still enabled so viewport/camera pipeline runs correctly in headless."
)

self._cli_visualizer_disable_all = True
self._cli_visualizer_types = []
# Do not clear visualizers when --headless is used with --viz: headless only suppresses the
# GUI window; visualizers (e.g. Kit) can run headless and are needed for correct camera/resolution.
# We allow headless kwarg to supersede HEADLESS envvar if headless_arg does not have the default value
# Note: Headless is always true when livestreaming
if headless_arg is True:
Expand Down
7 changes: 7 additions & 0 deletions source/isaaclab/isaaclab/sim/simulation_context.py
Original file line number Diff line number Diff line change
Expand Up @@ -594,6 +594,13 @@ def reset(self, soft: bool = False) -> None:
self.physics_manager.reset(soft)
for viz in self._visualizers:
viz.reset(soft)
# Invalidate RTX render dedup so the first camera read after reset pumps a fresh frame.
try:
from isaaclab_physx.renderers.isaac_rtx_renderer_utils import invalidate_render_update

invalidate_render_update()
except ImportError:
pass
# Start the timeline so the play button is pressed
self.physics_manager.play()
if not self._visualizers:
Expand Down
2 changes: 1 addition & 1 deletion source/isaaclab_physx/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.5.11"
version = "0.5.12"

# Description
title = "PhysX simulation interfaces for IsaacLab core package"
Expand Down
9 changes: 9 additions & 0 deletions source/isaaclab_physx/docs/CHANGELOG.rst
Original file line number Diff line number Diff line change
@@ -1,6 +1,15 @@
Changelog
---------

0.5.12 (2026-03-13)
~~~~~~~~~~~~~~~~~~~

Added
^^^^^

* Add function to invalidate render update so next camera read will pump the RTX renderer.


0.5.11 (2026-03-13)
~~~~~~~~~~~~~~~~~~~

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,16 @@
_last_render_update_key: tuple[int, int] = (0, -1)


def invalidate_render_update() -> None:
"""Invalidate the per-step render update stamp so the next camera read will pump the RTX renderer.

Call this from :meth:`SimulationContext.reset` so that the first observation after a reset
triggers a fresh render instead of reusing the pre-reset frame (which would appear stale).
"""
global _last_render_update_key
_last_render_update_key = (0, -1)


def ensure_isaac_rtx_render_update() -> None:
"""Ensure the Isaac RTX renderer has been pumped for the current physics step.

Expand Down
Loading