文件讲解

Gazebo中进行算法仿真首先需要启动世界模型,通过launch文件实现模型与代码的交互,launch文件中整合了world文件和其他launch文件使其同时运行在Gazebo中;world文件是整合模型的文件,可以直接调用模型或者直接编写模型相关的参数;Models文件则是构建每个子模型的文件。三者关系如下图所示:    

Models 文件

在打开Gazebo后进行insert,会有非常多已有的模型,拖动即可插入制作好的模型构建虚拟环境,是Gazebo仿真环境中的最底层文件。     文件位置:/home/username/.gaezbo/models (.gazebo文件为隐藏文件,按Ctrl+H显示)   包含内容:  
  1. .config文件(声明文件,在Gazebo中声明sdf与materials等文件)
  2. .sdf文件(参数文件,包含构建模型所必须的参数信息)
  3. materials文件(元素文件,包含需要在models中插入的图片、3D模型dae文件等)
  4. 其他参数文件(皆通过.config文件进行声明)
  Note: 现有已经展示出的模型文件比较有限,同时复杂的模型配置文件相当复杂,可能有成千上万个参数,很难通过修改参数来调整模型,同时有很多系统封装的模型dae文件或stl文件可以调用,如在一个模型文件的sdf文件中存在如下语句:  
 <uri>model://bed/meshes/cube_20k.stl</uri>
  即表示调用 ~/.gazebo/models/bed/meshes 模型文件中的 cube_20k.stl 文件构建模型,其中调用了一些系统文件,如  
<uri>file://media/materials/scripts/gazebo.material</uri>
  其中 gazebo.material文件位于 /usr/share/gazebo-7/media/materials/scripts,其中有诸多model的引用模型的定义, /usr/share/gazebo-7/media/materials/textures中保存了模型的引用图案和纹理。  

World文件

将models集成起来,但由于world文件只包含模型,故在直接运行时无法直接通过代码对模型进行控制,是Gazebo中的中层文件。 系统自带world文件位置:/usr/share/Gazebo-7/worlds(几乎包含了所有可用的现有的模型)   Note: world文件中有非常多的默认参数,且可以引用很多系统自带的model,几乎可以构建出所有想要的环境,现有world文件测试如下:    
在Gazebo中添加激光雷达参考:https://blog.csdn.net/qq_16775293/article/details/85009088
 

Launch文件

作用:将 world文件、models和其他launch文件组成起来,且作为接口文件可使代码对model进行控制,是Gazebo中最顶层的文件。
launch文件参数的学习: https://blog.csdn.net/qq_38402294/article/details/71512089
  launch文件示例: /turtlebot/turtlebot_simulator/turtlebot_gazebo/src/launch/turtlebot_world.launch   其中如果调用系统自带的launch文件可通过 $(find workspace)/launch/xxx.launch调用其他launch文件,例如$(find gazebo_ros)/launch/empty_world.launch,可通过指令进行定位  
rospack find gazebo_ros
  其中empty_world.launch文件位置:/opt/ros/kinetic/share/gazebo_ros/launch   Note:launch文件与代码文件的通信原理,launch文件中节点名字Node的定义通过代码文件进行调用即可使用代码控制gazebo中的模型。  

模型编辑

可视化操作

可参考:https://blog.csdn.net/lxlong89940101/article/details/91044811
  Note: 进入gazebo后按快捷键Ctrl+B进入编辑界面,并且可以拖动墙体、门体和三种基础形状进行编辑,其中点击墙体拖动进入gazebo后滑动确定长度后点击右键停止建墙。三种基础形状拖动进入gazebo后可进行编辑确定其参数。编辑好模型后保存至~/.gazbeo/models中。       存在问题: 三种基础形状更改后保存再次打开会存在问题,所以建议通过第二种方法直接修改模型。墙体在保存后其高低无法更改,但是其长度仍然可以在再次打开模型后进入Edit models进行修改。不建议一次性将所有模型集成起来,建议分开保存,之后再整合,否则一旦保存成为一个模型将无法更改里面的子模型。  

配置文件编辑

