首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >pydrake URDF设置动态参数

pydrake URDF设置动态参数
EN

Stack Overflow用户
提问于 2020-04-22 14:22:17
回答 3查看 329关注 0票数 1

在URDF文件中设置冲突的动态属性存在问题。

我看到使用了标准的ode标记,还有一个新的特定的drake drake github拉请求集标记。

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

代码语言:javascript
复制
<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代码如下:

代码语言:javascript
复制
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()))

我检索材料属性并打印出来。产出如下:

代码语言:javascript
复制
Collision Geometry properties for: peg_link
Coulomb
static: 1.0
dynamic: 1.0

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-04-23 14:08:48

您肯定可以从SDF或URDF中设置属性。我建议在Drake中浏览示例。

奇怪的是,你决定设置水弹性性质,我们确实有代码,但没有例子。这一模式目前正在发展之中,没有得到充分的支持。除非你有很好的理由,我建议你继续使用点接触器。

无论如何,它不适用于您的原因是因为它不是<drake:drake>,而是<drake:proximity_properties>。单元测试是找出可用选项的一个很好的来源,参见这里

<surface>标记不是URDF,被忽略,它是SDF标记。这也解释了它不起作用的原因。这是意料之中的。我建议阅读SDF规范文档并浏览Drake示例sdf文件(对<surface>的全局搜索将很快显示此标记仅用于SDF文件)。

对于URDF文件,也可以这样做:

代码语言:javascript
复制
<drake_compliance>
  <static_friction>0.8</static_friction>
  <dynamic_friction>0.3</dynamic_friction>
</drake_compliance>

所有解析选项都是完全记录在这里的,尽管我意识到不易发现。我会提出一个问题。

票数 3
EN

Stack Overflow用户

发布于 2020-04-23 01:28:45

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

MultibodyPlant目前使用的主要接触模型是“罚点接触”模型。它被详细地记录了这里 (以及后面的链接)。我还没有检查解析器,但我认为当前的状态/建议是,如果缺省值不够,应该以编程方式为MBP设置这些参数;我不认为它们可以在urdf/sdf中设置。

票数 0
EN

Stack Overflow用户

发布于 2020-04-23 08:25:39

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

代码语言:javascript
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61367504

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档