1

我在 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()))

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

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

似乎解析有问题,或者我做错了什么。

4

3 回答 3

3

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

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

无论如何,它对你不起作用的原因是因为它不是<drake:drake>but <drake:proximity_properties>。单元测试是找出可用选项的好来源,请参见此处

<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>

所有解析选项都在此处详细记录,尽管我意识到不容易发现。我会提出问题。

于 2020-04-23T14:08:48.563 回答
0

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

目前使用的主要接触模型MultibodyPlant是“点球法点接触”模型。它在此处(以及随后的链接)进行了非常详尽的记录。我没有检查解析器,但我相信当前状态/建议是以编程方式为 MBP 设置这些参数,如果默认值不足;我不认为它们可以在 urdf/sdf 中设置。

于 2020-04-23T01:28:45.620 回答
0

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

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)
于 2020-04-23T08:25:39.167 回答