Robosuite强化学习-3.robosuite.wrappers.gym_wrapper.GymWrapper详解
大家好,我素洪小帅~
GymWrapper 是 robosuite 库中的一个包装类,它的作用是使 RoboSuite 环境与OpenAI Gym接口兼容。具体来说,它对环境进行封装,以便能够与Gym的标准接口(如 reset()、step() 等)无缝集成。熟悉gym任务编程的宝贝可以用它来包装robosuite环境以后,使用gym的接口来写代码了.
1.类定义与继承:
class GymWrapper(robosuite.wrappers.wrapper.Wrapper, gymnasium.core.Env):
GymWrapper继承了两个基类:robosuite.wrappers.wrapper.Wrapper:这是 RoboSuite 环境的包装类,提供了包装功能。gymnasium.core.Env:这是 Gym 环境的基类,定义了与环境交互的核心接口。
2.构造函数:
def __init__(self, env, keys=None):
- 作用:初始化
GymWrapper对象。 - 参数:
env:这是要包装的底层 Gym 环境。keys:可选参数,用于指定在观察空间中保留哪些键(如果需要)。
3.方法:
1. compute_reward(self, achieved_goal, desired_goal, info)
def compute_reward(self, achieved_goal, desired_goal, info):
# 兼容 Gym 接口的虚拟方法,直接返回环境奖励
return float(self.reward)
-
作用:计算奖励,但在这个方法中,它仅返回环境中的奖励,而不使用
achieved_goal、desired_goal或info参数。 -
参数:
achieved_goal,desired_goal,info:这些参数在这里没有使用,通常在具有目标导向的环境中才会用到(如机器人控制任务)。
-
返回值:返回环境中的奖励,类型为
float。
2. reset(self, seed=None, options=None)
def reset(self, seed=None, options=None):
# 扩展 env 的 reset 方法,返回扁平化的观察空间(np.ndarray)而不是robosuite的OrderedDict
return self.env.reset(seed=seed, options=options)
-
作用:扩展了底层环境的
reset方法,返回的观察空间是扁平化的 NumPy 数组,而不是通常的OrderedDict。 -
参数:
seed:用于设置环境的随机种子。options:可选,允许在重置时指定额外的选项。
-
返回值:
- 一个 2 元组:
np.array:扁平化的环境观察空间。dict:一个空字典,作为标准的 Gym 返回格式。
- 一个 2 元组:
3. step(self, action)
def step(self, action):
# 扩展 step() 方法,返回扁平化的观察空间
return self.env.step(action)
-
作用:这个方法扩展了环境的
step方法,接受一个动作,并返回执行该动作后的环境状态,特别是返回扁平化的观察空间。 -
参数:
action (np.array):在环境中采取的动作。
-
返回值:
- 一个 5 元组:
np.array:扁平化的观察空间。float:执行动作后的奖励。bool:是否因为环境达到终止状态而结束当前 episode。bool:是否因为外部定义的条件而结束当前 episode。dict:附加的环境信息(如诊断信息)。
- 一个 5 元组:
从 robosuite.wrappers.wrapper.Wrapper 继承的方法:
-
__getattr__(self, attr):这是一个后备方法,允许 wrapper 处理原始环境不明确的任何方法调用。 -
observation_spec(self):返回环境的观察空间规范,通常是一个描述观察空间结构和类型的OrderedDict。 -
render(self, **kwargs):包装环境的render方法,支持渲染,并将额外的参数传递给底层环境的render函数。
从 robosuite.wrappers.wrapper.Wrapper 继承的类属性:
-
action_dim:返回环境动作空间的维度。 -
action_spec:返回一个元组,包含动作空间的最小值(低)和最大值(高)。 -
unwrapped:返回未经包装的环境,即去除了所有包装的环境实例。
从 gymnasium.core.Env 继承的方法:
-
__enter__(self)和__exit__(self):这两个方法支持环境的with语句上下文管理器。 -
close(self):关闭环境,释放资源(如渲染窗口、数据库或 HTTP 连接)。如果环境已经关闭,再次调用close不会有任何效果,也不会抛出错误。 -
get_wrapper_attr(self, name),has_wrapper_attr(self, name)和set_wrapper_attr(self, name, value):这些方法用于与环境的属性进行交互,检查或设置特定的 wrapper 属性。
从 gymnasium.core.Env 继承的只读属性:
-
np_random_seed:返回环境的随机数生成器的当前种子。如果未设置,将返回一个随机数种子。 -
np_random:返回环境内部的随机数生成器实例,通常是np.random.Generator的实例。
4.示例代码
import robosuite
from robosuite.wrappers.gym_wrapper import GymWrapper
import numpy as np
env = robosuite.make(
env_name="Lift", # 选择一个任务
robots="Panda",
has_renderer=False, # 启用渲染器
control_freq=20, # 控制频率
has_offscreen_renderer=False,
use_camera_obs=False,
)
env = GymWrapper(env)
env.reset()
for i in range(1000):
action = np.random.randn(*env.action_spec[0].shape) * 0.1
obs,reward,done,truncated,info = env.step(action) # take action in the environment
break
env.close() # 关闭环境
更多推荐
所有评论(0)