资料:https://blog.csdn.net/weixin_46178278/article/details/135962782
-
在gym环境中使用mujoco的时候,有一个很难受的地方,界面上没有实时显示动作空间和状态空间状态的地方。
-
gym自己原始带的环境是用pygame画的图,所以在定义环境类的那里会重载render()函数,那里可以修改界面。可是mujoco的gym环境中没有render()函数,猜测可能是因为这个图像是从mujoco的仿真器中自己生成的。
-
依据之前用pygame的经验,这种界面应该是图像和文字分开渲染的,也就是在图像边界上的三个方块应该是通过一个封装好的模块,通过不同行的字符串生成的。如果能找到这部分代码就能在上面添加需要的数据,就会有一个在界面上显示数据的代码
import gym#定义环境名字
env = gym.make('daolibai_test',render_mode='human') # 创建Humanoid环境实例
observation = env.reset() # 重置环境并获取初始观测for _ in range(10000): # 执行1000个步骤env.render() # 渲染环境图像action = env.action_space.sample() # 从动作空间中随机采样一个动作next_observation, reward, terminated,done, info = env.step(action) # 执行动作并获取下一个观测、奖励等信息# print(_)# print(action)if done:breakenv.close() # 关闭环境
- 从上面这个代码可以看出,渲染应该是跟env.render()有关。这个函数在gyn的mujoco文件夹中有环境基类,地址在/gym/gym/envs/mujoco/mujoco_env.py。这个基类中调用了_get_viewer(),函数如下:
def _get_viewer(self, mode) -> Union["mujoco_py.MjViewer", "mujoco_py.MjRenderContextOffscreen"]:self.viewer = self._viewers.get(mode)if self.viewer is None:if mode == "human":self.viewer = mujoco_py.MjViewer(self.sim)elif mode in {"rgb_array", "depth_array"}:self.viewer = mujoco_py.MjRenderContextOffscreen(self.sim, -1)else:raise AttributeError(f"Unknown mode: {mode}, expected modes: {self.metadata['render_modes']}")self.viewer_setup()self._viewers[mode] = self.viewerreturn self.viewer
,
- 这个函数中主要是调用了mujoco_py的函数MjViewer(),这个是mujoco自己的那个python库,也就是不光图像,整个gym中的mujoco模块实际上都只是创建了对应调用的接口。
- 我这个MjViewer类所在的位置在anaconda3/envs/RL/lib/python3.9/site-packages/mujoco_py/mjviewer.py,这个类里调用了_create_full_overlay()函数,类似于
self.add_overlay(const.GRID_TOPLEFT, "Toggle geomgroup visibility", "0-4")
就是创建模块文本的函数。 - 添加
self.add_overlay(const.GRID_BOTTOMRIGHT, "pos0", "%.f" % self.sim.data.qpos[0])
即可在界面上添加文本,效果如下: