本文将会记录与讲解使用legged_gym上手实践训练机器人的操作步骤。
一、导入机器人
这里选择宇树的G1机器人,进入宇树文档中心,在“RL例程”中找到相关资料并下载:https://support.unitree.com/home/zh/G1_developer/rl_control_routine
翻一翻文件夹可以发现,宇树提供了几款机器人的源码,分别是g1,g2,h1等:
同时准备好legged_gym项目文件夹,结构应该是这样的:
- 将机器人源码中的/unitree_rl_gym/resources/robots/g1_description文件夹复制到legged_gym文件夹的legged_gym/resources/robots/中:
- 接着把envs/中的g1文件夹复制到legged_gym的envs中:
- 在legged_gym/legged_gym/envs/init.py中增加注册机器人(三行注释为#添加的 的代码):
from legged_gym import LEGGED_GYM_ROOT_DIR, LEGGED_GYM_ENVS_DIR
from legged_gym.envs.a1.a1_config import A1RoughCfg, A1RoughCfgPPO
from .base.legged_robot import LeggedRobot
from .anymal_c.anymal import Anymal
from .anymal_c.mixed_terrains.anymal_c_rough_config import AnymalCRoughCfg, AnymalCRoughCfgPPO
from .anymal_c.flat.anymal_c_flat_config import AnymalCFlatCfg, AnymalCFlatCfgPPO
from .anymal_b.anymal_b_config import AnymalBRoughCfg, AnymalBRoughCfgPPO
from .cassie.cassie import Cassie
from .cassie.cassie_config import CassieRoughCfg, CassieRoughCfgPPO
from .a1.a1_config import A1RoughCfg, A1RoughCfgPPO
from .go2.go2_config import GO2RoughCfg, GO2RoughCfgPPO
from legged_gym.envs.g1.g1_config import G1RoughCfg, G1RoughCfgPPO #添加的
from legged_gym.envs.g1.g1_env import G1Robot #添加的
import os
from legged_gym.utils.task_registry import task_registry
task_registry.register( "anymal_c_rough", Anymal, AnymalCRoughCfg(), AnymalCRoughCfgPPO() )
task_registry.register( "anymal_c_flat", Anymal, AnymalCFlatCfg(), AnymalCFlatCfgPPO() )
task_registry.register( "anymal_b", Anymal, AnymalBRoughCfg(), AnymalBRoughCfgPPO() )
task_registry.register( "a1", LeggedRobot, A1RoughCfg(), A1RoughCfgPPO() )
task_registry.register( "cassie", Cassie, CassieRoughCfg(), CassieRoughCfgPPO() )
task_registry.register( "go2", LeggedRobot, GO2RoughCfg(), GO2RoughCfgPPO() )
task_registry.register( "g1", G1Robot,G1RoughCfg(), G1RoughCfgPPO() ) #添加的
二、训练机器人
重要训练参数讲解
首先讲一下训练的命令需要设置的重要参数:
-
--task
:- 描述:指定任务类型,默认值是
anymal_c_flat
。这个参数决定了训练的具体任务,anymal_c_flat
是指使用平地行走任务。
- 描述:指定任务类型,默认值是
-
--resume
:- 描述:是否从已保存的检查点恢复训练,默认为
False
。如果为True
,训练将从上次中断的地方继续。
- 描述:是否从已保存的检查点恢复训练,默认为
-
--experiment_name
:- 描述:实验名称,用于标识当前的实验,默认情况下会覆盖配置文件中定义的实验名称。
-
--run_name
:- 描述:运行名称,用于区分不同的训练运行。
-
--load_run
:- 描述:从哪个运行中加载模型,
-1
表示加载最近的运行。
- 描述:从哪个运行中加载模型,
-
--checkpoint
:- 描述:指定加载的检查点编号,
-1
表示加载最新的检查点。
- 描述:指定加载的检查点编号,
-
--headless
:- 描述:如果设置为
True
,则始终关闭可视化。适用于不需要图形界面的训练。
- 描述:如果设置为
-
--horovod
:- 描述:是否启用 Horovod(分布式深度学习库)来进行多GPU训练,默认为
False
。
- 描述:是否启用 Horovod(分布式深度学习库)来进行多GPU训练,默认为
-
--rl_device
:- 描述:指定强化学习算法使用的设备,可以是
cpu
、gpu
或者cuda:0
等。
- 描述:指定强化学习算法使用的设备,可以是
-
--num_envs
:- 描述:要创建的环境数量。通常用于并行化训练,如果不指定则使用配置文件中的值。
-
--seed
:- 描述:设置随机种子,用于确保实验的可重复性。
-
--max_iterations
:- 描述:最大训练迭代次数,超出此次数后停止训练。
用途和调参
-
--task
:选择任务类型,行走任务(如anymal_c_flat
)将帮助机器人训练走路。 -
--num_envs
:根据硬件和并行能力调整环境数量。更多环境有助于加速训练,尤其是在GPU上。 -
--rl_device
:如果在GPU上训练,使用cuda:0
或cuda:1
;若在CPU上训练则指定为cpu
。对于大规模训练,使用GPU会更高效。 -
--seed
:设置随机种子以确保每次训练都从相同的初始状态开始,便于调试和比较。 -
--max_iterations
:可以设置最大训练迭代次数以控制训练时间,初期可以设置较小的值来调试。 -
--horovod
:若使用多个GPU进行分布式训练,可启用 Horovod 来加速训练。
以上复制于gpt,下面我用自己写一下自己的理解:
--task
:名字取决于在任务注册中注册的名字--num_envs
:数量决定了同一时间的机器人agent有几个,相当于是batch_size
--max_iterations
:设置最大迭代次数,一般为三四千,算法会达到收敛--headless
:加上这条可以不开可视化,会快很多--load_run
: str类型参数,代表运行的策略的任务名称--checkpoint
: int类型参数,代表运行的策略编号
举例:
在legged_gym/logs/g1/中保存了所有与g1型号机器人有关的训练结果
- 这边文件夹的名称就是不同的训练过程,也就是任务名称
- 任务里面会随着训练保存一版版的训练结果,也就是策略名称,若指定checkpoint参数为10000,就会调用model_10000.pt
启动训练
先cd到legged_gym/scripts/文件夹处,运行
python train.py --task=g1 --num_env=1000 --headless
开始训练
训练完成后,logs里面就会多一个文件夹,代表这次训练任务的结果保存:
测试结果
如果在同scripts文件夹下直接运行
python play.py --task=g1
会选择最新的任务最新的策略测试
如果想要指定,比如
python play.py --task=g1 --load_run=origin_10000 --checkpoint=10000 --num_env=10
成功运行,其中打印log:
Loading model from: /home/swanchan/IsaacGym_Preview_4_Package/isaacgym/legged_gym/logs/g1/origin_10000/model_10000.pt