打开models所在文件夹的sdf文件进行参数修改,主要需要修改的参数,把握size、pose等字眼,修改其中的数字参数,在修改sdf文件的同时在gazebo中查看模型状态再调整参数,在sdf中引用stl或dae等模型文件格式如下:  
<link name="link1">		#定义了具有惯性,视觉特征和碰撞特性的刚体
      <pose>0 0 0.2 0 0 0</pose>		#模型的位置,依次表示x,y,z以及三个朝向
      <collision name="collision">		#定义碰撞属性
        <geometry>
          <mesh>
            <uri>model://bed/meshes/cube_20k.stl</uri>	#引用bed模型中的cube文件
            <scale>0.9 0.7 0.2</scale>		#定义长方体大小,x方向1.8m,y 1.4m,z 0.4m
          </mesh>
        </geometry>
      </collision>
      <visual name="visual">		#定义可视属性
        <geometry>
          <mesh>
            <uri>model://bed/meshes/cube_20k.stl</uri>
            <scale>0.9 0.7 0.2</scale>
          </mesh>
        </geometry>
      </visual>
    </link>
在sdf文件中同时引用多个stl或dae文件格式如下:
<?xml version="1.0" ?> 	#声明这是一个XML文件
<model name=”xxx”>		#定义该模型的名称,用于.config文件中调用并在insert中显示
	<link name=”xxx1”>
	……				#具体为模型的参数设置(如上所示)
	</link>
	<link name=”xxx2”>
	……
	</link>
</model>
 
更复杂的引用如引用纹理,使用自定义图片建立带纹理的地面模型: https://blog.csdn.net/catherine627/article/details/83548063 在Gazebo中构建四轮小车教程如下,包含详细的Link元素结构及详细属性分析、Joint元素结构及属性分析等参数讲解 https://blog.csdn.net/qq_16775293/article/details/88379988
 

仿真操作流程

完成model建模

model可以有两种方式进行建模  
  1. 直接在~/.gazebo/models文件中复制现有的model文件产生副本并重命名,然后在该文件的基础上修改config和sdf文件。但是这种方式仅限于简单的模型且参数容易修改的
  2. 在Gazebo中进行可视化建模然后保存。具体的流程为: 拖动需要的模型(含自制的模型)组建出如下类似的效果 保存至home/用户名/.gazebo/models/模型命名文件夹中此时再次打开Gazebo会发现左侧model栏中会出现已有的文件,可以拖动这个model到界面中(可能会卡顿)。如果想要固定该model,则需要修改world文件和launch文件
 

world文件和launch文件修改

找到现有的可以运行的仿真文件,如turtlebot3_empty_world.launch,首先一定要备份原文件,以免修改出错后原文件也没了。以博主的文件为例,首先定位turtlebot3_empty_world.launch位于~/catkin_ws/src/turtlebot3_simulations/turtlebot3_gazebo/launch中,打开该launch文件,发现其引用了world文件,将其修改为  
  <include file="$(find turtlebot3_gazebo)/launch/empty_world.launch">
  #这个empty_world.launch文件是基本仿真参数配置文件不需要修改
    <arg name="world_name" value="$(find turtlebot3_gazebo)/worlds/empty_1.world"/>
    # 需要修改这里的world文件为自己定义的文件
    <arg name="paused" value="false"/>
    <arg name="use_sim_time" value="true"/>
    <arg name="gui" value="true"/>
    <arg name="headless" value="false"/>
    <arg name="debug" value="false"/>
  </include>
  同时打开位于~/catkin_ws/src/turtlebot3_simulations/turtlebot3_gazebo/worlds文件,复制一份原有的empty_world文件并修改代码(只展示加入进去的代码):  
    <include>
      <uri>model://robothouse</uri> #这里是博主上面的模型文件
    </include>
  此时打开终端,运行  
$ roslaunch turtlebot3_gazebo turtlebot3_empty_world.launch
  运行结果如下:     此时如果需要运行导航及建图,请参考博主后续文章: ROS及SLAM进阶教程(九)Gmapping+amcl的turtlebot实现和Gazebo仿真实现  

其他模型展示

    上图是为了模拟家庭环境,结合了现有的model以及自己编辑的家具model而成的仿真平台,仅为参考。   本文转载自CSDN,原文链接:https://blog.csdn.net/qq_33742147/article/details/105437418