刚体#

刚体是 Genesis World 中默认的实体类型:一种不会变形的固体,由刚体求解器仿真。Hello, Genesis World 教程中得到的正是刚体,它覆盖了机器人学的大部分内容:机械臂、夹爪、移动底座,以及它们所交互的道具。本节其余部分介绍构建在同一个 Scene 之上的非刚体族。

添加刚体#

只要实体的 material 是 gs.materials.Rigid,它就是刚体,这也是默认值,因此通常只需传入一个 morph:

box = scene.add_entity(gs.morphs.Box(pos=(0, 0, 0.5), size=(0.2, 0.2, 0.2)))
franka = scene.add_entity(gs.morphs.MJCF(file="xml/franka_emika_panda/panda.xml"))

两者都是刚体实体。盒子是单个刚体;Franka 则是关节体,即由关节连接起来的一棵刚体连杆树。

单体与关节体#

每个刚体实体都是一个 RigidEntity,通过自身的方法驱动,而不是依靠全局句柄。关节体会暴露其结构:

  • 连杆(entity.links、entity.n_links):树中的各个刚体。

  • 关节(entity.joints、entity.n_joints):连杆之间的连接。

  • 自由度(entity.n_dofs):关节运动所沿的独立坐标。单个自由体有 6 个自由度;固定的盒子则没有。

通过实体读写状态:基座位姿用 get_pos() 和 get_quat(),关节位置用 get_dofs_position()。如何用控制器驱动这些自由度,请参见 控制你的机器人;针对机械臂的同类内容请参见 机器人控制。

固定基座与自由基座#

实体的基座是牢牢固定在世界坐标系上还是自由浮动,取决于 morph。MJCF 文件自身会指定基座关节;URDF 的基座默认是自由的(即与世界之间的一个 6 自由度关节),除非传入 fixed=True。具体细节请参见 加载资产。

物理属性#

刚体材质决定物体在物理上如何交互。传入配置好的 gs.materials.Rigid 可以覆盖默认值:

box = scene.add_entity(
    gs.morphs.Box(pos=(0, 0, 0.5), size=(0.2, 0.2, 0.2)),
    material=gs.materials.Rigid(
        rho=1000.0,               # density in kg/m3, used to estimate mass
        friction=1.0,             # sliding (Coulomb) friction coefficient
        friction_torsional=0.005, # resists spin about the contact normal (meters)
        friction_rolling=0.0001,  # resists rolling about the tangent axes (meters)
    ),
)

扭转摩擦和滚动摩擦只有在求解器上启用后才会生效,因为它们会为每个接触添加约束行:

scene = gs.Scene(
    rigid_options=gs.options.RigidOptions(
        friction_cone=gs.friction_cone.elliptic,  # exact isotropic cone (default: pyramidal)
        enable_torsional_friction=True,
        enable_rolling_friction=True,              # requires enable_torsional_friction
    ),
)

当静置的物体需要保持不动而不是缓慢蠕动时,请选择椭圆的 friction_cone。与默认的 Newton constraint_solver 搭配使用时,它还会启用 signorini 接触求解方式,此时我们会默认选择该方式:摩擦力受接触已经产生的法向力限制,因此快速滑动的物体会以 friction 倍重力减速,而不会从平坦地面上抬起。显式设置 contact_resolution 可以覆盖这一选择。

下面两个示例分别单独演示每个系数。examples/rigid/torsional_grasp.py 用两块平板夹住一个球并使其旋转,点接触只通过 friction_torsional 抵抗旋转。examples/rigid/rolling_coast.py 让两个球并排滚动,只有设置了 friction_rolling 系数的那个球会逐渐滚动停止。

刚体求解器掌管这些物体实际如何相互推挤:接触、碰撞几何和约束。理论与建模 记录了这一模型,并完整介绍了 接触求解。

另请参阅#