2025年6月26日 星期四

ROS2 check_urdf roscar.urdf messgae debug

 check_urdf 抱怨:

less
Failed to find root link: Two root links found: [body_3dcam] and [body_imu]

— URDF 只能有 一個「根連結 (root link)」;你現在讓 body_3dcambody_imu 都變成沒有父關係的頂層 link,解析器就無法判斷「誰才是全機的基準」。


1 為什麼會出現兩個 root?

URDF 的層級結構必須形成 一棵樹

markdown
(唯一 root_link) │ ┌───────┴────────┐ link_a link_b │ link_c
  • 每個 <link> 必須在 某個 <joint>child 欄位 出現過

  • 只有 root link 例外:它只會出現在 <joint>parent,從不當 child

當你遺漏了其中一個 joint(或把 joint 的 parent/child 寫錯),就會讓那條 link「浮」在頂層,變成第二個 root。


2 修正策略

✦ 做法 A:選一個真正的基準 link

  1. 決定誰是底盤(多半叫 base_linkchassis):

    • body_imu/body_3dcam 都是感測器,那就新增一個 base_link 當根

  2. 把另一個頂層 link 透過 固定關節(fixed joint) 接上去**

xml
<link name="base_link"/> <link name="body_imu"/> <link name="body_3dcam"/> <!-- imu 固定在 base_link --> <joint name="base_to_imu" type="fixed"> <parent link="base_link"/> <child link="body_imu"/> <origin xyz="0 0 0" rpy="0 0 0"/> </joint> <!-- 3d cam 固定在 base_link --> <joint name="base_to_3dcam" type="fixed"> <parent link="base_link"/> <child link="body_3dcam"/> <origin xyz="0.05 0 0.15" rpy="0 0 0"/> </joint>

✦ 做法 B:讓其中一個 sensor 依附另一個

body_imubody_3dcam 之間本來就有相對固定位置,也可直接這樣:

xml
<joint name="imu_to_3dcam" type="fixed"> <parent link="body_3dcam"/> <!-- 誰當 parent 就是 root --> <child link="body_imu"/> <origin xyz="0 0 0" rpy="0 0 0"/> </joint>

3 檢修步驟

  1. 打開 /src/roscar4wheel/urdf/roscar.urdf
    找到 link name="body_3dcam"link name="body_imu"

  2. 搜尋所有 <joint>,檢查是否有 child="body_3dcam" child="body_imu"

    • 沒有 → 用上面示範加入固定關節

  3. 儲存後重新驗證

bash
check_urdf roscar.urdf

看見

css
root Link: base_link has 2 child(ren) child(1): body_imu child(2): body_3dcam

或類似單一 root 的輸出就成功了。


4 小工具幫助視覺化(選用)

bash
sudo apt install graphviz liburdfdom-tools urdf_to_graphviz roscar.urdf # 會產生 roscar.pdf

PDF 會把 link/joint 關係畫出來,方便確認是否成單棵樹。


若仍有疑問…

貼出 roscar.urdf 前後修改的片段(links & joints 部分就好),

我可以替你再檢查一次坐標與父子關係。


沒有留言:

張貼留言