Gazebo
Gazebo 是一套 Robotics Simulator,可提供 Physics、Sensor、Robot Model 與 3D Environment,讓開發者在不需要實體硬體的情況下測試機器人系統。
本頁聚焦於 Modern Gazebo Sim 搭配 ROS 2 的使用方式,並透過 ros_gz Integration Package 進行整合。
概述
Gazebo 與 RViz2 的用途不同:
- Gazebo 用來模擬 Robot、Environment、Physics 與 Sensor。
- RViz2 用來視覺化實體或模擬系統所產生的 ROS 2 Data。
典型的 ROS 2 Simulation Workflow 如下:
Gazebo Sim
|
| Gazebo Transport
v
ros_gz_bridge
|
| ROS 2 topics
v
ROS 2 nodes / RViz2
Gazebo 可以模擬 Camera Image、Depth Image、LiDAR Scan 與 Point Cloud、IMU Data、Robot Motion、Contact 與 Collision。
為什麼重要
Simulation 可以讓你在連接實體硬體之前,先測試 Perception、Navigation、Manipulation 與 Control Logic。
常見用途包括:
- 測試 Robotics Algorithm
- 驗證 Robot Model 與 Sensor
- 穩定重現相同 Scenario
- 在沒有實體 Robot 的情況下進行開發
- 執行 Automated Test 或 Regression Test
Simulation 無法完全取代實體硬體驗證,但可以大幅減少必須直接在 Robot 上進行的開發與測試工作。
核心概念
Gazebo Sim 與 ROS 2
Modern Gazebo 使用自己的通訊系統:Gazebo Transport。
ROS 2 Node 不會自動接收到 Gazebo Transport Message。
ros_gz Package 提供 Gazebo 與 ROS 2 之間的 Integration Layer。
其中最常使用的元件之一是 ros_gz_bridge,它可以在支援的 Gazebo Message Type 與 ROS 2 Message Type 之間進行轉換。
Gazebo Classic vs. Modern Gazebo
較舊的 ROS Tutorial 可能會介紹 Gazebo Classic,以及以下 Package:
gazebo_ros
本教學則使用 Modern Gazebo Sim 架構:
gz sim
ros_gz
ros_gz_bridge
不要直接假設 Gazebo Classic 的 Instruction 或 Plugin 可以套用到 Modern Gazebo Sim。
URDF 與 SDF
ROS 2 的 Robot Description 通常使用 URDF,而 Gazebo 原生使用的 Simulation Description Format 則是 SDF。
URDF 很適合描述 Robot 的 Kinematic Structure。
但 Sensor、Plugin、Friction,以及其他 Simulation-specific Physics Setting,可能需要額外的 Gazebo / SDF Configuration。
ROS 2 Robot Description 的基礎內容可參考 URDF Robot Model。
Simulation Time
Simulator 會維護自己的 Simulation Clock,而不是只依賴 Wall-clock Time。
如果 ROS 2 Node 應該跟隨 Gazebo 的 Simulation Time,必須同時滿足:
- Gazebo 的 Simulation Time 要能提供給 ROS 2,通常透過
/clock。 - 需要跟隨 Simulation Time 的 ROS 2 Node,必須將
use_sim_time設為true。
這與 Rosbag 中介紹的 ROS 2 Time Mechanism 相同。
安裝
安裝目前 ROS 2 Distribution 對應的 Integration Package:
sudo apt update
sudo apt install ros-${ROS_DISTRO}-ros-gz
相容的 Gazebo Release 取決於 ROS 2 Distribution,以及 Target Platform 上可用的 Package。
不要直接將其他 ROS 2 Distribution 使用的 Gazebo Release 寫死在安裝流程中。
如果安裝 ROS Integration Package 後仍無法使用 gz sim,請依照目前環境的 Gazebo / ROS Compatibility Documentation,安裝與該 ROS 2 Distribution 相容的 Gazebo Release。
版本相容性
Gazebo Release 與 ROS 2 Distribution 有特定的 Compatibility Pairing。
在發布 Platform-specific Installation Instruction 前,請先確認 Robotic Suite Image 或 Target Platform 支援的實際組合。
實作步驟
1. 啟動 Gazebo
啟動 Gazebo Sim:
gz sim
依已安裝的 Gazebo Version 不同,啟動畫面可能會提供 World Selection 或 Launcher。

選擇一個可用的 Example World,並啟動 Simulation。

