Bridge the Sim2Real Gap with Neural Actuator

Kingsley Liu, DevTech | AI Open Day 5/30/2025

议程 (Agenda)

  • 背景 (Background)
  • 技术方法 (Technical Approach)
  • 实验结果 (Experiment Results)
  • 总结 (Summary)
  • IsaacSim/Lab 基准测试 (IsaacSim/Lab Benchmark)
  • 致谢 (Acknowledgements)

背景 (Background)

人形机器人任务 (Humanoid Tasks)

  • 低层次的人形机器人任务可分为两类:
    • 运动 (Locomotion): 以类人方式移动身体,通常涉及双足行走。
    • 全身控制 (Whole-body control, WBC): 协调所有关节和肢体以完成复杂任务。
  • 运动和全身控制策略都可以在模拟环境中使用强化学习 (reinforcement learning, RL) 进行训练。
    • 运动策略将速度指令作为输入,输出关节位置设定点。
    • 全身控制策略将目标身体姿态作为输入,输出关节位置设定点。
  • 高层次的人形机器人导航和视觉-语言-动作 (VLA) 策略可以建立在运动和全身控制之上。
Page 3: 人形机器人任务流程图
Page 3: 人形机器人任务流程图

Sim2Real 差距 (Sim2Real Gap)

  • 无缝的 Sim2Real 转换依赖于物理上精确的模拟引擎。
  • Sim2Real 差距可能导致策略在真实世界部署时失败。
    • 对于运动任务,人形机器人可能会在真实世界中摔倒。
    • 对于全身控制任务,人形机器人可能会在真实世界中经历自碰撞。
  • 关节位置指令在 IsaacLab 中是如何执行的:
    • 执行器 (Actuator) 使用以下公式将关节位置指令转换为扭矩(Torque):
      Torque = kp * (joint_pos_command – current_joint_pos) – kd * current_joint_vel,其中 kp 和 kd 分别是刚度(stiffness)和阻尼(damping)。
    • Physx 引擎 在模拟中应用该扭矩,并给出下一个关节位置和速度。
  • 我们创建了一个基准测试流程来衡量 IsaacLab 中的 Sim2Real 差距。
Page 4: Sim2Real 差距的图表和指标
Page 4: Sim2Real 差距的图表和指标

Sim2Real 对齐 (Sim2Real Alignment)

  • 有多种方法可以将模拟与真实世界物理对齐:
    • 构建一个更精确的物理引擎,例如 NVIDIA IsaacLab Next 将采用 Newton
    • 训练一个 delta position policy,调整关节位置指令以补偿动力学不匹配(参见 ASAP)。
    • 训练一个 neural actuator model,该模型可以根据关节位置指令输出适当的扭矩。
  • 我们选择使用神经执行器(neural actuator)的方法来减小 IsaacLab 中的 Sim2Real 差距。
    • 基础扭矩(Base torque)仍然使用公式 kp * (joint_pos_command – current_joint_pos) – kd * current_joint_vel 计算。
    • 增量扭矩(Delta torque)由神经执行器模型预测。
    • 施加的扭矩(Applied torque)是基础扭矩和增量扭矩之和。
Page 5: 神经执行器在模拟流程中的作用
Page 5: 神经执行器在模拟流程中的作用

技术方法 (Technical Approach)

整体工作流程 (Overall Workflow)

Page 6: 整体工作流程图
Page 6: 整体工作流程图
  1. 在真实世界中收集运动数据 (Collect Motion Data in Real)

    • 17 个重定向的 AMASS 运动序列。
    • 使用 Unitree H1_2 机器人。
    • 关节位置指令以 50 Hz 的频率应用。
    • 关节位置和速度以 200Hz 的频率记录。
  2. 使用强化学习训练神经执行器 (Train Neural Actuator with RL)

    • 15 个重定向的 AMASS 运动序列。
    • 2048 个并行环境。
    • 1500 次迭代,每次迭代包含 20 个物理步骤。
    • 使用 IsaacLab 2.1.0。
  3. 在模拟中评估神经执行器 (Eval Neural Actuator in Sim)

    • 2 个重定向的 AMASS 运动序列。
    • 测量关节位置误差和速度误差。
    • 使用 IsaacLab 2.1.0。

