上一篇教程中我们讲解了强化学习环境是怎样组织的,这次我们将深入讲解整个IsaacLab强化学习的训练流程。
1.1 RL工程如何运作
这里将会结合简单介绍强化学习工程的运作。
1.1.1 环境载入
在一个主要流程(main)中,我们首先会初始化创建好的强化学习环境。例如在教程(三)中我们设置的环境,会通过gym(gymnasium,这是一个能够打包强化学习环境的工具包,参考链接:https://github.com/openai/gym)进行包装和初始化,包装的目的是在强化学习环境和强化学习算法中提供标准的通讯API,例如env.reset()等。同时,它会给写好的环境和设置好的算法注册一个任务名,方便在更换算法和环境时进行管理。在用gym.make()进行环境初始化时需要载入一些设置,这时就可以载入之前设置的强化学习环境设置类,用ManagerBasedRLEnvCfg进行加载。
env_cfg: ManagerBasedRLEnvCfg = parse_env_cfg(args_cli.task, use_gpu=not args_cli.cpu, num_envs=args_cli.num_envs)
env = gym.make(args_cli.task, cfg=env_cfg, render_mode="rgb_array" if args_cli.video else None)
这样,我们就载入了我们设置好的环境。接下来,我们会介绍一些强化学习框架的算法设置。
1.1.2 强化学习算法库
IsaacLab推荐很多算法框架可供选择,这些算法框架都是支持并行化的强化学习环境的,这与一些其他仿真环境的强化学习框架(如stablebaselines等)有一些区别,我们将简单介绍一下这些框架。
(1)skrl,链接: https://github.com/Toni-SM/skrl 。
笔者在IsaacGym的开发中使用过这个库,这个库提供的算法比较多,封装的非常好,直接使用起来比较方便,但是如果你需要自定义强化学习的算法时,则需要参考一些工程 (https://github.com/PKU-MARL/DexterousHands )来自定义。整体上来说写自己的算法会比较方便。
(2)rlgames,链接:https://github.com/Denys88/rl_games 。
这个库的可读性比skrl差一些,需要有一定的强化学习框架开发基础才比较好上手。根据官方的介绍和文档,rlgames整体上功能和效果与其他框架也差不多。使用这个框架的项目据笔者了解比较少,笔者也没有实际开发过这个框架,因此不过多评价。
(3)rsl-rl,链接: https://github.com/leggedrobotics/rsl_rl。
这个库是IsaacLab官方模板使用的一个库,上手也是非常简单,代码量少,整体逻辑与其他库差不多,整体比较简洁。缺点就是现在官方的算法示例只有ppo,如果你希望尝试一些其他的强化学习算法(sac、td3等),则需要自己修改和移植一下其他库的代码。后续的教程将主要以rsl-rl这个库为基础展开。
1.1.3 强化学习任务设置
我们现在先看RSL-RL这个算法的工程流程:
训练:https://github.com/NathanWu7/isaacLab.manipulation/blob/main/scripts/rsl_rl/train.py
推理:https://github.com/NathanWu7/isaacLab.manipulation/blob/main/scripts/rsl_rl/play.py
首先就是进行一些设置,isaaclab提供了任务设置的管理接口:RslRlOnPolicyRunnerCfg,通过这个接口可以管理这个库的各项设置,在设置后可以用rls-rl库中的函数OnPolicyRunner创建任务,这里会需要封装好的环境和算法设置,如以下代码:
agent_cfg: RslRlOnPolicyRunnerCfg = cli_args.parse_rsl_rl_cfg(args_cli.task, args_cli)
runner = OnPolicyRunner(env, agent_cfg.to_dict(), log_dir=log_dir, device=agent_cfg.device)
其中,env就是刚刚我们gym.make的环境,然后我们就可以用runner训练策略了,如下图:
在训练之后,我们可以通过get_inference_policy获取训练好的策略,注意在推理中,我们需要单独实现动作的获取和环境的刷新,如下段代码:
# reset environment
obs, _ = env.get_observations()
# simulate environment
while simulation_app.is_running():
# run everything in inference mode
with torch.inference_mode():
# agent stepping
actions = policy(obs)
# env stepping
obs, _, _, _ = env.step(actions)
# close the simulator
env.close()
在这里,将并行环境数量调至1后,我们可以单独做一个真实世界的强化学习环境并封装,也可以单独做obs和actions的真实系统接口,这样就能够将我们训练好的policy部署在真实系统上了,在后续的教程中会简单进行教学。
1.2 RL工程实战
按照教程https://github.com/NathanWu7/isaacLab.manipulation/blob/main/README.md 中Usage部分,跳过导入自定义机器人,在isaacLab.manipulation/isaacLab/manipulation/algorithms文件夹下安装好RSL-RL,就可以直接执行示例代码了:
python3 scripts/rsl_rl/train.py --task Template-Isaac-Reach-Franka-v0 --num_envs 4096 --headless
这段代码在IsaacLab中同时开了4096个环境来跑通过gym注册的Template-Isaac-Reach-Franka-v0 这个任务,这个任务通过Runner管理,跑的时候会执行Runner.learn()。–headless指令使得isaaclab不会打开图形化窗口,在后续的测试环节中不加这个指令则会自动打开可视化窗口。在刚打开时,可以看到这些信息:
这些信息就是我们在教程(三)中提到的各种设置,具体细节我们等下个教程再介绍,此外我们还能看到:
这一部分显示了强化学习算法设置中的Actor和Critic网络结构,最后是训练日志,会显示奖励信息。目标信息等,最下面的total time表示已经训练的时间,ETA表示剩余时长。在训练完成后,运行测试指令:
python3 scripts/rsl_rl/play.py --task Template-Isaac-Reach-Franka-Play-v0 --num_envs 16
这时,会打开图形窗口,展示训练的效果:
到这里,整个强化学习的训练流程就已经完成了。在后续教程中,我们会介绍强化学习主要元素obs、action、reward等设置方法,以及如何将策略应用在真实的机器人系统上。