2025年12月4日 星期四

Xacro Load to Gazebo-class

 這是在 ROS 2 Humble 中啟動 Gazebo 模擬器並載入 XACRO 格式機器人模型的完整操作流程。

這個過程需要透過 ROS 2 Python Launch System 協調三個主要的節點:

  1. xacro:將 .xacro 檔案轉換為標準的 URDF 格式 XML 字串。

  2. robot_state_publisher (RSP):將 URDF 內容發佈到 /robot_description Topic 上。

  3. gazebo_ros + spawn_entity.py:啟動 Gazebo 伺服器,並使用 spawn_entity.py 節點從 /robot_description Topic 讀取模型並將其載入到模擬器中。


步驟一:環境與依賴套件確認

請確保您的 ROS 2 Humble 環境中安裝了以下關鍵套件:

套件名稱功能安裝指令 (若缺失)
xacro處理 .xacro 檔案sudo apt install ros-humble-xacro
gazebo-rosROS 2 與 Gazebo 的橋接介面sudo apt install ros-humble-gazebo-ros
robot-state-publisher發佈機器人狀態和模型描述sudo apt install ros-humble-robot-state-publisher

步驟二:專案結構準備

假設您的機器人描述套件(your_robot_pkg)已經建立,並且您的 XACRO 檔案位於該套件的 urdf/ 資料夾下。

your_ros2_ws/
├── src/
│   └── your_robot_pkg/
│       ├── urdf/
│       │   └── robot.urdf.xacro  <-- 您的機器人模型檔案
│       ├── launch/
│       │   └── sim_launch.py     <-- 我們的啟動檔案
│       └── package.xml
│       └── CMakeLists.txt
└── install/

步驟三:撰寫 Python 啟動檔案 (sim_launch.py)

your_robot_pkg/launch/ 內創建 sim_launch.py 檔案,並使用以下結構。

Python
import os
from ament_index_python.packages import get_package_share_directory
from launch import LaunchDescription
from launch.actions import IncludeLaunchDescription
from launch.launch_description_sources import PythonLaunchDescriptionSource
from launch.substitutions import LaunchConfiguration, Command, PathJoinSubstitution
from launch_ros.actions import Node
from launch_ros.substitutions import FindPackageShare

def generate_launch_description():
    # 1. 定義 XACRO 檔案路徑
    # ----------------------------------------------------
    pkg_name = 'your_robot_pkg'
    robot_name = 'my_awesome_robot' # 您希望在 Gazebo 中顯示的機器人名稱
    
    # 獲取套件共享目錄
    pkg_share = FindPackageShare(pkg_name).find(pkg_name)
    
    # 完整的 XACRO 檔案路徑
    xacro_file = PathJoinSubstitution([
        pkg_share, 
        'urdf', 
        'robot.urdf.xacro'
    ])
    
    # 使用 Command() 呼叫 'xacro' 指令,將 .xacro 轉換為 URDF XML 字串
    robot_description_content = Command(['xacro ', xacro_file])
    
    # 2. 啟動 Gazebo 伺服器與 GUI
    # ----------------------------------------------------
    # 載入 Gazebo 預設的空世界啟動檔案 (可替換為自定義世界檔)
    gazebo_ros_launch_path = get_package_share_directory('gazebo_ros')
    
    gazebo_launch = IncludeLaunchDescription(
        PythonLaunchDescriptionSource(
            os.path.join(gazebo_ros_launch_path, 'launch', 'gazebo.launch.py')
        ),
        # 設置 use_sim_time 參數
        launch_arguments={'use_sim_time': 'true'}.items()
    )

    # 3. 啟動 Robot State Publisher (RSP) 節點
    # ----------------------------------------------------
    # RSP 節點會讀取 robot_description 參數,並將 TF 廣播出去
    robot_state_publisher_node = Node(
        package='robot_state_publisher',
        executable='robot_state_publisher',
        name='robot_state_publisher',
        output='screen',
        parameters=[{
            'robot_description': robot_description_content, # 傳遞轉換後的 URDF 內容
            'use_sim_time': True
        }]
    )

    # 4. 啟動 Spawner (將機器人載入 Gazebo)
    # ----------------------------------------------------
    # spawn_entity.py 會從 /robot_description topic 讀取模型並將其載入 Gazebo
    spawn_entity_node = Node(
        package='gazebo_ros',
        executable='spawn_entity.py',
        arguments=[
            '-topic', 'robot_description', # 從這個 topic 讀取 URDF
            '-entity', robot_name,         # 給機器人在 Gazebo 中的名稱
            '-x', '0.0',                   # 初始 X 座標
            '-y', '0.0',                   # 初始 Y 座標
            '-z', '0.1'                    # 初始 Z 座標 (避免與地面碰撞)
        ],
        output='screen'
    )

    # 5. 組合所有動作並返回 LaunchDescription
    # ----------------------------------------------------
    return LaunchDescription([
        gazebo_launch,
        robot_state_publisher_node,
        spawn_entity_node
    ])

# 備註:請將上方程式碼中的 'your_robot_pkg' 替換為您實際的 ROS 2 套件名稱。

步驟四:編譯與執行

1. 編譯套件

在您的 ROS 2 工作空間 (your_ros2_ws/) 根目錄下執行 colcon build

Bash
cd ~/your_ros2_ws
colcon build --packages-select your_robot_pkg
source install/setup.bash

2. 啟動模擬

使用 ros2 launch 指令執行您剛剛撰寫的啟動檔案:

Bash
ros2 launch your_robot_pkg sim_launch.py

執行後:

  1. Gazebo 模擬器介面(GUI)將會啟動。

  2. robot_state_publisher 節點會將 XACRO 轉換後的模型內容發佈到 /robot_description

  3. spawn_entity.py 節點會接收此模型描述,並將您的機器人模型實例化在 Gazebo 世界中。

  4. 您應該能在 Gazebo 中看到您的機器人模型。

沒有留言:

張貼留言