ROS2与Gazebo11入门教程-扭转摩擦(Torsional Friction)
说明:
- 介绍如何在GUI或SDF中对扭转摩擦进行设置
概述
- 扭转摩擦当前仅适用于ODE物理引擎
为什么要扭转摩擦
无扭转摩擦的行为
当一个方盒在某个平面上旋转时,它们之间会有很大的接触面。
在每个接触点上,平移摩擦都会使方盒减速。您可以自己尝试一下:
- 使用默认的物理引擎打开Gazebo,并插入一个方盒;
- 选中“视图(View)”->“透明(Transparent)”菜单项,然后选中“视图(View)”->“接触(Contacts)”菜单项,这样我们就可以看到接触点。
- 右键单击该方盒,然后选择“应用力和扭矩(Apply Force and Torque)”菜单项。
- 在打开的对话框中,在扭矩(torque)的Z轴上输入1000.0 Nm,然后按下“应用扭矩(Apply Torque)”按钮。该方盒就会旋转一下子然后停下来。
现在,对球体也尝试上述相同的操作。您将会看到该球体开始旋转并且永远不会停下来。这是为什么呢?
方盒和球体发生不同行为的原因在于,Gazebo默认情况下会使用默认参数启用平移摩擦,但是默认情况下会禁用扭转摩擦。
方盒的表面很大,与地面有多个接触点,可以在上图中看到它们被显示为蓝色小球。每个接触点都具有垂直于接触法线方向的角速度和线速度。其中线速度的存在会触发平移摩擦。
另一方面,球体的单个接触点没有线速度,因此平移摩擦不会作用于球体上。如果我们希望球体由于摩擦而停下来,则需要为其设置扭转摩擦。
有扭转摩擦的行为
现在向仿真世界中添加另一个球体,并为其设置一些参数以启用使扭转摩擦。操作步骤如下:
- 在仿真世界中插入另一个球体;
- 右键单击该球体,然后选择“编辑模型(Edit model)”菜单项,这样就会进入模型编辑器。
- 双击该球体以打开其检查器。进入到“碰撞(Collision)”选项卡,然后找到“表面(Surface)”->“摩擦(Friction)”项。那里有一些对于扭转摩擦很重要的参数,下文会对其进行说明。现在,需要将“Use patch radius”参数设置为false,并将该球体的半径(0.5 m)输入到“Surface radius”参数中。请注意,默认情况下,扭转摩擦系数为1.0。
- 由于接触面积很小,扭转摩擦通常很小。对于我们的实验,需要很大的摩擦力以使该球体快速停下来。实现这个目的的一种方法就是让球体很重,这样会使其紧贴地面。因此,需要进入到“链接(Link)”选项卡,然后将质量(mass)设置为10000Kg。该球体越重,它压在地面上的力就越大,摩擦力也就越大。
- 应用所做的更改,关闭检查器,然后转到“文件(File)”->“退出模型编辑器(Exit Model Editor)”菜单项。确保保存该新模型。从“模型编辑器”返回后,仿真仍然处于暂停状态。在继续下一步之前,请确保单击“play”按钮以运行仿真
- 回到主窗口,像对上面那个无扭转摩擦的球体一样对这个新球体施加扭矩。与第一个球体(仍在旋转且它会一直旋转下去)不同,当施加扭矩时,新球体会快速停止旋转。
扭转摩擦的工作原理
扭转摩擦方程
- 扭转摩擦扭矩是基于接触深度和表面半径进行计算的,其公式如下(可以在此处找到更详细的计算方法):
T = 3*PI/16 * a * coefficient * N
式中:
T——由于扭转摩擦而产生的扭矩。
3*PI/16——常数,约等于0.589
N——接触点的法向力。
Coefficient——扭转摩擦系数。这通常与平移摩擦系数mu和mu2是相同的。
a——接触面半径(即SDF中的patch_radius)。这是两个表面之间的接触区域的半径。平面上的球体会产生一个圆形的接触面,该接触面取决于球体半径和接触深度,如下图所示。
- 接触面半径的计算公式如下:
a = sqrt(R * d)
式中:
R——接触点上的表面半径(即SDF中的surface_radius);
d——接触深度。
SDF参数
从上面的方程式可以看出,与平移摩擦不同,扭转摩擦不是仅仅取决于法向力及其摩擦系数,还取决于表面之间的接触面积。
SDF提供了两种参数化接触表面的方法。用户要么定义一个与接触深度无关、大小总是相同的patch_radius(上面的a),要么定义一个与接触深度一起使用的surface_radius(上面的R)。请注意,在这两种情况下,用户都为整个表面指定了一个值,因此为非球形表面选取值时可能需要进行微调。
要在这两种方法之间做出选择,可以对use_patch_radius标记进行设置,选择patch_radius参数时需要将其设置为true,而将其设置为false则会选用surface_radius。
默认值
coefficient:与mu和mu2一样,该参数的默认值为1.0。
use_patch_radius:默认为True,因此会使用patch_radius。
patch_radius:默认为零,因此即使设置了coefficient,也不会有扭转摩擦。
surface_radius:默认为零,因此即使设置了coefficient,也不会有扭转摩擦。
示例
回到上面的示例,由于知道该球体的半径,因此通过将use_patch_radius参数设置为false来选用surface_radius方法。然后也设置了正确的半径。
由于从定义上说扭转摩擦很小(想一下球体保持旋转的时间有多长),因此将球体质量增加到一个很大的值,以产生很大的压力并增大接触深度,从而加大了扭转摩擦。
在SDF中,该球体示例的扭转摩擦应该如下所示:
<model ...>
...
<link ...>
<collision ...>
...
<surface>
<friction>
<torsional>
<coefficient>1.0</coefficient>
<surface_radius>0.5</surface_radius>
<use_patch_radius>false</use_patch_radius>
</torsional>
</friction>
...
</surface>
</collision>
</link>
</model>
示例仿真世界
- Gazebo自带了一个演示仿真世界,可以用以下命令来运行该仿真世界:
gazebo -u worlds/torsional_friction_demo.world
- 在该演示中,有许多模型在旋转。摩擦更大的模型会先停下来,可以观看此视频直观了解该演示的效果。
参考:
获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号