Sim-to-Sim 策略转移#
本节提供了使用 Newton 后端进行 sim-to-sim 策略转移的示例。在将策略部署到真实机器人之前,sim-to-sim 转移是一个必不可少的步骤,因为它可以验证策略在不同仿真器上的工作情况。通过 sim-to-sim 验证的策略更有可能在真实机器人上成功。
概览#
本指南展示了如何在 Newton 后端上运行经过 PhysX 训练的策略。虽然该方法适用于任何机器人和物理引擎,但只在使用 PhysX 训练策略的 Unitree G1、Unitree H1 和 ANYmal-D 机器人上进行过测试。
PhysX 训练的策略希望关节和连杆按照 PhysX 解析机器人模型的特定顺序进行。然而,Newton 可能会以不同的关节和连杆顺序解析相同的机器人。
在未来,我们计划使用 robot schema 来解决这个问题,该模式标准化了不同后端之间的关节和链接顺序。
目前,我们通过在 YAML 文件中定义的关节映射重新映射观测和动作来解决这个问题。这些文件指定了 PhysX 顺序(源)和 Newton 顺序(目标)中的关节名称。在策略执行期间,我们使用此映射来重新排列观测和动作,以便与 Newton 正确配合。
所需材料#
通过 PhysX(RSL-RL)训练的策略checkpoint。
位于
scripts/newton_sim2sim/mappings/
下的机器人关节映射 YAML 文件。提供的player脚本:
scripts/newton_sim2sim/rsl_rl_transfer.py
。
要添加新的机器人,请创建一个包含两个列表的 YAML 文件,其中每个关节名称在两个列表中都只出现一次:
# Example structure
source_joint_names: # PhysX joint order
- joint_1
- joint_2
# ...
target_joint_names: # Newton joint order
- joint_1
- joint_2
# ...
该脚本自动计算locomotion任务所需的映射。
如何运行#
使用此命令模板通过 Newton 运行 PhysX 训练的策略:
./isaaclab.sh -p scripts/newton_sim2sim/rsl_rl_transfer.py \
--task=<TASK_ID> \
--num_envs=32 \
--checkpoint <PATH_TO_PHYSX_CHECKPOINT> \
--policy_transfer_file <PATH_TO_MAPPING_YAML>
以下是不同机器人的示例:
Unitree G1
./isaaclab.sh -p scripts/newton_sim2sim/rsl_rl_transfer.py \
--task=Isaac-Velocity-Flat-G1-v0 \
--num_envs=32 \
--checkpoint <PATH_TO_PHYSX_CHECKPOINT> \
--policy_transfer_file scripts/newton_sim2sim/mappings/sim2sim_g1.yaml
Unitree H1
./isaaclab.sh -p scripts/newton_sim2sim/rsl_rl_transfer.py \
--task=Isaac-Velocity-Flat-H1-v0 \
--num_envs=32 \
--checkpoint <PATH_TO_PHYSX_CHECKPOINT> \
--policy_transfer_file scripts/newton_sim2sim/mappings/sim2sim_h1.yaml
ANYmal-D
./isaaclab.sh -p scripts/newton_sim2sim/rsl_rl_transfer.py \
--task=Isaac-Velocity-Flat-Anymal-D-v0 \
--num_envs=32 \
--checkpoint <PATH_TO_PHYSX_CHECKPOINT> \
--policy_transfer_file scripts/newton_sim2sim/mappings/sim2sim_anymal_d.yaml
注意和限制#
此转移方法仅在使用 PhysX 训练策略的 Unitree G1、Unitree H1 和 ANYmal-D 机器人上经过测试。
观测重新映射假设一个以基本观测开头,后跟关节观测的定位布局。对于不同的观测布局,您需要修改
scripts/newton_sim2sim/policy_mapping.py
。当添加新的机器人或后端时,请确保源和目标具有相同的关节名称,并且 YAML 列表反映每个后端如何对这些关节进行排序。