在URDF文件中设置冲突的动态属性存在问题。
我看到使用了标准的ode标记,还有一个新的特定的drake drake github拉请求集标记。
下面是我在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似乎在解析中有问题,或者我做错了什么。
发布于 2020-04-23 14:08:48
您肯定可以从SDF或URDF中设置属性。我建议在Drake中浏览示例。
奇怪的是,你决定设置水弹性性质,我们确实有代码,但没有例子。这一模式目前正在发展之中,没有得到充分的支持。除非你有很好的理由,我建议你继续使用点接触器。
无论如何,它不适用于您的原因是因为它不是<drake:drake>,而是<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-23 01:28:45
哇!您已经找到了水弹性接触模型的参数,它即将上线,但在默认情况下还没有启用。
MultibodyPlant目前使用的主要接触模型是“罚点接触”模型。它被详细地记录了这里 (以及后面的链接)。我还没有检查解析器,但我认为当前的状态/建议是,如果缺省值不够,应该以编程方式为MBP设置这些参数;我不认为它们可以在urdf/sdf中设置。
发布于 2020-04-23 08:25:39
有关如何在代码中设置动态属性,请参见已接受的答案。下面是以编程方式更改它的代码。
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)https://stackoverflow.com/questions/61367504
复制相似问题