gym界面修改

本文讲述了如何在Gym的Mujoco环境中,由于界面缺乏实时显示动作空间和状态空间的状态,通过查找和解析代码,发现可以利用MjViewer和MjRenderContextOffscreen的功能,以及自定义overlay来在界面上添加数据,以实现数据可视化。
摘要由CSDN通过智能技术生成

资料: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()  # 关闭环境


  • 从上面这个代码可以看出,渲染应该是跟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

  • 这个函数中主要是调用了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])即可在界面上添加文本,效果如下:
    在这里插入图片描述
要在gym中更改保存的视频的背景颜色,可以使用moviepy库进行处理。下面是一个示例代码: ```python import gym from gym import wrappers import moviepy.editor as mpy # 创建gym环境实例 env = gym.make('CartPole-v1') # 设置保存视频的路径和文件名 video_path = 'path/to/save/video.mp4' # 包装环境以保存视频 env = wrappers.Monitor(env, video_path) # 重置环境并获取初始观测 observation = env.reset() done = False while not done: # 渲染环境 env.render() # 选择一个随机动作作为示例 action = env.action_space.sample() # 执行动作并获取下一个观测、奖励和结束标志 observation, reward, done, info = env.step(action) # 关闭环境 env.close() # 使用moviepy库加载保存的视频文件 video = mpy.VideoFileClip(video_path) # 更改视频的背景颜色为红色,并保存为新的视频文件 new_video = video.fl(lambda gf, t: gf(t).set_duration(video.duration).set_bgcolor((255, 0, 0))) # 设置保存新视频的路径和文件名 new_video_path = 'path/to/save/new_video.mp4' # 保存新的视频文件 new_video.write_videofile(new_video_path, codec='libx264') ``` 在上述代码中,我们首先创建了gym环境实例,并设置保存视频的路径和文件名。然后,我们使用`wrappers.Monitor()`方法包装环境,以便在渲染环境时保存视频。接下来,我们进入一个循环,在每个循环中,我们渲染环境(可选),选择一个随机动作,并执行该动作以获取下一个观测、奖励和结束标志。最后,我们关闭环境。 然后,我们使用moviepy库加载保存的视频文件,并使用`fl()`方法更改视频的背景颜色为红色。可以通过更改`(255, 0, 0)`来设置想要的背景颜色。最后,我们将新的视频文件保存到指定路径。 请注意,在使用代码之前,你需要安装`moviepy`库,可以使用以下命令来安装它:`pip install moviepy`。 希望这个示例可以帮助你更改gym保存视频的背景颜色!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值