【问题标题】:Pydrake: About Penetration in discrete time simulationPydrake:关于离散时间模拟中的渗透
【发布时间】:2021-05-19 13:17:19
【问题描述】:

我正在 pydrake 中进行双足机器人模拟。当步长为 0.0001 秒时,我的机器人现在可以通过使用逆动力学和优化接触力来很好地站立甚至跳跃。但是,当我将步长时间设置为 0.001 秒时,脚会穿透地面。因为实时离散系统中通常使用时间步长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

【问题讨论】:

  • 我其实和肖恩有同样的问题,实际问题不清楚。你说,“因为实时离散系统中通常使用时间步长 0.001s”。你是什​​么意思?这是您的控制器中的某种要求吗?或者你是想说如果时间步长更小,那么模拟程序就不会实时运行? (我会感到惊讶,您的系统看起来很小?)。但 Sean 关于穿透余量(刚度)和 sim 稳定性之间权衡的答案是准确的。
  • 抱歉我的问题不清楚。由于我们的机器人实时系统使用时间步长0.001s,我希望我在drake中模拟的时间步长与现实世界中的时间步长相同。这就是为什么我需要将步长从 0.0001s 增加到 0.001s。
  • TBH 我不明白你说的“我们的机器人实时使用时间步长0.001s”是什么意思,你的意思是你测量1kHz的状态?如果是这样,那并不意味着您的 sim 的时间步长必须与该频率匹配。对于 sim,时间步长通常由您尝试解决的动力学速度 + 稳定性给出。你的实际物理系统是连续的。 dt 仅告诉您我们正在使用该系统的离散近似值。无论测量。我的问题是,为什么 dt=1e-4 对你不利?是否合理符合现实?

标签: python drake


【解决方案1】:

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

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

我的建议是将离散时间步长设置为您想要的值,然后逐渐减少“渗透余量”到 最大 值,从而为您提供以下结果是“好”(使用您拥有的任何“好”指标)。

出于好奇,我不清楚实际的问题 是什么。渗透会引起问题吗?还是仅仅是令人惊讶?当然,任何假设脚底不能低于地面的代码都是错误的,所以你可能不得不在那里调整。

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

【讨论】:

  • 非常感谢。为了听从您的建议,我正在尝试降低“set_penetration_allowance()”的值。目前,我的参数比以前的参数小(plant.set_penetration_allowance(0.0001) )。但渗透仍然严重且大。在 5 秒长的模拟中,我的机器人站立并保持双脚穿透。我很好奇,一旦我改变时间步长(0.001s),穿透就消失了(或者真的很小,如上图所示)。
  • 对于模拟,如果有非常非常大的穿透我不能忽略,机器人的高度不准确,那么它就无法遵循我想要的 COM(质心)轨迹。
  • 您的机器人的总质量是多少,对于 0.0001 的穿透余量,您观察到的穿透深度是多少?有多少英尺与地面接触才能达到这么大的穿透力?
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2017-05-31
    • 2012-10-22
    • 1970-01-01
    • 2019-09-07
    • 1970-01-01
    • 2015-07-13
    • 2018-11-07
    • 2021-05-23
    • 2011-04-29
    相关资源
    最近更新 更多