[ Gazebo ] 手把手教会你创建自己的World
gazebo介绍
1 什么是Gazebo?
Gazebo是一款3D物理仿真器,支持机器人开发所需的机器人、传感器和环境模型,并通过其搭载的强大物理引擎产生高品质的图形画面,达到逼真的仿真结果。
Gazebo功能强大,主要有:
-
构建机器人运动仿真模型
Gazebo提供了最基础的球体、圆柱体与立方体,利用它们以及伸缩变换或者旋转变换,可以自主设计机器人三维仿真模型。除此之外,Gazebo提供了CAD、Blender、SolidWorks等各种2D、3D设计软件接口,可以导入图纸让Gazebo机器人模型更真实。 -
构建现实世界各种场景的仿真模型
Gazebo可以建立一个用来测试机器人的仿真场景,通过添加物体库来模仿现实世界,还可以通过添加2D房屋设计图,构建出3D的房屋。 -
构建传感器仿真模型
Gazebo提供强大的传感器模型库,包括camera、depth camera、laser、imu等机器人常用的传感器,并且可以直接使用。Gazebo也允许用户从零创建一个新的传感器,添加它的具体参数,甚至还可以添加传感器噪声模型,让传感器更加真实。 -
为机器人模型添加现实世界的物理性质
Gazebo提供的物理引擎可以为机器人添加重力、阻力等,提供了在复杂的室内和室外环境中准确有效地模拟机器人群体的能力。
2 Gazebo架构
2.1 Gazebo前后端
Gazebo区分:
- 客户端:gzclient,接受数据信息并显示,允许多个客户端存在
- 服务端:gzserver,运行Gazebo运算分析功能
终端运行指令:
gazebo
默认执行指令
gzserver
gzclient
可以分开运行服务端和客户端指令
2.2 gazebo文件格式
-
世界
扩展名为 .world,该文件包含了仿真的所有元素——机器人、环境、传感器等,通过 gzserver 读取所有信息并构建一个真实的3D场景。
-
模型:
扩展名为 .sdf,即仿真描述文件(Simulation Description Format),模型文件主要用于实现基本组件复用,例如——太阳、平面等,从而简化 .world
**URDF(Unified Robot Description Format)在ROS中是一种功能强大且标准化的机器人描述格式,但依然缺少许多功能。**例如,
URDF只能单独定义单个机器人的运动学和动力学特性;
无法定义机器人本身在世界中的姿态;
不能定义闭链结构(并联机器人);
缺乏摩擦和等更丰富的动力学特性;
不能定义非机器人物体,例如灯光,高度图等。
在实现方面,URDF语法大量使用XML的属性(Attribute)特性,使得URDF更加不灵活。 也没有向后兼容的机制。
为了解决以上问题,开发人员创建了一种称为SDF(Simulation Description Format)的新格式,专门供Gazebo使用。
SDF完整描述了从世界级到机器人级的所有内容。 它具有良好的可扩展性。
SDF格式使用XML元素而非属性来自我描述(因为属性往往难以阅读和维护),这有助于使用简单的升级工具将旧版本迁移到新版本。 SDF也是具有自描述性的格式。
2.3 gazebo环境变量
| 环境变量 | 描述 |
|---|---|
GAZEBO_MODEL_PATH | Gazebo所有模型的路径 |
GAZEBO_RESOURCE_PATH | Gazebo所有资源的路径,例如 .world、.sdf 等 |
GAZEBO_MASTER_URI | 指定ip与端口,用于Gazebo客户端与服务器连接使用,通常使用服务器运行Gazebo时需要设置 |
GAZEBO_PLUGIN_PATH | Gazebo搜索插件库的路径 |
GAZEBO_MODEL_DATABASE_URI | Gazebo下载模型的路径 |
上述环境变量存于/usr/share/gazebo/setup.sh文件中
# if GAZEBO_INSTALL_PREFIX is unset, fall back to
# configure-time value of CMAKE_INSTALL_PREFIX
installPrefix=${GAZEBO_INSTALL_PREFIX:-/usr}
if [ ! -d "${installPrefix}" ]; then
echo "The install prefix ${installPrefix} does not exist."
unset installPrefix
return 1
elif [ ! -f "${installPrefix}/share/gazebo-11/setup.sh" ]; then
echo "The install prefix ${installPrefix}/share/gazebo-11 does not contain setup.sh."
unset installPrefix
return 1
fi
export GAZEBO_MASTER_URI=${GAZEBO_MASTER_URI:-http://localhost:11345}
export GAZEBO_MODEL_DATABASE_URI=http://models.gazebosim.org
export GAZEBO_RESOURCE_PATH=${installPrefix}/share/gazebo-11:${GAZEBO_RESOURCE_PATH}
export GAZEBO_PLUGIN_PATH=${installPrefix}/lib/x86_64-linux-gnu/gazebo-11/plugins:${GAZEBO_PLUGIN_PATH}
export GAZEBO_MODEL_PATH=${installPrefix}/share/gazebo-11/models:${GAZEBO_MODEL_PATH}
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${GAZEBO_PLUGIN_PATH}
export OGRE_RESOURCE_PATH=/usr/lib/x86_64-linux-gnu/OGRE-1.9.0
unset installPrefix
3 界面介绍
Gazebo-GUI主要包含以下部分:
- 场景(Scene):模拟器的主要部分,是仿真模型显示的地方,用户可以在场景中操作仿真对象,使其与环境进行交互。
- 左侧面板:
- WORLD:该选项卡显示当前场景中的模型,并允许查看和修改模型参数。
- INSERT:该选项卡是向仿真场景中添加新对象、模型,可以添加常用模型所在的路径。
- LAYERS:该选项卡组织并显示仿真中可用的不同可视化组,一个图层可以包含一个或多个模型,打开或关闭图层将显示或隐藏该图层中的模型。
- 顶部工具栏:包含与模拟器交互时最常用的选项,如按钮:选择、移动、旋转和缩放;灯光;创建简单形状(例如立方体、球体、圆柱体);复制/粘贴;更改视图;捕捉对齐等。
- 底部工具栏:显示有关仿真的数据,如仿真时间及其与真实时间。
- 仿真时间:指当仿真运行时,时间在仿真环境中过得有多快。仿真可以比真实时间慢或快,具体取决于运行仿真所需的计算量。
- 真实时间:指在仿真环境中运行时实际经过的时间。仿真时间和真实时间的比率称为实时因子。
- 步长:每次仿真迭代都会推进一个固定的秒数,默认情况下,步长为1ms。按“暂停”按钮暂停仿真,并使用“步长”按键一次执行多个步长。
4 地图搭建
4.1 地图编辑
启动Gazebo,依次点击 Edit -> Building Editor 打开地图编辑器。

该编辑器由以下3个区域组成:
- 调色板:选择建筑特征和材料
- 2D视图:设计或导入楼层平面图,编辑器会根据平面图自动在3D编辑器中插入墙壁、门窗和楼梯
- 3D视图:预览平面设计的3D视图,在这里可以为建筑物的不同部分分配颜色和纹理
4.2 地图保存
在顶部菜单上,选择File,然后Save As可以保存模型文件.sdf与.config。单击Exit Building Editor退出场景编辑器,注意退出后就不能够再次编辑场景了。
回到主界面再次选择File,然后Save World可以保存世界文件.world。
4.3 地图加载
.world中包含模型文件的全部内容,但不利于模型文件.sdf与.config复用以及.world文件的可读性,本节进行改进。假设模型文件名为scene1,则模块化加载模型的方式为
存放位置为 ~/ros2_ws/src/robot_description/models,则:
<!-- 自定义模型 -->
<model name='scene1'>
<include>
<uri>///home/mstrling/ros2_ws/src/robot_description/models/scene1</uri>
</include>
</model>
存放位置为 ~/.gazebo/models,则:
<!-- 自定义模型 -->
<model name='scene1'>
<include>
<uri>model://scene1</uri>
</include>
</model>
启动地图可以类比turtlebot3_world.launch的结构,将其中的地图改成自己的场景即可,如下所示
<launch>
<include file="$(find gazebo_ros)/launch/empty_world.launch">
<arg name="world_name" value="$(find gazebo_lab)/worlds/scene1.world"/>
<!-- more default parameters can be changed here -->
<arg name="paused" value="false"/>
<arg name="use_sim_time" value="true"/>
<arg name="gui" value="true"/>
<arg name="headless" value="false"/> <!-- Inert - see gazebo_ros_pkgs issue #491 -->
<arg name="recording" value="false"/>
<arg name="debug" value="false"/>
</include>
</launch>
5 模型和world的引入
5.1 文件结构
5.1.1 模型文件结构
├── models
│ ├── MODEL_NAME
│ │ ├── model.config
│ │ ├── model.sdf
│ │ ├── meshes
│ │ │ ├── (*.dae), (*.stl)
│ │ ├── materials
│ │ │ ├── textures
│ │ │ │ ├── (*.png), (*.jpg)
5.1.2 功能包文件结构
├── PackageName
│ ├── CMakeLists.txt
│ ├── package.xml
│ ├── launch
│ │ ├── gazebo.launch
│ ├── worlds
│ │ ├── scene1.world
│ ├── models
│ │ ├── MODEL_NAME
│ │ │ ├── model.config
│ │ │ ├── model.sdf
│ │ │ ├── meshes
│ │ │ │ ├── ...
│ │ │ ├── materials
│ │ │ │ ├── textures
│ │ │ │ │ ├── ...
│ ├── urdf
│ │ ├── robot.urdf
5.2 模型路径
5.2.1 model的sdf文件中的uri路径
参考链接:model的sdf文件中的uri路径
通常world文件中需要引入sdf文件,如下所示
<include>
<uri>model://sun</uri>
</include>
<include>
<uri>model://garage</uri>
</include>
下面介绍uri的三种路径:
- 1. model的默认路径
默认路径是~/.gazebo/models,可以将模型文件夹放入该路径下,然后在world文件中引入模型即可
- 2. model的自定义路径
很多时候用户会引入自定义的模型或者为了打包方便,将模型放在功能包中,这时候就需要使用model的自定义路径
步骤:
- 在功能包中创建models文件夹
- 将模型文件夹放入models文件夹中
- 在功能包的package.xml文件中添加如下内容
<export>
<gazebo_ros gazebo_model_path="${prefix}/models"/>
</export>
注意:这里的${prefix}是指功能包的路径,即功能包的根目录,比如/home/mstrling/ros2_ws/src/robot_description
- 在xx.sdf文件或xx.world文件中引入模型:model://MODEL_NAME
- 在功能包的launch文件中引入world文件
- 3. 声明路径(环境变量)
在终端或者.bashrc里声明GAZEBO_MODEL_PATH的路径,如下所示
可以通过设置GAZEBO_MODEL_PATH环境变量来改变默认路径
export GAZEBO_MODEL_PATH=~/ros2_ws/src/robot_description/models:$GAZEBO_MODEL_PATH若要设置多个路径,可以使用冒号分隔
生效方法为source ~/.bashrc
5.3 模型参数
| 字段名称 | 说明 |
|---|---|
| max_step_size | 最大的仿真时间步长。因为 Gazebo 支持四种不同的物理引擎,simbody 这样的引擎使用的是可变时间步长的求解器,所以需要指定最大的时间步长。而 Gazebo 默认使用的 ODE 引擎,则是固定步长的求解器,该值就是实际的仿真时间步长。默认情况下为 0.001 秒,即完成一次仿真迭代,仿真时间流逝 0.001 秒。 |
| real_time_update_rate | 该字段定义了仿真器的迭代频率,默认是 1000Hz。如果该字段为 0 或者计算机的实际算力不能够支持该字段所要求的更新频率,那么 Gazebo 将尽可能快速地进行仿真求解。 |
| real_time_factor | 该字段描述了仿真时间与机器时间之间类似于 “天上一日,地上一年” 的比例关系。如果该字段小于 1,则意味着仿真时间比机器时间慢。此外字段 max_step_size 和 real_time_update_rate 的乘积决定了该比例系数的上限。 |
统一时间体系,无非就是要让ROS系统使用Gazebo的仿真时间,这一点只需要将ROS的运行参数"/use_sim_time"设置为true就可以了。这样ROS系统就会订阅一个"/clock"的主题来驱动ROS系统的时间体系。 我们只需要在Gazebo的插件中通过该主题不断的发布仿真时间
在launch文件中,如果跑gazebo仿真,则需要设置use_sim_time为true,若跑实体机器人,则需要设置为false
<physics type="ode"> <!-- 物理引擎 ode -->
<real_time_update_rate>3150.0</real_time_update_rate> <!-- 每秒物理更新的尝试次数,单位为赫兹(Hz) -->
<max_step_size>0.001</max_step_size> <!-- 每个物理更新步骤的持续时间,单位为秒 ,增大该值可以提高仿真的速度,但会降低仿真的精度。 -->
<real_time_factor>3</real_time_factor> <!-- 仿真时间与实际时间的比率。设置为 3 表示仿真时间以实际时间的 3 倍速度运行 -->
<ode>
<solver> <!-- 求解器设置 -->
<type>quick</type> <!-- 求解器类型。quick 使用迭代的投影高斯-赛德尔(PGS)方法,计算速度较快,但精度可能略低。 -->
<iters>150</iters> <!-- 求解器的迭代次数。值为 150,表示每个时间步长进行 150 次迭代,以提高解的精度。 -->
<precon_iters>0</precon_iters> <!-- 预处理器的迭代次数。值为 0,表示不使用预处理器。 -->
<sor>1.400000</sor> <!-- 超松弛因子(Successive Over-Relaxation)。值为 1.4,用于加速迭代收敛。 -->
<use_dynamic_moi_rescaling>1</use_dynamic_moi_rescaling> <!-- 是否使用动态转动惯量重新缩放。值为 1,表示启用该功能。 -->
</solver>
<constraints> <!-- 约束设置 -->
<cfm>0.00001</cfm> <!-- 约束柔性系数(Constraint Force Mixing)。值为 0.00001,用于处理系统中的柔性约束。 -->
<erp>0.2</erp> <!-- 误差还原参数(Error Reduction Parameter)。值为 0.2,控制约束误差的修正速度 -->
<contact_max_correcting_vel>2000.000000</contact_max_correcting_vel> <!-- 接触最大修正速度。值为 2000,限制接触点的最大速度修正。-->
<contact_surface_layer>0.01000</contact_surface_layer> <!-- 接触表面层厚度。值为 0.01,表示接触表面的厚度为 0.01 米。 -->
</constraints>
</ode>
</physics>
目前在cpu为13400f电脑上,令msz=0.001时,rtf=3已经是极限了,即使此时再增大rtua,rtf也不会在增大。如果实在是追求更高的rtf,可以考虑增大msz,比如0.002,但是这样会降低仿真的精度。
自定义world
1 建筑设计
1.1 准备工作
1.1.1 测绘
使用激光测距仪获取机器人预期工作环境中的建筑物的尺寸和形状。
包括但不限于
- 尺寸:
- 房间的长、宽、高;
- 门、窗、走廊、楼梯、电梯、花坛、柜子、电器、桌椅、展台;
- 建筑布局:
- 房间分布及功能区域(如办公室、实验室、会议室等)的划分。
- 各个房间或区域之间的通道、门口、楼梯、以及电梯的分布。
- 各种家具和障碍物的摆放位置,例如桌子、椅子、柜子、展示架等。
- 特殊区域(如紧急出口、消防通道、楼梯口等)的标识。
1.1.2 autoCAD 设计建筑结构和基础布局
使用AutoCAD设计建筑物的外形和基础布局,包括建筑物的结构、楼梯、电梯等固定设施的位置和尺寸。
电梯和楼梯的位置和尺寸是建筑物的固定属性,不会随着楼层的变化而变化。
1.1.3 设计草图展示

1.2 设计每层楼的布局
依照建筑物的外形和基础布局,设计每层楼的布局,包括房间的分布和大小,走廊,门等
此时不需要部署家具和其他设施
- floor_3

1.3 导入gazebo中
本文档使用的是将cad图纸导出为png格式的图片,导入gazebo中沿线画墙的方式,总时长约为3小时。
不建议使用这种方式,可以使用sketchup或者blender等软件,它们可以直接把二维草图拉伸为墙,且可以导入gazebo中
具体方法和资源见model_list.md
2 建图 | 测试
- 将模型保存为
.world文件,
保存于
~/ros2_project/ros_ws/src/robot_description/worlds/下
- 修改
robot_description/launch/gazebo_sim.launch.py文件:
default_gazebo_world_path = os.path.join(
urdf_package_path, "world", "floor_3.world"
)
- 启动gazebo
ros2 launch robot_description gazebo_sim.launch.py

- 启动rviz
rviz2
设置rviz
global options -> Fixed Frame -> base_link
add -> By topic -> /map
-> By display type -> RobotModel
-> LaserScan size:0.05
-> TF frame timeout:1000 # 1s
-> odometry keep:1000
-> Image topic:/camera_sensor/image_raw
保存配置
File -> Save Config As ->
~/ros2_project/ros_ws/src/robot_navigation2/config/slam.rviz
- slam_toolbox建图
ros2 launch slam_toolbox online_async_launch.py use_sim_time:=True
- 键盘控制机器人
ros2 run teleop_twist_keyboard teleop_twist_keyboard
- 保存地图
ros2 run nav2_map_server map_saver_cli -f ~/ros2_project/ros_ws/src/robot_navigation2/maps/floor_3

- 导航测试
ros2 launch robot_navigation2 navigation2.launch.py
3 修改模型
已经保存为world的是不可以删除和修改已经存在的模型的,除非熟悉sdf文件的格式,可以直接修改sdf文件,但是这样不够直观,不推荐。
但是可以添加新的模型
下面介绍一下删除模型的方法:
- 打开world文件,找到要删除的模型的,比如ramp,删除如下代码
<model name='ramp'>
<static>1</static>
<link name='link'>
<collision name='collision'>
<geometry>
<mesh>
<uri>/home/mstrling/.gazebo/models/ramp/meshes/ramp.dae</uri>
</mesh>
</geometry>
<max_contacts>10</max_contacts>
<surface>
<contact>
<ode/>
</contact>
<bounce/>
<friction>
<torsional>
<ode/>
</torsional>
<ode/>
</friction>
</surface>
</collision>
<visual name='visual'>
<geometry>
<mesh>
<uri>/home/mstrling/.gazebo/models/ramp/meshes/ramp.dae</uri>
</mesh>
</geometry>
</visual>
<self_collide>0</self_collide>
<enable_wind>0</enable_wind>
<kinematic>0</kinematic>
</link>
<pose>-6.58129 -0.494302 0 0 -0 0</pose>
</model>
<model name='ramp'>
<pose>-1.7485 6.14578 0 0 -0 1.57162</pose>
<scale>1 1 1</scale>
<link name='link'>
<pose>-1.7485 6.14578 0 0 -0 1.57162</pose>
<velocity>0 0 0 0 -0 0</velocity>
<acceleration>0 0 0 0 -0 0</acceleration>
<wrench>0 0 0 0 -0 0</wrench>
</link>
</model>
更多推荐



所有评论(0)