耦合求解器#
警告
耦合求解器是实验性功能,通过 isaaclab_contrib.coupling 提供。其 API、行为、功能支持、性能和实现均可能变化。
Newton 可以将一个模型分配给多个求解器,并在每个仿真步中交换状态和力。这样,任务就能组合处理不同物理现象的求解器,例如让 MJWarp 刚性机器人与 VBD 布料或 MPM 材料交互。
Isaac Lab 通过 isaaclab_contrib.coupling 暴露这一框架。适配层将配置选择器转换为具名的 Newton 求解器条目,构建选定的耦合算法,并将其集成到 NewtonCfg 。共享模型架构、迭代算法、受支持的约束行和求解器专用实现细节,见 Newton 的 耦合求解器概念页面 。
耦合模型#
耦合仿真从一个 Newton 模型开始。Isaac Lab 不将整个模型交给单个求解器,而是将其划分为多个具名条目。每个条目选择一个求解器,并持有模型中彼此不重叠的一部分。
下方动画展示了源求解器持有的夹爪刚体如何通过局部代理,与目标求解器持有的材料交互:
青绿色实心手指属于源求解器;蓝色轮廓手指是目标求解器内这些刚体的本地代理。蓝色物体表示归目标求解器所有的材料。
上方箭头表示源状态与代理之间的同步,包括位姿和速度。接触产生下方箭头所示的力与力矩反馈,在后续源求解或耦合迭代中返回。
打开动画 可暂停或拖动进度查看交换过程。
每个求解器获得共享模型的一个视图,只有其条目持有的元素会汇总到最终共享状态中。每个元素最多属于一个条目;未分配的元素不参与嵌套求解器。一个关节体应完整地放在同一个条目中。
Isaac Lab 解析所有权选择器、构建 Newton 条目视图,并通过正常的 Newton 后端生命周期运行耦合求解器。Newton 负责耦合算法,以及条目之间的位姿、力和约束信息交换。
选择代理耦合或 ADMM 耦合#
方法 |
它是如何工作的 |
适用情况 |
|---|---|---|
代理耦合 |
源条目持有的刚体或粒子作为虚拟端点出现在目标求解器中;目标求解器在后续轮次或迭代中返回反馈。 |
适用于交互具有自然方向性的情况,例如可变形体或粒子求解中的刚性碰撞体。代理耦合能够复用目标求解器的接触处理路径,是 Isaac Lab 中耦合 MJWarp–VBD 和刚体–MPM 任务的既有实现方式。 |
ADMM |
耦合器在条目之间创建界面约束,迭代各子求解器,并施加大小相等、方向相反的界面力。 |
适用于界面应当对称的情况,尤其是受支持的跨条目关节、刚体–粒子附着或摩擦接触。ADMM 调参项较多,支持的约束行范围也更窄。 |
对于基于碰撞体的刚体–可变形体交互,代理耦合通常是更简单的入门选择。先使用 mode="lagged" ; "staggered" 模式使用更新的源状态,但对时间步长和执行顺序更敏感。只有各条目独立运行时已经稳定,才应增加耦合迭代次数。
如果人为区分源与目标会将物理界面变成单向交互,ADMM 更适合。固定迭代次数、罚参数、近端项和稳定化参数共同参与耦合约束求解,应结合时间步长和参与求解器一起调节。当前支持的关节、接触及限制,以 Newton 概念页面为准。
代理耦合复用目标求解器的接触路径,有时只需一轮,因此耦合开销可能较低,但有方向的数据交换对时间步长和顺序敏感。ADMM 表示对称界面,但每次耦合迭代都会再次推进参与求解器。增加轮次或迭代可以改善耦合响应和界面收敛,也会增加运行时间。两种方法都不总是更准确,应通过与任务相关的物理指标比较。
配置耦合求解器#
在 Isaac Lab 中, CouplerEntryCfg 定义各条目的求解器与所有权。将 CouplerProxyCfg 或 CouplerAdmmCfg 用作 NewtonCfg 的求解器配置。
以下配置与维护中的 Franka 刚体–可变形体任务一致:完整机器人交给 MJWarp,粒子和静态碰撞几何交给 VBD,仅将手掌和手指作为 VBD 的代理碰撞体:
from isaaclab_contrib.coupling import (
CouplerEntryCfg,
CouplerProxyCfg,
CouplerProxyMappingCfg,
)
from isaaclab_newton.physics import MJWarpSolverCfg, NewtonCfg, VBDSolverCfg
entries = [
CouplerEntryCfg(
name="rigid",
solver_cfg=MJWarpSolverCfg(),
bodies=[r"/World/envs/env_[^/]+/Robot"],
),
CouplerEntryCfg(
name="soft",
solver_cfg=VBDSolverCfg(),
all_particles=True,
include_static_shapes=True,
),
]
physics = NewtonCfg(
solver_cfg=CouplerProxyCfg(
entries=entries,
proxies=[
CouplerProxyMappingCfg(
source="rigid",
destination="soft",
bodies=[
r"/World/envs/env_[^/]+/Robot/Geometry/.*panda_hand",
r"/World/envs/env_[^/]+/Robot/Geometry/.*panda_(left|right)finger",
],
mode="lagged",
)
],
iterations=1,
),
num_substeps=2,
)
对于 ADMM,保留所有权条目,将代理映射替换为需要耦合的对称界面:
from isaaclab_contrib.coupling import CouplerAdmmCfg
physics = NewtonCfg(
solver_cfg=CouplerAdmmCfg(
entries=entries,
contact_pairs=[("rigid", "soft")],
iterations=5,
rho=1.0,
),
num_substeps=2,
)
设置 contact_pairs=None 可为每对不同条目生成接触;使用空列表则禁用 ADMM 接触耦合,同时保留受支持的跨条目关节和附着约束。
调节耦合参数#
修改耦合参数前,先保证各条目独立运行时稳定。
CouplerEntryCfg.substeps改变单个条目的时间分辨率;更多子步会增加求解器工作量。对于代理耦合,
mode控制交换顺序,iterations控制松弛轮次,mass_scale改变代理在目标求解器中的有效惯性,collide_interval控制接触刷新频率。对于 ADMM,
iterations控制界面迭代轮次,rho设置罚项权重,gamma添加近端惯性与速度权重,baumgarte添加位置误差修正。
更多子步或迭代可能改善稳定性或收敛,但会增加运行时间,也不能修复本身不稳定的条目。生成的 耦合配置 API 列出所有字段和默认值,Newton 概念页面解释底层算法。
ADMM 接触容量#
ADMM 的内部接触缓冲区独立于 NewtonCfg.collision_cfg 。三角形对溢出时,增大 CouplerAdmmCfg.contact_max_triangle_pairs ;出现接触约简哈希表警告时,增大 contact_reduction_hashtable_size_factor 。两者默认均为 None ,使用 Newton 默认值;显式赋值要求 Newton 的 SolverCoupledADMM.Config 支持相应参数。容量覆盖一个进程中的全部环境,在多 GPU 任务中,各 rank 独立计算。
当 rigid_contact_matching="latest" 或 "sticky" 时,三角形对容量必须小于 2**20 ;更大的值要求使用 "disabled" 。保留匹配功能时,可以单独增大哈希表:
coupling_cfg = CouplerAdmmCfg(
entries=entries,
rigid_contact_matching="latest",
contact_max_triangle_pairs=1_000_000,
contact_reduction_hashtable_size_factor=2.0,
)
刚体–MPM 对比视频#
在代理耦合中, mass_scale 改变源刚体在目标视图中的有效质量和惯性,不改变写入模型的刚体质量。先使用 1 ,仅在 MPM 接触过程中刚体求解器对刚体施加强约束时增加该值。支撑状态和自由运动状态都应检查,因为较大的缩放可能抑制正常运动。
G1 视频展示同一策略在沙、雪和黏土上行走。单向视频使用小腿代理,双向视频使用全身代理。它们是展示示例, 并非 控制单一变量的比较;测量耦合效果时,应保持策略、随机种子、命令和代理几何一致。
从维护中的任务开始#
MJWarp + VBD 耦合 指南提供 Franka 软体任务的完整配置和可运行命令。构建代理耦合的刚体–可变形体环境时,可从该示例开始,再将条目所有权和代理选择器缩小到实际参与交互的刚体。
目前 Isaac Lab 不支持嵌套耦合器和 Newton 接触传感器,代理耦合最多支持两个条目。部分求解器模式需要管理器专用的生命周期操作,不能嵌套在耦合器中。调节耦合结果前,先分别验证各条目;当前算法级支持与限制见 Newton 概念页面。