当前位置: 首页 > article >正文

【gym】理解gym并测试gym小游戏CartPole (一)

一、gym与文件位置的联合理解

import gym
import inspect

# 加载 CliffWalking 环境
env = gym.make('CliffWalking-v0')

# 获取环境的类
env_class = type(env)

# 获取环境类所在的文件路径
file_path = inspect.getfile(env_class)

print(f"The source code for CliffWalking-v0 is located at: {file_path}")

输出结果:
The source code for CliffWalking-v0 is located at: D:\env\anaconda\envs\test38\lib\site-packages\gym\wrappers\order_enforcing.py

解释说明:

  1. import gym :gym是一个库(某工具包),其安装在D:\env\anaconda\envs\test38\Lib\site-packages文件下。这个安装路径,说明了有一个虚拟环境envs—名称为test38,所有安装包(例如:gym,numpy,torch,matplotlib等)都安装在site-packages下。
  2. 在文件夹site-packages中打开子文件夹gym.
    在这里插入图片描述当我们单独使用gym下的子文件的时候,方法为:import gym.envs或者import gym.spaces

__init__.py是以长下划线开头的,则默认在import gym的时候会默认运行该文件中的代码。
__init__.py中会导入所有有用的内容,如下
在这里插入图片描述我们在pycharm中输入gym.后会自动有如下的提示!

在这里插入图片描述

二、在pycharm中示例一个gym小游戏

2.1 可能出现的报错问题

我们给定一个代码,经常会出现的问题。

import gym
import numpy as np

# 创建CartPole环境
env = gym.make('CartPole-v1')
#env = gym.make('CartPole-v1', render_mode='rgb_array')  # 使用'rgb_array'模式进行渲染,这将返回一个图像数组而不是显示图像
# 初始化环境
state = env.reset()

# 运行环境循环
for i in range(1000):
    env.render()  # 渲染环境
    action = np.random.randint(0, 2)  # 随机选择动作(0或1)
    state, reward, terminated, _, _ = env.step(action)  # 执行动作并获取新状态、奖励和终止标志
    if terminated:
        state = env.reset()  # 如果回合结束,则重置环境

env.close()  # 关闭环境

有报错,缺少库pygame,报错位置在cartpole.py的第222行

Traceback (most recent call last):
  File "D:\env\anaconda\envs\test38\lib\site-packages\gym\envs\classic_control\cartpole.py", line 219, in render
    import pygame
ModuleNotFoundError: No module named 'pygame'
...
    result = env.render(*args, **kwargs)
  File "D:\env\anaconda\envs\test38\lib\site-packages\gym\envs\classic_control\cartpole.py", line 222

打开文件后找到相关位置,发现如果不设置渲染参数,则会导入pygame.所以要么修改渲染参数[ 使用’rgb_array’模式进行渲染,这将返回一个图像数组而不是显示图像],要么导入对应的库。

在这里插入图片描述会出现曾经安装过库pygame,为什么现在会报错?当然从没安装过,当然会报错。原因在于,调用gym的时候会使用一个虚拟环境,比如我的虚拟环境是test38.可以根据第一部分文件路径在site-packages中查找有没有pygame的文件夹。如果没有,则没有安装成功。

虚拟环境中安装库

  1. 在终端中激活虚拟环境conda activate test38
  2. 安装pip install pygame

在jupyter中使用gym
思路:在虚拟环境中安装ipykernel,然后将虚拟环境添加到jupyter内核中。
3. 在终端中激活虚拟环境conda activate test38
4. 安装·pip install ipykernel
5. 在激活的虚拟环境(终端)中,运行python -m ipykernel install --user --name myenv --display-name “My Python Environment”
例如:python -m ipykernel install --user --name test38 --display-name "Python (test38)"
6.重新打开jupyter,选择路径。如下修改
在这里插入图片描述
7. 在jupyter中,import gym,不报错则成功使用。

