如何在仿真中"dampen" MultibodyPlant 的兼容接触模型?
How to "dampen" MultibodyPlant's compliant contact model in a simulation?
TL;DR
目前,我正在修改一个简单的杂乱生成 Python 脚本。
我在哪里可以找到关于如何在我希望正向模拟的工厂中最好地 "minimize" 能量的信息,可能是通过 "damping" MultibodyPlant
的接触模型的参数?
我的愿望是能够向前模拟落入水槽(或垃圾箱)的杂物,并有效地抑制动能(即没有弹跳),希望不会使整合太僵硬。现在,如果这是 "non-physical" hack,我没问题。
我看过以下 Doxygen 部分:
- Doxygen C++: Contact Modeling in Drake
- Doxygen C++:
MultibodyPlant
- 那是我获得接触建模和所有参考的地方。
我看到了改变静摩擦力公差的选项(在我看来,我想要更少的滑动,但是减少它会导致更多的断言失败?),以及时间步长(准确性/刚度,在权衡计算时间)。我还没有遇到可以调整的阻尼项。
我想到的一个选择是只使用 AdvanceTo(t + dt)
,在步骤之间,对 "remove" 能量做一些简单的试探(例如,看看是否有方向变化,然后剥离输出速度(如果有的话)。我的猜测是,如果系统仍然僵硬,这不会真正帮助计算时间。
背景
实际上,这个脚本只是移植了 Naveen 之前的库(在阁楼上,使用 RigidBodyTree
)的一种形式,以使用 MultibodyPlant
:
drake@f2808c7a:attic/manipulation/scene_generation
我的目标是进行快速计算(通过挂钟时间)以生成在一定程度上 "settled" 的新颖杂乱场景。
我有一个简单的玩具示例(我可以生成物体并将其放入厨房水槽),但我发现为了生成初始条件不会导致非物理行为/数值不稳定的对象(例如相互穿透的物体),我向系统中注入了太多 "energy"(我在 xy 平面的一个盒子里生成它们,但我 space 它们沿着 z s.t 离开。初始配置没有穿透力)。
我正在尝试用不同的方法来 "minimize" 这种能量并使物体以尽可能少的计算时间稳定下来。
我简单尝试过的一些事情:
- 只需在非穿透性初始条件下进行正向模拟。这很好,但是(可能是由于兼容接触模型中的设置)它可能需要一段时间才能稳定下来,and/or 能量太大以至于物体会从水槽中反弹出来。在 "take a while" 部分,
- 使用即将发布的安祖版Collision Remover,以所有物体的"zero-height"为起点,以原始生成高度为"collision free" 状态。这可行,但对于大量对象(> 5)来说计算量很大,而且总体上比仅使用前向模拟来解决对象要慢得多。
- 尝试结合
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 毫秒.
很想回来重温一下!
TL;DR
目前,我正在修改一个简单的杂乱生成 Python 脚本。
我在哪里可以找到关于如何在我希望正向模拟的工厂中最好地 "minimize" 能量的信息,可能是通过 "damping" MultibodyPlant
的接触模型的参数?
我的愿望是能够向前模拟落入水槽(或垃圾箱)的杂物,并有效地抑制动能(即没有弹跳),希望不会使整合太僵硬。现在,如果这是 "non-physical" hack,我没问题。
我看过以下 Doxygen 部分:
- Doxygen C++: Contact Modeling in Drake
- Doxygen C++:
MultibodyPlant
- 那是我获得接触建模和所有参考的地方。
我看到了改变静摩擦力公差的选项(在我看来,我想要更少的滑动,但是减少它会导致更多的断言失败?),以及时间步长(准确性/刚度,在权衡计算时间)。我还没有遇到可以调整的阻尼项。
我想到的一个选择是只使用 AdvanceTo(t + dt)
,在步骤之间,对 "remove" 能量做一些简单的试探(例如,看看是否有方向变化,然后剥离输出速度(如果有的话)。我的猜测是,如果系统仍然僵硬,这不会真正帮助计算时间。
背景
实际上,这个脚本只是移植了 Naveen 之前的库(在阁楼上,使用 RigidBodyTree
)的一种形式,以使用 MultibodyPlant
:
drake@f2808c7a:attic/manipulation/scene_generation
我的目标是进行快速计算(通过挂钟时间)以生成在一定程度上 "settled" 的新颖杂乱场景。
我有一个简单的玩具示例(我可以生成物体并将其放入厨房水槽),但我发现为了生成初始条件不会导致非物理行为/数值不稳定的对象(例如相互穿透的物体),我向系统中注入了太多 "energy"(我在 xy 平面的一个盒子里生成它们,但我 space 它们沿着 z s.t 离开。初始配置没有穿透力)。
我正在尝试用不同的方法来 "minimize" 这种能量并使物体以尽可能少的计算时间稳定下来。
我简单尝试过的一些事情:
- 只需在非穿透性初始条件下进行正向模拟。这很好,但是(可能是由于兼容接触模型中的设置)它可能需要一段时间才能稳定下来,and/or 能量太大以至于物体会从水槽中反弹出来。在 "take a while" 部分,
- 使用即将发布的安祖版Collision Remover,以所有物体的"zero-height"为起点,以原始生成高度为"collision free" 状态。这可行,但对于大量对象(> 5)来说计算量很大,而且总体上比仅使用前向模拟来解决对象要慢得多。
- 尝试结合
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 毫秒.
很想回来重温一下!