封装后的Gym环境调用get_images()报错,如何获取RGB帧?
解决方案
错误原因:DummyVecEnv.get_images() 会调用子环境的 render(mode='rgb_array') 方法,但你使用的 AtariWrapper 未定义接受 mode 参数的 render 方法,导致参数不匹配报错。
以下是两种无需修改环境封装顺序的解决方法:
方案一:给AtariWrapper打猴子补丁兼容mode参数
通过补丁让AtariWrapper的render方法支持mode参数,这样就能正常调用get_images():
# 假设你的最终环境变量名为env(VecFrameStack实例) # 逐层获取内部的AtariWrapper环境 dummy_env = env.venv atari_env = dummy_env.envs[0] # 定义补丁后的render方法 def patched_render(self, mode='rgb_array'): if mode == 'rgb_array': # 调用原始Gym环境的render获取原始RGB图像 return self.env.render(mode='rgb_array') # 保留AtariWrapper原有render行为(返回处理后的灰度图等) return super(type(self), self).render() # 给AtariWrapper实例应用补丁 atari_env.render = patched_render.__get__(atari_env, type(atari_env)) # 现在可以正常调用get_images()获取RGB图像 rgb_images = env.venv.get_images() # rgb_images是一个列表,每个元素对应一个子环境的RGB图像数组
方案二:直接获取原始Gym环境手动获取RGB图像
逐层拿到最内层的原始Gym环境,直接调用其render方法获取RGB图像:
# 逐层获取原始Gym环境 dummy_env = env.venv atari_env = dummy_env.envs[0] original_gym_env = atari_env.env # 在每一步交互后,调用原始环境的render获取RGB图像 obs, reward, done, info = env.step(action) rgb_image = original_gym_env.render(mode='rgb_array')
内容的提问来源于stack exchange,提问作者user19826638
相关产品推荐
相关产品推荐

