Gazebo 的機械手臂沒有運動,可能有以下幾個問題:
- ROS 控制器 (
joint_trajectory_controller
) 沒有正確啟動 - Gazebo 模擬中機械手臂模型沒有正確載入
- 程式發送的 Topic (
/robot_arm_controller/command
) 沒有被訂閱 - 機械手臂的關節名稱 (
joint_names
) 不匹配
我們可以依照以下步驟來排除問題:
1️⃣ 檢查 Gazebo 與 ROS 控制器是否正確啟動
📌 確保 Gazebo 模擬環境已啟動
bashroslaunch robot_arm_urdf robot_arm_control.launch
如果 Gazebo 沒有開啟或報錯,需要確認
robot_arm_urdf
內的launch
檔案是否正確載入機械手臂模型。
📌 檢查機械手臂是否在 Gazebo 內
bashrostopic list | grep gazebo
應該會看到:
bash/gazebo/model_states /gazebo/link_states /gazebo/set_model_state /gazebo/set_link_state
📌 檢查 Gazebo 內的機械手臂模型
bashrostopic echo /gazebo/model_states
如果 robot_arm_urdf
沒有出現在 name:
欄位,表示機械手臂沒有載入,需要確認 URDF 或 Spawn Model 指令 是否有問題。
2️⃣ 檢查控制器 (joint_trajectory_controller
) 是否正常
📌 列出目前運行的 ROS 節點
bashrosnode 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"/>
📌 檢查控制器是否已經運行
bashrosservice 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
,那麼機械手臂的控制器沒有正確啟動。
📌 手動啟動控制器
bashrosrun controller_manager spawner joint_state_controller robot_arm_controller
然後再嘗試運行 move_arm_loop.py
。
3️⃣ 檢查程式是否成功發送指令
📌 監聽 /robot_arm_controller/command
topic
bashrostopic echo /robot_arm_controller/command
如果執行 move_arm_loop.py
後,沒有任何輸出,表示程式沒有發送指令。
📌 檢查程式是否發送指令 手動執行:
bashrostopic 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
bashrostopic echo /joint_states
應該會看到:
bashname: ['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.launch | Gazebo 是否載入機械手臂? |
2. 檢查 /joint_states 是否存在 | rostopic echo /joint_states | 檢查機械手臂的關節狀態是否發布 |
3. 檢查控制器 (controller_manager ) | `rosservice list | grep controller` |
4. 測試手動發送指令 | rostopic pub -1 /robot_arm_controller/command trajectory_msgs/JointTrajectory ... | 測試是否能控制手臂運動 |
5. 檢查程式是否發送指令 | rostopic echo /robot_arm_controller/command | 確保 move_arm_loop.py 有正確發送訊息 |
沒有留言:
張貼留言