welcom ! Handel home

2025年3月3日 星期一

(Robot_arm) robot_arm_control.launch 建立指南

  robot_arm_control.launch 建立指南

這個 robot_arm_control.launch 檔案應該包含:

  1. 加載機械手臂的 URDF 模型 (robot_description)
  2. 啟動 Gazebo 並載入機械手臂
  3. 啟動 joint_state_publisher (發布關節狀態)
  4. 啟動 robot_state_publisher (發布 TF 變換)
  5. 啟動 ros_control 控制器 (controller_manager)
  6. 啟動 joint_trajectory_controller 以控制機械手臂關節

🚀 robot_arm_control.launch 詳細內容

📌 robot_arm_urdf/launch/robot_arm_control.launch 建立以下內容

xml
<launch> <!-- 🔹 設定機械手臂的 URDF --> <arg name="use_gui" default="false"/> <arg name="robot_description" default="$(find robot_arm_urdf)/urdf/robot_arm_urdf.urdf"/> <!-- 🔹 載入機械手臂的 URDF --> <param name="robot_description" command="$(cat $(arg robot_description))" /> <!-- 🔹 啟動 Gazebo 環境 --> <include file="$(find gazebo_ros)/launch/empty_world.launch" /> <!-- 🔹 載入機械手臂到 Gazebo --> <node name="spawn_urdf" pkg="gazebo_ros" type="spawn_model" args="-param robot_description -urdf -model robot_arm" output="screen"/> <!-- 🔹 啟動 Joint State Publisher (GUI 可選) --> <node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" output="screen"> <param name="use_gui" value="$(arg use_gui)" /> </node> <!-- 🔹 啟動 Robot State Publisher --> <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" output="screen"/> <!-- 🔹 啟動 TF 變換 --> <node name="tf_footprint_base" pkg="tf" type="static_transform_publisher" args="0 0 0 0 0 0 base_link base_footprint 40" /> <!-- 🔹 加載 ROS 控制器設定 --> <rosparam file="$(find robot_arm_urdf)/config/joint_trajectory_controller.yaml" command="load"/> <!-- 🔹 啟動 `controller_manager` 來管理關節控制 --> <node name="controller_spawner" pkg="controller_manager" type="spawner" respawn="false" output="screen" args="joint_state_controller robot_arm_controller"/> </launch>

📌 robot_arm_control.launch 內容解析

1️⃣ 載入機械手臂 URDF

xml
<arg name="robot_description" default="$(find robot_arm_urdf)/urdf/robot_arm_urdf.urdf"/> <param name="robot_description" command="$(cat $(arg robot_description))" />
  • 讀取 robot_arm_urdf.urdf,並設定 robot_description 參數,這是 ROS 控制器運行所必須的。

2️⃣ 啟動 Gazebo

xml
<include file="$(find gazebo_ros)/launch/empty_world.launch" />
  • 啟動 Gazebo 的空白世界,準備加入機械手臂模型。

3️⃣ 在 Gazebo 中生成機械手臂

xml
<node name="spawn_urdf" pkg="gazebo_ros" type="spawn_model" args="-param robot_description -urdf -model robot_arm" output="screen"/>
  • 透過 gazebo_ros 將機械手臂模型載入 Gazebo。

4️⃣ 啟動 Joint State Publisher

xml
<node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" output="screen"> <param name="use_gui" value="$(arg use_gui)" /> </node>
  • joint_state_publisher 負責發布機械手臂的關節狀態 (/joint_states topic)。
  • use_gui 設定是否啟動 GUI 來手動控制關節。

5️⃣ 啟動 Robot State Publisher

xml
<node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" output="screen"/>
  • robot_state_publisher 負責轉換機械手臂的 關節狀態 (/joint_states)TF 變換,讓 RViz 也能顯示。

6️⃣ 設定 TF (base_footprint → base_link)

xml
<node name="tf_footprint_base" pkg="tf" type="static_transform_publisher" args="0 0 0 0 0 0 base_link base_footprint 40" />
  • 設定靜態變換,使 base_footprintbase_link 保持一致。

7️⃣ 載入 ROS 控制器

xml
<rosparam file="$(find robot_arm_urdf)/config/joint_trajectory_controller.yaml" command="load"/>
  • 讀取控制器設定 (joint_trajectory_controller.yaml),這個 YAML 檔案應該包含:
    • 關節控制模式 (position_controllers/JointTrajectoryController)
    • 關節名稱 (joint_1 ~ joint_6)
    • PID 參數等

📌 🔹 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}

8️⃣ 啟動 controller_manager

xml
<node name="controller_spawner" pkg="controller_manager" type="spawner" respawn="false" output="screen" args="joint_state_controller robot_arm_controller"/>
  • 管理 ROS 控制器
  • joint_state_controller:負責發布 /joint_states
  • robot_arm_controller:負責控制機械手臂 (joint_trajectory_controller)

📌 總結

這個 robot_arm_control.launch 會: ✅ 載入機械手臂的 URDF
啟動 Gazebo 並載入機械手臂
啟動 robot_state_publisher 以發送 TF
啟動 joint_state_publisher 發布關節狀態
啟動 ROS 控制器 (joint_trajectory_controller)


🚀 如何測試

📌 (1) 啟動 Gazebo 與機械手臂

bash
roslaunch robot_arm_urdf robot_arm_control.launch

📌 (2) 確認控制器已啟動

bash
rosservice list | grep controller

應該看到 /robot_arm_controller/command

📌 (3) 測試控制機械手臂

bash
rosrun robot_arm_urdf move_arm_loop.py

🚀 如果機械手臂沒有動,請提供 rostopic listrosnode list 的輸出


沒有留言: