包装器¶
包装器是一种方便的方式,可以在不直接修改底层代码的情况下修改现有环境。
使用包装器将使您避免大量样板代码,并使您的环境更具模块化。重要的是,包装器可以链接以组合它们的效果,并且大多数通过 :meth: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)
你可以通过使用 :attr:gymnasium.Wrapper.env
属性来访问 第一个 包装器下的环境。由于 :class:gymnasium.Wrapper
类继承自 :class:gymnasium.Env
,因此 :attr:gymnasium.Wrapper.env
可以是另一个包装器。
>>> wrapped_env
<RescaleAction<TimeLimit<OrderEnforcing<PassiveEnvChecker<HopperEnv<Hopper-v4>>>>>>
>>> wrapped_env.env
<TimeLimit<OrderEnforcing<PassiveEnvChecker<HopperEnv<Hopper-v4>>>>>
如果你想访问 所有 包装层之下的环境,你可以使用 :attr:gymnasium.Wrapper.unwrapped
属性。如果环境已经是一个裸环境,:attr:gymnasium.Wrapper.unwrapped
属性将直接返回自身。
>>> wrapped_env
<RescaleAction<TimeLimit<OrderEnforcing<PassiveEnvChecker<HopperEnv<Hopper-v4>>>>>>
>>> wrapped_env.unwrapped
<gymnasium.envs.mujoco.hopper_v4.HopperEnv object at 0x7fbb5efd0490>
你可能希望一个包装器执行的三种常见操作是:
在将操作应用于基础环境之前对其进行转换
转换由基础环境返回的观察结果
转换由基础环境返回的奖励
这种包装器可以通过继承 :class:gymnasium.ActionWrapper
、:class:gymnasium.ObservationWrapper
或 :class:gymnasium.RewardWrapper
并实现相应的转换来轻松实现。如果你需要一个执行更复杂任务的包装器,你可以直接继承 :class:gymnasium.Wrapper
类。
如果你想实现自己的自定义包装器,请查看 相应的教程 <../../tutorials/implementing_custom_wrappers>
_。
- class gymnasium.Wrapper(env: Env[ObsType, ActType])[源代码]¶
包装一个 :class:
gymnasium.Env
以允许对 :meth:step
和 :meth:reset
方法进行模块化转换。此类是所有包装器的基类,用于改变底层环境的行为。继承自此类包装器可以修改 :attr:
action_space
、 :attr:observation_space
、 :attr:reward_range
和 :attr:metadata
属性,而不会改变底层环境的属性。此外, :meth:step
和 :meth:reset
方法的行为可以通过这些包装器进行改变。一些属性(:attr:
spec
、:attr:render_mode
、:attr:np_random
)将指向包装器的环境(即指向 :attr:env
的相应属性)。备注
如果你继承自 :class:
Wrapper
,别忘了调用super().__init__(env)
- 参数:
env – 要包装的环境
方法¶
- Wrapper.step(action: WrapperActType) tuple[WrapperObsType, SupportsFloat, bool, bool, dict[str, Any]] [源代码]¶
使用可以被覆盖的 :attr:
env
的 :meth:step
方法来改变返回的数据。
- Wrapper.reset(*, seed: int | None = None, options: dict[str, Any] | None = None) tuple[WrapperObsType, dict[str, Any]] [源代码]¶
使用可以被覆盖以改变返回数据的 :attr:
env
的 :meth:reset
。
- Wrapper.render() RenderFrame | list[RenderFrame] | None [源代码]¶
使用 :attr:
env
的 :meth:render
方法,该方法可以被重写以改变返回的数据。
- classmethod Wrapper.wrapper_spec(**kwargs: Any) WrapperSpec [源代码]¶
为包装器生成一个
WrapperSpec
。
属性¶
- Wrapper.env¶
这个包装器的环境(下一级)。
这本身可能是一个包装的环境。要获取所有包装层下的环境,请使用 :attr:
gymnasium.Wrapper.unwrapped
。
- property Wrapper.action_space: Space[ActType] | Space[WrapperActType]¶
返回 :attr:
Env
:attr:action_space
,除非被覆盖,否则使用包装器 :attr:action_space
。
- property Wrapper.observation_space: Space[ObsType] | Space[WrapperObsType]¶
返回 :attr:
Env
:attr:observation_space
,除非被覆盖,否则使用包装器 :attr:observation_space
。
- property Wrapper.spec: EnvSpec | None¶
返回 :attr:
Env
:attr:spec
属性,如果包装器继承自EzPickle
,则带有WrapperSpec
。
- property Wrapper.metadata: dict[str, Any]¶
返回 :attr:
Env
:attr:元数据
。
- property Wrapper.np_random: Generator¶
返回 :attr:
Env
的 :attr:np_random
属性。
- property Wrapper.np_random_seed: int | None¶
返回基础环境的 :attr:
np_random_seed
。