welcom ! Handel home

2025年3月3日 星期一

(Robot_arm)arm_urdf.launch 解析與註解

 

📌 arm_urdf.launch 解析與註解

這個 launch 檔案的功能是:

  1. 定義機械手臂 (robot_arm_urdf) 的 URDF
  2. 啟動 Gazebo 空白場景
  3. 將機械手臂載入 Gazebo
  4. 初始化 ROS 控制器 (joint_trajectory_controller)
  5. 發布 TF (座標變換),供 RViz 視覺化

🚀 解析 launch 檔案

xml
<launch>

🔹 整個 launch 檔案的開頭標籤,所有設定都在 <launch> 內。


1️⃣ 定義 arg 參數 (用於 Gazebo 內的機械手臂位置)

xml
<arg name="arg_x" default="0.00" /> <arg name="arg_y" default="0.00" /> <arg name="arg_z" default="0.00" /> <arg name="arg_R" default="0.00" /> <arg name="arg_P" default="0.00" /> <arg name="arg_Y" default="0.00" />

🔹 這些 <arg> 變數定義了機械手臂的初始 位置 (x, y, z) 和朝向 (R, P, Y)

  • arg_x, arg_y, arg_zXYZ 位置
  • arg_R, arg_P, arg_YRPY 旋轉角度
  • 用途:這些變數稍後會傳遞給 spawn_urdf,決定機械手臂的初始位置與旋轉。

2️⃣ 載入機械手臂的 URDF

xml
<param name="robot_description" textfile="$(find robot_arm_urdf)/urdf/robot_arm_urdf.urdf"/>

🔹 這行指令將 URDF 檔案 (robot_arm_urdf.urdf) 載入到 ROS 參數伺服器

  • URDF 位置$(find robot_arm_urdf)/urdf/robot_arm_urdf.urdf
  • 存儲於 ROS 參數伺服器內,變數名稱為 robot_description
  • Gazebo 以及 MoveIt! 需要使用這個 robot_description

3️⃣ 啟動 Gazebo 空白場景

xml
<include file="$(find gazebo_ros)/launch/empty_world.launch" />

🔹 這行載入 Gazebo 預設的 empty_world (空白場景)

  • Gazebo 啟動後,會 自動加載地面 (ground plane) 與環境
  • 機械手臂稍後會加入這個 Gazebo 世界

4️⃣ 設定機械手臂的 TF (base_linkbase_footprint)

xml
<node name="tf_footprint_base" pkg="tf" type="static_transform_publisher" args="0 0 0 0 0 0 base_link base_footprint 40" />

🔹 這個 node 負責建立靜態 TF 變換

  • base_footprintbase_link (機械手臂底座)
  • 位置 (0, 0, 0),旋轉 (0, 0, 0)
  • 頻率 40 Hz

5️⃣ 在 Gazebo 內生成機械手臂

xml
<node name="spawn_urdf" pkg="gazebo_ros" type="spawn_model" args="-param robot_description -urdf -model robot_arm_urdf -x $(arg arg_x) -y $(arg arg_y) -z $(arg arg_z) -Y $(arg arg_Y) -J joint_1 0.0 -J joint_2 0.0 -J joint_3 0.0 -J joint_4 0.0 -J joint_5 0.0 -J joint_6 0.0"/>

🔹 這個 spawn_model 節點將機械手臂載入 Gazebo

  • -param robot_description:從 ROS 參數伺服器讀取 URDF
  • -urdf:指定這是 URDF 格式的模型
  • -model robot_arm_urdf:Gazebo 內部的機器人名稱
  • -x $(arg arg_x) -y $(arg arg_y) -z $(arg arg_z):機械手臂的 XYZ 位置
  • -Y $(arg arg_Y):機械手臂的 Yaw 旋轉角度
  • -J joint_1 0.0 -J joint_2 0.0 ...
    • 初始化所有關節 (joint_1 ~ joint_6) 到 0.0 rad

6️⃣ 載入 joint_trajectory_controller.yaml 控制器

xml
<rosparam file ="$(find robot_arm_urdf)/config/joint_trajectory_controller.yaml" command="load"/>

🔹 這行指令讀取 ROS 控制器的 YAML 配置

  • 檔案位置robot_arm_urdf/config/joint_trajectory_controller.yaml
  • 控制器類型position_controllers/JointTrajectoryController
  • 控制關節joint_1 ~ joint_6
  • PID 參數gains 內的 P, I, D

📌 🔹 joint_trajectory_controller.yaml (範例)

yaml
robot_arm_controller: type: position_controllers/JointTrajectoryController joints: - joint_1 - joint_2 - joint_3 - joint_4 - joint_5 - joint_6 gains: joint_1: {p: 100.0, i: 0.01, d: 10.0} joint_2: {p: 100.0, i: 0.01, d: 10.0} joint_3: {p: 100.0, i: 0.01, d: 10.0} joint_4: {p: 100.0, i: 0.01, d: 10.0} joint_5: {p: 100.0, i: 0.01, d: 10.0} joint_6: {p: 100.0, i: 0.01, d: 10.0}

7️⃣ 啟動 ROS 控制器

xml
<node name= "controller_spawner" pkg= "controller_manager" type="spawner" respawn="false" output="screen" args="joint_state_controller robot_arm_controller hand_ee_controller"/>

🔹 這行指令負責啟動 ROS 控制器 (controller_manager)

  • joint_state_controller:負責發布 關節狀態 (/joint_states)
  • robot_arm_controller:負責 機械手臂運動 (/robot_arm_controller/command)
  • hand_ee_controller:負責 夾爪控制 (若有夾爪)

8️⃣ 啟動 Robot State Publisher

xml
<node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" respawn="false" output="screen"/>

🔹 這行指令將 joint_states 轉換為 TF 變換

  • ROS 控制器 (joint_state_controller) 會發布 /joint_states
  • 這個 node 會解析 /joint_states 並生成 /tf
  • TF 可用於 RViz 顯示機械手臂的當前狀態

🚀 總結

功能詳細說明
載入 URDF    robot_description
啟動 Gazebo    empty_world.launch
載入機械手臂到 Gazebo    spawn_urdf
加載 ROS 控制器    joint_trajectory_controller.yaml
啟動 controller_manager       負責管理關節運動
啟動 TF 變換       讓 RViz 監視機械手臂位置

這個 launch 檔案讓 Gazebo + ROS 控制器 正常運行,

你可以透過 move_arm.py 控制機械手臂運動! 

🚀

沒有留言: