mirror of
https://github.com/huggingface/lerobot.git
synced 2026-05-22 12:09:42 +00:00
fix(eval): render_frame covers _LazyAsyncVectorEnv
isinstance(env, AsyncVectorEnv) silently skipped _LazyAsyncVectorEnv,
causing video rendering to produce no frames on the default async path.
Switch to hasattr(env, "call") so any async-compatible env (including
_LazyAsyncVectorEnv) hits the call("render") branch.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -323,8 +323,9 @@ def eval_policy(
|
|||||||
n_to_render_now = min(max_episodes_rendered - n_episodes_rendered, env.num_envs)
|
n_to_render_now = min(max_episodes_rendered - n_episodes_rendered, env.num_envs)
|
||||||
if isinstance(env, gym.vector.SyncVectorEnv):
|
if isinstance(env, gym.vector.SyncVectorEnv):
|
||||||
ep_frames.append(np.stack([env.envs[i].render() for i in range(n_to_render_now)])) # noqa: B023
|
ep_frames.append(np.stack([env.envs[i].render() for i in range(n_to_render_now)])) # noqa: B023
|
||||||
elif isinstance(env, gym.vector.AsyncVectorEnv):
|
elif hasattr(env, "call"):
|
||||||
# Here we must render all frames and discard any we don't need.
|
# Here we must render all frames and discard any we don't need.
|
||||||
|
# Covers AsyncVectorEnv and _LazyAsyncVectorEnv (which wraps one).
|
||||||
ep_frames.append(np.stack(env.call("render")[:n_to_render_now]))
|
ep_frames.append(np.stack(env.call("render")[:n_to_render_now]))
|
||||||
|
|
||||||
if max_episodes_rendered > 0:
|
if max_episodes_rendered > 0:
|
||||||
|
|||||||
Reference in New Issue
Block a user