22、ROS2 Gazebo仿真平台
1、Gazebo简介
Gazebo是ROS系统中最为常用的三维物理仿真平台 ,支持动力学引擎,可以实现高质量的图形渲染,不仅可以模拟机器人及周边环境,还可以加入摩擦力、弹性系数等物理属性。
比如我们要开发一个火星车,那就可以在Gazebo中模拟火星表面的环境,再比如我们做无人机,续航和限飞都导致我们没有办法频繁用实物做实验,此时不妨使用Gazebo先做仿真,等算法开发的差不多了,再部署到实物上来运行。
所以类似Gazebo这样的仿真平台,可以帮助我们验证机器人算法、优化机器人设计、测试机器人场景应用,为机器人开发提供更多可能。
注意:本章节只做了解学习,教程中并未配置该环境,因为这边直接用的真机调试
2、安装运行
- 通过命令apt进行安装gazebo
sudo apt install ros- ${ROS_DISTRO} -gazebo- *
- 运行gazebo
- 通过以下命令启动或直接通过桌面图标启动
xxxxxxxxxx gazebo --verbose -s libgazebo_ros_init.so -s libgazebo_ros_factory.so

运行之后可以看到如下页面:

- 可选项:为保证模型顺利加载,可以将请将离线模型下载并放置到~/.gazebo/models路径下,下载链接如下:https://github.com/osrf/gazebo_models
3、gazebo启动节点与服务
1、查看节点
xxxxxxxxxx ros2 node list

正确返回:/gazebo 2、查看节点的对外提供的服务:
xxxxxxxxxx ros2 service list
可以看出如下的结果:

出去最后几个常规的服务,我们只注意前三个特殊的服务:
-
/spawn_entity,用于加载模型到gazebo中
-
/get_model_list,用于获取模型列表
-
/delete_entity,用于删除gazbeo中已经加载的模型
4、创建功能包
- 创建一个myrobot功能包,用来存放我们的URDF模型文件和启动文件
xxxxxxxxxx ros2 pkg create myrobot \--build-type ament_cmake
- 进入到myrobot的目录下,创建launch、urdf文件夹,在urdf文件夹下创建一个demo01_base.urdf文件,这个文件就是一个简单的演示文件,只有一个基础的立方体。
xxxxxxxxxx < robot name = "myrobot" > < link name = "base_link" > < visual > < geometry > < box size = "0.2 0.2 0.2" /> </ geometry > < origin xyz = "0.0 0.0 0.0" /> </ visual > < collision > < geometry > < box size = "0.2 0.2 0.2" /> </ geometry > < origin xyz = "0.0 0.0 0.0" /> </ collision > < inertial > < mass value = "0.1" /> < inertia ixx = "0.000190416666667" ixy = "0" ixz = "0" iyy = "0.0001904" iyz = "0" izz = "0.00036" /> </ inertial > </ link > < gazebo reference = "base_link" > < material > Gazebo/Red </ material > </ gazebo > </ robot >
5、编写launch启动文件
launch文件的编写,launch文件主要启动两个部分,启动Gazebo文件,然后将机器人模型加载到Gazebo中。
xxxxxxxxxx start_gazebo_cmd = ExecuteProcess( cmd = [ 'gazebo' , '--verbose' , '-s' , 'libgazebo_ros_init.so' , '-s' , 'libgazebo_ros_factory.so' ], output = 'screen' )
这个命令就是启动Gazebo的,就是一个启动命令,并没有特别复杂的地方,下面是加载模型的命令:
xxxxxxxxxx spawn_entity_cmd = Node( package = 'gazebo_ros' , executable = 'spawn_entity.py' , arguments = [ '-entity' , robot_name_in_model, '-file' , urdf_model_path ], output = 'screen' )
这个命令注意后面两个参数-entity是模型文件中的名字,-file是通过urdf文件加载参数,后面我们还可以看到通过topic话题加载模型的。在launch目录下新建一个bringup_model.launch.py文件完整的启动文件如下:
x import os from launch import LaunchDescription from launch . actions import ExecuteProcess from launch_ros . actions import Node from launch_ros . substitutions import FindPackageShare from launch_ros . parameter_descriptions import ParameterValue from launch . substitutions import Command def generate_launch_description (): robot_name_in_model = 'myrobot' package_name = 'myrobot' urdf_name = "demo01_base.urdf" ld = LaunchDescription () pkg_share = FindPackageShare ( package = package_name ). find ( package_name ) urdf_model_path = os . path . join ( pkg_share , f'urdf/{urdf_name}' ) # Start Gazebo server start_gazebo_cmd = ExecuteProcess ( cmd =[ 'gazebo' , '--verbose' , '-s' , 'libgazebo_ros_init.so' , '-s' , 'libgazebo_ros_factory.so' ], output = 'screen' ) # Launch the robot spawn_entity_cmd = Node ( package = 'gazebo_ros' , executable = 'spawn_entity.py' , arguments =[ '-entity' , robot_name_in_model , '-file' , urdf_model_path ], output = 'screen' ) ld . add_action ( start_gazebo_cmd ) ld . add_action ( spawn_entity_cmd ) return ld
- 在Cmakelist中填入以下内容,用于将我们的urdf和launch文件夹安装进install目录下
xxxxxxxxxx install ( DIRECTORY urdf launch DESTINATION share/ ${PROJECT_NAME} )
- 之后编译运行功能包
xxxxxxxxxx colcon build \--packages-select myrobot

- 刷新环境变量然后运行launch启动文件
xxxxxxxxxx ros2 launch myrobot bringup_model.launch.py

启动之后可以看到如下的Gazebo模型:

可以看到红色的模型,因为最后加上了Gazebo的标签设置。