在系列教程(二) 自定义机器人中,我们介绍了如何导入自定义机器人的usd并且进行设置,这些定义好的自定义机器人类在强化学习环境中可以直接引用。接下来,我们将进行强化学习环境(env)部分的设置。
1.1 强化学习环境创建:Direct方式
IsaacLab提供了两种组织强化学习环境的方式,一种叫Direct,一种叫manager_based,这两种方式各有优点,我们先分别介绍一下:
Direct方式的优点是设置非常直观,方便定制化系统,使用某些特殊算法时较为方便,但是扩展性没有那么强。
在Direct方式中,我们会在一个env.py文件中实现强化学习环境所需要的所有步骤和功能,并用一个额外的文件设置一些环境和强化学习训练的参数,举例:
了解isaac gym的同学可以发现,这个方式非常像isaac gym里强化学习环境的组织方式,当然接口有很大的区别,但总体来说还是比较易懂的。
(1)AnymalCFlatEnvCfg,我们可以在这个设置类中导入自定义的机器人,Flat地形和力传感器,并进行一些基本物理参数和奖励参数的设置,这一部分可以作为一个基本类,因为后续各种环境的变体都会载入这个基本类。
(2)AnymalRoughEnvCfg,这个类在第一部分的基础上增加了地形设置,和高度传感器。相当于基本类的变体。 前两部分主要是针对isaac sim物理环境的设置,而接下来的第三部分,AnymalCEnv就是强化学习环境的设置了。
(3)在第三部分中,我们会载入前两部分的设置,并且实现强化学习基本元素Action,Observation和Reward的函数,此外还会实现dones部分依照id进行reset。具体的Tensor和并行化我们再这里就不讲解了,可以先参考IsaacGym的部分教程,以理解整个环境并行化的运作方式:https://github.com/isaac-sim/IsaacGymEnvs,还可以参考IsaacLab的官方文档:
https://isaac-sim.github.io/IsaacLab/source/tutorials/03_envs/create_direct_rl_env.html。
其中,值得注意的是Action部分,从强化学习决策网路Actor输出的值会经过一系列处理(Pre_physics_step和apply_action),最后变换为机器人每个关节的位置或者速度控制量,而通常情况下,我们需要加一些限制条件以限制Action的范围,这取决于具体的机器人。
最后,Direct方式的强化学习环境就设置好了,我们可以在外部封装后,使用一些强化学习环境进行训练。
1.2 强化学习环境创建:Manager based方式
1.2.1 工程文件结构
Manager based方式可以看作一种基于Direct方式的高级封装,管理起来十分方便,扩展性也强,但需要看的接口也比较多。目前存在的很多扩展工程框架都是基于Manager based的方式的,包括笔者的Isaaclab.manipulation,从Isaacgym到isaaclab的总体使用感觉上,推荐使用manager based方式建立自己的工程。这里我们不按照官方的例子进行,因为目前开发者提供的模板更加适合进行自定义工程的实现,我们将以这个仓库为基础进行讲解:https://github.com/NathanWu7/isaacLab.manipulation
其中,assets部分提供了教程(二)自定义机器人的一些例子,而tasks部分则是强化学习环境,这里你可以命名自己的任务,例如reach任务,需要机械臂末端到达某一个位置,在reach任务中除了init以外有三个部分:
(1)config. 这里存放了每种机械臂具体的设置文件和控制文件。
(2)mdp. 这里存放了强化学习各个元素的设置文件。
(3)env_cfg.py 这个文件组织起了强化学习的环境,是主要的文件,与direct方式中env.py起到的作用类似。我们再这里主要看reach_env_cfg.py,其他部分将在后续教程中进行介绍。
在env_cfg.py中,我们可以看到很多管理器,例如ReachSceneCfg、CommandsCfg、ActionCfg等,这些管理器分别实现了对于不同功能的管理,我们将逐一进行简单的介绍。
1.2.2 强化学习环境的创建
在env_cfg.py中,所有的设置通过ReachEnvCfg进行统一的管理和创建,我们可以看到在代码段的最后,所有的Cfg都会加载和初始化,以完成强化学习环境的创建,我们将逐一对这些Cfg进行介绍:
(1)ReachSceneCfg。 这个Cfg会导入光照、地面、机器人和物体。其中,机器人部分会单独通过后续类的重载进行导入,这里不用管,物体也可以单独用类的重载导入,但我们这里仅导入了桌子,方式就比较直接。
(2)CommandsCfg。 这个Cfg可以设置一些指令,例如初始化随机指令,可以随机物体的状态,使强化学习的策略更加鲁棒。
(3)ActionsCfg。 这个Cfg可以设置具体的动作,这个动作接收Actor网络输出的结果,通过设定一些映射参数以变换到实际的机器人运动上。在这里我们也没有直接创建,而是与(1)中的机器人部分一起重载,这些设置起来更加方便和定制化,不同的机器人有不同的动作参数。
(4)ObservationCfg。 这个Cfg管理了强化学习环境中的观测量,每个观测量都通过mdp中的函数获取。
(5) EventCfg:这个Cfg可以设置机器人初始化时的状态,也可以通过EventTerm设置一些其他事件。
(6)RewardCfg: 这个Cfg设置了总的奖励函数,通过mdp设置了不同的奖励后,通过这个部分统一为一个奖励函数。
(7)TerminationsCfg: 这个Cfg可以设置触发什么条件终止这一幕(Episode),可以设置任务的失败和成功条件。
(8)CurriculumCfg: 这个Cfg控制课程学习(Curriculum learning)这一方法,简单来说就是在训练一段时间后可以更改一些奖励的权重,增加或减少,使得智能体在不同的阶段能够学习到不同的目标。在这个例子中,我们希望在一段时间后智能体能学习到以最小的action和joint velocity完成任务。
以上就是所有的Cfg了,最后这些Cfg都会通过ReachEnv加载,构成一个强化学习的环境,我们的下一个教程将会介绍整个工程的运作思路。
版权归原作者 NathanWu7 所有, 如有侵权,请联系我们删除。