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,虽然我知道不容易发现。我会提出一个问题。
我在 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,虽然我知道不容易发现。我会提出一个问题。