I want to record the interaction with a vectorized environment of two games of Atari's Breakout using Gymnasium
.
Unfortunately, when executed, my code only records the last game of the vector during an episode
(or maybe it internally overwrites recordings until the last recording).
I am looking for a solution to record all games of a vector for each episode.
Here is my current code:
import gymnasium as gym
from gymnasium.wrappers.record_video import RecordVideo
from pyvirtualdisplay import Display
from IPython.display import display, Video
wrap_record_video=lambda x: RecordVideo(x,
video_folder="recordings/",
name_prefix="breakout_test",
episode_trigger=lambda x: True,
disable_logger=True)
env = gym.make_vec('Breakout-v4',
render_mode='rgb_array',
num_envs=2,
vectorization_mode="async",
wrappers=[wrap_record_video])
d = Display(visible=0, size=(800,600))
d.start()
for episode in range(0, 5):
state = env.reset()
done = False
score = 0
while not done:
action = env.action_space.sample()
n_state, reward, terminated, truncated, info = env.step(action)
done = True in terminated or True in truncated
score += reward
print("Episode:{} Score:{}".format(episode, score))
display(Video("recordings/breakout_test-episode-{}.mp4".format(episode), embed=True))
env.close()
d.stop()
I have seen examples that wrap the vectorized environment into a VecFrameStack
environment of
stable-baselines3
. However, VecFrameStack
requires the vector to be of class stable_baselines3.common.vec_env.VecEnv
,
while the output of gym.make_vec
is of class gymnasium.vector.VectorEnv
.