OpenAI Gym 有大量已定义的环境,同时自己也完全可以定一个环境来进行操作(免费)。
我们这里定义一个箭头跟随圆点移动的例子。
1、在Python\Python38\Lib\site-packages\gym\envs 下的 __init__.py 文件中自定义一个环境
id=BallView-v0,这个在主程序中调用的id号
BallEnv是需要新建环境的类名
#自定义环境
register(
id='BallView-v0',
entry_point='gym.envs.classic_control:BallEnv',
max_episode_steps=200,
reward_threshold=195.0,
)
2、我们定义的环境classic_control目录底下,这里还有一个 __init__.py 文件,加入如下代码,从环境源文件BallView_v0.py中导入类
from gym.envs.classic_control.BallView_v0 import BallEnv
3、新建BallView_v0.py
按照官方的说法,包括seed(), step(),reset()和render()几个函数,这个我们可以自行调整。我在使用step()的时候,提示TypeError: 'float' object is not callable,和time_limit.py 的类有冲突,
一直找不到原因,所以这里改为step_do(),如果谁知道怎么处理,麻烦告诉我。这里我们加入了主程序段 if __name__ == '__main__': 方便先调测。
#ballview-v0-run的独立测试程序 by lhf
import math
import gym
from gym import spaces
from gym.utils import seeding
import numpy as np
from gym.envs.classic_control import rendering
class BallEnv(gym.Env):
"""
Description: 球体在屏幕上方移动,实现对球体的动态追踪
Source:
design by lhf
Observation:
Type: Box(4)
Num Observation Min Max
0 ball X Position 0 640
1 ball Y Position 100 100(480)
2 ball Velocity -Inf Inf
3 Eye Angle -90 deg 90 deg
Actions:
Type: Discrete(2)
Num Action
0 让 eye逆时针旋转
1 让 eye顺时针旋转
"""
metadata = {
'render.modes': ['human', 'rgb_array'],
'video.frames_per_second': 50
}
def __init__(self):
self.screen_width, self.screen_heigh = 640, 480
self.kinematics_integrator = 'euler'
# 定义旋转初始角度,方向
self.degree = 0
self.turnback_left = True