探索 MPM 材料与耦合#
物质点法(MPM)用粒子表示能够变形、压实和流动的材料。刚度、屈服、摩擦和黏度共同决定材料受力及碰撞时的响应。
本教程先在简单碰撞场景中对比材料参数,探索近似刚体的极限情况,并从粒子重建流体表面;随后让 G1 机器人行走,观察粒子反作用力对刚体运动的影响。各组对比将仿真的不同因素分开考察,便于将这些设置用于自己的场景。
生成 MPM 对象和配置 Newton 求解器的入门说明见 隐式 MPM 。下列对比用于展示定性行为,可作为实验起点,并非经过标定的材料模型。
运行教程#
材料与刚体教程默认启动 Kit,需要安装 isaacsim 可选依赖。表面重建教程默认启动 Newton GL。可以用 --viz 选择其他可视化器;Newton RTX 还需要使用 uv run --extra ovrtx。
对比材料参数#
material_parameters.py 教程展示单个参数如何改变材料的碰撞响应。刚度与可压缩性预设让球体落到平板上;其余预设让方块落到水平圆柱上,便于观察材料铺展、碎裂和碰撞后的形状。
使用 --press_spheres 对比受压时的弹性刚度:
先从弹性刚度对比开始:
uv run --extra isaacsim python scripts/tutorials/08_mpm/material_parameters.py \
--preset young_modulus --viz kit
三个试样采用相同的几何形状、初速度、粒子质量、求解器设置,以及由同一随机种子生成的粒子分布,杨氏模量分别为 100 kPa、300 kPa 和 1 MPa。观察各球体的压缩程度和碰撞后的恢复过程。该预设关闭屈服,以单独考察弹性响应。
每种预设都定义了变化的字段和保持不变的值。material_values_for_variant() 将这些值与通用材料设置合并,再传给 MPMParticleMaterialCfg:
def material_values_for_variant(index: int) -> dict[str, float]:
"""Combine the common material settings with the selected variant's value."""
material_values = {
"density": DENSITY,
"young_modulus": 1.0e7,
"poisson_ratio": 0.3,
"friction": 0.68,
"yield_pressure": 1.0e12,
**PRESET.fixed,
}
if PRESET.field != "particle_jitter_fraction":
material_values[PRESET.field] = PRESET.values[index]
return material_values
根据希望考察的行为选择预设:
|
需观察的行为 |
|---|---|
|
弹性压缩与恢复 |
|
受压时的体积变化 |
|
粒料铺展与最终休止角 |
|
碎裂与抗拉内聚力 |
|
不可逆压缩 |
|
塑性压实后的强度增长 |
|
剪切过程中的体积变化 |
|
内聚流动与形状保持 |
|
与变形速率有关的塑性流动 |
|
规则排列与不规则堆积的粒子分布对结果的影响 |
求解器默认体素大小为 25 mm,每个体素的每个轴向布置两个粒子,即内部体素含八个粒子。材料对比复用相同的随机偏移,避免将粒子堆积变化误认为材料响应变化;只有 particle_jitter 预设对比规则排列和随机扰动后的粒子。用 --variant_index 0、1 或 2 可以单独查看一个试样;粒子扰动预设只有两个变体。
要施加持续压缩,可为任一球体预设添加 --press_spheres:
uv run --extra isaacsim python scripts/tutorials/08_mpm/material_parameters.py \
--preset poisson_ratio --press_spheres --viz kit
静置两秒后,平板开始下降,并持续压缩球体。保持杨氏模量不变,比较横向膨胀和体积响应。加载后让仿真继续运行,以区分瞬态运动和最终稳定的形状。
预设数值及检查分辨率、时间步长、收敛情况的方法见 MPM 求解器 。解释材料行为之前,应先完成这些检查。
接近刚体极限#
rigid_body_equivalence.py 教程在两个相同斜面上对比球体、立方体和胶囊体。左侧由 MJWarp 模拟刚体,右侧由 Newton MPM 模拟对应的粒子对象。相互对应的对象具有相同的颜色、相对斜面的初始位置、外部尺寸和总质量。
uv run --extra isaacsim python scripts/tutorials/08_mpm/rigid_body_equivalence.py \
--viz kit
MPM 对象采用较大但有限的刚度和压力屈服阈值,近似刚性材料。将它们的滚动、滑动及形状保持情况与刚体进行对比。MPM 本质上仍是离散化的连续介质模型,因此较大刚度并不保证得到完全相同的刚体运动;网格分辨率、粒子采样、时间步长和求解器收敛情况仍会影响结果。
用 --mpm_young_modulus 和 --mpm_yield_pressure 探索材料逐渐变软或发生屈服时的变化。对比材料参数时,保持 --voxel_size、--mpm_substeps 和 --solver_iterations 不变,再单独调整它们,检查数值近似的影响。
重建流体表面#
surface_reconstruction.py 教程将一团水落入浅水池,展示如何在不改变粒子仿真的情况下,将粒子位置重建为用于渲染的连续表面。
uv run python scripts/tutorials/08_mpm/surface_reconstruction.py \
--surface_preset balanced --viz newton_gl
换一个 --surface_preset,再次运行同一场景:
预设 |
相对于 |
|---|---|
|
25 mm 重建网格、各向异性核、一次网格平滑 |
|
50 mm 重建网格 |
|
各向同性核 |
|
六次网格平滑 |
观察飞溅形成的薄片、细小的表面特征,以及水池逐渐静止的过程。用 --fluid_render_mode both 可同时查看网格和原始粒子。重建网格独立于 MPM 求解器网格,改变它会影响表面细节和提取开销,不会改变粒子运动。单独指定 --surface_* 选项可以覆盖所选预设。
教程在 sim.reset() 后创建 newton.geometry.ParticleSurface,再将它传给 ParticleSurfaceRenderer。仿真循环在 sim.render() 前调用渲染器的 update(),使可视化器收到与当前粒子状态对应的网格。此接入方式见 隐式 MPM 。
备注
本教程使用 Newton GL 或 Newton RTX 进行表面重建。Kit、Viser 或 Rerun 请设置 --fluid_render_mode particles。共用的 ParticleSurfaceRenderer 也支持 Kit,见 隐式 MPM 中的茶壶示例。
对比单向与双向耦合#
mpm-g1-coupling 示例使用训练好的 G1 行走策略,穿过刚性跑道上的浅层沙、雪和黏土带。机器人先从没有粒子的跑道上起步,再接触粒子。该对比展示了材料阻力如何影响在刚性地形上训练的控制器。
从源码检出目录运行双向耦合对比:
uv run --extra isaacsim --extra rsl-rl isaaclab example mpm-g1-coupling \
--coupling two_way --viz kit
然后改用 --coupling one_way 再运行一次。两种模式下,机器人都会推动粒子。双向耦合将粒子反作用力传回机器人;单向耦合则从初始状态起,将代理反馈的松弛系数设为零。除了观察粒子位移,还应对比机器人的前进情况和平衡状态。遇到材料时,策略可能使机器人减速、卡住或跌倒。
默认情况下,示例让机器人的完整碰撞几何参与 MPM 耦合。可以用 --proxy_bodies feet 或 --proxy_bodies lower_legs 探索耦合几何的选择如何影响交互。--proxy_mode 的 lagged 和 staggered 两种调度方式都支持反馈;仅改变调度模式不会将耦合切换为单向。代理配置和反馈控制见 耦合求解器 。
该示例需要 CUDA。除非通过 --checkpoint 指定检查点,否则会下载已发布的 Isaac-Velocity-Flat-G1 策略。安装软件包后也可运行:
uvx --torch-backend cu130 --from 'isaaclab[isaacsim,rsl-rl]' isaaclab example mpm-g1-coupling \
--coupling two_way --viz kit