Gazebo
Treat a Gazebo simulation as a contract between world, robot, sensors,
transport, and time. Find the first contract that is not producing believable
evidence.
Start from the actual stack
- Confirm the installed
gz release, ROS distro, ros_gz pairing, render
backend, and whether the run is graphical or headless.
- Use modern Gazebo (
gz). Gazebo Classic and libgazebo_ros_* tutorials are
a different, end-of-life stack.
- Keep upstream compatibility tables and SDF specifications as the authority
for release-sensitive package names, tags, and plugin APIs.
Trace the simulation boundary
- World: the selected world loads and the expected systems are present.
- Robot: links, joints, frames, and drive plugins agree with the physical
model and downstream interfaces.
- Sensors: rates, fields of view, ranges, noise, frames, and timestamps
model the intended hardware rather than tutorial defaults.
- Transport: prove the Gazebo topic exists before debugging its ROS bridge.
- Bridge: keep a reviewable YAML bridge configuration for a real app;
ad-hoc bridge commands are suitable only for diagnosis.
- ROS: confirm
/clock, commands, odometry, transforms, and sensor messages
arrive with the expected direction and QoS.
Do not infer simulation correctness from a running process or visible GUI. A
render-backed sensor may be silent even while physics continues.
Go deeper only when needed
- For SDF worlds, models, drive plugins, spawning, and headless server mode,
read worlds and models.
- For lidar, camera, IMU, contact, noise, and rendering, read
sensors.
- For
ros_gz_bridge, topic direction, types, QoS, /clock, and frame
overrides, read the ROS 2 bridge guide.
- For a silent world, sensor, bridge, or remote launch, read
failures.
- Use the bundled SDF and bridge YAML together only as a starting pair; keep
their topic and frame names synchronized and verify syntax upstream.
Move to navigation only after the robot pose, sensor, map, and velocity
interfaces are valid. Move to ros2 when Gazebo is publishing correctly and
the fault is in the ROS graph. Use environments for container GPU/display
setup and simulation only when the simulator itself has not been chosen.
Done
- Physics time advances and the expected world and model are present.
- Every required Gazebo topic has a matching, correctly directed ROS interface.
- Sensor rate, frame, timestamp, and render output are believable.
- The run works in its intended graphical or headless environment.
- Release-specific claims match current Gazebo
and ros_gz documentation.
1---2name: gazebo3description: Build and debug modern Gazebo simulations and their ROS 2 boundary.4---56# Gazebo78Treat a Gazebo simulation as a contract between world, robot, sensors,9transport, and time. Find the first contract that is not producing believable10evidence.1112## Start from the actual stack1314- Confirm the installed `gz` release, ROS distro, `ros_gz` pairing, render15 backend, and whether the run is graphical or headless.16- Use modern Gazebo (`gz`). Gazebo Classic and `libgazebo_ros_*` tutorials are17 a different, end-of-life stack.18- Keep upstream compatibility tables and SDF specifications as the authority19 for release-sensitive package names, tags, and plugin APIs.2021## Trace the simulation boundary2223- **World:** the selected world loads and the expected systems are present.24- **Robot:** links, joints, frames, and drive plugins agree with the physical25 model and downstream interfaces.26- **Sensors:** rates, fields of view, ranges, noise, frames, and timestamps27 model the intended hardware rather than tutorial defaults.28- **Transport:** prove the Gazebo topic exists before debugging its ROS bridge.29- **Bridge:** keep a reviewable YAML bridge configuration for a real app;30 ad-hoc bridge commands are suitable only for diagnosis.31- **ROS:** confirm `/clock`, commands, odometry, transforms, and sensor messages32 arrive with the expected direction and QoS.3334Do not infer simulation correctness from a running process or visible GUI. A35render-backed sensor may be silent even while physics continues.3637## Go deeper only when needed3839- For SDF worlds, models, drive plugins, spawning, and headless server mode,40 read [worlds and models](references/worlds-and-models.md).41- For lidar, camera, IMU, contact, noise, and rendering, read42 [sensors](references/sensors.md).43- For `ros_gz_bridge`, topic direction, types, QoS, `/clock`, and frame44 overrides, read [the ROS 2 bridge guide](references/ros2-bridge.md).45- For a silent world, sensor, bridge, or remote launch, read46 [failures](FAILURES.md).47- Use the bundled SDF and bridge YAML together only as a starting pair; keep48 their topic and frame names synchronized and verify syntax upstream.4950Move to `navigation` only after the robot pose, sensor, map, and velocity51interfaces are valid. Move to `ros2` when Gazebo is publishing correctly and52the fault is in the ROS graph. Use `environments` for container GPU/display53setup and `simulation` only when the simulator itself has not been chosen.5455## Done5657- Physics time advances and the expected world and model are present.58- Every required Gazebo topic has a matching, correctly directed ROS interface.59- Sensor rate, frame, timestamp, and render output are believable.60- The run works in its intended graphical or headless environment.61- Release-specific claims match current [Gazebo](https://gazebosim.org/docs/)62 and [ros_gz](https://github.com/gazebosim/ros_gz) documentation.