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: 人形机器人任务流程图
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 差距的图表和指标
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: 神经执行器在模拟流程中的作用
技术方法 (Technical Approach)
整体工作流程 (Overall Workflow)
Page 6: 整体工作流程图
-
在真实世界中收集运动数据 (Collect Motion Data in Real)
- 17 个重定向的 AMASS 运动序列。
- 使用 Unitree H1_2 机器人。
- 关节位置指令以 50 Hz 的频率应用。
- 关节位置和速度以 200Hz 的频率记录。
-
使用强化学习训练神经执行器 (Train Neural Actuator with RL)
- 15 个重定向的 AMASS 运动序列。
- 2048 个并行环境。
- 1500 次迭代,每次迭代包含 20 个物理步骤。
- 使用 IsaacLab 2.1.0。
-
在模拟中评估神经执行器 (Eval Neural Actuator in Sim)
- 2 个重定向的 AMASS 运动序列。
- 测量关节位置误差和速度误差。
- 使用 IsaacLab 2.1.0。
系统架构 (System Architecture)
该系统包含两个主要部分:Rollout(执行/推理)和 Training(训练)。
-
Rollout:
- 从运动数据集中获取关节位置指令(Joint Pos Command)和当前的关节位置/速度(Current Joint Pos/Vel)作为观测值(observation)。
- 神经执行器(Neural Actuator)接收观测值并输出一个动作(action),即增量扭矩。
- 总扭矩(Torque)被施加到 Physx 引擎中的机器人模型上。
- Physx 引擎模拟物理交互,并输出下一个关节位置/加速度(Next Joint Pos/Vel/Acc)。
- 将模拟结果与真实世界的关节位置/速度(Real Joint Pos/Vel)进行比较,计算奖励(reward)。
-
Training:
- 在 Rollout 过程中收集的观测(Observation)、动作(Action)和奖励(Reward)数据被存储在 Rollout Storage 中。
- 这些数据被用于训练神经执行器(Actor-Critic 模型)。
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 代理目标函数公式
实现细节 (Implementation Details)
- 模拟环境中 8 个感兴趣关节的超参数
- 奖励尺度 (Reward scales)
- 网络架构 (Network architecture)
Page 10: 关节超参数、奖励尺度和网络架构的详细信息
实验结果 (Experiment Results)
训练曲线 (Training Curves)
- 损失 (Loss): 展示了总损失、学习率、代理损失和价值函数随训练迭代的变化。
- 奖励 (Reward): 展示了各个奖励分量随训练迭代的变化。
Page 11: 训练过程中的损失和奖励曲线图
评估指标 - 所有关节 (Evaluation Metrics – All Joints)
- 训练好的增量扭矩策略在两个运动序列上进行评估。
- 基线是直接应用基础扭矩。
- 测量平均关节位置误差和速度误差。
Page 12: 所有关节的平均位置误差和平均速度误差随训练迭代的变化
评估指标 - 每个关节 (Evaluation Metrics – Per-Joint)
此页面展示了每个被控制的关节(左肩、左肘、右肩、右肘的 pitch, roll, yaw 关节)的平均位置误差和平均速度误差随训练迭代次数的变化。
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
不同任务的可扩展性
- 相机渲染任务的性能取决于分辨率、相机数量以及 GPU 数量。GPU 可以并行化渲染任务。(GPU 瓶颈,CPU 瓶颈)
- 对于 GPU 瓶颈的任务,使用多个 GPU 的并行性更好,一些并行效率超过 90%。
- 对于 CPU 瓶颈的任务,添加更多 GPU 不会提供加速,并可能导致性能波动,从而可能降低性能。
Page 22
- 机器人仿真和 SGD 任务(多 GPU 可以加速,多 GPU 无法加速)
- 对于主要工作负载在仿真和 SDG 中的任务,增加 GPU 可能会增加 CPU 上的工作负载,导致性能下降。
- 对于涉及多个传感器的任务,多个 GPU 可以处理不同的传感器,类似于处理多个相机的方式,从而实现并行加速。
Page 23
线程数影响
- 在进行基准测试时,我们发现经常存在大量的线程等待。经过调查,我们发现这可能与 Carb 和 TBB 线程的数量有关。
Page 24
- 我们发现过多的 Carb Tasking 和 TBB 线程会导致性能下降。因此,我们测试了不同线程数对性能的影响。
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:
- Isaac-Navigation-Flat-Obstacle-Anymal-C-v0:
IsaacLab 基准测试: Isaac-Velocity-Flat-Unitree-Go2-v0
- 数据收集时间占了非常高的百分比,而强化学习(RL)账户的时间非常少。
- 对于多 GPU 加速,实现良好的加速比是困难的。这主要是因为随着环境数量减少,数据收集时间并没有按比例缩短。
Page 30
Isaac-Navigation-Flat-Obstacle-Anymal-C-v0
- 数据收集时间占比非常高,而强化学习(RL)部分耗时很少。
- 对于此任务,由于平铺相机(tiled camera)和强化学习模型(CNN+MLP)的处理时间较长,其可扩展性相对较好。
Page 31
结论 (Takeaway)
- 在 IsaacLab 提供的强化学习示例中,例如导航和速度相关任务,数据收集时间和强化学习模块都不能很好地扩展。使用多个 GPU 可能无法实现显著的加速。
- 对于更复杂的任务,例如我们示例中的平铺相机+导航避障任务,多 GPU 的可扩展性良好,可以尝试使用多 GPU 进行加速。
Page 32
致谢 (Acknowledgements)
演示以致谢结尾。
Page 33