Gazebo中进行算法仿真首先需要启动世界模型,通过launch文件实现模型与代码的交互,launch文件中整合了world文件和其他launch文件使其同时运行在Gazebo中;world文件是整合模型的文件,可以直接调用模型或者直接编写模型相关的参数;Models文件则是构建每个子模型的文件。三者关系如下图所示:
在打开Gazebo后进行insert,会有非常多已有的模型,拖动即可插入制作好的模型构建虚拟环境,是Gazebo仿真环境中的最底层文件。
文件位置:/home/username/.gaezbo/models (.gazebo文件为隐藏文件,按Ctrl+H显示)
包含内容:
Note: 现有已经展示出的模型文件比较有限,同时复杂的模型配置文件相当复杂,可能有成千上万个参数,很难通过修改参数来调整模型,同时有很多系统封装的模型dae文件或stl文件可以调用,如在一个模型文件的sdf文件中存在如下语句:
<uri>model://bed/meshes/cube_20k.stluri>
即表示调用 ~/.gazebo/models/bed/meshes 模型文件中的 cube_20k.stl 文件构建模型,其中调用了一些系统文件,如
<uri>file://media/materials/scripts/gazebo.materialuri>
其中 gazebo.material文件位于 /usr/share/gazebo-7/media/materials/scripts,其中有诸多model的引用模型的定义, /usr/share/gazebo-7/media/materials/textures中保存了模型的引用图案和纹理。
将models集成起来,但由于world文件只包含模型,故在直接运行时无法直接通过代码对模型进行控制,是Gazebo中的中层文件。
系统自带world文件位置:/usr/share/Gazebo-7/worlds(几乎包含了所有可用的现有的模型)
Note: world文件中有非常多的默认参数,且可以引用很多系统自带的model,几乎可以构建出所有想要的环境,现有world文件测试如下:
world 文件 | Gazebo场景 |
---|---|
actor.world | 移动的人 |
blank.world | 一片空白 |
camera.world | turtlebot和一个cube,都携带摄像头传感器 |
cart_demo.world | 一个简单的小车和一个机器人 |
contact.world | 一个立方体一个turtlebot |
depth_camera.world | 携带深度摄像头的turtlebot和一个半球体,可输出物体width,height,midpoint,distance,min和Max等信息 |
elevator.world | turtlebot和电梯模型 |
empty.world | 空的世界 |
empty_sky.world | turtlebot机器人和蓝天白云(白云可移动) |
road.world | 一条双向马路和一个turtlebot |
wireless_sensors.world | 有一个turtlebot,同时地板上每个方块顶点都有一个点状传感器 |
single_rotor_demo.world | 一个风车和一个turtlebot |
population.world | turtlebot和很多饮料罐 |
linear_battery_demo.world: | |
light.worlds | 绿色光源和一些奇怪的荧光图案 |
imu_demo.world | 一个物体自由落体可测试imu传感器 |
plane_demo.world | 模拟行星表面 |
projector.world | 有一个小球作灯光投影 |
sonar_demo.world | turtlebot声呐传感器 |
heightmap.world | 很高的一个台子 |
presentation.world | turtlebot在一篇白地上做圆周运动 |
rubble.world | 碎石头块和turtlebot |
shapes.world | 三个基本形状和turtlebot |
在Gazebo中添加激光雷达参考:https://blog.csdn.net/qq_16775293/article/details/85009088
作用:将 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 0pose> #模型的位置,依次表示x,y,z以及三个朝向
<collision name="collision"> #定义碰撞属性
<geometry>
<mesh>
<uri>model://bed/meshes/cube_20k.stluri> #引用bed模型中的cube文件
<scale>0.9 0.7 0.2scale> #定义长方体大小,x方向1.8m,y 1.4m,z 0.4m
mesh>
geometry>
collision>
<visual name="visual"> #定义可视属性
<geometry>
<mesh>
<uri>model://bed/meshes/cube_20k.stluri>
<scale>0.9 0.7 0.2scale>
mesh>
geometry>
visual>
link>
在sdf文件中同时引用多个stl或dae文件格式如下:
#声明这是一个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可以有两种方式进行建模
home/用户名/.gazebo/models/模型命名
文件夹中找到现有的可以运行的仿真文件,如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://robothouseuri> #这里是博主上面的模型文件
include>
此时打开终端,运行
$ roslaunch turtlebot3_gazebo turtlebot3_empty_world.launch
运行结果如下:
此时如果需要运行导航及建图,请参考博主后续文章:
ROS及SLAM进阶教程(九)Gmapping+amcl的turtlebot实现和Gazebo仿真实现
上图是为了模拟家庭环境,结合了现有的model以及自己编辑的家具model而成的仿真平台,仅为参考。
博主有两年多ROS的使用经验,目前仍在不停研究中。本系列ROS及SLAM进阶教程将涵盖ROS的进阶功能使用、机器人SLAM及导航的设计及研究等领域,持续不断更新中。如果大家有相关问题或发现作者漏洞欢迎私戳,同时欢迎关注收藏。
同时欢迎关注博主Git:
https://github.com/redglassli