welcom ! Handel home

2025年3月6日 星期四

/rosbot_arm_control/command Topic 正在接收訊息 debug err message !

 

錯誤分析

css
[ERROR] Cannot create trajectory from message. It does not contain the expected joints.

這個錯誤表示: ✅ 你的 /rosbot_arm_control/command Topic 正在接收訊息 

ROS 控制器 (rosbot_arm_control) 無法正確解析 Joint Trajectory 可能的原因:

  1. 控制器 (rosbot_arm_control) 的 joints 配置錯誤
  2. 發送的 /rosbot_arm_control/command 訊息中的 joint_names 不匹配
  3. Gazebo 內的機械手臂 joint_namesjoint_trajectory_controller.yaml 定義的 joints 不匹配
  4. URDF (robot_description) 內的 joint_name 與控制器的 joint_name 不一致

🚀 1️⃣ 檢查 /rosbot_arm_control/command 發送的 Joint Names

📌 檢查 ROS Topic

bash
rostopic echo /rosbot_arm_control/command

輸出應該是類似這樣

yaml
joint_names: - joint_1 - joint_2 - joint_3 - joint_4 - joint_5 - joint_6

如果 joint_names 與你控制器的 joint_trajectory_controller.yaml 設定不匹配,請修正發送端的訊息

📌 手動發送正確的關節訊息

bash
rostopic pub -1 /rosbot_arm_control/command trajectory_msgs/JointTrajectory ' joint_names: ["joint_1", "joint_2", "joint_3", "joint_4", "joint_5", "joint_6"] points: - positions: [0.0, -0.5, 1.0, -1.5, 0.5, 0.0] time_from_start: {secs: 3, nsecs: 0}'

如果 這個訊息可以讓手臂動作,表示你的控制節點有問題,需要修正 joint_names


🚀 2️⃣ 檢查 joint_trajectory_controller.yaml

📌 打開 joint_trajectory_controller.yaml

bash
nano ~/data/robotxtest5_ws/src/robot_arm_urdf/config/joint_trajectory_controller.yaml

📌 確保 joints 名稱正確

yaml
rosbot_arm_control: type: position_controllers/JointTrajectoryController joints: - joint_1 - joint_2 - joint_3 - joint_4 - joint_5 - joint_6

如果 joints 名稱與 rostopic echo /rosbot_arm_control/command 顯示的不一致,請修正後重新加載

bash
rosparam load ~/data/robotxtest5_ws/src/robot_arm_urdf/config/joint_trajectory_controller.yaml

📌 確認 rosparam 內的 joint_names 是否正確

bash
rosparam get /rosbot_arm_control/joints

應該輸出

diff
- joint_1 - joint_2 - joint_3 - joint_4 - joint_5 - joint_6

🚀 3️⃣ 檢查 URDF (robot_description) 內的 joint_names

📌 打開 robot_arm_urdf.urdf

bash
nano ~/data/robotxtest5_ws/src/robot_arm_urdf/urdf/robot_arm_urdf.urdf

📌 確保所有 Joint 定義的名稱與 joint_trajectory_controller.yaml 的名稱一致

xml
<joint name="joint_1" type="revolute"> <parent link="base_link"/> <child link="link_1"/> <axis xyz="0 0 1"/> </joint>

所有關節名稱應與 /rosbot_arm_control/command 內的 joint_names 完全匹配

📌 確認 URDF 已正確載入

bash
rosparam get /robot_description | grep joint

如果關節名稱 不一致,請修正 robot_arm_urdf.urdf 後重新加載:

bash
rosparam load ~/data/robotxtest5_ws/src/robot_arm_urdf/urdf/robot_arm_urdf.urdf robot_description

🚀 4️⃣ 重新啟動控制器

📌 關閉所有運行中的控制器

bash
rosservice call /controller_manager/switch_controller '{start_controllers: [], stop_controllers: ["rosbot_arm_control"], strictness: 1}'

📌 重新加載控制器

bash
rosrun controller_manager spawner rosbot_arm_control

📌 檢查控制器是否正常運行

bash
rosservice call /controller_manager/list_controllers

應該看到

vbnet
name: "rosbot_arm_control" state: "running"

🚀 5️⃣ 測試手動發送 Joint Trajectory

📌 手動發送測試指令

bash
rostopic pub -1 /rosbot_arm_control/command trajectory_msgs/JointTrajectory ' joint_names: ["joint_1", "joint_2", "joint_3", "joint_4", "joint_5", "joint_6"] points: - positions: [0.2, -0.5, 0.8, -1.2, 0.3, 0.1] time_from_start: {secs: 5, nsecs: 0}'

📌 觀察機械手臂是否動作

  • 如果機械手臂動作,表示你的程式發送的 joint_names 可能有錯
  • 如果機械手臂還是不動,請回報 rostopic echo /rosbot_arm_control/command 的完整輸出

🚀 總結

步驟指令預期結果
1. 檢查 /rosbot_arm_control/command 發送的 joint_namesrostopic echo /rosbot_arm_control/command應該與 joint_trajectory_controller.yaml 相同
2. 確保 joint_trajectory_controller.yaml 設定正確nano config/joint_trajectory_controller.yaml應該與 URDF 定義一致
3. 確保 URDF 內的 joint_names 正確nano urdf/robot_arm_urdf.urdf應該包含 joint_1 ~ joint_6
4. 重新啟動控制器rosservice call /controller_manager/switch_controller應該顯示 rosbot_arm_control running
5. 手動發送 Joint Trajectory 測試rostopic pub -1 /rosbot_arm_control/command trajectory_msgs/JointTrajectory應該讓機械手臂移動

沒有留言: