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_countgpu_max_rigid_patch_countgpu_found_lost_pairs_capacitygpu_found_lost_aggregate_pairs_capacitygpu_total_aggregate_pairs_capacitygpu_collision_stack_size
gpu_heap_capacity 不同:它设置 GPU 内存堆和页锁定主机内存堆的初始容量;需要扩容时,PhysX 会继续分配内存。只有测量表明反复扩容不合适时,才提高初始堆容量,不应把它当作固定上限。
测量重置和接触最密集的状态,为任务预留余量,再验证相同的固定复现场景仍然稳定。调整缓冲区容量无法修复无效几何、求解器发散或控制器问题。