跳至主要内容

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,必須同時滿足:

  1. Gazebo 的 Simulation Time 要能提供給 ROS 2,通常透過 /clock。
  2. 需要跟隨 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。

ROS2_gazebo1

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

ROS2_gazebo2

實際可用的 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。

ROS2_gazebo3

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_bridge Package — 安裝目前 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:

Gazebo Fuel

ROS2_gazebo5

可用內容與 Fuel User Interface 可能會隨時間及 Gazebo Release 而有所不同。

重點整理​

  • Gazebo 用來模擬 Robot Physics、Sensor 與 Environment;RViz2 則用來視覺化 ROS 2 Data。
  • Modern Gazebo 透過 ros_gz Package 與 ROS 2 整合,而不是使用舊版 Gazebo Classic 的 gazebo_ros Workflow。
  • 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。