系统架构 (System Architecture)

该系统包含两个主要部分:Rollout(执行/推理)和 Training(训练)。

  • Rollout:

    1. 从运动数据集中获取关节位置指令(Joint Pos Command)和当前的关节位置/速度(Current Joint Pos/Vel)作为观测值(observation)。
    2. 神经执行器(Neural Actuator)接收观测值并输出一个动作(action),即增量扭矩。
    3. 总扭矩(Torque)被施加到 Physx 引擎中的机器人模型上。
    4. Physx 引擎模拟物理交互,并输出下一个关节位置/加速度(Next Joint Pos/Vel/Acc)。
    5. 将模拟结果与真实世界的关节位置/速度(Real Joint Pos/Vel)进行比较,计算奖励(reward)。
  • Training:

    1. 在 Rollout 过程中收集的观测(Observation)、动作(Action)和奖励(Reward)数据被存储在 Rollout Storage 中。
    2. 这些数据被用于训练神经执行器(Actor-Critic 模型)。
Page 7: 系统架构图,展示了 Rollout 和 Training 流程
Page 7: 系统架构图,展示了 Rollout 和 Training 流程

算法设计 1/2 (Algorithm Design - 1/2)

  • 强化学习环境 (RL environment)
    • 在平坦地面上的人形机器人 H1_2,总共有 27 个关节。
    • 观测 (Observation): {joint_pos_command, current_joint_pos, current_joint_vel},共 81 维。
    • 动作 (Action): 上半身 8 个关节的增量扭矩,共 8 维。
    • applied_torque = base_torque + delta_torque
    • 奖励 (Reward): 使用真实的关节位置/速度来计算跟踪奖励。
      • 关节位置跟踪 (Joint pos tracking): torch.exp(-pos_error/0.1)
      • 关节速度跟踪 (Joint vel tracking): torch.exp(-vel_error/0.25)
      • 扭矩正则化 (Torque regularization): torch.sum(torch.square(applied_torque), dim=1)
      • 加速度正则化 (Acceleration regularization): torch.sum(torch.square(joint_acc), dim=1)
      • 速度正则化 (Velocity regularization): torch.sum(torch.square(joint_vel), dim=1)
      • 扭矩限制 (Torque limits): torch.sum((torch.abs(applied_torque) - torque_limits).clip(min=0.0, max=1.0), dim=1)
      • 速度限制 (Velocity limits): torch.sum((torch.abs(joint_vel) - vel_limits).clip(min=0.0, max=1.0), dim=1)
      • 位置限制 (Position limits): torch.sum((-joint_pos - pos_limits_lower).clip(max=0.0) + (joint_pos - pos_limits_upper).clip(min=0.0), dim=1)

算法设计 2/2 (Algorithm Design - 2/2)

  • PPO 训练 (PPO training)
    • 我们可以直接利用 rsl_rl 提供的 PPO 训练实现。
    • 收集到的训练数据在用于训练 RL 模型之前会进行处理:
      • delta[step] = rewards[step] + (1-dones[step]) * y * values[step+1] - values[step]
      • advantages[step] = delta[step] + (1-dones[step]) * y * λ * advantages[step+1]
      • returns[step] = values[step] + advantages[step]
    • 总损失由三个部分组成:
      • 价值损失 (Value loss): (returns_batch - value_batch).pow(2).mean()
      • 代理损失 (Surrogate loss): -action_prob_ratio_clipped * advantages
      • 负熵 (Negative entropy): -Normal(actions_mean, actions_std).entropy.sum(-1)
    • 在计算代理损失时,使用 PPO2 算法进行离策略校正(off-policy correction)。
