当前位置:   article > 正文

gym界面修改

gym界面修改

资料: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:
        break

env.close()  # 关闭环境


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 从上面这个代码可以看出,渲染应该是跟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.viewer

        return self.viewer
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

  • 这个函数中主要是调用了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])即可在界面上添加文本,效果如下:
    在这里插入图片描述
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/722643
推荐阅读
相关标签
  

闽ICP备14008679号