Gazebo是ROS系统中最为常用的三维物理仿真平台,支持动力学引擎,可以实现高质量的图形渲染,不仅可以模拟机器人及周边环境,还可以加入摩擦力、弹性系数等物理属性。
比如我们要开发一个火星车,那就可以在Gazebo中模拟火星表面的环境,再比如我们做无人机,续航和限飞都导致我们没有办法频繁用实物做实验,此时不妨使用Gazebo先做仿真,等算法开发的差不多了,再部署到实物上来运行。
所以类似Gazebo这样的仿真平台,可以帮助我们验证机器人算法、优化机器人设计、测试机器人场景应用,为机器人开发提供更多可能。
注意:本章节只做了解学习,教程中并未配置该环境,因为这边直接用的真机调试
通过命令apt进行安装
xxxxxxxxxxsudo apt install ros-foxy-gazebo-*
然后通过一下命令可以运行
xxxxxxxxxxros2 launch gazebo_ros gazebo.launch.py
或者下面的命令
xxxxxxxxxxgazebo --verbose -s libgazebo_ros_init.so -s libgazebo_ros_factory.so
运行之后可以看到如下页面:
为保证模型顺利加载,请将离线模型下载并放置到~/.gazebo/models路径下,下载链接如下:https://github.com/osrf/gazebo_models
1、查看节点
xxxxxxxxxxros2 node list
正确返回:/gazebo 2、查看节点的对外提供的服务:
xxxxxxxxxxros2 service list
可以看出如下的结果:
xxxxxxxxxx/delete_entity/get_model_list/spawn_entity/gazebo/describe_parameters/gazebo/get_parameter_types/gazebo/get_parameters/gazebo/list_parameters/gazebo/set_parameters/gazebo/set_parameters_atomically
出去最后几个常规的服务,我们只注意前三个特殊的服务:
/spawn_entity,用于加载模型到gazebo中
/get_model_list,用于获取模型列表
/delete_entity,用于删除gazbeo中已经加载的模型
创建一个gazebo_demo的文件夹,在其中创建一个src文件,然后在src文件夹中创建我们的功能包myrobot(以c++为例)。
xxxxxxxxxxmkdir -p gazebo_demo/srccd gazebo_demo/srcros2 pkg create myrobot --build-type ament_camke
进入到myrobot的目录下,创建launch、urdf文件夹,修改CMakeLists.txt文件,这一步骤和rviz中类似。在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>
这里和以前的文件不同的是加入了collision和intertial属性,都属于物理相关参数,这个就不做讨论。
launch文件的编写,launch文件主要启动两个部分,启动Gazebo文件,然后将机器人模型加载到Gazebo中。
xstart_gazebo_cmd = ExecuteProcess(cmd=['gazebo', '--verbose','-s', 'libgazebo_ros_init.so', '-s', 'libgazebo_ros_factory.so'],output='screen')
这个命令就是启动Gazebo的,就是一个启动命令,并没有特别复杂的地方,下面是加载模型的命令:
xxxxxxxxxxspawn_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话题加载模型的。完整的启动文件如下:
import osfrom launch import LaunchDescriptionfrom launch.actions import ExecuteProcessfrom launch_ros.actions import Nodefrom launch_ros.substitutions import FindPackageSharefrom launch_ros.parameter_descriptions import ParameterValuefrom 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
启动之后可以看到如下的Gazebo模型:
可以看到红色的模型,因为最后加上了Gazebo的标签设置。
随着技术的进步,Gazebo仿真平台也在不断迭代,新一代的Gazebo命名为Ignition,从渲染效果和仿真流畅度上都有较大的变化,我们不妨也来试一下。
x$ sudo apt install ros-foxy-ros-ign$ ros2 launch ros_ign_gazebo_demos rgbd_camera_bridge.launch.py
运行成功后,会打开Ignition的仿真界面和Rviz上位机,我们可以看到RGBD相机仿真后发布的图像数据。

