2025年9月30日 星期二

check_urdf 驗證 Xacro 檔案時的常見錯誤

 您遇到了 check_urdf 驗證 Xacro 檔案時的常見錯誤:Failed to build tree: child link [link_1] of joint [joint_1] not found

這個錯誤表明,儘管您在 Xacro 檔案中定義了 joint_1,並指定其子連桿是 link_1,但在 Xacro 處理器嘗試建立連桿樹狀結構時,它找不到名為 link_1 的連桿的定義。

錯誤分析與修正指導 🔎

這個問題幾乎總是發生在 Xacro 檔案中的 連桿 (Link) 定義順序巨集展開 (Macro Expansion) 邏輯上。

核心問題:巨集展開順序 🔄

在您重構的 Xacro 檔案中,您使用了巨集 (<xacro:arm_link>) 來定義所有的連桿。如果這些巨集沒有在它們被其他元素(例如關節 <joint>)引用之前被正確地包含或展開,check_urdf 在解析時就會找不到連桿。

雖然 Xacro 通常會先解析巨集,但最好的做法是確保所有連桿和關節的定義都在單一檔案中,並且結構清晰。

解決步驟:檢查 Xacro 結構和 Link 定義

請仔細檢查您的 robot_arm_urdf.xacro 檔案,特別是您在上一輪指導中建立的結構:

  1. 檢查 xacro:arm_link 巨集調用: 確認您在 Xacro 檔案的主體中,呼叫 xacro:arm_link 來生成 link_1 的部分沒有錯誤,並且在 joint_1 的定義之前。

    • 正確的順序(應確保 Link 在 Joint 之前):

      XML
      <xacro:arm_link
        name="link_1" 
        mass="0.14046" 
        origin_xyz="0.01967 -0.01117 0.00112"
        origin_rpy="0 0 0"
        mesh_filename="link_1.STL" />
      
      <joint name="joint_1" type="revolute">
        <parent link="base_link" />
        <child link="link_1" />  </joint>
      
  2. 確保 Link 定義的完整性: 確保在 <xacro:arm_link> 巨集中,您使用的連桿名稱參數 name 確實被用於創建 <link name="${name}"> 標籤。根據先前的 Xacro 轉換,這一部分是正確的。

  3. 確認 check_urdf 參數: 當您運行 check_urdf robot_arm_urdf.xacro 時,check_urdf 會自動調用 Xacro 解析器將 .xacro 檔案轉換為 .urdf。如果 Xacro 檔案本身有語法錯誤(例如巨集調用參數不匹配),解析會失敗。

建議:使用 Xacro 命令行預覽

為了排除 Xacro 語法或連桿定義的錯誤,請先在命令行中手動執行 Xacro 到 URDF 的轉換,確認輸出的 URDF 檔案中確實包含了 link_1 的完整定義:

Bash
# 運行 Xacro 解析器,將輸出重定向到一個臨時的 URDF 檔案
ros2 run xacro xacro robot_arm_urdf.xacro > temp_robot_arm_urdf.urdf

檢查 temp_robot_arm_urdf.urdf 檔案:

  • 開啟 temp_robot_arm_urdf.urdf

  • 搜索 <link name="link_1">。如果找不到這個標籤,說明您的 xacro:arm_link 巨集沒有被正確展開。

  • 如果找到了,再搜索 <joint name="joint_1">,確保 <child link="link_1"/> 正確無誤。

如果手動解析的 URDF 檔案中存在 link_1,但 check_urdf 仍然報錯,則問題可能在於 joint_1 引用了 base_link。在您的 URDF 檔案中,base_link 已經被定義了。

最終確認: 這個錯誤 child link [link_1] of joint [joint_1] not found 幾乎 100% 確定是 link_1 的定義在 XML 結構中缺失或位於錯誤的位置 (在 joint_1 之後),或者是在巨集展開時丟失了。請再次仔細檢查您的 Xacro 檔案。


 

沒有留言:

張貼留言