如何在仿真中"dampen" MultibodyPlant 的兼容接触模型?

How to "dampen" MultibodyPlant's compliant contact model in a simulation?

TL;DR

目前,我正在修改一个简单的杂乱生成 Python 脚本。

我在哪里可以找到关于如何在我希望正向模拟的工厂中最好地 "minimize" 能量的信息,可能是通过 "damping" MultibodyPlant 的接触模型的参数?

我的愿望是能够向前模拟落入水槽(或垃圾箱)的杂物,并有效地抑制动能(即没有弹跳),希望不会使整合太僵硬。现在,如果这是 "non-physical" hack,我没问题。

我看过以下 Doxygen 部分:

我看到了改变静摩擦力公差的选项(在我看来,我想要更少的滑动,但是减少它会导致更多的断言失败?),以及时间步长(准确性/刚度,在权衡计算时间)。我还没有遇到可以调整的阻尼项。

我想到的一个选择是只使用 AdvanceTo(t + dt),在步骤之间,对 "remove" 能量做一些简单的试探(例如,看看是否有方向变化,然后剥离输出速度(如果有的话)。我的猜测是,如果系统仍然僵硬,这不会真正帮助计算时间。

背景

实际上,这个脚本只是移植了 Naveen 之前的库(在阁楼上,使用 RigidBodyTree)的一种形式,以使用 MultibodyPlant:

drake@f2808c7a:attic/manipulation/scene_generation

我的目标是进行快速计算(通过挂钟时间)以生成在一定程度上 "settled" 的新颖杂乱场景。

我有一个简单的玩具示例(我可以生成物体并将其放入厨房水槽),但我发现为了生成初始条件不会导致非物理行为/数值不稳定的对象(例如相互穿透的物体),我向系统中注入了太多 "energy"(我在 xy 平面的一个盒子里生成它们,但我 space 它们沿着 z s.t 离开。初始配置没有穿透力)。

我正在尝试用不同的方法来 "minimize" 这种能量并使物体以尽可能少的计算时间稳定下来。

我简单尝试过的一些事情:

  1. 只需在非穿透性初始条件下进行正向模拟。这很好,但是(可能是由于兼容接触模型中的设置)它可能需要一段时间才能稳定下来,and/or 能量太大以至于物体会从水槽中反弹出来。在 "take a while" 部分,
  2. 使用即将发布的安祖版Collision Remover,以所有物体的"zero-height"为起点,以原始生成高度为"collision free" 状态。这可行,但对于大量对象(> 5)来说计算量很大,而且总体上比仅使用前向模拟来解决对象要慢得多。
  3. 尝试结合 MinimumDistanceConstraint 编写一个简单的高度最小化 MathematicalProgram。这很慢而且相当脆弱,尽管它可能需要更多的调整。 Example code here.

免责声明:我是 TRI Anzu / Drake 开发人员,但对 Drake 物理模拟设置中更复杂的部分一无所知:P

我一直认为"right"解决这个问题的方法是写一个小的数学程序来解决问题的不动点(静态平衡:v=v̇=0)。对于机械手方程,当 v=0 时,一堆项消失了。全局解决这个问题是丑陋的和非凸的,但一旦你知道哪些力应该是非零的(也许通过模拟一点),那么它应该很快,我想。

谢谢大家的回答!

目前,我走的是(更悲伤的)hack 路线,这是更简单的启发式方法:

generate_poses_sink_clutter.py, height_heuristic(...)

https://github.com/RobotLocomotion/drake/issues/13332#issuecomment-632335186

在这种情况下,高度启发式运行大约需要 5 毫秒(即使在 Python 中),而 MathematicalProgram 变体(至少我写的穷人版本)往往需要 >500 毫秒.

很想回来重温一下!