您遇到了 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
檔案,特別是您在上一輪指導中建立的結構:
檢查
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>
確保 Link 定義的完整性: 確保在
<xacro:arm_link>
巨集中,您使用的連桿名稱參數name
確實被用於創建<link name="${name}">
標籤。根據先前的 Xacro 轉換,這一部分是正確的。確認
check_urdf
參數: 當您運行check_urdf robot_arm_urdf.xacro
時,check_urdf
會自動調用 Xacro 解析器將.xacro
檔案轉換為.urdf
。如果 Xacro 檔案本身有語法錯誤(例如巨集調用參數不匹配),解析會失敗。
建議:使用 Xacro 命令行預覽
為了排除 Xacro 語法或連桿定義的錯誤,請先在命令行中手動執行 Xacro 到 URDF 的轉換,確認輸出的 URDF 檔案中確實包含了 link_1
的完整定義:
# 運行 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 檔案。
沒有留言:
張貼留言