Pydrake:关于离散时间模拟中的渗透

2024-09-27 07:29:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在pydrake中进行两足机器人的模拟。我的机器人现在可以站立,甚至跳跃,通过使用反向动力学和优化接触力,当步进时间为0.0001s时。但是,当我将步进时间设置为0.001s时,脚会穿透地面。因为时间步长0.001s通常用于实时离散系统

是否有可能防止pydrake中的穿插(站立时脚与地面之间)?我认为我使用的联系人是pydrake中的惩罚方法,与此相关的参数如下所示

    1. 参数(步进时间为0.0001s时):
plant.set_penetration_allowance(0.0001)
plant.set_stiction_tolerance(0.001)
  • 地面装置如:
ground_friction = CoulombFriction(static_friction=1,static_friction=1)
plant.RegisterVisualGeometry(plant.world_body(), RigidTransform(),HalfSpace(), "GroundVisualGeometry", diffuse_color=[1., 0.64, 0.0, 0.5])
plant.RegisterCollisionGeometry(plant.world_body(), RigidTransform(), HalfSpace(), "GroundCollisionGeometry", ground_friction)

这里没有渗透

Standing when steptime is 0.0001

    1. 参数(步进时间为0.001s时):
plant.set_penetration_allowance(0.001) # if this param smaller than the step time 0.001, an error will be there
plant.set_stiction_tolerance(0.001)
  • 地面参数相同

是否可以固定脚的穿透

Standing when steptime is 0.001


Tags: world参数时间机器人statictolerancesetplant
2条回答

幸运的是,我现在知道我的机器人出了什么事。穿透的原因是碰撞几何体的obj格式。我现在用一个简单的长方体代替我的URDF中的obj碰撞,然后问题就解决了(没有穿透)! 我认为主要的原因是,用drake中的接触函数在离散时间内可能无法完美地解决obj碰撞

首先要认识到的是,接触总是会导致德雷克的渗透。德雷克的接触类似于基于惩罚的方法,穿透越深,法向力越大。您可以调整各种参数,以便对于具有给定质量的机器人,穿透量减少,但它永远不会变为零

您可以通过调整set_penetration_allowance()值来更改发生的穿透程度。该值越大,您获得的穿透力就越大。但是,该值越小,系统就越硬,模拟的成本就越高(也越困难)。原则上,您应该而不是仅仅因为更改了离散时间步长而增加此值(尽管,极不兼容的穿透余量和时间步长可能导致无法解决的配置)

我的建议是将离散时间步长设置为您想要的值,然后逐渐的“穿透余量”减小到最大的值,从而得到“好”的结果(使用您拥有的任何“好”度量)

出于好奇,我不清楚实际的问题是什么。渗透是否造成问题?还是仅仅是令人惊讶?当然,任何假定脚底不能低于地面的代码都是错误的,因此您可能必须在那里进行调整

如果你能更清楚地了解所报告的渗透造成了什么问题,这可能有助于提供建议。这将更好地使社区了解问题,并从更大的工具箱中提供建议

相关问题 更多 >

    热门问题