文件讲解
Gazebo中进行算法仿真首先需要启动世界模型,通过launch文件实现模型与代码的交互,launch文件中整合了world文件和其他launch文件使其同时运行在Gazebo中;world文件是整合模型的文件,可以直接调用模型或者直接编写模型相关的参数;Models文件则是构建每个子模型的文件。三者关系如下图所示:
Models 文件
在打开Gazebo后进行insert,会有非常多已有的模型,拖动即可插入制作好的模型构建虚拟环境,是Gazebo仿真环境中的最底层文件。 文件位置:/home/username/.gaezbo/models (.gazebo文件为隐藏文件,按Ctrl+H显示) 包含内容:
- .config文件(声明文件,在Gazebo中声明sdf与materials等文件)
- .sdf文件(参数文件,包含构建模型所必须的参数信息)
- materials文件(元素文件,包含需要在models中插入的图片、3D模型dae文件等)
- 其他参数文件(皆通过.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可以有两种方式进行建模
- 直接在~/.gazebo/models文件中复制现有的model文件产生副本并重命名,然后在该文件的基础上修改config和sdf文件。但是这种方式仅限于简单的模型且参数容易修改的
- 在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