外观
8.2 高性能 GPU 仿真与 Isaac Gym/Isaac Sim
假设一个四足环境每秒推进 1,000 步。只运行一个环境时,收集一亿步需要约 28 小时;若 4,096 个环境能够并行推进,理想下限约为 24 秒。实际速度不会线性增长,但这个数量级差异说明了为什么机器人强化学习重视并行仿真。

图 8.2-1:Isaac Gym 在同一 GPU 仿真平台中运行多类机械臂、四足与灵巧操作任务。 出处:Viktor Makoviychuk et al.,Isaac Gym: High Performance GPU-Based Physics Simulation For Robot Learning(2021),Figure 1。
本节关注两个问题:多刚体状态怎样组织成批量张量,以及仿真与策略都驻留在 GPU 时,为什么可以减少设备间的数据搬运。Isaac Gym 是这一计算管线的代表;Isaac Sim/Isaac Lab 则提供更完整的机器人、传感器与场景工作流,两者不应被视为同一个接口。

图 8.2-2:Orbit 将机器人、传感器、场景资产、运动生成与遥操作组合成统一的 Isaac Sim 学习工作流。 出处:Mayank Mittal et al.,Orbit: A Unified Simulation Framework for Interactive Robot Learning Environments(2023),Figure 1。
历史溯源与强化学习仿真的通信瓶颈
MuJoCo 面向模型式控制提供快速的刚体动力学、接触求解与导数计算 [Todorov et al., 2012]。传统机器人学习管线常在 CPU 上推进仿真,再把观测复制到 GPU 训练策略;当并行环境数量增加时,仿真吞吐和 CPU—GPU 数据传输都可能成为瓶颈。这里讨论的是计算管线差异,而不是用 MuJoCo 论文证明所有 CPU 仿真器精度更高或无法扩展。
强化学习循环反复执行“读取观测—计算动作—推进物理—计算奖励”。若仿真在 CPU、策略在 GPU,每一步都要传输观测和动作。环境较少时,这个开销可能并不突出;并行环境增多后,物理计算、同步和数据传输都可能成为瓶颈。

图 8.2-3:Isaac Gym 的端到端 GPU 管线让仿真状态直接进入策略训练,避免逐步往返 CPU。 出处:Viktor Makoviychuk et al.,Isaac Gym: High Performance GPU-Based Physics Simulation For Robot Learning(2021),Figure 3。
在这一背景下,Makoviychuk 等人提出 Isaac Gym:一个面向机器人学习、把 PhysX 仿真与策略训练数据都保留在 GPU 上的平台 [Makoviychuk et al., 2021]。论文强调的是端到端 GPU 管线减少 CPU—GPU 数据传输并支持大量并行环境;“首个”并不是理解其贡献所必需的结论。
物理动力学的降维解析与系统张量化
先写出单个环境的动力学,再把环境编号增加为批次维度。
从单个质点到欧拉-拉格朗日体系
回顾高中物理,当我们研究单个质点(质量为
如果是旋转运动,我们有其等价的角动量形式:
其中
为了系统且优雅地描述这种复杂动力学,学术界采用了拉格朗日力学(Lagrangian Mechanics)体系。假设机器人的姿态可以由一组广义坐标(Generalized Coordinates)
在这里,
基于最小作用量原理,系统轨迹必须满足欧拉-拉格朗日方程:
将前面的动能表达式与拉格朗日函数代入欧拉-拉格朗日方程中展开推导,我们便得到了机器人控制理论中最著名的多刚体动力学方程(Rigid-body Dynamics Equation):
我们对该公式中的每一项进行细致拆解:
:惯性项。它直接对应了高中物理中的 ,不同之处在于这里的质量 不再是常数,而是随着机器人各个关节角度变化而实时更新的矩阵。 :科里奥利力与离心力项。这是由连杆之间的非线性运动耦合产生的,本质是动能项中质量矩阵随时间的导数 引发的附加惯性力。 :重力项。由势能对坐标的梯度产生,代表为了维持机器人在当前姿态对抗重力所必须克服的静态力。 :广义外力,主要表现为电机输出的控制扭矩。
动力学方程的张量化升维
设有
实际引擎不会对每个环境显式计算矩阵逆,这个式子只用于标出环境之间可以并行。把广义坐标堆叠后,

图 8.2-4:Brax 的吞吐曲线展示批量环境数增加时并行物理仿真的扩展规律与硬件差异。 出处:C. Daniel Freeman et al.,Brax — A Differentiable Physics Engine for Large Scale Rigid Body Simulation(2021),Figure 2。
从接口角度,可以把批量计算写成:

图 8.2-5:批次维 N 负责并行而不负责混合;第 i 个质量矩阵只求解第 i 个环境的残差,输出继续保留环境轴。
其中,
非光滑力学:并行接触力求解
机器人足端落地或机械手抓取物体时,会出现接触与摩擦。这类约束使动力学变成非光滑问题。
硬接触的一种理想化写法是线性互补问题(Linear Complementarity Problem, LCP):地面可以推起足端,却不能用法向力把足端拉向地面。
考虑单个接触点,假设接触面的法向相对加速度为
- 力的单向性:接触必须只表现为排斥力,即
。 - 非穿透约束:物体的相对加速度在接触时刻不能表现为相互挤压穿透,即
。 - 互斥激活条件:如果两个表面分离(
),则法向力必须为零( );如果它们承受巨大的受力( ),那么接触点彼此之间的相对加速度必须为零( )。
在数学上,我们将这一逻辑归纳为正交互补性约束:
结合以上三点,接触力的求解被规约为如下的标准互补问题格式:
在多刚体系统中,可将局部法向加速度写成
编写高度并行的张量化仿真环境
下面不启动物理引擎,只用 PyTorch 展示 Isaac Gym 张量接口中最重要的批次布局。真实环境还需要从仿真器取得状态张量并把动作张量写回控制接口。
python
import torch
num_envs = 4096
num_dofs = 12 # 以常见四足机器人的 12 个关节为例
device = "cuda" if torch.cuda.is_available() else "cpu"
# 第 0 维是环境,第 1 维是关节
dof_pos = torch.zeros((num_envs, num_dofs), dtype=torch.float32, device=device)
dof_vel = torch.zeros((num_envs, num_dofs), dtype=torch.float32, device=device)
actions = torch.randn((num_envs, num_dofs), dtype=torch.float32, device=device)
def compute_reward(dof_positions, actions):
"""为每个环境计算一个标量奖励。"""
target_pos = torch.zeros_like(dof_positions)
pos_error = torch.sum((dof_positions - target_pos) ** 2, dim=-1)
action_penalty = torch.sum(actions ** 2, dim=-1)
return -0.5 * pos_error - 0.01 * action_penalty
batch_rewards = compute_reward(dof_pos, actions)
assert batch_rewards.shape == (num_envs,)
print(batch_rewards.shape, batch_rewards.device)奖励函数没有显式遍历环境,而是沿关节维求和,一次得到形状为 .cpu() 或 .numpy(),仍会重新引入同步与传输开销。
小结
- Isaac Gym 的关键是让物理状态和策略张量都驻留在 GPU,并直接交换数据 [Makoviychuk et al., 2021]。
- 多环境张量的第 0 维表示环境编号;观测、动作、奖励和终止标记应保持一致的批次顺序。
- 并行并不消除接触求解成本。场景复杂度、接触数量、时间步与同步频率仍会限制吞吐量。
- Isaac Gym、Isaac Sim 与 Isaac Lab 面向不同层次的工作流,迁移代码前需要核对当前接口和运行环境。

