< >
Home » ROS2与Gazebo11入门教程 » ROS2与Gazebo11入门教程-流体(Fluids)仿真

ROS2与Gazebo11入门教程-流体(Fluids)仿真

说明:

  • 介绍流体(Fluids)仿真.

简介

  • 该软件包允许在Gazebo中对流体进行仿真。使用Fluidix库在GPU上计算流体粒子的相互作用(如果nvidia GPU不可用,则仿真会在CPU模式下运行)。

前提条件:

  • 英伟达(Nvidia)显卡

  • 完成了Gazebo基本教程的学习,尤其是完成了仿真世界插件,系统插件和传输库示例。

  • 为更深入地了解流体粒子仿真,请查看一些Fluidix示例。

安装相关软件

  • 安装CUDA(推荐安装6.0):
sudo apt-get install nvidia-cuda-dev nvidia-cuda-toolkit
  • 安装Fluidix

  • 使用在线形式来获得对Fluidix的链接,命令为:

mkdir /tmp/fluidix

unzip ~/Downloads/Fluidix*.zip -d /tmp/fluidix

cd /tmp/fluidix

sudo ./install.sh
  • 使用fluid_sph分支从源代码安装Gazebo,命令为:
[...]

cd ~; git clone https://github.com/osrf/gazebo

cd ~/gazebo

git checkout fluid_sph

[...]

该软件包的工作原理

  • 流体仿真作为一个单独的物理引擎运行,该引擎通过接口(include/FluidEngine.hh)与Gazebo的刚体物理引擎进行交互。

  • 交互内容包括:碰撞检测刚性物体上施加的力/扭矩*流体粒子的可视化。

  • 流体仿真的核心部分被写入到cuda文件src/FluidEngine.cu中,且是构建于SPH基本示例之上的。

  • 该软件包包含两个插件,一个是用于更新流体及其交互的仿真世界插件(http://FluidWorldPlugin.cc)。而另一个是用于可视化流体粒子的GUI系统插件(http://FluidVisPlugin.cc)。

运行插件

  • 设置gazebo插件和模型路径:
echo "export GAZEBO_PLUGIN_PATH=/<path_to_gazebo_source>/gazebo/build/plugins:${GAZEBO_PLUGIN_PATH}" >> ~/.bashrc

echo "export GAZEBO_MODEL_PATH=/<path_to_gazebo_source>/gazebo/media/models:${GAZEBO_MODEL_PATH}" >> ~/.bashrc

source ~/.bashrc
  • 将插件添加到仿真世界文件中,或使用该软件包中的示例之一:
gedit ~/fluid.world
  • 将以下内容复制到打开的文本编辑器中,保存该文件然后退出:
<?xml version="1.0"?>

<sdf version="1.5">

<world name="fluid_world">



<!-- A global light source -->

<include>

<uri>model://sun</uri>

</include>



<!-- A box (plane + fluid is not supported) -->

<model name="box">

<static>true</static>

<pose>0 0 0 0 0 0</pose>

<link name="link">

<collision name="collision">

<geometry>

<box>

<size>20 20 0.1</size>

</box>

</geometry>

</collision>

<visual name="visual">

<geometry>

<box>

<size>20 20 0.1</size>

</box>

</geometry>

</visual>

</link>

</model>



<plugin name="FluidWorldPlugin" filename="libFluidWorldPlugin.so">

<world_position>0 0 1.01</world_position>

<world_size>1.5 1 10</world_size>

<fluid_position>-0.5 0.0 0.8</fluid_position>

<fluid_volume>0.4 0.95 0.5</fluid_volume>

<particle_nr>0</particle_nr>

</plugin>



</world>

</sdf>
  • 其中:
<world_position>和<world_size>用于设置流体仿真世界的中心位置及其大小

<fluid_position>和<fluid_volume>用于设置流体的中心位置及待被流体粒子填充的体积

<particle_nr>如果设置为0,给定的体积将会被流体粒子填充满,否则将会产生给定数量的粒子。
  • 用该系统插件运行gazebo客户端,命令为:
gazebo ~/fluid.world -g /tmp/gz_fluid/build/libFluidVisPlugin.so

碰撞网格(Collisions meshes)

  • 为了使流体仿真能够检测到碰撞,Gazebo需要使用.stl文件作为碰撞网格。

可能的问题:

  • 在CMakeLists.txt文件中,CUDA编译器可能需要特定于显卡的标志:
SET(CUDA_NVCC_FLAGS "-arch;sm_30 -use_fast_math -lm -ldl -lrt -Xcompiler \"-fPIC\"")

Fluidix软件包的CMake包含路径

  • 对于默认安装,Fluidix头文件位于/opt/fluidix/include目录中,如果路径不同,请确保在src/CMakeLists.txt文件中对该路径进行相应更改。

部分代码说明:

  • 仿真世界插件http://FluidWorldPlugin.cc:

  • 在构造函数中,会对流体引擎进行初始化

  • 在FluidWorldPlugin :: Load函数中,会加载sdf参数,创建流体仿真世界,添加流体,在流体环境中重新创建环境中的物体(在可能的时候)

  • 在FluidWorldPlugin :: Init函数中,会对物体和流体粒子位置的发布者节点进行初始化

  • 仿真世界的每个更新事件都会调用FluidWorldPlugin :: OnUpdate函数,在该函数中流体引擎会在一个时间戳上进行更新,并向渲染插件发送一条包含所有流体粒子新位置的消息,并会计算出施加在刚性物体上的力和扭矩。

  • 系统插件http://FluidVisPlugin.cc,用于渲染流体:

  • 在FluidVisPlugin :: Load函数中,会加载渲染类型(sphere或默认的point)参数(如果已给定)。当选择球体时,如果加载了许多流体粒子,则渲染速度会变慢。

  • 在FluidVisPlugin :: Init函数中,会加载流体粒子位置的订阅者节点。

  • 在FluidVisPlugin :: RenderAsPointsUpdate或FluidVisPlugin :: RenderAsSpheresUpdate函数中(取决于渲染类型),如果有具有流体粒子位置的新消息可用,则会更新渲染。

  • 流体仿真引擎FluidEngine.cu与Fluidix的SPH示例相类似。

未完成的部分和待办事项(TODOs)

  • 如果有人有兴趣进一步为该软件包做出贡献,以下诸多功能仍然需要进一步的工作:

  • 实现一个较新的SPH:可以是PCISPH或IISPH,以实现更快速的仿真和不压缩流体。可以通过在src/FluidEngine.cu文件中改进算法完成此事项。

  • 当前,流体仿真中的标准形状仅实现了方盒(box)形状,请参见src/FluidEngine.cu文件中的FluidEngine :: AddMovableBox,其实现方式与这个示例类似。采用相同的想法,也可以实现圆柱体、球体、平面等其他碰撞类型。实现这些标准形状后,与方盒类型相似,也需要在FluidWorldPlugin :: CreateFluidCollision方法中添加这些标准形状。

  • 力和扭矩的交互是通过流体粒子表面碰撞完成的,并没有考虑来自流体的压力。更好的算法会大大提高流体仿真的真实性。

参考:

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

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


标签: ros2与gazebo11入门教程