本文主要记录开发逐际动力机器人过程中的学习过程。
主要的仓库是:https://github.com/limxdynamics/pointfoot-legged-gym
该仓库主要继承了legged-gym环境,并使用了Isaac Gymenvs并行训练。
- 了解legged-gym环境基本信息
- 了解wheel-legged的基本文件以及和legged-gym的关系
- 一些启发研究
在这之前, 可以先读一下这个仓库对应的论文: Learning to Walk in Minutes Using Massively Parallel Deep Reinforcement Learnin, https://arxiv.org/pdf/2109.11978
这篇论文是ETH的研究团队于2021年9月在arxiv挂出的。
本文的基本情况:
-
把data collection 和 policy update都放在了GPU中,可以避免CPU和GPU之间的通讯较长而导致训练速度下降。
-
使用的是PPO算法,有几个点需要注意:
-
Batchsize由单个机器人在单词policy update前运动的步数和机器人的数量决定:$B=n_{robots}n_{steps}$,
关于batchsize的选择, 如果太小的话, 会导致policy update时出现更多的噪音现象, 不够连续光滑. 如果太大, 则里面重复的数据会比较多, 导致浪费更新过程, 降低训练速度.
此外, GAE对于$n_{steps}$也有依赖性,
$n_{steps}$ 体现了一个轨迹,它必须有一定的时间连续性, 如果$n_{steps}$低于某个阈值, 算法就无法学习到最优的解。Reset,一般是机器人摔倒了需要重置,或者走了一定步数上限后重置以生成新的轨迹。 -
reset会带来一定的问题,PPO中的critic是在无限视野(infinite horizen)下工作的,用来预测无限长步数后的奖励如何的,引入reset会打断critic的工作条件,导致它的性能下降。
因此有必要分析下重置的情况:
-
第一种是基于失败或达成目标的重置
这种重置对于Critic来说好预测,可以根据获取的状态或者奖励了解到自己是成功还是失败。
-
第二种是基于上限步数或者超时的重置
因为在观测中并不会提供步数/时间的信息,所以critic无法预测这类的重置,导致其对未来的预测出现偏差。
-
-
改进的方法如下:
- 在接口里增加一个信息,区分终止并重置的原因。
- 如果是因为上限步数/超时导致的终止和重置,就使用critic预测的未来奖励来近似无限步后的奖励。
-
本文把框架应用在了legged-robot上,本文的几个新idea如下:
-
课程学习
由于机器人的场景较多,会先从简单的平地开始训练,然后再逐步转移到复杂的台阶上。
-
观测空间,动作和奖励的设计
观测空间包括:基本线性和角速度、重力矢量的测量、关节位置和速度、策略选择的先前操作,最后,从机器人基本周围的网格中采样的 108 次地形测量。
动作空间是机器人各个关节的目标位置,经过一个PD控制器后变成各个关节的力矩。
奖励如下表所示,其中成功跟踪水平方向的速度和绕着z轴(垂直地面)的话就是正向奖励,对z轴方向的速度或者绕着水平轴方向的旋转,就是惩罚,为了让动作更加流畅,所以对关节扭矩、关节加速度、关节目标更改和碰撞都设置了惩罚,最后最右边一排的权重里有一个$dt$,目的是鼓励机器人运行时间长一些。
-
sim2real的gap
实际机器人上会有外力干扰和摩擦力等仿真里没有考虑的因素,有以下几种提升sim2real性能的方法。
最后就是实验结果,可以在原文中看。
这里直接总结一下实验结果:并行的机器人数量太少的时候,会导致数据离独立同分布的假设偏离较大,训练效果不好;当batchsize一定时并行的机器人数量太多,会导致机器人仿真步数太少,导致数据连续性不够强,性能也会下降。
此外,增加机器人数量可以降低仿真时间。
了解了该仓库的算法思路后,就可以分析其工程代码了。
- legged_gym文件树
📁 legged_gym ├──📁 envs │ ├──📁 base │ ├── 📄 base_config.py │ ├── 📄 base_task.py │ ├── 📄legged_robot.py │ └── 📄 legged_robot_config.py | │ ├──📁a1 │ ├──📁... │ └──📄 init.py │ | ├── 📁 scripts │ ├── 📄 play.py │ └── 📄 train.py │ │ ├── 📁 tests │ └── 📄 test_env.py │ │ ├── 📁 utils │ ├── 📄 init.py │ ├── 📄 helper.py │ ├── 📄logger.py │ ├── 📄 math.py │ ├── 📄 task_registry.py │ └── 📄 terrian.py | | └── 📄 init.py
官方给出了一个基本使用说明:
- Each environment is defined by an env file (
legged_robot.py
) and a config file (legged_robot_config.py
). The config file contains two classes: one containing all the environment parameters (LeggedRobotCfg
) and one for the training parameters (LeggedRobotCfgPPo
).- Both env and config classes use inheritance.
- Each non-zero reward scale specified in
cfg
will add a function with a corresponding name to the list of elements which will be summed to get the total reward.- Tasks must be registered using
task_registry.register(name, EnvClass, EnvConfig, TrainConfig)
. This is done inenvs/__init__.py
, but can also be done from outside of this repository.
逐际动力的机器人仓库:https://github.com/limxdynamics/pointfoot-legged-gym
- 关键文件树 📁 legged_gym in pointfoot-legged-gym ├── 📁 envs │ ├── 📄 init.py │ └── 📁 pointfoot │ ├── 📁 flat │ │ └── 📁 WF │ │ └── 📄 pointfoot_flat_config.py │ │ │ ├── 📁 mixed_terrian │ │ └── 📄 pointfoot_rough_config.py │ │ │ └── 📁 WF │ └── 📄 point_foot.py | | ├── 📁 scripts │ ├── 📄 export_policy_as_onnx.py │ ├── 📄 play.py │ └── 📄 train.py | | ├── 📁 tests │ └── 📄 test_env.py | | ├── 📁 utils │ ├── 📄 init.py │ ├── 📄 helper.py │ ├── 📄 logger.py │ ├── 📄 math.py │ ├── 📄 task_registry.py │ └── 📄 terrian.py | | └── 📄 init.py
首先,逐际动力将wheel-legged的机器人直接放在了\legged_gym\envs\WF\point_foot.py里,这里包含了机器人的全部函数,比如reset, step, get_observation, compute_reward, check_termination, render, 等等。
需要注意的是,逐际动力并没有继承原来legged_gym里的基础机器人类BaseTask或者LeggedRobot,而是从头自己写的。
使用的机器人训练参数配置,则分别放在了同一个文件夹路径下的flat
和mixed_terrain
中,因为训练的环境有平地和台阶两种,这里逐际动力并没有使用课程学习,每一次只能使用一个环境,所以配置文件也是分开写的,分别是flat\WF\pointfoot_flat_config.py
和mixed_terrain\pointfoot_rough_config.py
。
这里继承了leggeg_gym的BaseConfig,这部分代码量少,需要修改的也比较少,所以他们直接继承了。
在envs/init.py中,将wheel-legged环境给注册了。
经过注册后,就可以使用scripts/train.py来训练了。具体的注册以及注册后如何指定wheel-legged来训练的过程我在这里不详细展开,当作一个黑盒即可。
Q:如何修改奖励函数?
A:通过前面分析可知,以平地环境为例子,则找legged_gym/envs/flat/WF/pointfoot_flat_config.py
,在这里找到PointFootFlatCfg.rewards,就可以看到奖励函数的设定了。
Q:如何修改PPO网络的参数?
A:以台阶环境为例,找到legged_gym/envs/pointfoot/mixed_terrain/pointfoot_rough_config.py
,找到PointFootRoughCfgPPO,就可以看到PPO的参数了。
可能是逐际动力还没考虑让wheel-legged机器人在台阶环境里训练,所以默认没有给它设计台阶环境的配置文件,只能在平地上训练。但经过我们分析文件结构后,我们可以自己改写。
启发研究: 游戏中上下楼梯问题的解决思路: https://www.youtube.com/watch?v=GnOmGdMh7ww