2.2 CartPole-v1的“切片”展示

CartPole问题是一个控制问题,其中一根杆子通过一个非驱动关节连接到一辆推车上,推车沿着一条无摩擦的轨道移动。钟摆直立在车上,目标是通过在推车上施加左右方向的力来平衡杆子,使其尽可能长时间地保持直立。同时,在上述行为的作用下,推车速度降低或提高的速度并不是固定的,而是取决于杆子所指向的方向(因为杆子重心的改变使得移动推车所需的能量改变)。

当前面的代码解决了运行问题后,发现动态结果无法保存。我们先采用外部的工具去捕捉个别几帧的图像。

import gym
import numpy as np
import matplotlib.pyplot as plt

# 创建CartPole环境,指定渲染模式为'rgb_array'
env = gym.make('CartPole-v1', render_mode='rgb_array')
# 初始化环境
state = env.reset()

# 运行环境循环
for i in range(1000):
    # 每隔100步渲染一次
    if i % 100 == 0:
        image = env.render()  # 渲染环境并获取图像数组 
        plt.imshow(image) 
        plt.axis('off')  # 关闭坐标轴
        plt.show()  # 显示图像
    action = np.random.randint(0, 2)  # 随机选择动作(0或1)
    state, reward, terminated, _, _ = env.step(action)  # 执行动作并获取新状态、奖励和终止标志
    if terminated:
        state = env.reset()  # 如果回合结束,则重置环境

env.close()  # 关闭环境

通过额外的步骤获取屏幕图像:"image=……” ,这里“render_mode="rgb_array”把env.render该为数组模式,所以,打印image是一个数组。通过截图获得(1,2,3,4,5,6)图像如下所示:

在这里插入图片描述 在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

2.3 使用 wrappers渲染-报错

错误的使用

import gym
import numpy as np
from gym import wrappers

# 指定保存视频的目录
save_dir = './cartpole_videos'

# 使用wrappers.Monitor来包装环境
# 注意:这里我们不再需要指定render_mode='rgb_array',因为Monitor会自动处理渲染和录制
env = wrappers.Monitor(gym.make('CartPole-v1'), save_dir, force=True)

# 初始化环境
state = env.reset()

# 运行环境循环
for i in range(1000):
    # 这里我们不再需要手动渲染图像
    action = np.random.randint(0, 2)  # 随机选择动作(0或1)
    state, reward, terminated, _, _ = env.step(action)  # 执行动作并获取新状态、奖励和终止标志
    if terminated:
        print("上个循环的结束点:", i)
        state = env.reset()  # 如果回合结束,则重置环境

env.close()  # 关闭环境

出现了报错
在这里插入图片描述
打开wrappers中的__init__.py文件,发现导入中,的确没有 Monitor 函数
在这里插入图片描述
经验证发现:在最新版本的 Gym(24.3.1)中,wrappers.Monitor 确实已经被移除或替换.

修正一

为了录制 Gym 环境的视频,你可以使用 Gymnasium 库,这是 Gym 的一个后续项目,旨在提供更新和更好的功能。在 Gymnasium 中,录制视频的功能已经通过 wrappers.RecordVideo 类得到了实现。

import  gym  # 导入Gymnasium库
import numpy as np
from gym.wrappers import RecordVideo  # 从Gymnasium导入RecordVideo

# 指定保存视频的目录
video_dir = './cartpole_videos'

# 创建环境并包装它以录制视频
# 注意:这里我们使用gymnasium的make函数来创建环境
env = RecordVideo(gym.make('CartPole-v1', render_mode='rgb_array'), video_folder=video_dir)

# 初始化环境
state = env.reset()

# 运行环境循环
for i in range(1000):
    action = np.random.randint(0, 2)  # 随机选择动作(0或1)
    state, reward, done, _ = env.step(action)  # 执行动作并获取新状态、奖励和终止标志
    # 注意:在Gymnasium中,terminated被替换为done
    if done:
        print("上个循环的结束点:", i)
        state = env.reset()  # 如果回合结束,则重置环境

