roscar.urdf
中定義了許多 <link>
,但出現了錯誤:
lessFailed to find root link: Two root links found: [body_3dcam] and [body_imu]
這代表你有兩個 <link>
沒有透過任何 <joint>
與其他 link 相連,導致它們都變成「根節點」,這是違反 URDF 結構規則的。
✅ 修正建議:定義一個 base_link
,讓其他 link 依附它
請將你目前最核心的底盤連結(例如 body_base
、body_main
、base_link
,看你的命名)作為 root link,然後把其他的「浮動感測器」link 接上去,方式如下:
✦ 範例修正段落
加入一個 base_link
,並用 fixed joint 把 body_imu
和 body_3dcam
連上去:
xml<!-- 根 link -->
<link name="base_link"/>
<!-- 將 IMU 固定在 base_link 上 -->
<joint name="base_to_imu" type="fixed">
<parent link="base_link"/>
<child link="body_imu"/>
<origin xyz="0.0 0.0 0.1" rpy="0 0 0"/>
</joint>
<!-- 將 3D Camera 固定在 base_link 上 -->
<joint name="base_to_3dcam" type="fixed">
<parent link="base_link"/>
<child link="body_3dcam"/>
<origin xyz="0.1 0.0 0.2" rpy="0 0 0"/>
</joint>
origin
裡的xyz
可根據實體位置微調,否則感測器會全部堆疊在 (0, 0, 0)
🔍 確認哪些 link 是 root 的方法(進階)
你可以用下面的 Python 工具列出所有沒有被作為 child
的 link:
pythonimport xml.etree.ElementTree as ET
tree = ET.parse("roscar.urdf")
root = tree.getroot()
all_links = {link.get("name") for link in root.findall("link")}
child_links = {joint.find("child").get("link") for joint in root.findall("joint")}
root_candidates = all_links - child_links
print("疑似 root 的 link:", root_candidates)
你現在出錯,就是因為這個集合裡有超過一個元素。
✅ 下一步
-
加入固定關節連結感測器
-
確保有一個、且僅一個 root link(例如
base_link
) -
再次執行:
bashcheck_urdf roscar.urdf
看到像這樣輸出就是成功:
cssrobot name is: ROScar
root Link: base_link has 2 child(ren)
child(1): body_imu
child(2): body_3dcam
如需我幫你 整份修正 這份 URDF,我可以幫你產生修改後的完整版本,
是否要我代你修好後提供?
我把你的 roscar.urdf
重新整理,新增一個統一的 base_link
當唯一根節點,並用 fixed joint 把所有現有 link(輪子、感測器等)都掛到 base_link
之下。
這樣整份 URDF 便成為一棵合法的單根樹,check_urdf
應該會通過,spawn_entity.py
也不再報「兩個 root link」的錯。
下載修正版:
Download the fixed URDF
做了哪些修改?
動作 | 說明 |
---|---|
新增 <link name="base_link"> | 讓它成為唯一 root,並加上最小慣性 (mass=1 kg) |
為每個原本的 link 建立 <joint type="fixed"> | parent="base_link" 、child="原本的 link 名稱" ,origin xyz="0 0 0" |
移除 XML 宣告 | 避免 Unicode strings with encoding declaration are not supported 例外 |
接下來怎麼做?
-
下載並取代你專案中的
urdf/roscar.urdf
(或改名也行)。 -
重新 build & source:
bashcolcon build --packages-select roscar4wheel source install/setup.bash
-
再次啟動 Gazebo:
bashros2 launch roscar4wheel bringup_gz.launch.py
-
若 Gazebo GUI 仍有問題,可把
gui:=false
參數保留。
-
如果你還需要為輪子加上 revolute 關節、設定轉向或馬達控制,隨時告訴我!