pydrake URDF设置动态参数

pydrake URDF setting dynamic parameters

我在 URDF 文件中设置碰撞的动态属性时遇到问题。

我看到使用了标准的 ode 标签,还有一个新的特定 drake drake github pull requeset xml 标签。

以下是我在 urdf 中定义碰撞的方式。该对象是一个简单的盒子。

<collision>
  <origin xyz="0 0 0" rpy="0 0 0"/>
  <geometry>
     <box size="0.85 0.85 2." />
  </geometry>
  <drake:drake>
     <drake:hydroelastic_resolution_hint value="1.3" />
     <drake:elastic_modulus value="1e8" />
     <drake:dissipation value="0.25" />
     <drake:mu_dynamic value="0.7" />
     <drake:mu_static value="0.7" />
  </drake:drake>
  <surface>
    <friction>
     <ode>
       <mu>0.6</mu>
       <mu2>0.6</mu2>
     </ode>
   </friction>
 </surface>
</collision>

pydrake代码如下:


builder = DiagramBuilder()
plant, scene_graph = AddMultibodyPlantSceneGraph(builder, 0.001)
parser = Parser(plant)

peg_model_instance = Parser(plant).AddModelFromFile('square_peg.urdf')

plant.Finalize()

print('Collision Geometry properties for: {}'.format(peg_body.name()))
for collision_geometry in plant.GetCollisionGeometriesForBody(peg_body):
    const_proximity_properties = inspector.GetProximityProperties(collision_geometry)
    coulomb_friction = const_proximity_properties.GetProperty('material', 'coulomb_friction')
    print('Coulomb')
    print('static: {}'.format(coulomb_friction.static_friction()))
    print('dynamic: {}'.format(coulomb_friction.dynamic_friction()))

我检索 material 属性并打印它们。输出是:

Collision Geometry properties for: peg_link
Coulomb
static: 1.0
dynamic: 1.0

好像解析有问题或者我做错了什么。

哇!您已经找到了水弹性接触模型的参数,该模型即将上线,但默认情况下尚未启用。

目前MultibodyPlant使用的主要联系人模型是"Penalty method point contact"模型。它的文档非常详尽 here(以及后面的链接)。我没有检查解析器,但我相信当前的 status/recommendation 是以编程方式为 MBP 设置这些参数,如果默认值不够;我不认为它们可以在 urdf/sdf.

中设置

有关如何在代码中设置动态属性的信息,请参阅已接受的答案。 下面是以编程方式更改它的代码。

def copy_object_proximity_properties(const_proximity_properties, new_proximity_properties):
    for group_name in const_proximity_properties.GetGroupNames():
        properties = const_proximity_properties.GetPropertiesInGroup(group_name)
        for name in properties:
            if new_proximity_properties.HasProperty(group_name, name):
                continue
            new_proximity_properties.AddProperty(group_name, name, const_proximity_properties.GetProperty(group_name, name))


def set_rigid_body_coulomb_friction(scene_graph, plant, source_id, rigid_body, static_friction, dynamic_friction):
    new_proximity_properties = ProximityProperties()
    new_proximity_properties.AddProperty('material',
                                         'coulomb_friction',
                                         CoulombFriction(static_friction, dynamic_friction))

    geometry_id = plant.GetCollisionGeometriesForBody(rigid_body)[0]
    inspector = scene_graph.model_inspector()
    const_proximity_properties = inspector.GetProximityProperties(geometry_id)

    copy_object_proximity_properties(const_proximity_properties, new_proximity_properties)
    scene_graph.AssignRole(source_id, geometry_id, new_proximity_properties, RoleAssign.kReplace)

您绝对可以从 SDF 或 URDF 设置属性。我推荐浏览 Drake 中的示例。

你决定设置水弹性属性很奇怪,我们有代码但没有示例。该模型目前正在开发中,尚未得到完全支持。除非你有很好的理由,否则我建议你继续使用点接触解算器。

无论如何,它对您不起作用的原因是因为它不是 <drake:drake>,而是 <drake:proximity_properties>。单元测试是找出可用选项的良好来源,请参阅 here

<surface> 标签不是 URDF 并且被忽略,它是一个 SDF 标签。这也解释了它不起作用的原因。这是预期的。我建议阅读 SDF 规范文档并浏览 Drake 示例 sdf 文件(全局搜索 <surface> 将快速显示此标签仅用于 SDF 文件)。

使用 URDF 文件您还可以:

<drake_compliance>
  <static_friction>0.8</static_friction>
  <dynamic_friction>0.3</dynamic_friction>
</drake_compliance>

所有的解析选项都很彻底documented here,虽然我知道不容易发现。我会提出一个问题。