Sim-to-Sim 策略转移#

本节提供了 PhysX 和 Newton 后端之间的 sim-to-sim 策略转移示例。Sim-to-sim 转移是真实机器人部署前的必要步骤,因为它验证了策略在不同模拟器上的工作情况。通过 sim-to-sim 验证的策略更有可能在真实机器人上成功。

概览#

本指南展示了如何在 PhysX 和 Newton 后端之间进行双向策略转移。主要挑战在于不同的物理引擎可能会以不同的关节和链接顺序解析相同的机器人模型。

在某个后端训练的策略期望关节和链接按照该后端解析机器人模型的特定顺序排列。当转移到另一个后端时,关节顺序可能不同,需要重新映射观测和动作。

在未来,我们计划使用 robot schema 来解决这个问题,该模式标准化了不同后端之间的关节和链接顺序。

目前,我们通过使用 YAML 文件中定义的关节映射来重新映射观测和动作来解决这个问题。这些文件以源后端和目标后端的顺序指定关节名称。在策略执行期间,我们使用此映射来重新排列观测和动作,以便它们能够正确地与目标后端配合工作。

该方法已在 Unitree G1、Unitree Go2、Unitree H1 和 ANYmal-D 机器人上进行了双向转移测试。

所需材料#

  • 使用 PhysX 或 Newton(RSL-RL)训练的策略 checkpoint。

  • 位于 scripts/sim2sim_transfer/config/ 下的机器人关节映射 YAML 文件。

  • 提供的播放器脚本: scripts/sim2sim_transfer/rsl_rl_transfer.py

要添加新的机器人,请创建一个包含两个列表的 YAML 文件,其中每个关节名称在两个列表中都只出现一次:

# Example structure
source_joint_names:  # Source backend joint order
  - joint_1
  - joint_2
  # ...
target_joint_names:  # Target backend joint order
  - joint_1
  - joint_2
  # ...

该脚本自动计算locomotion任务所需的映射。

PhysX 到 Newton 的转移#

要使用 Newton 后端运行 PhysX 训练的策略,请使用以下命令模板:

./isaaclab.sh -p scripts/sim2sim_transfer/rsl_rl_transfer.py \
    --task=<TASK_ID> \
    --num_envs=32 \
    --checkpoint <PATH_TO_PHYSX_CHECKPOINT> \
    --policy_transfer_file <PATH_TO_MAPPING_YAML>

以下是不同机器人的示例:

  1. Unitree G1

./isaaclab.sh -p scripts/sim2sim_transfer/rsl_rl_transfer.py \
    --task=Isaac-Velocity-Flat-G1-v0 \
    --num_envs=32 \
    --checkpoint <PATH_TO_PHYSX_CHECKPOINT> \
    --policy_transfer_file scripts/sim2sim_transfer/config/physx_to_newton_g1.yaml
  1. Unitree H1

./isaaclab.sh -p scripts/sim2sim_transfer/rsl_rl_transfer.py \
    --task=Isaac-Velocity-Flat-H1-v0 \
    --num_envs=32 \
    --checkpoint <PATH_TO_PHYSX_CHECKPOINT> \
    --policy_transfer_file scripts/sim2sim_transfer/config/physx_to_newton_h1.yaml
  1. Unitree Go2

./isaaclab.sh -p scripts/sim2sim_transfer/rsl_rl_transfer.py \
    --task=Isaac-Velocity-Flat-Go2-v0 \
    --num_envs=32 \
    --checkpoint <PATH_TO_PHYSX_CHECKPOINT> \
    --policy_transfer_file scripts/sim2sim_transfer/config/physx_to_newton_go2.yaml
  1. ANYmal-D

./isaaclab.sh -p scripts/sim2sim_transfer/rsl_rl_transfer.py \
    --task=Isaac-Velocity-Flat-Anymal-D-v0 \
    --num_envs=32 \
    --checkpoint <PATH_TO_PHYSX_CHECKPOINT> \
    --policy_transfer_file scripts/sim2sim_transfer/config/physx_to_newton_anymal_d.yaml

请注意,要运行此命令,您需要切换到 IsaacLab 的基于 Newton 的分支,例如 feature/newton

Newton 到 PhysX 的转移#

要将 Newton 训练的策略转移到基于 PhysX 的 IsaacLab,请使用反向映射文件:

以下是不同机器人的示例:

  1. Unitree G1

./isaaclab.sh -p scripts/sim2sim_transfer/rsl_rl_transfer.py \
    --task=Isaac-Velocity-Flat-G1-v0 \
    --num_envs=32 \
    --checkpoint <PATH_TO_NEWTON_CHECKPOINT> \
    --policy_transfer_file scripts/sim2sim_transfer/config/newton_to_physx_g1.yaml
  1. Unitree H1

./isaaclab.sh -p scripts/sim2sim_transfer/rsl_rl_transfer.py \
    --task=Isaac-Velocity-Flat-H1-v0 \
    --num_envs=32 \
    --checkpoint <PATH_TO_NEWTON_CHECKPOINT> \
    --policy_transfer_file scripts/sim2sim_transfer/config/newton_to_physx_h1.yaml
  1. Unitree Go2

./isaaclab.sh -p scripts/sim2sim_transfer/rsl_rl_transfer.py \
    --task=Isaac-Velocity-Flat-Go2-v0 \
    --num_envs=32 \
    --checkpoint <PATH_TO_NEWTON_CHECKPOINT> \
    --policy_transfer_file scripts/sim2sim_transfer/config/newton_to_physx_go2.yaml
  1. ANYmal-D

./isaaclab.sh -p scripts/sim2sim_transfer/rsl_rl_transfer.py \
    --task=Isaac-Velocity-Flat-Anymal-D-v0 \
    --num_envs=32 \
    --checkpoint <PATH_TO_NEWTON_CHECKPOINT> \
    --policy_transfer_file scripts/sim2sim_transfer/config/newton_to_physx_anymal_d.yaml

关键区别在于使用 newton_to_physx_*.yaml 映射文件而不是 physx_to_newton_*.yaml 文件。另请注意,您需要切换到基于 PhysX 的 IsaacLab 分支,例如 main

注意事项和限制#

  • 双向转移都已在 Unitree G1、Unitree Go2、Unitree H1 和 ANYmal-D 机器人上进行测试。

  • PhysX 到 Newton 的转移使用 physx_to_newton_*.yaml 映射文件。

  • Newton 到 PhysX 的转移需要相应的 newton_to_physx_*.yaml 映射文件和 IsaacLab 的 PhysX 分支。

  • 观测重新映射假设一个以基础观测为开头、后跟关节观测的运动布局。对于不同的观测布局,您需要修改 scripts/sim2sim_transfer/rsl_rl_transfer.py 中的 get_joint_mappings 函数。

  • 当添加新的机器人或后端时,请确保源和目标具有相同的关节名称,并且 YAML 列表反映每个后端如何对这些关节进行排序。