IsaacLab从入门到精通(三) 强化学习环境的创建

CSDN 2024-10-02 17:01:04 阅读 65

在系列教程(二) 自定义机器人中,我们介绍了如何导入自定义机器人的usd并且进行设置,这些定义好的自定义机器人类在强化学习环境中可以直接引用。接下来,我们将进行强化学习环境(env)部分的设置

1.1 强化学习环境创建:Direct方式

IsaacLab提供了两种组织强化学习环境的方式,一种叫Direct,一种叫manager_based,这两种方式各有优点,我们先分别介绍一下:

Direct方式的优点是设置非常直观,方便定制化系统,使用某些特殊算法时较为方便,但是扩展性没有那么强。

在Direct方式中,我们会在一个env.py文件中实现强化学习环境所需要的所有步骤和功能,并用一个额外的文件设置一些环境和强化学习训练的参数,举例:

https://github.com/isaac-sim/IsaacLab/blob/main/source/extensions/omni.isaac.lab_tasks/omni/isaac/lab_tasks/direct/anymal_c/anymal_c_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 强化学习环境的创建

参考代码:https://github.com/NathanWu7/isaacLab.manipulation/blob/main/isaacLab/manipulation/tasks/Robot_arm/reach/reach_env_cfg.py

在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加载,构成一个强化学习的环境,我们的下一个教程将会介绍整个工程的运作思路。



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。