ROS2与Gazebo11入门教程-流体力学(Hydrodynamics)插件
说明:
- 介绍如何使用BuoyancyPlugin插件和LiftDragPlugin插件共同对水下物体(潜艇)的行为进行仿真
背景知识
浮力(Buoyancy)
浮力是指作用于浸没在流体中的物体上的力,方向与其所受重力方向相反。当一个物体浸入流体中时,作用于其上的压力就会增大。流体柱底部的压力(沿重力方向)大于其顶部的压力。
浮力就是由这个压力差产生的:物体趋向于向压力较低的地方移动。浮力正是某些物体漂浮在水中的原因。
根据阿基米德原理,作用在一个物体上的浮力等于该物体浸入流体中而排开的流体重量。流体重量是由重力作用在流体上的力。为了计算出这个浮力,必须知道被排开流体的质量,该质量可以从被排开流体的体积和密度推导出来。被排开流体的体积等于排开这些流体的物体体积。
密度是流体的已知特性(例如,在1个大气压下,水的密度约为999 kg/m3)。
这样:
作用于物体上的浮力 = 该物体体积×流体密度×重力加速度
使用BuoyancyPlugin插件
- BuoyancyPlugin是一个模型插件,用于计算模型中每个链接的浮力并将该浮力应用于该链接的体积中心。
- 可以使用SDF指定下列可选插件参数:
<fluid_density>:物体周围流体的密度,单位为千克/立方米(kg/m3)。默认值为999.1026 kg/m3(水的密度)。
<link>:链接
name:<link>元素的属性即链接名称。必须与模型中已有链接的名称匹配。
<center_of_volume>:链接在链接坐标系中的体积中心,是3维空间中的一个点。如果未指定,则会自动计算出体积中心。
<volume>:链接的体积,单位为立方米(m3)。如果未指定,则会自动计算出链接的体积。
如果未指定链接的<center_of_volume>和
参数,则会根据构成该物体的碰撞形状的尺寸来计算这两个参数值。如果物体由简单形状(方盒、圆柱体和球体)组成,则该计算将是精确的。而对于网格和折线形状,则会使用其边界框对这两个参数值进行近似计算。 下面是一个含有BuoyancyPlugin插件的SDF示例代码块:
<model name="boat">
<link name="body">
<!-- ... link info here ... -->
</link>
<plugin name="BuoyancyPlugin" filename="libBuoyancyPlugin.so">
<!-- a viscous liquid -->
<fluid_density>2000</fluid_density>
<link name="body">
<center_of_volume>1 2 3</center_of_volume>
<volume>50</volume>
</link>
</plugin>
</model>
演示(Demo)
- 以暂停模式用Gazebo打开underwater.world仿真环境,命令为:
gazebo --verbose worlds/underwater.world -u
这个仿真世界中有三艘潜艇。当Gazebo不暂停仿真(正在进行仿真)时,白色潜艇会浮到仿真世界的顶部,黑色潜艇会沉入到水底地平面上,而黄色潜艇若不受干扰,则会保持在一个恒定高度上。
每个潜艇模型都有一个螺旋桨链接。黄色潜艇被设计为当螺旋桨旋转时向前移动。
拉出Gazebo的右面板并选中黄色潜艇模型。赋给spinning_joint一个小的正扭矩。
随着螺旋桨的旋转,该潜艇将会向前移动。增大扭矩将会导致该潜艇更快地向前推进。
本演示的效果可以通过下面这个Youtube视频链接进行观看:
演示说明
浮力
- 白色潜艇的密度为500kg/m3。由于浮力大于重力,因此在不暂停仿真时,白色潜艇会立即浮到仿真世界的顶部。另一方面,黑色潜艇的密度为1500kg/m3,因此会沉入到水下地平面上。黄色潜艇的密度恰好为999.1026kg/m3,因此除非受到其他作用力的干扰,否则它会以平衡状态漂浮在水中。
升力和阻力
潜艇螺旋桨的构造使得旋转螺旋桨关节会产生前进方向上的阻力。螺旋桨叶片是倾斜的,这样就会使螺旋桨叶片的迎角始终小于45度。螺旋桨叶片在垂直于前进方向的平面内旋转。因为升力和阻力是正交的,所以会产生前进方向上的升力。螺旋桨上的升力使得整个潜艇会向前移动。
对于每个螺旋桨叶片来说,升力和阻力都是作用在该叶片的压力中心上,压力中心位于螺旋桨叶片轴线方向上距螺旋桨中心约70%半径处。压力中心也是测量速度以计算升力和阻力的点。压力中心对旋转物体非常重要,因为如果使用螺旋桨的中心来计算升力和阻力,则这些力将会始终为零。
参考:
获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号