welcom ! Handel home

2025年3月2日 星期日

(Robot_arm)Gazebo 的機械手臂沒有運動,可能有以下幾個問題:

Gazebo 的機械手臂沒有運動,可能有以下幾個問題:

  1. ROS 控制器 (joint_trajectory_controller) 沒有正確啟動
  2. Gazebo 模擬中機械手臂模型沒有正確載入
  3. 程式發送的 Topic (/robot_arm_controller/command) 沒有被訂閱
  4. 機械手臂的關節名稱 (joint_names) 不匹配

我們可以依照以下步驟來排除問題:


1️⃣ 檢查 Gazebo 與 ROS 控制器是否正確啟動

📌 確保 Gazebo 模擬環境已啟動

bash
roslaunch robot_arm_urdf robot_arm_control.launch

如果 Gazebo 沒有開啟或報錯,需要確認 robot_arm_urdf 內的 launch 檔案是否正確載入機械手臂模型。

📌 檢查機械手臂是否在 Gazebo 內

bash
rostopic list | grep gazebo

應該會看到:

bash
/gazebo/model_states /gazebo/link_states /gazebo/set_model_state /gazebo/set_link_state

📌 檢查 Gazebo 內的機械手臂模型

bash
rostopic echo /gazebo/model_states

如果 robot_arm_urdf 沒有出現在 name: 欄位,表示機械手臂沒有載入,需要確認 URDFSpawn Model 指令 是否有問題。


2️⃣ 檢查控制器 (joint_trajectory_controller) 是否正常

📌 列出目前運行的 ROS 節點

bash
rosnode list

應該會看到:

bash
/controller_spawner /robot_state_publisher

如果 /controller_spawner 不存在,則說明控制器沒有啟動,需要確認 robot_arm_control.launch 內是否有:

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

📌 檢查控制器是否已經運行

bash
rosservice list | grep controller

應該會有:

bash
/robot_arm_controller/follow_joint_trajectory/cancel /robot_arm_controller/follow_joint_trajectory/goal /robot_arm_controller/follow_joint_trajectory/result /robot_arm_controller/follow_joint_trajectory/status /controller_manager/list_controllers /controller_manager/list_controller_types

如果 沒有 /robot_arm_controller/command,那麼機械手臂的控制器沒有正確啟動。

📌 手動啟動控制器

bash
rosrun controller_manager spawner joint_state_controller robot_arm_controller

然後再嘗試運行 move_arm_loop.py


3️⃣ 檢查程式是否成功發送指令

📌 監聽 /robot_arm_controller/command topic

bash
rostopic echo /robot_arm_controller/command

如果執行 move_arm_loop.py 後,沒有任何輸出,表示程式沒有發送指令。

📌 檢查程式是否發送指令 手動執行:

bash
rostopic pub -1 /robot_arm_controller/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: 2} } ] }'

如果機械手臂有動,表示程式碼 move_arm_loop.py 可能有問題。


4️⃣ 檢查機械手臂的 joint_names 是否正確

📌 查看 /joint_states topic

bash
rostopic echo /joint_states

應該會看到:

bash
name: ['joint_1', 'joint_2', 'joint_3', 'joint_4', 'joint_5', 'joint_6'] position: [...] velocity: [...] effort: [...]

如果 name: 欄位和程式碼的 joint_names 不匹配,則需要修改 move_arm_loop.py 內的 joint_names


5️⃣ 測試修正版本的 move_arm_loop.py

如果程式發送指令,但 Gazebo 仍然沒動,可以修改為 更穩定的版本

python
#!/usr/bin/env python import rospy import time from trajectory_msgs.msg import JointTrajectory, JointTrajectoryPoint def move_joint(joint_names, positions_list, duration=2.0): """ 發送 Joint Trajectory 命令,讓機械手臂移動到指定位置 :param joint_names: 關節名稱列表 (list) :param positions_list: 一組關節目標角度 (list of lists) :param duration: 運動持續時間 (秒) """ pub = rospy.Publisher('/robot_arm_controller/command', JointTrajectory, queue_size=10) rospy.init_node('joint_trajectory_publisher', anonymous=True) # 確保 Publisher 已經連接 rospy.loginfo("等待控制器啟動...") while pub.get_num_connections() == 0 and not rospy.is_shutdown(): rospy.sleep(0.5) rospy.loginfo("機械手臂開始運動...") while not rospy.is_shutdown(): for positions in positions_list: traj_msg = JointTrajectory() traj_msg.joint_names = joint_names point = JointTrajectoryPoint() point.positions = positions point.time_from_start = rospy.Duration(duration) traj_msg.points.append(point) rospy.loginfo("發送指令: %s", positions) pub.publish(traj_msg) rospy.sleep(duration) if __name__ == '__main__': try: joint_names = ["joint_1", "joint_2", "joint_3", "joint_4", "joint_5", "joint_6"] motion_positions = [ [0.0, -0.5, 1.0, -1.5, 0.5, 0.0], [0.5, -0.3, 0.8, -1.2, 0.3, 0.2], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0] ] move_joint(joint_names, motion_positions, duration=3.0) except rospy.ROSInterruptException: rospy.logwarn("程序中斷,停止運動")

6️⃣ 總結 (故障排除步驟)

步驟指令問題分析
1. 確保 Gazebo 正常運行roslaunch robot_arm_urdf robot_arm_control.launchGazebo 是否載入機械手臂?
2. 檢查 /joint_states 是否存在rostopic echo /joint_states檢查機械手臂的關節狀態是否發布
3. 檢查控制器 (controller_manager)`rosservice listgrep controller`
4. 測試手動發送指令rostopic pub -1 /robot_arm_controller/command trajectory_msgs/JointTrajectory ...測試是否能控制手臂運動
5. 檢查程式是否發送指令rostopic echo /robot_arm_controller/command確保 move_arm_loop.py 有正確發送訊息


沒有留言: