For ROS 1, see ROS integration overview.
Gazebo is a stand-alone application which can be used independently of ROS or ROS 2. The integration of Gazebo with either ROS version is done through a set of packages called gazebo_ros_pkgs. These packages provide a bridge between Gazebo's C++ API and transport system, and ROS 2 messages and services.
Not all functionality from ROS 1 has been ported to ROS 2 yet. You can check the progress on this issue.
If you're interested in porting official or your own custom plugins, check out the ROS2 migration contribution guide.
The ROS 2 package
gazebo_ros_pkgs is a metapackage which contains the
gazebo_dev: Provides a cmake configuration for the default version of
Gazebo for the ROS distribution. So downstream packages can
just depend on
gazebo_dev instead of needing to find
Gazebo by themselves.
gazebo_msgs: Message and service data structures for interacting with
Gazebo from ROS 2.
gazebo_ros: Provides convenient C++ classes and functions which can be
used by other plugins, such as
and testing utilities. It also provides some generally useful
gazebo_plugins: A series of Gazebo plugins exposing sensors and other
features to ROS 2. For example,
publishes ROS 2 images, and
an interface for controlling and instrospecting differential
drive robots through ROS 2.
The ROS 2 port of
gazebo_ros_pkgs has debian packages released
for the Crystal Clemmys distribution.
The code can also be built from source using the ros2 branch against ROS 2 master branches.
Currently, the only supported Gazebo version is Gazebo 9.
Several changes and refactoring were done to
gazebo_ros_pkgs when migrating
from ROS 1 to ROS 2.
Some goals of the refactoring were:
Detailed migration guides for each plugin can be found on the gazebo_ros_pkgs wiki. See some general highlights below.
The ROS 1 integration required that Gazebo be launched with the
gazebo_ros_api_plugin system plugin, which would initialize ROS.
There's no such requirement with ROS 2. Gazebo can be started without any plugins and ROS-2-enabled plugins can be added at runtime.
In ROS 1, each plugin typically had one or more
ros::NodeHandle instances to
interact with ROS.
In ROS 2, plugins use
gazebo_ros::Node instead, which allows each plugin to
exist as its own node in the ROS graph, with its own parameters, namespace,
loggers, etc. Plugins also don't need to worry about spinning the node or
keeping callback queues -
gazebo_ros handles all that internally.
There are several configurations which Gazebo ROS plugins commonly want to set through SDF, and in the ROS 1 implementation, there was a lot of duplicate code on plugins parsing the same things, sometimes following loose conventions.
In ROS 2, common configurations like namespace, ROS parameters and topic
remapping rules are parsed by
gazebo_ros::Node, so there's no need for plugins
to reimplement them every time.
In ROS 1,
gazebo_ros_api_plugin was a large plugin which offered a lot of
functionality in a bundle, giving users little flexibility to opt-in/out of
In ROS 2, this plugin is being split into smaller, more focused plugins. You can read the migration details on ROS 2 Migration: gazebo_ros_api_plugin.