welcom ! Handel home

2025年3月6日 星期四

ROS 控制器 (/rosbot_arm_control/command) check

 ROS 控制器 (/rosbot_arm_control/command) 已經收到指令

Gazebo 內的機械手臂關節沒有動作

可能的原因:

  1. Gazebo 沒有正確載入 gazebo_ros_control 插件
  2. URDF (robot_description) 缺少 transmission 配置
  3. 控制器 (rosbot_arm_control) 沒有正確啟動
  4. 關節的 PID 參數 (gains) 沒有正確設定
  5. Gazebo 物理引擎 (physics) 設定不當

🚀 1️⃣ 確保 Gazebo 有加載 gazebo_ros_control

📌 檢查 Gazebo 是否加載控制插件

bash
rostopic list | grep gazebo

應該看到類似

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

如果沒有這些 Topics,請確保 URDF 內部有 gazebo_ros_control 插件

📌 打開 URDF (robot_arm_urdf.urdf)

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

📌 確保 URDF 內有這段

xml
<gazebo> <plugin name="control" filename="libgazebo_ros_control.so"> <robotNamespace>/</robotNamespace> </plugin> </gazebo>

📌 重新啟動 Gazebo

bash
roslaunch robot_arm_urdf robot_arm_control.launch

📌 確認 Gazebo 插件加載

bash
rosparam list | grep gazebo_ros_control

🚀 2️⃣ 確保 URDF (robot_description) 包含 transmission

📌 打開 URDF

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

📌 確保 transmission 配置正確

xml
<transmission name="joint_1_trans"> <type>transmission_interface/SimpleTransmission</type> <joint name="joint_1"> <hardwareInterface>hardware_interface/PositionJointInterface</hardwareInterface> </joint> <actuator name="joint_1_motor"> <hardwareInterface>hardware_interface/PositionJointInterface</hardwareInterface> <mechanicalReduction>1.0</mechanicalReduction> </actuator> </transmission>

📌 確保所有關節都有 transmission 配置,如果沒有,Gazebo 無法控制機械手臂。

📌 重新載入 URDF

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

📌 確認 URDF 是否正確

bash
rosparam get /robot_description | grep joint

應該列出所有關節名稱


🚀 3️⃣ 確保控制器 (rosbot_arm_control) 正確啟動

📌 檢查控制器是否在運行

bash
rosservice call /controller_manager/list_controllers

如果輸出顯示

vbnet
name: "rosbot_arm_control" state: "running"

代表 控制器已成功啟動

如果 state: stopped,請手動啟動

bash
rosrun controller_manager spawner rosbot_arm_control

📌 檢查 /rosbot_arm_control/command 是否發布消息

bash
rostopic echo /rosbot_arm_control/command

如果 消息持續更新,但 Gazebo 內的手臂沒動作,請執行 步驟 4


🚀 4️⃣ 確保 joint_trajectory_controller.yaml 設定正確

📌 打開 joint_trajectory_controller.yaml

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

📌 確保 gains 參數存在

yaml
rosbot_arm_control: 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}

📌 重新加載 YAML

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

📌 檢查 pid_gains 是否正確加載

bash
rosparam list | grep pid_gains

🚀 5️⃣ 檢查 Gazebo 物理引擎

📌 修改 Gazebo 物理引擎設定

xml
<world name="default"> <physics type="ode"> <real_time_update_rate>1000</real_time_update_rate> <max_step_size>0.001</max_step_size> <ode> <solver> <type>quick</type> <iters>50</iters> </solver> </ode> </physics> </world>

📌 確保 Gazebo 沒有暫停

bash
rosservice call /gazebo/unpause_physics

📌 如果關節仍然無法運動,請手動設定初始值

bash
rosservice call /gazebo/set_model_configuration '{model_name: robot_arm, urdf_param_name: robot_description, joint_names: ["joint_1", "joint_2", "joint_3"], joint_positions: [0.1, -0.2, 0.3]}'

這樣可以確認 Gazebo 是否正確接收關節運動指令


🚀 總結

