welcom ! Handel home

2025年2月18日 星期二

(Robot_arm)Gazebo 啟動錯誤分析與解決方案

 

Gazebo 啟動錯誤分析與解決方案

從錯誤日誌來看,你的 roslaunch robot_arm_urdf gazebo.launch 出現了幾個問題:

  1. Gazebo_ros_control 無法找到 PID 參數
  2. Gazebo 載入機器人模型成功,但出現 Topic is not valid
  3. TF 靜態變換出錯(Node 重複註冊)

1️⃣ No p gain specified for pid 錯誤

🔹 錯誤訊息

less
[ERROR] [1739940912.505204069, 0.180000000]: No p gain specified for pid. Namespace: /gazebo_ros_control/pid_gains/joint_1

這表示 Gazebo 的控制插件 gazebo_ros_control 沒有設定 PID 參數,導致無法正確控制關節。

解決方案:在 gazebo.launchrobot_arm_urdf_control.yaml 中添加 PID 設定 在你的 robot_arm_urdf 套件內,應該有一個 控制器 YAML 檔案(通常命名為 robot_arm_urdf_control.yaml)。如果沒有,請建立:

yaml
gazebo_ros_control: pid_gains: joint_1: {p: 100.0, i: 0.01, d: 1.0} joint_2: {p: 100.0, i: 0.01, d: 1.0} joint_3: {p: 100.0, i: 0.01, d: 1.0} joint_4: {p: 100.0, i: 0.01, d: 1.0} joint_5: {p: 100.0, i: 0.01, d: 1.0} joint_6: {p: 100.0, i: 0.01, d: 1.0} joint_7: {p: 100.0, i: 0.01, d: 1.0}

然後,在 gazebo.launch 添加這個 YAML:

xml
<rosparam command="load" file="$(find robot_arm_urdf)/config/robot_arm_urdf_control.yaml"/>

2️⃣ Topic is not valid

🔹 錯誤訊息

swift
Topic [/data://world/default/model/robot_arm_urdf/plugin/control/joint_cmd] is not valid.

這表示 Gazebo 找不到控制 joint 的指令 Topic,通常是 URDF 或 SDF 檔案中缺少 transmission 定義。

解決方案:在 robot_arm_urdf.urdf 添加 transmission

xml
<transmission name="trans_joint_1"> <type>transmission_interface/SimpleTransmission</type> <joint name="joint_1"> <hardwareInterface>EffortJointInterface</hardwareInterface> </joint> <actuator name="motor_joint_1"> <hardwareInterface>EffortJointInterface</hardwareInterface> <mechanicalReduction>1.0</mechanicalReduction> </actuator> </transmission>

確保 所有關節都有定義 transmission,並在 robot_arm_urdf.urdf.xacrogazebo.launch 載入 controller YAML


3️⃣ [tf_footprint_base] Reason: new node registered with same name

🔹 錯誤訊息

less
[ WARN] [1739940911.569750838]: Reason given for shutdown: [[/tf_footprint_base] Reason: new node registered with same name]

這表示 有兩個相同名稱的 tf_static 變換節點 在運行,導致 Gazebo 關閉舊的節點。

解決方案:確保 static_transform_publisher 只有一個 檢查 gazebo.launchrobot_arm_urdf.launch,避免重複定義:

xml
<node pkg="tf" type="static_transform_publisher" name="tf_footprint_base" args="0 0 0 0 0 0 base_link world 100"/>

若有 重複的 static_transform_publisher,刪除其中一個


📌 最終修正步驟

1️⃣ 確認 PID 設定

bash
rostopic list | grep pid_gains

如果沒有 PID,則在 robot_arm_urdf_control.yaml 添加並在 gazebo.launch 加載。

2️⃣ 確認 URDF transmission

bash
rosparam get /robot_description

如果 transmission 不存在,請在 robot_arm_urdf.urdf 新增 transmission

3️⃣ 避免重複 TF 節點

bash
rosnode list | grep tf

如果 tf_footprint_base 出現兩次,則檢查 launch 檔案,移除重複定義。

4️⃣ 重新啟動並測試

bash
roslaunch robot_arm_urdf gazebo.launch

確保 Gazebo 能成功運行,沒有 PID 錯誤,

也沒有 Topic is not valid 錯誤 🎯🚀


沒有留言: