OpenAI-Gym-render画基本形状

  |  

摘要: OpenAI gym 中 用 Render 画基本形状

【对算法,数学,计算机感兴趣的同学,欢迎关注我哈,阅读更多原创文章】
我的网站:潮汐朝夕的生活实验室
我的公众号:算法题刷刷
我的知乎:潮汐朝夕
我的github:FennelDumplings
我的leetcode:FennelDumplings


在文章 OpenAI-Gym入门 中,我们以 CartPole-v1 环境为例学习了 OpenAI Gym 的基本用法。在文章 OpenAI-Gym神经网络策略及其训练 中,我们依然是以 CartPole-v1 为例,学习了策略梯度算法及其实现,并用 Keras 实际训练了一个神经网络策略。

在实际业务场景中,我们需要自己实现环境,也就是继承 gym.Env,然后重新实现 reset, step, render 等函数。本文我们主要看一下 render 这个函数,也就是对环境可视化这块。


Gym 简单画图

(1) 直线

首先导入 Gym 中的渲染模块

1
from gym.envs.classic_control import rendering

定义一个自己的环境类,继承 gym.Env,可以添加元数据来改变渲染环境时的参数,在 init() 中定义一个画板,然后重载 render 方法,写自己的画图逻辑。

其中直线是用 rendering.Line 定义的。代码中的直线元素的方法 set_color 是添加颜色,画板的方法 add_geom 是将元素画到画板上。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class StraightEnv(gym.Env):
metadata = {
"render.modes": ["human", "rgb_array"],
"video.frames_per_second": 2
}

def __init__(self):
# 初始化一个画板,参数为长和宽
self.viewer = rendering.Viewer(600, 400)

def render(self, mode="human", close=False):
# 元素
line1 = rendering.Line((100, 300), (500, 300))
line2 = rendering.Line((100, 200), (500, 200))
# 给元素加颜色
line1.set_color(0, 0, 0)
line2.set_color(0, 0, 0)
# 把元素添加到画板
self.viewer.add_geom(line1)
self.viewer.add_geom(line2)

return self.viewer.render(return_rgb_array = mode == "rgb_array")

env = StraightEnv()
while True:
env.render()

结果如下

注意:画板的水平方向是 x 轴,垂直方向是 y 轴,原点在左下角。

(2) 圆

画圆形与画双直线主要的区别在 render 函数内部,其它代码基本一样。

圆是用 rendering.make_circle() 定义的。圆心默认是在原点的,也就是在左下角,我们可以用 rendering.Transform(translation=(100, 200)) 和的方式进行平移。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class CircleEnv(gym.Env):
metadata = {
"render.modes": ["human", "rgb_array"],
"video.frames_per_second": 2
}

def __init__(self):
self.viewer = rendering.Viewer(600, 400)

def render(self, mode="human", close=False):
# 元素(直径为30的圆)
circle = rendering.make_circle(30)
# 平移圆心
circle_transform = rendering.Transform(translation=(100, 200))
circle.add_attr(circle_transform)
# 把元素添加到画板
self.viewer.add_geom(circle)
return self.viewer.render(return_rgb_array = mode == "rgb_array")

env = CircleEnv()
while True:
env.render()

渲染结果如下

(3) 多边形

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class MultiPolylineEnv(gym.Env):
metadata = {
"render.modes": ["human", "rgb_array"],
"video.frames_per_second": 2
}

def __init__(self):
self.viewer = rendering.Viewer(600, 400)

def render(self, mode="human", close=False):
multipolyline = rendering.make_polyline([(50, 200 - 50 * math.sqrt(3))
,(100, 200)
,(200, 200)
,(250, 200 - 50 * math.sqrt(3))
,(200, 200 - 100*math.sqrt(3))
,(100, 200 - 100*math.sqrt(3))
,(50, 200 - 50 * math.sqrt(3))
])
multipolyline_transform = rendering.Transform(translation=(60, 120))
multipolyline.add_attr(multipolyline_transform)
self.viewer.add_geom(multipolyline)
return self.viewer.render(return_rgb_array = mode == "rgb_array")

渲染结果如下


Share