這是在 ROS 2 Humble 中啟動 Gazebo 模擬器並載入 XACRO 格式機器人模型的完整操作流程。
這個過程需要透過 ROS 2 Python Launch System 協調三個主要的節點:
xacro:將
.xacro檔案轉換為標準的 URDF 格式 XML 字串。robot_state_publisher(RSP):將 URDF 內容發佈到/robot_descriptionTopic 上。gazebo_ros+spawn_entity.py:啟動 Gazebo 伺服器,並使用spawn_entity.py節點從/robot_descriptionTopic 讀取模型並將其載入到模擬器中。
步驟一:環境與依賴套件確認
請確保您的 ROS 2 Humble 環境中安裝了以下關鍵套件:
| 套件名稱 | 功能 | 安裝指令 (若缺失) |
| xacro | 處理 .xacro 檔案 | sudo apt install ros-humble-xacro |
| gazebo-ros | ROS 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 檔案,並使用以下結構。
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:
cd ~/your_ros2_ws
colcon build --packages-select your_robot_pkg
source install/setup.bash
2. 啟動模擬
使用 ros2 launch 指令執行您剛剛撰寫的啟動檔案:
ros2 launch your_robot_pkg sim_launch.py
執行後:
Gazebo 模擬器介面(GUI)將會啟動。
robot_state_publisher節點會將 XACRO 轉換後的模型內容發佈到/robot_description。spawn_entity.py節點會接收此模型描述,並將您的機器人模型實例化在 Gazebo 世界中。您應該能在 Gazebo 中看到您的機器人模型。
沒有留言:
張貼留言