Page 9: PPO 代理目标函数公式
Page 9: PPO 代理目标函数公式

实现细节 (Implementation Details)

  • 模拟环境中 8 个感兴趣关节的超参数
  • 奖励尺度 (Reward scales)
  • 网络架构 (Network architecture)
Page 10: 关节超参数、奖励尺度和网络架构的详细信息
Page 10: 关节超参数、奖励尺度和网络架构的详细信息

实验结果 (Experiment Results)

训练曲线 (Training Curves)

  • 损失 (Loss): 展示了总损失、学习率、代理损失和价值函数随训练迭代的变化。
  • 奖励 (Reward): 展示了各个奖励分量随训练迭代的变化。
Page 11: 训练过程中的损失和奖励曲线图
Page 11: 训练过程中的损失和奖励曲线图

评估指标 - 所有关节 (Evaluation Metrics – All Joints)

  • 训练好的增量扭矩策略在两个运动序列上进行评估。
  • 基线是直接应用基础扭矩。
  • 测量平均关节位置误差和速度误差。
Page 12: 所有关节的平均位置误差和平均速度误差随训练迭代的变化
Page 12: 所有关节的平均位置误差和平均速度误差随训练迭代的变化

评估指标 - 每个关节 (Evaluation Metrics – Per-Joint)

此页面展示了每个被控制的关节(左肩、左肘、右肩、右肘的 pitch, roll, yaw 关节)的平均位置误差和平均速度误差随训练迭代次数的变化。

Page 13: 每个关节的评估指标图表
Page 13: 每个关节的评估指标图表

视频演示 (Video Demo)

  • 我们展示了 2 个评估运动序列的执行情况。
  • 人形机器人使用了来自 iter_1500 检查点的神经执行器。
  • 红色标记代表从真实执行数据中获得的目标身体姿态。
  • 蓝色标记代表模拟中的身体姿态。

(此页包含一个视频占位符)

总结 (Summary)

  • 主要收获 (Takeaways)

    • IsaacLab 和 rsl-rl 使得为机器人策略训练设置强化学习流程变得容易。
    • 训练后的神经执行器优于基于公式的执行器基线,有效减小了 Sim2Real 差距。
  • 局限性 (Limitations)

    • 需要为每个人形机器人训练一个单独的神经执行器;跨机器人泛化尚不可行。
    • 对于某些关节(如肩关节的 yaw 轴),神经执行器并未有效减少 Sim2Real 误差。
  • 未来工作 (Future work)

    • 收集更多真实世界的运动执行数据以增强神经执行器的训练。
    • 利用神经执行器作为基础,训练运动(locomotion)或全身控制(WBC)策略,旨在实现无缝的 Sim2Real 部署。
    • 发布详细的论文或博客,以推动进一步的研究和实际应用。

IsaacSim/Lab 基准测试

Hui Kang, DevTech | AI Open Day 5/30/2025

IsaacSim 基准测试

基准测试介绍

  • 基准测试方法

    • 使用 IsaacSim 提供的基准测试脚本($(ISAACSIM_PATH)/standalone_examples/benchmarks)来执行基准测试。
    • 使用 Nsight Systems 和 Tracy 来分析 IsaacSim 中每一帧的时间分布。
  • 基准测试目标

    • 理解 IsaacSim 在不同配置的计算机上的性能差异。
    • 理解 IsaacSim 的并行可扩展性,并识别哪些任务可以通过多个 GPU 加速。
    • 理解 IsaacSim 的某些配置如何影响其性能。

