混合实体#

混合实体(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 抵消骨架上的重力,因此机械臂会保持位姿而不会下垂。

混合材质参数#

参数

默认值

含义

material_rigid

必填

刚性骨架的材质,例如 gs.materials.Rigid。

material_soft

必填

软质蒙皮的材质。必须是 gs.materials.MPM.* 类型。

thickness

0.05

蒙皮厚度(米),从每个连杆的网格向外膨胀。

damping

0.0

对蒙皮与骨架之间的相对速度施加阻尼;数值越大,振荡越小。

soft_dv_coef

0.01

从骨架回馈到蒙皮的耦合速度比例。

use_default_coupling

False

使用求解器内置的耦合器,而不是混合实体的逐粒子耦合。

控制#

通过刚体自由度控制混合实体,方法与普通 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 材质使用。

另请参阅#