当我运行此代码时:
from nes_py.wrappers import JoypadSpace
import gym
import gym_super_mario_bros
from gym_super_mario_bros.actions import SIMPLE_MOVEMENT
from gym.wrappers import GrayScaleObservation
from stable_baselines3.common.vec_env import VecFrameStack,DummyVecEnv
from matplotlib import pyplot as plt
env = gym_super_mario_bros.make('SuperMarioBros-v0',apply_api_compatibility=True,render_mode="human")
env = JoypadSpace(env, SIMPLE_MOVEMENT)
env = GrayScaleObservation(env,keep_dim=True)
env = DummyVecEnv([lambda:env])
env = VecFrameStack(env,4,channels_order='last')
state = env.reset()
我收到以下错误:
我该如何解决这个问题?
这是 nes-py 中的一个错误(截至此答案版本为 8.2.1)。
JoypadSpace
未正确覆盖 reset()
的 Wrapper
方法。
JoypadSpace
reset()
已在 nes-py 0.8.7(2018 年 7 月)中针对 gym
0.10.5 实施。
Wrapper
reset()
在 **kwargs
0.10.6(2018 年 10 月)中用
gym
定义。
Env
reset()
不接受任何参数。Env
reset()
开始接受seed
参数 gym
0.22.0(2022 年 2 月)。单行解决方法:
JoypadSpace.reset = lambda self, **kwargs: self.env.reset(**kwargs)
我使用以下代码尝试了此处提出的解决方案:
from nes_py.wrappers import JoypadSpace
JoypadSpace.reset = lambda self, **kwargs: self.env.reset(**kwargs)
from gym_super_mario_bros.actions import SIMPLE_MOVEMENT
env = JoypadSpace(env, SIMPLE_MOVEMENT)
from gym.wrappers import GrayScaleObservation
env = GrayScaleObservation(env, keep_dim=True)
from stable_baselines3.common.vec_env import DummyVecEnv
env = DummyVecEnv([lambda: env])
gameState = env.reset()
obs, _, _, _, _ = env.step(1)
env.close()
但是这次我得到了错误:
值错误
Traceback (most recent call last)
<ipython-input-3-7521e0795c59> in <cell line: 37>()
35
36 # Size of frame output
---> 37 gameState = env.reset()
38 obs, _, _, _, _ = env.step(1)
39 env.close()
/usr/local/lib/python3.10/dist-packages/stable_baselines3/common/vec_env/dummy_vec_env.py in reset(self)
74 def reset(self) -> VecEnvObs:
75 for env_idx in range(self.num_envs):
---> 76 obs, self.reset_infos[env_idx] = self.envs[env_idx].reset(seed=self._seeds[env_idx])
77 self._save_obs(env_idx, obs)
78 # Seeds are only used once
ValueError: too many values to unpack (expected 2)
这个问题如何解决?