水弹性接触没有提供预期的接触面

The hydroelastic contact does not give expected contact surface

我一直在使用 Hydroelastic Contact 来模拟钉入孔任务。模拟场景是这样的

蓝色钉子是柔顺的水弹性圆柱体,孔是刚性水弹性网格。孔网格的线框视图为

当我向下推柱子并对其施加外力时(柱子左端向下的力,指向孔的表面),我发现柱子意外地倾斜了。

可以看出,桩尖的左侧部分进入了孔的表面,因此倾斜角度。由于钉子是顺应性主体,因此预计会有穿透力。然而,令我困惑的是倾斜角度和接触面。我期望的是接触面应该包含钉子穿透部分的所有区域,然而,我真正得到的只是一条带。说明如下图所示。左边是我真正得到的接触面,右边是我期望的接触面。 由于孔的表面和钉子的末端之间的接触是面对面的,我希望在孔的表面和钉子的末端接触之后,钉子将处于正常位置(垂直方向)并且倾斜角尽管有外部作用力,钉子还是很小。然而,由于接触表面是条带,销可以沿着该条带旋转并且倾斜角可以很大。起初我怀疑原因是我的孔网格的三角形稀疏。然而,在我向孔的表面添加更多三角形后,我得到了几乎相同的结果。增加水弹性模量也无济于事。我还尝试在钉子的尖端添加小碰撞球体,如点接触情况。但是,我得到

RuntimeError: Bad tetrahedron. Cannot compute gradient.

我应该进行哪些修改才能获得正确的接触面?或者有没有变通的方法可以使面接触后钉子的穿透倾斜角度变小?

我有运行 ball and plate 水弹性接触的例子,发现板和平面之间的接触似乎没有这个问题。

非常感谢您的回答!

(编辑):resolution_hint 太小(~1e-17)触发了 Drake 中的错误。这是 resolution_hint = peg_circumference / 20:

的结果

(原答案):

你有我可以用来重现错误的 public 分支吗?

我的第一个怀疑是您的 resolution_hint 太大了。水弹性中使用的所有原始形状都被赋予内部网格表示,该参数控制网格的粗糙度。使用非常大的分辨率提示,圆柱体的近似值最终可能会变成一个盒子。试试更小的分辨率提示。

如果这不起作用:

您的挂钉使用的是圆柱体基元还是带有 drake:declare_convex 标签的网格?我的另一个怀疑是钉子网格或孔网格中某些面的方向是相反的。

我们期望用作水弹性几何体的网格具有一致且向外的面法线。