耦合#
各求解器独立推进,因此如果只靠它们自己,刚体夹爪和 FEM 物块会彼此穿透。耦合器(coupler)负责检测分属不同求解器的实体之间的接触,并交换力与状态,使它们保持一致。一个耦合器服务整个场景,其类型由传给它的 coupler_options 决定:
import genesis as gs
scene = gs.Scene(
coupler_options=gs.options.SAPCouplerOptions(), # omit for the default legacy coupler
)
耦合的工作方式#
在一个时间步内,各求解器独立推进,耦合器则在它们之间进行协调。每个子步按顺序执行四个阶段:
预处理: 耦合器准备求解器在积分之前所需的跨求解器数据,例如 MPM 的兼容质点网格(CPIC,compatible particle-in-cell)变体用来判断每个粒子位于薄几何体哪一侧的逐粒子刚体表面法线。
推进(耦合前): 每个活跃求解器都将自身材质向前积分一个子步,忽略其他求解器。
耦合: 耦合器检测不同求解器中的实体之间的接触,并交换动量,使它们不再互相穿透。
后处理(耦合后): 每个求解器用耦合后的状态完成该子步。
默认耦合器采用基于冲量(impulse-based)的响应来求解接触。对每个候选接触,它会查询到刚体或固体几何体的有符号距离,并用平滑的影响权重混合响应,使接触逐渐生效,而不是突然出现。随后它把相对速度分解为法向和切向分量,沿法向施加恢复规则、沿切向施加库仑摩擦规则,并把大小相等、方向相反的动量变化作为外力施加回刚体。三个逐几何体的材质参数控制这一响应:
coup_softness: 接触区的厚度。取值越大,影响范围越深入表面之外,冲量也越柔和。coup_restitution: 沿法向的弹性,取0为完全非弹性,取1为完全弹性。coup_friction: 限制切向滑移的库仑摩擦系数。
选择耦合器#
我们提供三种耦合器,均通过派生自 BaseCouplerOptions 的选项类配置;若场景没有指定任何一种,则使用传统耦合器。
耦合器 |
接触模型 |
适用场景 |
要求 |
|---|---|---|---|
传统(默认) |
基于冲量 |
刚体与 MPM、SPH、PBD 或 FEM 的组合;可微分仿真 |
无 |
半解析原始(semi-analytic primal)模型,来自 Drake |
中等变形下的刚体-FEM 接触,例如抓取可变形物体 |
64 位精度;隐式 FEM 求解器 |
|
基于障碍势(Incremental Potential Contact) |
布料与大变形软体;无交叠接触 |
|
传统耦合器覆盖的求解器组合最多。在冲量模型过于粗糙的场合,SAP 提升了刚体-FEM 接触的精度;IPC 则在大变形下保持接触无交叠,并通过仿射体动力学(ABD)表示刚体。两种专用耦合器都有各自的页面介绍配置与参数。
启用与禁用交互#
传统耦合器只有在两个求解器都出现在场景中并且对应标志已设置时,才会激活这一对求解器的交互。默认情况下所有组合都是启用的:
scene = gs.Scene(
coupler_options=gs.options.LegacyCouplerOptions(
rigid_mpm=False, # skip rigid-MPM contact even when both solvers are active
),
)
LegacyCouplerOptions 上可用的组合标志有 rigid_mpm、rigid_sph、rigid_pbd、rigid_fem、mpm_sph、mpm_pbd、fem_mpm 和 fem_sph;传统耦合器正是耦合这些组合。关闭不需要的组合,可以省去每个子步运行其接触内核的开销。
延伸阅读#
超越刚体:选择求解器,并运行每种求解器的最小示例。
软体求解器:被耦合的求解器,以及它们积分的模型。
核心概念:实体状态如何映射到各求解器的全局数据字段。
可运行的跨求解器组合示例位于
examples/coupling。