问题描述
我正在 pydrake 中进行两足机器人模拟。当步进时间为 0.0001 秒时,我的机器人现在可以通过使用逆动力学和优化接触力来很好地站立甚至跳跃。但是,当我将步进时间设置为 0.001 秒时,脚会进入地面。因为在实时离散系统中通常使用时间步长 0.001s。
是否可以防止 pydrake 中的相互渗透(站立时脚和地面之间)?我觉得我用的contact是pydrake中的惩罚方法,相关的参数如下所示。
-
- 参数(当步进时间为0.0001s时):
IFormattable
- 地面设置如下:
plant.set_penetration_allowance(0.0001)
plant.set_stiction_tolerance(0.001)
这里没有渗透。
Standing when steptime is 0.0001
-
- 参数(当步进时间为0.001s时):
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(),"GroundCollisionGeometry",ground_friction)
- 地面参数相同。
是否可以修复脚的穿透?
Standing when steptime is 0.001
解决方法
首先要认识到的是,接触总是会导致 Drake 的渗透。 Drake 中的接触类似于基于惩罚的方法——穿透越深,法向力越大。您可以调整各种参数,这样对于具有给定质量的机器人,穿透量会减少,但永远不会为零。
您可以通过调整 set_penetration_allowance()
值来更改发生的渗透程度。 价值越大,您获得的渗透率就越高。但是,该值越小,您的系统就越硬,模拟起来就越昂贵(和困难)。原则上,您不应该仅仅因为您改变了离散时间步长就增加该值(尽管极不兼容的穿透余量和时间步长会导致不溶性配置)。
我的建议是将离散时间步长设置为您想要的值,然后逐渐减少“渗透余量”到最大值,从而为您提供以下结果是“好”(使用您拥有的任何“好”指标)。
出于好奇,我不清楚实际问题是什么。渗透会导致问题吗?还是仅仅是令人惊讶?当然,任何假设脚底不能低于地面的代码都是错误的,因此您可能必须在那里进行调整。
如果您更清楚报告的渗透导致什么问题,这可能有助于提供建议。它将更好地让社区了解问题并从更大的工具箱中提供建议。