2025年9月11日 星期四

工作流從 gazebo_ros 轉換到 ros_gz_sim

 

ROS 2 啟動 Gazebo 之後,您可以使用 ros2 run 指令,透過 gazebo_ros 套件中的 spawn_entity.py 工具來載入 URDF 檔案。


載入 URDF 到 Gazebo 的指令

要將名為 twowheel.urdf 的 URDF 檔案載入到 Gazebo Sim 中,標準的 ROS 2 指令格式如下:

ros2 run gazebo_ros spawn_entity.py -entity twowheel_amr -file /path/to/your/twowheel.urdf -x 0 -y 0 -z 0

指令參數說明

  • ros2 run gazebo_ros spawn_entity.py: 這是用來執行 gazebo_ros 套件中,負責產生實體的 Python 腳本。

  • -entity twowheel_amr: 指定您要產生的實體名稱。這在 Gazebo 內部會被用作模型的名稱。

  • -file /path/to/your/twowheel.urdf: 指定您 URDF 檔案的完整路徑。 非常重要:您需要將 /path/to/your/ 替換為 twowheel.urdf 檔案在您系統中的實際路徑。

  • -x 0 -y 0 -z 0: 這是可選參數,用來設定模型在 Gazebo 世界中的初始位置。您可以根據需要調整這些值。

備註

  • 環境變數: 為了確保 ros2 指令能找到 gazebo_ros 和其他 ROS 2 套件,請確認您已在終端機中 source 過您的工作空間設定檔 (setup.bash)。

  • Gazebo Sim 運行中: 這個 spawn_entity.py 指令需要 Gazebo Sim 已經在運行中才能成功執行。您通常會先使用一個 launch 檔案啟動 Gazebo,然後在另一個終端機中執行此 spawn 指令。

  • URDF 檔案: 確保您的 twowheel.urdf 檔案內容有效且沒有錯誤。如果 URDF 本身有問題,Gazebo 可能會無法正確載入模型並給出錯誤訊息。




gazebo_ros 是針對 Gazebo 9 (舊版) 和 Gazebo Classic 設計的

而 ros_gz_sim 則是針對新的 Gazebo (GZ) Sim 所設計的

且是 ROS 2 官方推薦的整合方式。

這兩者是不同的套件,提供了不同 Gazebo 版本的 ROS 2 橋接功能。


為什麼推薦使用 ros_gz_sim

  • 官方支持ros_gz_sim 是 Gazebo 專案的官方橋接工具,旨在提供 Gazebo Sim 與 ROS 2 之間的無縫整合。

  • 新功能與效能: Gazebo Sim (或稱 GZ Sim) 提供了許多相較於舊版 Gazebo 的新功能和效能改進,例如更現代的物理引擎和渲染技術。

  • 跨平台相容性ros_gz_sim 提供了 ROS 2 和 Gazebo Sim 之間的通用橋接,可用於任何 ROS 2 支援的平台。

如何將您的工作流從 gazebo_ros 轉換到 ros_gz_sim

您需要將原先使用 gazebo_ros 的命令和啟動檔案替換成 ros_gz_sim 對應的工具。

1. 安裝 ros_gz_sim 套件

您需要先安裝 ros_gz_sim 橋接套件,確保其版本與您的 ROS 2 和 Gazebo Sim 版本相容。

Bash
sudo apt-get install ros-<distro>-ros-gz-sim

將 <distro> 替換為您的 ROS 2 版本,例如 humble 或 iron

2. 啟動 Gazebo Sim

您可以使用 ros_gz_sim 提供的啟動檔案來開啟 Gazebo Sim。

Bash
ros2 launch ros_gz_sim_demos gz_sim.launch.py

這會開啟一個空的 Gazebo 世界。您也可以指定一個世界檔案來啟動 Gazebo:

Bash
ros2 launch ros_gz_sim_demos gz_sim.launch.py gz_args:="-r /path/to/your/world.sdf"

3. 載入模型

ros_gz_sim 使用 ros_gz_sim 套件中的 create 節點來產生實體,而不是舊版的 spawn_entity.py。您通常會在啟動檔案中完成此步驟。

例如,在您的 .launch.py 檔案中加入以下內容:

Python
import os
from ament_index_python.packages import get_package_share_directory
from launch import LaunchDescription
from launch_ros.actions import Node

def generate_launch_description():
    pkg_ros_gz_sim = get_package_share_directory('ros_gz_sim')
    
    # 載入 URDF/SDF 模型
    urdf_path = os.path.join(
        get_package_share_directory('your_robot_description_package'),
        'urdf',
        'twowheel.urdf'
    )
    
    spawn_entity_node = Node(
        package='ros_gz_sim',
        executable='create',
        output='screen',
        arguments=[
            '-file', urdf_path,
            '-name', 'twowheel_amr',
            '-x', '0',
            '-y', '0',
            '-z', '0.5'
        ]
    )
    
    return LaunchDescription([
        spawn_entity_node
    ])

總結:從 gazebo_ros 轉移到 ros_gz_sim 是正確且符合未來的方向。它需要您更改啟動指令和啟動檔案的內容,但能讓您使用最新版本的 Gazebo 和其提供的所有功能。





沒有留言:

張貼留言