< >
Home » ROS2与Gazebo11入门教程 » ROS2与Gazebo11入门教程-扭转摩擦(Torsional Friction)

ROS2与Gazebo11入门教程-扭转摩擦(Torsional Friction)

说明:

  • 介绍如何在GUI或SDF中对扭转摩擦进行设置

概述

  • 扭转摩擦当前仅适用于ODE物理引擎

为什么要扭转摩擦

无扭转摩擦的行为

  • 当一个方盒在某个平面上旋转时,它们之间会有很大的接触面。

  • 在每个接触点上,平移摩擦都会使方盒减速。您可以自己尝试一下:

      1. 使用默认的物理引擎打开Gazebo,并插入一个方盒;
      1. 选中“视图(View)”->“透明(Transparent)”菜单项,然后选中“视图(View)”->“接触(Contacts)”菜单项,这样我们就可以看到接触点。
      1. 右键单击该方盒,然后选择“应用力和扭矩(Apply Force and Torque)”菜单项。
      1. 在打开的对话框中,在扭矩(torque)的Z轴上输入1000.0 Nm,然后按下“应用扭矩(Apply Torque)”按钮。该方盒就会旋转一下子然后停下来。
  • 现在,对球体也尝试上述相同的操作。您将会看到该球体开始旋转并且永远不会停下来。这是为什么呢?

请输入图片描述

  • 方盒和球体发生不同行为的原因在于,Gazebo默认情况下会使用默认参数启用平移摩擦,但是默认情况下会禁用扭转摩擦。

  • 方盒的表面很大,与地面有多个接触点,可以在上图中看到它们被显示为蓝色小球。每个接触点都具有垂直于接触法线方向的角速度和线速度。其中线速度的存在会触发平移摩擦。

  • 另一方面,球体的单个接触点没有线速度,因此平移摩擦不会作用于球体上。如果我们希望球体由于摩擦而停下来,则需要为其设置扭转摩擦。

有扭转摩擦的行为

  • 现在向仿真世界中添加另一个球体,并为其设置一些参数以启用使扭转摩擦。操作步骤如下:

      1. 在仿真世界中插入另一个球体;
      1. 右键单击该球体,然后选择“编辑模型(Edit model)”菜单项,这样就会进入模型编辑器。
      1. 双击该球体以打开其检查器。进入到“碰撞(Collision)”选项卡,然后找到“表面(Surface)”->“摩擦(Friction)”项。那里有一些对于扭转摩擦很重要的参数,下文会对其进行说明。现在,需要将“Use patch radius”参数设置为false,并将该球体的半径(0.5 m)输入到“Surface radius”参数中。请注意,默认情况下,扭转摩擦系数为1.0。
      1. 由于接触面积很小,扭转摩擦通常很小。对于我们的实验,需要很大的摩擦力以使该球体快速停下来。实现这个目的的一种方法就是让球体很重,这样会使其紧贴地面。因此,需要进入到“链接(Link)”选项卡,然后将质量(mass)设置为10000Kg。该球体越重,它压在地面上的力就越大,摩擦力也就越大。
      1. 应用所做的更改,关闭检查器,然后转到“文件(File)”->“退出模型编辑器(Exit Model Editor)”菜单项。确保保存该新模型。从“模型编辑器”返回后,仿真仍然处于暂停状态。在继续下一步之前,请确保单击“play”按钮以运行仿真
      1. 回到主窗口,像对上面那个无扭转摩擦的球体一样对这个新球体施加扭矩。与第一个球体(仍在旋转且它会一直旋转下去)不同,当施加扭矩时,新球体会快速停止旋转。

扭转摩擦的工作原理

扭转摩擦方程

  • 扭转摩擦扭矩是基于接触深度和表面半径进行计算的,其公式如下(可以在此处找到更详细的计算方法):
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
  • 在该演示中,有许多模型在旋转。摩擦更大的模型会先停下来,可以观看此视频直观了解该演示的效果。

参考:

纠错,疑问,交流: 请进入讨论区点击加入Q群

获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号


标签: ros2与gazebo11入门教程