包装器

包装器是修改现有环境而不必直接更改底层代码的便捷方式。

使用包装器可以避免许多样板代码,并使您的环境更具模块化。重要的是,包装器可以链接以组合它们的效果,并且大多数通过 gymnasium.make() 生成的环境默认情况下将被包装。

为了包装环境,您必须先初始化一个基本环境。然后,您可以将此环境以及(可能可选的)参数传递给包装器的构造函数。

>>> import gymnasium as gym
>>> from gymnasium.wrappers import RescaleAction
>>> base_env = gym.make("Hopper-v4")
>>> base_env.action_space
Box(-1.0, 1.0, (3,), float32)
>>> wrapped_env = RescaleAction(base_env, min_action=0, max_action=1)
>>> wrapped_env.action_space
Box(0.0, 1.0, (3,), float32)

您可以使用 gymnasium.Wrapper.env 属性访问第一个包装器下的环境。由于 gymnasium.Wrapper 类继承自 gymnasium.Env,那么 gymnasium.Wrapper.env 可以是另一个包装器。

>>> wrapped_env
<RescaleAction<TimeLimit<OrderEnforcing<PassiveEnvChecker<HopperEnv<Hopper-v4>>>>>>
>>> wrapped_env.env
<TimeLimit<OrderEnforcing<PassiveEnvChecker<HopperEnv<Hopper-v4>>>>>

如果您想访问所有包装器层下方的环境,您可以使用 gymnasium.Wrapper.unwrapped 属性。如果环境已经是裸环境,gymnasium.Wrapper.unwrapped 属性将只返回自身。

>>> wrapped_env
<RescaleAction<TimeLimit<OrderEnforcing<PassiveEnvChecker<HopperEnv<Hopper-v4>>>>>>
>>> wrapped_env.unwrapped 
<gymnasium.envs.mujoco.hopper_v4.HopperEnv object at 0x7fbb5efd0490>

您可能希望包装器执行的三件常见事情

  • 在将动作应用于基本环境之前转换动作

  • 转换基本环境返回的观测结果

  • 转换基本环境返回的奖励

这样的包装器可以通过继承 gymnasium.ActionWrappergymnasium.ObservationWrappergymnasium.RewardWrapper 并实现相应的转换来轻松实现。如果您需要包装器来执行更复杂的任务,您可以直接继承自 gymnasium.Wrapper 类。

如果您想实现自己的自定义包装器,请查看 相应的教程

class gymnasium.Wrapper(env: Env[ObsType, ActType])[source]

包装一个 gymnasium.Env 以允许对 step()reset() 方法进行模块化转换。

此类是所有包装器的基类,用于更改底层环境的行为。继承自此类的包装器可以修改 action_spaceobservation_spacemetadata 属性,而不更改底层环境的属性。此外,step()reset() 方法的行为可以通过这些包装器进行更改。

某些属性 (specrender_modenp_random) 将指向包装器的环境(即指向 env 的相应属性)。

注意

如果您继承自 Wrapper,请不要忘记调用 super().__init__(env)

参数:

env – 要包装的环境

方法

Wrapper.step(action: WrapperActType) tuple[WrapperObsType, SupportsFloat, bool, bool, dict[str, Any]][source]

使用可以覆盖的 envstep() 来更改返回的数据。

Wrapper.reset(*, seed: int | None = None, options: dict[str, Any] | None = None) tuple[WrapperObsType, dict[str, Any]][source]

使用可以覆盖的 envreset() 来更改返回的数据。

Wrapper.render() RenderFrame | list[RenderFrame] | None[source]

使用 render() 方法,该方法可以被覆盖以更改返回的数据。

Wrapper.close()[source]

关闭包装器和 env

classmethod Wrapper.wrapper_spec(**kwargs: Any) WrapperSpec[source]

为包装器生成一个 WrapperSpec

Wrapper.get_wrapper_attr(name: str) Any[source]

从包装器和更低级别的环境中获取属性,如果 name 在该对象中不存在。

参数:

name – 要获取的变量名称

返回:

包装器或更低级别环境中名为的变量

Wrapper.set_wrapper_attr(name: str, value: Any)[source]

如果 name 已定义,则在此包装器或更低级别的环境中设置一个属性。

参数:
  • name – 变量名称

  • value – 新的变量值

属性

Wrapper.env

该包装器下方的环境(下一级)。

它本身可能是一个包装的环境。要获取所有包装层下的环境,请使用 gymnasium.Wrapper.unwrapped

property Wrapper.action_space: spaces.Space[ActType] | spaces.Space[WrapperActType]

返回 Env action_space,除非被覆盖,否则使用包装器 action_space

property Wrapper.observation_space: spaces.Space[ObsType] | spaces.Space[WrapperObsType]

返回 Env observation_space,除非被覆盖,否则使用包装器 observation_space

property Wrapper.spec: EnvSpec | None

返回 Env spec 属性,如果包装器继承自 EzPickle 则包含 WrapperSpec

property Wrapper.metadata: dict[str, Any]

返回 Env metadata

property Wrapper.np_random: Generator

返回 Env np_random 属性。

property Wrapper.np_random_seed: int | None

返回基础环境的 np_random_seed

property Wrapper.unwrapped: Env[ObsType, ActType]

返回包装器的基础环境。

这将是所有包装层下方的裸 gymnasium.Env 环境。