PhysX 求解器调优#

本指南适用于 PhysX 后端已能构建任务和资产的情况。修改求解器设置前,用固定的初始状态、随机种子和动作序列复现一个问题。记录该复现场景中的故障、接触行为和任务指标,再逐项调整场景级设置。具体字段及其当前默认值,以 PhysxCfg 的自动生成 API 文档为准。

建立明确的基准配置#

先在任务配置中明确场景级 PhysX 设置。以下基准配置是接触密集任务的一个代表性起点,并非通用建议:

from isaaclab.sim import SimulationCfg
from isaaclab_physx.physics import PhysxCfg

physx_cfg = PhysxCfg(
    solver_type=1,
    min_position_iteration_count=8,
    max_position_iteration_count=64,
    min_velocity_iteration_count=1,
    max_velocity_iteration_count=4,
    enable_ccd=False,
    enable_stabilization=False,
    bounce_threshold_velocity=0.2,
    friction_offset_threshold=0.04,
    friction_correlation_distance=0.025,
)

sim_cfg = SimulationCfg(dt=1 / 120, physics=physx_cfg)

接触材料、关节体迭代次数和 USD 中编写的碰撞设置等各对象属性,仍应放在模式配置中;场景级 PhysX 调优不能替代这些属性的编写。

选择 TGS 或 PGS#

对于关节式机器人和接触密集的操作任务,优先尝试 solver_type=1 (TGS)。TGS 是既有默认选项,通常能为较新的 Isaac Lab 任务提供最佳稳定性。只有验证资产、控制器和接触几何后,固定的复现场景仍表现不佳,或较早的高刚度资产在 PGS 下表现更好时,才比较 solver_type=0 (PGS)。

如果确定求解器类型后,抓取或高刚度接触负载仍然敏感,可在同一复现场景中测试 solve_articulation_contact_last 。只有它确实改善了记录的接触或任务指标,才保留这一设置。

调整求解迭代次数#

PhysX 通过场景级迭代范围限制各对象的求解计算量:位置迭代使用 min_position_iteration_count 和 max_position_iteration_count ,速度迭代使用 min_velocity_iteration_count 和 max_velocity_iteration_count 。

当固定的复现场景出现穿透、关节约束漂移或抓取不稳定时,先增加位置迭代次数。只有同一场景出现不稳定的恢复响应,或位置迭代无法解决的速度层面收敛问题时,才增加速度迭代次数。在实测行为不再改善时停止;更多迭代无法修复无效碰撞几何、重置时的重叠,或由控制器引入的不稳定。

调整接触与稳定性#

修改场景全局接触设置前,先验证碰撞体、材料属性和重置时的重叠,再使用同一固定复现场景调整以下参数:

  • enable_ccd 适用于 CPU 动力学中穿过薄几何体的高速运动刚体。GPU 动力学不支持 CCD;如果 GPU 仿真请求 enable_ccd=True ,Isaac Lab 会强制关闭它并发出警告。

  • enable_stabilization 仅适用于 dt 大于约 1 / 30 秒的低频仿真。这项额外处理可能使接触传感器报告的力大小不准确;如果观测或评估使用这些力,应保持禁用。

  • bounce_threshold_velocity [m/s]:接触发生回弹所需的相对速度阈值。

  • friction_offset_threshold [m]:PhysX 开始施加摩擦力的接触距离。

  • friction_correlation_distance [m]:将邻近接触合并到同一摩擦锚点所使用的距离。

这些设置都会改变接触模型,应以测量为依据。每次调整后,重新检查穿透、滑移、回弹、接触数、任务成功率和运行耗时。

确定 GPU 缓冲区容量#

多数 PhysX GPU 场景缓冲区的容量固定,不会动态增长。当场景超出其中某项容量时,PhysX 可能丢弃接触,或发出 [PhysX] 警告并失败。在复现场景中,应将这类警告视为必须解决的故障,只增加溢出的那项容量。

对于大型向量化场景或接触密集场景,最常需要提高的固定容量如下:

  • gpu_max_rigid_contact_count

  • gpu_max_rigid_patch_count

  • gpu_found_lost_pairs_capacity

  • gpu_found_lost_aggregate_pairs_capacity

  • gpu_total_aggregate_pairs_capacity

  • gpu_collision_stack_size

gpu_heap_capacity 不同:它设置 GPU 内存堆和页锁定主机内存堆的初始容量;需要扩容时,PhysX 会继续分配内存。只有测量表明反复扩容不合适时,才提高初始堆容量,不应把它当作固定上限。

测量重置和接触最密集的状态,为任务预留余量,再验证相同的固定复现场景仍然稳定。调整缓冲区容量无法修复无效几何、求解器发散或控制器问题。

另请参阅#