步驟指令預期結果
1. 確保 gazebo_ros_control 加載`rostopic listgrep gazebo`
2. 確保 URDF transmission 正確nano urdf/robot_arm_urdf.urdf應該包含 SimpleTransmission
3. 確保 rosbot_arm_control 運行rosservice call /controller_manager/list_controllers應該顯示 running
4. 確保 joint_trajectory_controller.yaml 設定正確nano config/joint_trajectory_controller.yaml應該包含 gains 參數
5. 檢查 Gazebo 物理引擎是否正常rosservice call /gazebo/unpause_physics應該解除暫停

📌 執行這些步驟後,如果機械手臂還是沒有動作,

check the topic  : 

#rostopic echo /rosbot_arm_control/command  

#rosservice call /controller_manager/list_controllers 


====================================================

rostopic list 沒有 /gazebo/set_model_configuration,表示 Gazebo 可能沒有正確啟動gazebo_ros 插件未正確加載。我們可以透過以下步驟來解決這個問題。


🚀 1️⃣ 檢查 Gazebo 是否正在運行

📌 列出所有 ROS 節點

bash
rosnode list

應該有 /gazebo/gazebo_gui

bash
/gazebo /gazebo_gui

如果沒有 /gazebo,請重新啟動 Gazebo

bash
roslaunch robot_arm_urdf robot_arm_control.launch

📌 確認 Gazebo 內部是否有機械手臂

bash
rostopic echo /gazebo/model_states

應該顯示機械手臂的資訊

pgsql
name: ['ground_plane', 'robot_arm']

如果 robot_arm 不在列表內,請手動生成

bash
rosrun gazebo_ros spawn_model -param robot_description -urdf -model robot_arm

🚀 2️⃣ 檢查 Gazebo 是否加載 gazebo_ros_control

📌 檢查 URDF (robot_arm_urdf.urdf) 是否包含 gazebo_ros_control

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

📌 確保這一段存在

xml
<gazebo> <plugin name="control" filename="libgazebo_ros_control.so"> <robotNamespace>/</robotNamespace> </plugin> </gazebo>

如果這段代碼缺失,請加入後重新啟動 Gazebo

bash
roslaunch robot_arm_urdf robot_arm_control.launch

🚀 3️⃣ 確保 gazebo_ros 插件正確加載

📌 檢查是否已加載 gazebo_ros 插件

bash
rosparam list | grep gazebo

應該看到

bash
/gazebo /gazebo_ros_control /gazebo_ros_paths

如果沒有 /gazebo_ros_control,請手動加載

bash
rosparam load $(rospack find gazebo_ros)/launch/empty_world.launch

📌 重新啟動 Gazebo

bash
roslaunch robot_arm_urdf robot_arm_control.launch

🚀 4️⃣ 檢查 /gazebo/set_model_configuration 是否出現

📌 列出所有 Gazebo 相關 Topics

bash
rostopic list | grep gazebo

應該看到

bash
/gazebo/set_model_configuration

如果仍然沒有 /gazebo/set_model_configuration,請手動啟動

bash
rosservice call /gazebo/reset_simulation

📌 手動測試

bash
rosservice call /gazebo/set_model_configuration '{model_name: "robot_arm", urdf_param_name: "robot_description", joint_names: ["joint_1", "joint_2", "joint_3"], joint_positions: [0.1, -0.2, 0.3]}'

如果 執行這個指令後 Gazebo 內的機械手臂仍然不動,請執行 步驟 5


🚀 5️⃣ 檢查 Gazebo 物理引擎

📌 確認 Gazebo 沒有暫停

bash
rosservice call /gazebo/unpause_physics

應該解除暫停,Gazebo 應該恢復運作

📌 檢查物理引擎設定

xml
<physics type="ode"> <real_time_update_rate>1000</real_time_update_rate> <max_step_size>0.001</max_step_size> </physics>

📌 修改 empty.worldrobot_arm.world,確保 physics 設定正確


🚀 總結

步驟指令預期結果
1. 確保 Gazebo 運行rosnode list應該有 /gazebo
2. 檢查 gazebo_ros_controlnano urdf/robot_arm_urdf.urdf應該包含 libgazebo_ros_control.so
3. 檢查 Gazebo 相關 Topics`rostopic listgrep gazebo`
4. 嘗試手動設定關節位置rosservice call /gazebo/set_model_configuration應該讓機械手臂移動
5. 確保 Gazebo 沒有暫停rosservice call /gazebo/unpause_physics應該解除暫停


rostopic list | grep gazebo   check 輸出

沒有留言: