本文在Ubuntu18.04 + ROS melodic环境下完成,其他ROS版本类似。

gazebo能够在复杂的室内和室外环境中准确高效地模拟机器人工作的功能,为使用ROS的机器人开发者提供了优异的仿真环境。

一、ROS集成概述

为了实现ROS与gazebo的集成,人们开发了一组名为gazebo_ros_pkgs的ROS功能包,提供了必要的接口。gazebo_ros_pkgs的一些功能有:

  • 支持gazebo的系统独立性,没有与ROS进行绑定;
  • 通过catkin编译;
  • 尽可能支持urdf文件格式;
  • 减少与gazebo代码的重复;
  • 使用ros_control改进了控制器。

下图概述了gazebo_ros_pkgs接口:

gazebo_ros_pkgs元功能包包含了gazebo_ros、gazebo_msgs、gazebo_plugins子功能包。它们的功能分别是:

  • gazebo_ros:提供ROS插件,这些插件支持消息和服务发布者,使ROS与gazebo交互。
  • gazebo_plugins:独立于机器人的gazebo插件,用于传感器,电机和动态可重配置组件。
  • gazebo_msgs:消息和服务数据结构,用于ROS中与gazebo交互。

在尝试安装gazebo_ros_pkgs之前,请通过在终端中运行来确保独立的gazebo能够正常工作,第一次启动需要加载一段时间:

$ gazebo

然后,安装gazebo_ros_pkgs:

$ sudo apt-get install ros-melodic-gazebo-ros-pkgs ros-melodic-gazebo-ros-control

其中,gazebo_ros_control功能包包含用于在ROS和gazebo之间通信的标准控制器。

安装后,检查gazebo是否安装正确,先运行下方命令:

$ roscore

然后,打开新的终端:

$ rosrun gazebo_ros gazebo

gazebo启动后,GUI的场景中无任何内容:

若打开gazebo后黑屏,确保已经配置好models文件夹(缺少模型文件)的情况下,运行以下命令行后,重新启动gazebo:

$ killall gzserver
$ killall gzclient

要验证是否设置了正确的ROS连接,需查看可用的ROS topics:

$ rostopic list
/gazebo/link_states
/gazebo/model_states
/gazebo/parameter_descriptions
/gazebo/parameter_updates
/gazebo/set_link_state
/gazebo/set_model_state

你也可以验证gazebo服务是否存在:

$ rosservice list
/gazebo/apply_body_wrench
/gazebo/apply_joint_effort
/gazebo/clear_body_wrenches
/gazebo/clear_joint_forces
/gazebo/delete_model
/gazebo/get_joint_properties
/gazebo/get_link_properties
/gazebo/get_link_state
/gazebo/get_loggers
/gazebo/get_model_properties
/gazebo/get_model_state
/gazebo/get_physics_properties
/gazebo/get_world_properties
/gazebo/pause_physics
/gazebo/reset_simulation
/gazebo/reset_world
/gazebo/set_joint_properties
/gazebo/set_link_properties
/gazebo/set_link_state
/gazebo/set_logger_level
/gazebo/set_model_configuration
/gazebo/set_model_state
/gazebo/set_parameters
/gazebo/set_physics_properties
/gazebo/spawn_gazebo_model
/gazebo/spawn_sdf_model
/gazebo/spawn_urdf_model
/gazebo/unpause_physics
/rosout/get_loggers
/rosout/set_logger_level

通过ROS启动gazebo的方式有以下几种:

  • 一起启动gazebo服务器和客户端
$ rosrun gazebo_ros gazebo
  • 仅启动gazebo服务器
$ rosrun gazebo_ros gzserver
  • 仅启动gazebo客户端
$ rosrun gazebo_ros gzclient
  • 使用roslaunch启动空白世界
$ roslaunch gazebo_ros empty_world.launch

二、仿真案例演示

使机器人在gazebo中工作的第一步是获得有效的urdf模型,通过在rviz中查看模型来测试您的模型,然后继续使用gazebo配置您的机器人。为了更好的学习ROS与gazebo联合仿真,我们将使用RRBot机器人功能包进行演示。

1、获取RRBot

RRBot是一个简单的3连杆2关节手臂,我们将使用它来演示gazebo和urdf的各种功能。

要获得RRBot,请将gazebo_ros_demos github库克隆到工作区的/src文件夹中(将库里面的功能包全部剪切到src目录下,删除gazebo_ros_demos文件夹),然后重建您的工作区:

$ mkdir -p ros_gazebo/src/
$ cd ros_gazebo
$ catkin_make
$ cd src/
$ git clone https://github.com/ros-simulation/gazebo_ros_demos.git
$ cd ..
$ catkin_make

2、在rviz中查看

首先,安装依赖:

$ sudo apt-get install ros-melodic-joint-state-publisher-gui

然后,修改./rrbot_description/launch/rrbot_rviz.launch文件(找到对应代码并修改):

<nde name="joint_state_publisher_gui" pkg="joint_state_publisher_gui" type="joint_state_publisher_gui">
<param name="use_gui" value="TRUE"/>
</node>
...
<node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher"/>

最后,启动launch文件:

$ roslaunch rrbot_description rrbot_rviz.launch

这时候,你将看到如下画面:

此外,我们可以使用“Joint State Publisher”窗口中的滑块来控制两个关节旋转。

重要的是,将机器人转换为在gazebo中工作时,不要破坏rviz或其他ROS应用程序功能,因为我们可能需要在rviz中查看机器人以确保一切正常。

3、在gazebo中仿真RRBot

(1)检查rrbot.xacro文件

$ cd ~/ros_gazebo/src/rrbot_description/urdf/

请注意,我们使用xarco语法简化了urdf模型(下一教程会提及)。除此之外,还有两个附加文件:

  • rrbot.gazebo是一个用于gazebo的特定文件,其中包含大多数gazebo的特定标签;
  • materials.xacro是一个简单的rviz颜色文件,用于存储rgba值,不是必须的,但是是一个很好的习惯。

(2)在gazebo中查看模型

$ roslaunch rrbot_gazebo rrbot_world.launch

在gazebo窗口中,可以看到机器人直立。

尽管在默认情况下,物理模拟器中没有故意的干扰,但数值误差的累积会导致机器人在几秒钟后掉落。最终,手臂应完全停止。

下一教程中,我们将进行调整和测试urdf的各个方面,以帮助您了解有关urdf的更多信息。