在这里插入图片描述
强化学习的智能体必须和环境交互才能或者reward和observation。对于有些任务,比如机器人的训练任务,在现实中就不能直接实施,需要先在仿真中确保算法没有问题,才能迁移到真实机器人上。这样会节省很多时间,同时也可以减少机器人的磨损。

OpenAI Gym是目前最流行的强化学习虚拟环境。他提供了智能体和环境之间方便易用的接口,使之非常容易的与环境交互、执行动画、获取奖励和生成实时仿真动画。

大量的benchmark environment被封装好,用来比较不同强化学习算法的性能。比如CartPole、MountainCar、inverted Pendulum等环境。

这些环境用来学习强化学习算法或者比较一下自己算法的性能是很好的,但是对于自己的问题,比如量化交易、机器人和自动驾驶等问题就需要建立自己的新的虚拟环境。

Gym和物理引擎结合的很好,对于物理世界的机器人、自动驾驶等任务,都需要物理引擎的介入。目前仿真中有图像引擎和物理引擎,对于物理特性不敏感的任务,物理引擎不需要特别精确,但是对于像机器人、自动驾驶等物理特性强需求的任务,一个好的物理引擎就非常重要。

目前物理引擎有Mujoco、Bullet、ODE、PhysX等。在强化学习领域,使用最多的是Mujoco(Multi-Joint dynamics with Contact),因为在Gym中,对于机器人的连续控制,就是使用Mujoco;同时,Mujoco在很多指标性能上面,也是同行第一的水平,关于这几个引擎的比较,请看论文Simulation Tools for Model-Based Robotics:
Comparison of Bullet, Havok, MuJoCo, ODE and PhysX

Mujoco虽好,但是需要license,学生可以免费申请单机一年的使用权。购买的话license很贵。

仿真软件也有Mujoco、PyBullet、Gazebo、V-REP、Unity(不常用,现在unity出了个unity-ml,用于强化学习训练,unity的渲染是优势)等常见软件。Mujoco使用Mujoco引擎,收费;PyBullet使用Bullet引擎,免费开源,而且在强化学习领域应用甚广,目前谷歌在维护;Gazebo和V-REP是传统机器人仿真软件,使用ODE、Bullet、PhysX等引擎,但是在强化学习领域应用不广,开源代码较少;Unity刚推出不久。

鉴于上,后文选择使用PyBullet作为仿真平台。Pybullet有很多顶尖研究的应用,具体可参考官网PyBullet
在这里插入图片描述

对于训练一个应用强化学习的机器人,常用的流程就是这样
在这里插入图片描述

我们首先了解一下Gym环境。一个Gym环境包含智能体可与之交互的必须的功能。一般包含4个函数(方法):
init:初始化环境类
● step:输入action,输出包含4个项的list:the next state, the reward of the current state, done, info.
● reset:重置state和环境的其他变量
● render:显示实时的视频

所有的Gym环境都包含在PIP包中,并且遵循下面的结构
在这里插入图片描述

这是环境的主目录

```gym-foo/README.md

环境的描述文件

比如这样


gym_foo

gym_foo是一个最简单的Gym环境

安装和注册Gym环境

pip install gym
pip install -e .

测试环境

python test_gym_foo.py

这是pip的安装文件。它描述了环境的名字、版本、依赖等。
```python
from setuptools import setup

setup(name='gym_foo',
          version='0.0.1',
          install_requires=['gym']
)
这个文件注册了环境的id和entry points。
```python
from gym.envs.registration import register

register(
        id='foo-v0',
        entry_point='gym_foo.envs:FooEnv',
)
这个文件只包含一句话
```python
from gym_foo.envs.foo_env import FooEnv
这是环境类的主文件,包含了上文说的4个函数。
```python
import gym
from gym import error, spaces, utils
from gym.utils import seeding

class FooEnv(gym.Env):
    metadata = {'render.modes': ['human']}

    def __init__(self):
        pass

    def step(self, action):
        pass

    def reset(self):
        pass

    def render(self, mode='human', close=False):
        pass

现在,环境已经定义完成,下面可以进行安装和注册环境了。
进入到gym-foo目录,运行pip命令

pip install -e .

-e 参数表示这个包是以”editable”模式安装的。这意味着这个包安装在本地,并且任何对于原始包的任何更改都会反映到环境上面。

最后,测试环境,创建一个新文件:test_gym_foo.py

import gym
import gym_foo

env = gym.make('foo-v0')

如果没有错误,说明环境已经成功安装并且注册到gym env中。

可以使用下面的代码查看所有注册的gym 环境

from gym import envs
import gym_foo

envids = [spec.id for spec in envs.registry.all()]
for envid in sorted(envids):
    print(envid)