强化学习仿真器Raisim进行深度强化学习的初步尝试

本文主要结合Raisim官方实例,介绍如何使用Raisim进行深度强化学习。本文主要参考了Raisim官方文档,以及Raisim的github仓库中的一些例子。部分内容使用AI辅助生成。

raisimGymTorch是raisim的Gym环境示例。还提供了一个简单的基于pytorch的RL框架,但它应该可以很好地与任何其他RL框架配合使用。该项目使用pybind11作为python接口,这样的好处是将矢量化环境包装在C++中,以便使用OpenMP在C++中完成并行化,这极大地提高了仿真速度。这里直接上官方的图。

如图所示,该框架定义了Environment类型,在该类中完成环境的定义。然后VectorizedEnvronmentEnvironment进行矢量化,以便在C++中进行并行化。最后riasim_gym.cppRaisimVecEnv.py使用pybind11将上述C++环境封装成python包供其他RL框架调用。并行化的过程是在C++中完成的,因此可以大大提高仿真速度。

RaisimGymTorch的使用可以参考官方文档,但事实上该文档写的并不是很详细,因此本文将对其进行补充。也可以结合示例来进一步研究。

RaisimGymTorch的目录结构

RaisimGymTorch位于raisimGymTorch文件夹下,目录结构如下:

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
C:.
│ CMakeLists.txt # cmake文件, 用于编译但不要直接使用该文件编译,而是使用setup.py编译
│ LICENSE
│ README.md
│ setup.py # 用于编译raisimGymTorch的脚本文件,使用python setup.py develop编译
│ __init__.py
|
├───raisimGymTorch # raisimGymTorch库,核心文件夹
│ ├───algo # algorithm文件,自带了一个ppo算法,添加其他算法可以在这里添加
│ │ │ __init__.py
│ │ └───ppo
│ ├───env # env文件夹,用于存放环境文件,非常重要的文件夹,
# 修改环境时需要修改这里的文件,
# c++和python的交互也是通过这里的文件进行的
│ │ │ Common.hpp
│ │ │ debug_app.cpp # c++部分封装成py库后还想调试需要用这个
│ │ │ RaisimGymEnv.hpp # 环境基类,自己定义环境需要继承这个类
│ │ │ RaisimGymVecEnv.py # VectorizedEnvironment封装成py之后的再次封装文件,
# 用于和其他RL框架配合使用,就是一个语法糖
│ │ │ raisim_gym.cpp # 使用pybind11将VectorizedEnvironment封装成py库
│ │ │ Reward.hpp # 奖励函数,用来记录奖励,具体的奖励函数需要自己定义
│ │ │ VectorizedEnvironment.hpp # 矢量化环境,用于并行化,这个文件不要修改,
# 该文件将自定义的环境并行化
│ │ │ Yaml.cpp # yaml文件读取,用于读取配置文件
│ │ │ Yaml.hpp
│ │ │ __init__.py
│ │ │
│ │ ├───bin # c++编译出来的python包会出现在这里,也可以在cmakelists中修改
│ │ └───envs # 这里面就是各种环境了,可以参考这里的环境来自己定义环境
│ │ └───rsg_anymal # 这是一个四足机器人使用PPO算法的例子
│ │ cfg.yaml
│ │ Environment.hpp # 这个Environment.hpp是自己定义的环境, 继承RaisimGymEnv.hpp
│ │ runner.py # 这个是训练的主程序
│ │ tester.py
│ │
│ ├───helper # 杂项,包括了一些辅助函数,不用管
│ │ raisim_gym_helper.py
│ │ __init__.py
│ │
│ └───stable_baselines3 # 按照stable_baseline3格式封装并行化环境的例子
│ anymal.py # 上述rsg_anymal例子的训练主程序,按照stable_baseline3的格式封装的
│ RaisimSbGymVecEnv.py # 这个文件是将VectorizedEnvironment封装成stable_baseline3格式的环境
│ __init__.py

