Skip to content

Commit 3438349

Browse files
committed
Fix renderer cadence after environment reset
Environment resets can change simulation state without advancing the physics-step counter. Invalidate render-context scene-state cadence in every reset implementation so the next render republishes transforms. Fixes #6609
1 parent 9f752df commit 3438349

8 files changed

Lines changed: 53 additions & 0 deletions

File tree

CONTRIBUTORS.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ Guidelines for modifications:
7272
* Cameron Upright
7373
* Cathy Y. Li
7474
* Cheng-Rong Lai
75+
* Chenyu Cao
7576
* Chenyu Yang
7677
* Connor Smith
7778
* CY (Chien-Ying) Chen
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
Fixed
2+
^^^^^
3+
4+
* Fixed camera renderers retaining pre-reset transforms when an environment
5+
resets state without advancing the physics-step counter.

source/isaaclab/isaaclab/envs/direct_marl_env.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -737,6 +737,8 @@ def _reset_idx(self, env_ids: Sequence[int]):
737737
# reset the episode length buffer
738738
self.episode_length_buf[env_ids] = 0
739739

740+
self.sim.render_context.reset_scene_state_cadence()
741+
740742
"""
741743
Implementation-specific functions.
742744
"""

source/isaaclab/isaaclab/envs/direct_rl_env.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -721,6 +721,8 @@ def _reset_idx(self, env_ids: Sequence[int]):
721721
# reset the episode length buffer
722722
self.episode_length_buf[env_ids] = 0
723723

724+
self.sim.render_context.reset_scene_state_cadence()
725+
724726
"""
725727
Implementation-specific functions.
726728
"""

source/isaaclab/isaaclab/envs/manager_based_env.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -658,3 +658,5 @@ def _reset_idx(self, env_ids: Sequence[int]):
658658
# -- recorder manager
659659
info = self.recorder_manager.reset(env_ids)
660660
self.extras["log"].update(info)
661+
662+
self.sim.render_context.reset_scene_state_cadence()

source/isaaclab/isaaclab/envs/manager_based_rl_env.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -409,3 +409,5 @@ def _reset_idx(self, env_ids: Sequence[int]):
409409

410410
# reset the episode length buffer
411411
self.episode_length_buf[env_ids] = 0
412+
413+
self.sim.render_context.reset_scene_state_cadence()

source/isaaclab/test/envs/test_direct_marl_env.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,3 +79,18 @@ def test_initialization(device):
7979
assert len(env.action_spaces) == 2
8080
# close the environment
8181
env.close()
82+
83+
84+
def test_reset_invalidates_renderer_scene_state_cadence():
85+
"""A same-step multi-agent reset must republish renderer scene state."""
86+
sim_utils.create_new_stage()
87+
env = DirectMARLEnv(cfg=get_empty_base_env_cfg())
88+
try:
89+
env._get_observations = lambda: {}
90+
env.sim.render_context._last_scene_state_step = 7
91+
92+
env.reset()
93+
94+
assert env.sim.render_context._last_scene_state_step is None
95+
finally:
96+
env.close()

source/isaaclab/test/envs/test_env_rendering_logic.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,30 @@ def wrapped_step(dt):
253253
SimulationContext.clear_instance()
254254

255255

256+
@pytest.mark.parametrize("env_type", ["manager_based_env", "manager_based_rl_env", "direct_rl_env"])
257+
def test_env_reset_invalidates_renderer_scene_state_cadence(env_type):
258+
"""A same-step reset must force the next camera read to republish scene state."""
259+
env = None
260+
try:
261+
sim_utils.create_new_stage()
262+
if env_type == "manager_based_env":
263+
env = create_manager_based_env(render_interval=1)
264+
elif env_type == "manager_based_rl_env":
265+
env = create_manager_based_rl_env(render_interval=1)
266+
else:
267+
env = create_direct_rl_env(render_interval=1)
268+
269+
env.sim.render_context._last_scene_state_step = 7
270+
env.reset()
271+
272+
assert env.sim.render_context._last_scene_state_step is None
273+
finally:
274+
if env is not None:
275+
env.close()
276+
else:
277+
SimulationContext.clear_instance()
278+
279+
256280
@pytest.mark.parametrize("env_type", ["manager_based_env", "manager_based_rl_env", "direct_rl_env"])
257281
def test_env_render_false_skips_rendering(env_type, physics_callback, render_callback):
258282
"""Test that setting render_enabled=False skips all rendering while physics continues."""

0 commit comments

Comments
 (0)