ros_gz_sim
Tools for using Gazebo Sim simulation with ROS.
README
ROS + Gazebo Sim
This package contains things that make it convenient to integrate ROS with Gazebo, such as:
Launch files
ROS-enabled executables
Run Gazebo Sim
There’s a convenient launch file, try for example:
ros2 launch ros_gz_sim gz_sim.launch.py gz_args:="shapes.sdf"
Spawn entities
The create
executable can be used to spawn SDF or URDF entities from:
A file on disk or from Gazebo Fuel
A ROS parameter
For example, start Gazebo Sim:
ros2 launch ros_gz_sim gz_sim.launch.py
then spawn a model:
ros2 run ros_gz_sim create -world default -file 'https://fuel.gazebosim.org/1.0/openrobotics/models/Gazebo'
See more options with:
ros2 run ros_gz_sim create --helpshort
Using <gazebo_ros>
to export model paths in package.xml
The <gazebo_ros>
tag inside the <export>
tag of a package.xml
file can be
used to add paths to GZ_SIM_RESOURCE_PATH
and GZ_SIM_SYSTEM_PLUGIN_PATH
,
which are environment variables used to configure Gazebo search paths for
resources (e.g. SDFormat files, meshes, etc) and plugins respectively.
The values in the attributes gazebo_model_path
and gazebo_media_path
are
appended to GZ_SIM_RESOURCE_PATH
. The value of plugin_path
is appended to
GZ_SIM_SYSTEM_PLUGIN_PATH
. See the
Finding resources tutorial to
learn more about these environment variables.
The keyword ${prefix}
can be used when setting these values and it will be
expanded to the package’s share path (i.e., the value of
ros2 pkg prefix --share <package name>
)
<export>
<gazebo_ros gazebo_model_path="${prefix}/models"/>
<gazebo_ros gazebo_media_path="${prefix}/media"/>
<gazebo_ros plugin_path="${prefix}/plugins"/>
</export>
Thus the required directory needs to be installed from CMakeLists.txt
install(DIRECTORY models
DESTINATION share/${PROJECT_NAME})
In order to reference the models in a ROS package unambiguously, it is
recommended to set the value of gazebo_model_path
to be the parent
of the prefix
.
<export>
<gazebo_ros gazebo_model_path="${prefix}/../"/>
</export>
Consider an example where we have a ROS package called my_awesome_pkg
and it contains an SDFormat model cool cool_robot
:
my_awesome_pkg
├── models
│ └── cool_robot
│ ├── model.config
│ └── model.sdf
└── package.xml
With gazebo_model_path="${prefix}/../
set up, we can
reference the cool_robot
model in a world file using the package name
in the uri
:
<sdf version="1.6">
<world name="default">
<include>
<uri>package://my_awesome_pkg/models/cool_robot</uri>
</include>
</world>
</sdf>
However, if we set gazebo_model_path=${prefix}/models
, we would
need to reference cool_robot
as package://cool_robot
, which
might have a name conflict with other models in the system.