混合实体#
混合实体(hybrid entity)把刚性骨架与柔软蒙皮耦合在一起,使两者作为同一个物体进行仿真。刚性部分承载你控制的关节;柔软部分在它周围变形,并通过接触反向推回。它适用于柔顺机械臂、软体夹爪,以及运动来自带关节的框架、但表面可变形的生物。
完整脚本见 examples/tutorials/advanced_hybrid_robot.py:一台双连杆机械臂,其软质蒙皮在地面上扫动一个刚性球。
心智模型#
混合实体把两个共享同一场景和同一时间步的实体配对:
刚性部分(
RigidEntity),从 URDF 解析而来,承载关节和自由度(dof)。软质部分(
MPMEntity),其粒子附着在刚性连杆上。
每个仿真步中,刚性求解器推进关节,耦合把每个软体粒子映射回它所属的连杆;粒子的反作用力随后回馈到刚性连杆上。通过刚体自由度驱动该实体,蒙皮就会跟随运动。软质材料必须基于 MPM;目前尚不支持 FEM 和 PBD 蒙皮。
最小配置#
混合场景需要三样前面教程没有的东西:一个 MPM 域、一个足够软的刚体接触求解器,以及一种混合材质。
scene = gs.Scene(
sim_options=gs.options.SimOptions(
dt=3e-3, # s; small for rigid-body numerical stability
substeps=10,
),
rigid_options=gs.options.RigidOptions(
gravity=(0, 0, -9.8), # m/s^2, Z-up
# A stiff rigid contact solver produces large impulses at this small dt.
constraint_timeconst=0.02,
),
mpm_options=gs.options.MPMOptions(
lower_bound=(0.0, 0.0, -0.2), # MPM grid must enclose the soft skin
upper_bound=(1.0, 1.0, 1.0),
gravity=(0, 0, 0), # mimic gravity compensation on the skin
enable_CPIC=True, # keeps skin particles from slipping through the thin skeleton links
),
)
MPM 求解器在背景网格上模拟蒙皮;lower_bound 和 upper_bound(单位:米)定义该网格的范围。请让实体舒适地处于其内部。
添加混合实体#
传入 gs.morphs.URDF 作为骨架,以及一个包装了刚性材料和软质材料的 gs.materials.Hybrid:
robot = scene.add_entity(
morph=gs.morphs.URDF(
file="urdf/simple/two_link_arm.urdf",
pos=(0.5, 0.5, 0.3),
scale=0.2,
fixed=True,
),
material=gs.materials.Hybrid(
material_rigid=gs.materials.Rigid(
gravity_compensation=1.0, # cancel gravity on the skeleton
),
material_soft=gs.materials.MPM.Muscle(
E=1e4, # Young's modulus, Pa
nu=0.45, # Poisson's ratio
rho=1000.0, # kg/m^3
model="neohooken",
),
thickness=0.05, # m; skin inflated outward from each link's collision mesh
damping=1000.0,
),
)
Genesis World 会生成蒙皮:对于每个带碰撞几何体的刚性连杆,它把该几何体向外膨胀 thickness(米),并用绑定到该连杆的 MPM 粒子填充。上文把 MPM 求解器的 gravity 设为零,可抵消蒙皮上的重力,而 gravity_compensation=1.0 抵消骨架上的重力,因此机械臂会保持位姿而不会下垂。
混合材质参数#
参数 |
默认值 |
含义 |
|---|---|---|
|
必填 |
刚性骨架的材质,例如 |
|
必填 |
软质蒙皮的材质。必须是 |
|
|
蒙皮厚度(米),从每个连杆的网格向外膨胀。 |
|
|
对蒙皮与骨架之间的相对速度施加阻尼;数值越大,振荡越小。 |
|
|
从骨架回馈到蒙皮的耦合速度比例。 |
|
|
使用求解器内置的耦合器,而不是混合实体的逐粒子耦合。 |
控制#
通过刚体自由度控制混合实体,方法与普通 RigidEntity 相同,这些调用会转发到刚性部分:
for i in range(1000):
dofs_ctrl = [1.0 * np.sin(2 * np.pi * i * 0.001)] * robot.n_dofs
robot.control_dofs_velocity(dofs_ctrl)
scene.step()
control_dofs_position、control_dofs_velocity、control_dofs_force 以及对应的 get_dofs_position / get_dofs_velocity / get_dofs_force 都作用于骨架。软质蒙皮没有独立的控制接口;它随连杆运动而运动。
访问各部分#
两个底层实体通过属性暴露,便于分别读取或渲染:
robot.part_rigid # the RigidEntity skeleton
robot.part_soft # the MPMEntity skin
robot.n_dofs # dofs of the skeleton
solver_rigid 和 solver_soft 分别返回对应的求解器。
注意事项与常见陷阱#
Note
刚性和软质求解器必须共享同一个 dt。Genesis World 会在构造时断言这一点,因此请在 sim_options 中统一设置时间步,而不要按求解器分别设置。
Warning
由 lower_bound / upper_bound 定义的 MPM 网格是有限的,求解器会钳制到达边界的蒙皮粒子,表现为骨架继续运动时蒙皮却卡在一堵看不见的墙上。请把边界设得足以容纳实体的全部运动范围。
Tip
混合动力学是刚性的。如果仿真不稳定,请先降低 dt、提高 damping,或用更大的 constraint_timeconst 让刚体接触求解器变软,然后再考虑调整材料刚度 E。
混合实体也可以直接由 gs.morphs.Mesh 构建:Genesis World 会对网格做骨架化,从提取出的骨架构建刚体,并把软体粒子绑定到其上。经过测试的示例使用上文展示的 URDF 路径;网格路径可通过同一个 gs.materials.Hybrid 材质使用。