From 291fd6fab232910b580b50bf871930d3a735381c Mon Sep 17 00:00:00 2001 From: Andrea Prestia <67275846+andreh1111@users.noreply.github.com> Date: Tue, 1 Sep 2026 15:02:06 -0400 Subject: [PATCH 1/3] fix doubled render call --- robohive/envs/env_base.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/robohive/envs/env_base.py b/robohive/envs/env_base.py index bc3cc13f..115538c3 100644 --- a/robohive/envs/env_base.py +++ b/robohive/envs/env_base.py @@ -293,6 +293,8 @@ def step(self, a, **kwargs): step_duration=self.dt, realTimeSim=self.mujoco_render_frames, render_cbk=self.mj_render if self.mujoco_render_frames else None) + # robot.step() above already rendered this tick when mujoco_render_frames is True + self._rendered_this_tick = self.mujoco_render_frames return self.forward(**kwargs) @implement_for("gym", None, "0.24") @@ -317,9 +319,10 @@ def _forward(self, **kwargs): Returns current obs(t), rwd(t), done(t), info(t) """ - # render the scene - if self.mujoco_render_frames: + # render the scene (skipped if step() already rendered this tick) + if self.mujoco_render_frames and not getattr(self, '_rendered_this_tick', False): self.mj_render() + self._rendered_this_tick = False # observation obs = self.get_obs(**kwargs) From 351c6cebad5c055882cee433233f9eb8b8a7d98b Mon Sep 17 00:00:00 2001 From: Andrea Prestia <67275846+andreh1111@users.noreply.github.com> Date: Tue, 1 Sep 2026 15:49:31 -0400 Subject: [PATCH 2/3] address vk comment --- robohive/envs/env_base.py | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/robohive/envs/env_base.py b/robohive/envs/env_base.py index 115538c3..d1fd9a5d 100644 --- a/robohive/envs/env_base.py +++ b/robohive/envs/env_base.py @@ -92,6 +92,7 @@ def _setup(self, robot_cls = kwargs.pop('robot_cls', Robot) self.robot = robot_cls(mj_sim=self.sim, random_generator=self.np_random, + env_dt=self.sim.model.opt.timestep * frame_skip, **kwargs) #resolve action space @@ -293,36 +294,37 @@ def step(self, a, **kwargs): step_duration=self.dt, realTimeSim=self.mujoco_render_frames, render_cbk=self.mj_render if self.mujoco_render_frames else None) - # robot.step() above already rendered this tick when mujoco_render_frames is True - self._rendered_this_tick = self.mujoco_render_frames - return self.forward(**kwargs) + # robot.step() above already rendered this tick (render_cbk in hardware mode, + # sim.advance(render=True) in sim mode) -- forward()'s own render would + # otherwise duplicate it, uncompensated by robot.step()'s pacing sleep. + return self.forward(render=False, **kwargs) @implement_for("gym", None, "0.24") - def forward(self, **kwargs): - return self._forward(**kwargs) + def forward(self, render=True, **kwargs): + return self._forward(render=render, **kwargs) @implement_for("gym", "0.24", None) - def forward(self, **kwargs): - obs, reward, done, info = self._forward(**kwargs) + def forward(self, render=True, **kwargs): + obs, reward, done, info = self._forward(render=render, **kwargs) terminal = done return obs, reward, terminal, False, info @implement_for("gymnasium") - def forward(self, **kwargs): - obs, reward, done, info = self._forward(**kwargs) + def forward(self, render=True, **kwargs): + obs, reward, done, info = self._forward(render=render, **kwargs) terminal = done return obs, reward, terminal, False, info - def _forward(self, **kwargs): + def _forward(self, render=True, **kwargs): """ Forward propagate env to recover env details Returns current obs(t), rwd(t), done(t), info(t) """ - # render the scene (skipped if step() already rendered this tick) - if self.mujoco_render_frames and not getattr(self, '_rendered_this_tick', False): + # render the scene -- render=False from step(), which already rendered via + # robot.step(); standalone callers (e.g. after reset()) keep the default. + if self.mujoco_render_frames and render: self.mj_render() - self._rendered_this_tick = False # observation obs = self.get_obs(**kwargs) From 4479f6e21a176f83aa371a3b11030de37bd5cdf5 Mon Sep 17 00:00:00 2001 From: Andrea Prestia <67275846+andreh1111@users.noreply.github.com> Date: Tue, 1 Sep 2026 15:52:13 -0400 Subject: [PATCH 3/3] revert mistakenly committed update --- robohive/envs/env_base.py | 1 - 1 file changed, 1 deletion(-) diff --git a/robohive/envs/env_base.py b/robohive/envs/env_base.py index d1fd9a5d..96d3b7b7 100644 --- a/robohive/envs/env_base.py +++ b/robohive/envs/env_base.py @@ -92,7 +92,6 @@ def _setup(self, robot_cls = kwargs.pop('robot_cls', Robot) self.robot = robot_cls(mj_sim=self.sim, random_generator=self.np_random, - env_dt=self.sim.model.opt.timestep * frame_skip, **kwargs) #resolve action space