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方法中添加这些标准形状。
力和扭矩的交互是通过流体粒子表面碰撞完成的,并没有考虑来自流体的压力。更好的算法会大大提高流体仿真的真实性。
参考:
获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号