env.close()  # 关闭环境

发现又有了报错,又缺少了库moviepy

在这里插入图片描述

  1. 终端激活虚拟环境"test38"
  2. 安装pip install moviepy

💡提醒
video_dir = './cartpole_videos'创建视频目录的时候,要保证这个目录不存在。多次尝试运行的时候,记得提前删除这个目录。否则报错。

✋ 又bug
正常来说,state, reward, done, _= env.step(action) # 执行动作并获取新状态、奖励和终止标志 是返回四个变量,但不知为啥返回了5个变量。最简单的解决方法,就是增加一个变量。
state, reward, done, _,d = env.step(action) # 执行动作并获取新状态、奖励和终止标志

2.4 使用 wrappers渲染-完美

如果出现某库没有导入的情况,记得在虚拟环境中安装。例如有:pygame,moviepy

完美代码

import gymnasium as gym  # 导入Gymnasium库 
# import gym 这两个你下载的那个就导入哪个
import numpy as np
from gymnasium.wrappers import RecordVideo  # 从Gymnasium导入RecordVideo

# 指定保存视频的目录
video_dir = './cartpole_videos'

# 创建环境并包装它以录制视频
# 注意:这里我们使用gymnasium的make函数来创建环境
env = RecordVideo(gym.make('CartPole-v1', render_mode='rgb_array'), video_folder=video_dir)

# 初始化环境
state = env.reset()

# 运行环境循环
for i in range(1000):
    action = np.random.randint(0, 2)  # 随机选择动作(0或1)
    state, reward, done, _,d = env.step(action)  # 执行动作并获取新状态、奖励和终止标志
    #本应该是4个数据,不知道出什么问题了,返回5个数据。如下:
    #env.step(action) returned: (array([ 0.01718894, -0.40361807,  0.05589583,  0.6464533 ], dtype=float32), 1.0, False, False, {})
    #为避免报错,输出变量增加了一个d
    # 注意:在Gymnasium中,terminated被替换为done
    if done:
        print("上个循环的结束点:", i)
        state = env.reset()  # 如果回合结束,则重置环境

env.close()  # 关闭环境

其结果生成的文件为4个动态小视频

在这里插入图片描述

其中一个动态视频视频展示为:

rl-video-episode-0


http://www.kler.cn/a/454186.html

相关文章:

  • (附源码)基于springboot的酒店餐饮预定管理系统 用户前台管理后台 P10062
  • 【ETCD】【实操篇(十三)】ETCD Cluster体检指南:健康状态一键诊断,全方位解析!
  • 力扣第118题:杨辉三角 - C语言解法
  • 前端安全 常见的攻击类型及防御措施
  • HotpotQA多跳问答数据集;Kaggle在线数据科学和机器学习竞赛平台
  • ROSboard:为您的机器人提供强大的Web可视化工具
  • 音视频入门基础:MPEG2-TS专题(22)——FFmpeg源码中,获取TS流的音频信息的实现
  • 云手机:Instagram 账号管理新机遇
  • 5.Python爬虫相关
  • C05S14-MySQL高级语句
  • 【Unity开发】低版本HDRenderPipeline升级到HDRP14.x版本问题笔记
  • 【数据结构与算法】排序算法(下)——计数排序与排序总结
  • 依图科技简介
  • 生产管理系统PHP+Uniapp源码
  • CentOS Stream 9 挂载Windows共享FTP文件夹
  • Linux 网络配置基础
  • 运动控制卡网络通讯的心跳检测之C#上位机编程
  • CSS系列(37)-- Overscroll Behavior详解
  • 论文解读 | EMNLP2024 一种用于大语言模型版本更新的学习率路径切换训练范式
  • 云上「算力浪费」,正在掣肘企业应用落地。