└───thirdParty # 第三方库pybind11
└───pybind11

核心文件定义

本部分介绍raisimGymTorch的核心文件,了解这些文件的结构有助于理解raisimGymTorch的工作原理,也有助于自己定义环境。核心文件的调用关系如下图所示,该图中RaisimGymEnv需要自行继承修改,其他文件不需要修改,但是可以了解其作用。

RaisimGymEnv.hpp

该文件是定义环境的基类,所有自定义的环境需要继承该类来定义。该类定义了环境的基本接口,包括了初始化,重置,step,以及其他一些接口。该类的定义如下:

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
27
28
29
30
class RaisimGymEnv {

public:
explicit RaisimGymEnv (std::string resourceDir, const Yaml::Node& cfg) :
resourceDir_(std::move(resourceDir)), cfg_(cfg) { }

virtual ~RaisimGymEnv() { if(server_) server_->killServer(); };

/////// implement these methods /////////
virtual void init() = 0; // 初始化函数,用于初始化环境
virtual void reset() = 0; // 重置函数,用于重置环境

virtual void observe(Eigen::Ref<EigenVec> ob) = 0;
// 观测函数,用于获取观测值,注意可观向量的维度

virtual float step(const Eigen::Ref<EigenVec>& action) = 0;
// step函数,用于执行动作,返回奖励值,输入为动作,输出为奖励值

virtual bool isTerminalState(float& terminalReward) = 0;
// 判断是否为终止状态,如果是终止状态,返回true,并将终止奖励值赋值给terminalReward
////////////////////////////////////////

/////// optional methods ///////
virtual void curriculumUpdate() {};
virtual void close() {};
virtual void setSeed(int seed) {};
////////////////////////////////
//***部分代码省略***//

};

编译raisimGymTorch与定制化自己的环境

raisimGymTorch框架编译使用pybind11库将c++文件编译为python包,因此有必要了解一些pybind11的基本用法。pybind11的使用可以参考官方文档,这里主要介绍一下如何编译raisimGymTorch,以及如何自定义环境。

使用 python setup.py develop命令即可编译raisimGymTorch,编译完成后会在raisimGymTorch文件夹下生成build文件夹,该文件夹下包含了编译出来的python包,在raisimGymTorch/raisimGymTorch/env/bin目录下会生成最终编译的包。编译完成后,可以在python中使用import raisimGymTorch来导入raisimGymTorch包。(在安装raisim到/usr/local后无需如官方教程所示指定--CMAKE_PREFIX_PATH路径)。

该编译脚本将会调用CMakeLists.txt文件完成编译,因此修改这个文件可以自定义编译内容。具体自定义路径的方法如下。

  • 修改包名称:您可以在 setup.py 中找到它(name=’raisim_gym_torch’)。这是您将在 anaconda 环境的目录中找到的名称site_packages。
  • 修改目录名称:这是您可以在顶部raisimGymTorch目录中找到的目录名称。默认名称也是 raisimGymTorch 目录。如有必要,请对其进行修改。然后,您必须修改 runner.py 和 CMakeLists.txt 标头中的目录。
  • 修改二进制名称:这是环境目录的名称。默认名称为 rsg_anymal。如果更改目录名称,则必须重命名 runner.py 文件中的rsg_anymal。
  • 修改环境名称:这是将从 Environment.hpp 文件生成的二进制文件的名称。默认名称是RaisimGymVecEnv。您可以在raisim_gym.cpp文件中找到它。如果更改它,您还必须更改文件名 runner.py 文件。

结语

本文简要介绍了RaisimGymTorch的使用,对官方文档做了一些补充说明,以及对核心文件进行了简要介绍。方便后续查阅。Raisim也提供RaisimPy接口可以更方便的与python进行交互,但是由于RaisimPy是单线程的,因此在强化学习中使用的话速度会比较慢。此外Raisim还提供Matlab接口,但由于强化学习多使用python,因此这里不做介绍,有兴趣的可以自行研究。


EOF