不同计算机配置下的性能

  • IsaacSim 在各种配置下于不同任务上的性能表现。(最佳性能颜色,最差性能颜色
Page 21
Page 21
  • 当 GPU 固定时,使用不同的 CPU 平台会对大多数基准测试任务产生显著影响。
  • 当 CPU 平台固定时,不同 GPU 的性能基本相同,其中 L40* 的性能略好于 4090 D 和 L20。

    *仅供技术讨论

不同任务的可扩展性

  • 相机渲染任务的性能取决于分辨率、相机数量以及 GPU 数量。GPU 可以并行化渲染任务。(GPU 瓶颈,CPU 瓶颈
    • 对于 GPU 瓶颈的任务,使用多个 GPU 的并行性更好,一些并行效率超过 90%。
    • 对于 CPU 瓶颈的任务,添加更多 GPU 不会提供加速,并可能导致性能波动,从而可能降低性能。
Page 22
Page 22
  • 机器人仿真和 SGD 任务(多 GPU 可以加速,多 GPU 无法加速
    • 对于主要工作负载在仿真和 SDG 中的任务,增加 GPU 可能会增加 CPU 上的工作负载,导致性能下降。
    • 对于涉及多个传感器的任务,多个 GPU 可以处理不同的传感器,类似于处理多个相机的方式,从而实现并行加速。
Page 23
Page 23

线程数影响

  • 在进行基准测试时,我们发现经常存在大量的线程等待。经过调查,我们发现这可能与 Carb 和 TBB 线程的数量有关。
Page 24
Page 24
  • 我们发现过多的 Carb Tasking 和 TBB 线程会导致性能下降。因此,我们测试了不同线程数对性能的影响。
Page 25
Page 25
  • 通过测试,我们发现过多的 Carb Tasking 和 TBB 线程会导致性能下降。因此,有必要针对反映真实使用场景的线程数进行优化测试。建议将最大线程数设置为 32。如果 CPU 的核心数少于 32 个,请使用可用核心的数量。
  • 设置 Kit 参数:
--/plugins/carb.tasking.plugin/threadCount=32
--/plugins/omni.tbb.globalcontrol/maxThreadCount=32
  • 设置环境变量:
export PXR_WORK_THREAD_LIMIT=32
export OPENBLAS_NUM_THREADS=32

总结

  • 当运行 GPU 渲染任务相对较轻时,大部分工作负载都在 CPU 上。如果在 IsaacSim 任务中有性能提升的空间,建议首先考虑更换到更好的 CPU 平台进行性能测试。
  • 只有在涉及多个传感器和高分辨率的任务中,才有多 GPU 加速的潜力。对于低分辨率和少量传感器的任务,无法加速。事实上,使用多个 GPU 可能会增加 CPU 端的协调开销,导致性能下降。
  • 在使用 IsaacSim 时,更多的 CPU 线程并不一定意味着更好的性能。在我们的测试中,当设置为 32 个线程时,最新的 Xeon 处理器表现最佳。

IsaacLab 基准测试

任务介绍

IsaacLab 基准测试: Isaac-Velocity-Flat-Unitree-Go2-v0

  • 数据收集时间占了非常高的百分比,而强化学习(RL)账户的时间非常少。
  • 对于多 GPU 加速,实现良好的加速比是困难的。这主要是因为随着环境数量减少,数据收集时间并没有按比例缩短。
Page 30
Page 30

Isaac-Navigation-Flat-Obstacle-Anymal-C-v0

  • 数据收集时间占比非常高,而强化学习(RL)部分耗时很少。
  • 对于此任务,由于平铺相机(tiled camera)和强化学习模型(CNN+MLP)的处理时间较长,其可扩展性相对较好。
Page 31
Page 31

结论 (Takeaway)

  • 在 IsaacLab 提供的强化学习示例中,例如导航和速度相关任务,数据收集时间和强化学习模块都不能很好地扩展。使用多个 GPU 可能无法实现显著的加速。
  • 对于更复杂的任务,例如我们示例中的平铺相机+导航避障任务,多 GPU 的可扩展性良好,可以尝试使用多 GPU 进行加速。
Page 32
Page 32

致谢 (Acknowledgements)

演示以致谢结尾。

Page 33
Page 33