實際可用的 World 與 User Interface 可能會因 Gazebo Release 而不同。
2. 檢查 Gazebo Topic
可以使用以下指令列出 Gazebo Transport Topic:
gz topic -l
實際 Topic Name 取決於所選的 World、Model、Link 與 Sensor。
例如 Sensor Topic 常會包含類似以下 Path:
/world/<world_name>/model/<model_name>/link/<link_name>/sensor/<sensor_name>/...
不要直接假設某個 Example World 的 Topic Path 在其他 World 中也一定存在。
3. 將 Gazebo Data Bridge 到 ROS 2
ros_gz_bridge 可以在 Gazebo Transport 與 ROS 2 之間建立 Bridge。
Gazebo-to-ROS Bridge 的一般格式如下:
ros2 run ros_gz_bridge parameter_bridge <topic>@<ros_message_type>[<gz_message_type>
例如,要 Bridge 一個 Gazebo Image Topic,可以使用類似以下格式:
ros2 run ros_gz_bridge parameter_bridge /world/<world>/model/<model>/link/<link>/sensor/<camera>/image@sensor_msgs/msg/Image[gz.msgs.Image
Gazebo Point Cloud Topic 則可以使用:
ros2 run ros_gz_bridge parameter_bridge /world/<world>/model/<model>/link/<link>/sensor/<sensor>/points@sensor_msgs/msg/PointCloud2[gz.msgs.PointCloudPacked
請使用以下指令實際取得 Topic,再替換上方 Example Path:
gz topic -l
4. 確認 ROS 2 Topic
啟動 Bridge 後,先檢查 ROS 2 Graph:
ros2 topic list
接著檢查 Bridged Topic:
ros2 topic info <topic_name> -v
如果是 Image Topic,也可以使用:
ros2 topic echo <topic_name> --once
對 Image 或 Point Cloud 等 High-bandwidth Sensor Data,通常使用 RViz2 會比持續將 Message 印到 Terminal 更實用。
5. 在 RViz2 中顯示 Bridged Data
啟動 RViz2:
ros2 run rviz2 rviz2
加入適合的 Display,例如:
- Image
- PointCloud2
- LaserScan
- TF
並選擇由 Bridge 建立的 ROS 2 Topic。
完整 Visualization Workflow 可參考 RViz2。

6. 必要時使用 Simulation Time
如果 ROS 2 Node 應該使用 Gazebo 的 Simulation Clock,需要將模擬的 /clock Topic Bridge 或以其他方式提供給 ROS 2,並在 Consumer Node 上啟用 Simulated Time。
可以使用以下方式建立 /clock Bridge:
ros2 run ros_gz_bridge parameter_bridge /clock@rosgraph_msgs/msg/Clock[gz.msgs.Clock
接著在正在執行的 ROS 2 Node 上啟用 Simulated Time:
ros2 param set <node_name> use_sim_time true
ROS 2 端是否已經存在 /clock,取決於 Simulation 的 Launch 與 Integration 方式。
建立額外 Bridge 前,先檢查:
ros2 topic list | grep clock
預期成果
啟動 Gazebo 與必要的 Bridge 後:
- Gazebo 正常執行所選的 World 與 Simulated Sensor。
gz topic -l可以看到 Gazebo Transport Topic。ros2 topic list可以看到 Bridged ROS 2 Topic。- ROS 2 Tool 可以檢查 Bridged Message。
- RViz2 可以顯示支援的 Simulated Sensor Data。
- 當
/clock存在時,設定use_sim_time=true的 Node 會跟隨 Simulation Time。
常用指令
# Start Gazebo Sim
gz sim
# List Gazebo Transport topics
gz topic -l
# Inspect Gazebo CLI help
gz sim --help
gz topic --help
# Start a Gazebo-to-ROS bridge
ros2 run ros_gz_bridge parameter_bridge <topic>@<ros_message_type>[<gz_message_type>
# Inspect ROS 2 topics
ros2 topic list
ros2 topic info <topic_name> -v
# Start RViz2
ros2 run rviz2 rviz2
# Check simulated time
ros2 topic list | grep clock
ros2 param get <node_name> use_sim_time
常見問題
gz: command not found— 相容的 Gazebo Runtime 尚未安裝,或目前 Environment 無法使用。請確認 Target Platform 支援的 Gazebo / ROS 2 Pairing。- 找不到
ros_gz_bridgePackage — 安裝目前 ROS 2 Distribution 對應的 ROS Integration Package,並確認 ROS 2 Environment 已經 source。 - Bridge 已啟動,但 ROS 2 端沒有資料 — 使用
gz topic -l確認 Gazebo Topic Name,並確認 Bridge Command 中的 Gazebo 與 ROS Message Type 正確。 - Example Topic Path 不存在 — Topic Path 取決於所選 World、Model、Link 與 Sensor。應使用
gz topic -l檢查,而不是直接複製其他 World 的 Topic Path。 - RViz2 已收到資料,但出現 TF Error — Sensor Message 所屬 Frame 沒有連接到 RViz2 所選的 Fixed Frame。請使用 TF2 中介紹的工具檢查 TF Tree。
- Simulation 中 ROS 2 Timer 或 TF 行為異常 — 確認
/clock存在,並確認所有應該跟隨 Simulation Time 的 Node 都設定use_sim_time=true。 - 效能不佳 — 複雜 World、高解析度 Camera、Point Cloud 與 Physics Setting 都可能需要大量 CPU / GPU Resource。必要時降低 Simulation Complexity 或 Sensor Update Rate。
下載 World 與 Model
可以透過 Gazebo Fuel 取得更多 Gazebo World 與 Model:

可用內容與 Fuel User Interface 可能會隨時間及 Gazebo Release 而有所不同。
重點整理
- Gazebo 用來模擬 Robot Physics、Sensor 與 Environment;RViz2 則用來視覺化 ROS 2 Data。
- Modern Gazebo 透過
ros_gzPackage 與 ROS 2 整合,而不是使用舊版 Gazebo Classic 的gazebo_rosWorkflow。 ros_gz_bridge可以在支援的 Gazebo Transport Message 與 ROS 2 Message 之間進行轉換。- Gazebo Topic Name 會依 Simulation World 與 Model 而變化,因此應實際檢查,不要將 Example Path 寫死。
- 當 ROS 2 Node 需要跟隨 Simulation Time 時,使用
/clock並設定use_sim_time=true。 - Gazebo Release 應與 ROS 2 Distribution 及 Target Robotic Suite Environment 相容,不要假設固定使用某一個 Gazebo Version。
下一步
回到 ROS 2 學習地圖,或繼續查看 RViz2、TF2 與 URDF Robot Model,進一步建立或除錯 Simulated Robot System。