2025年6月26日 星期四

ROS2 update URDf

roscar.urdf 中定義了許多 <link>,但出現了錯誤:

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

這代表你有兩個 <link> 沒有透過任何 <joint> 與其他 link 相連,導致它們都變成「根節點」,這是違反 URDF 結構規則的。


✅ 修正建議:定義一個 base_link,讓其他 link 依附它

請將你目前最核心的底盤連結(例如 body_basebody_mainbase_link,看你的命名)作為 root link,然後把其他的「浮動感測器」link 接上去,方式如下:


✦ 範例修正段落

加入一個 base_link,並用 fixed joint 把 body_imubody_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:

python
import 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)

你現在出錯,就是因為這個集合裡有超過一個元素。


✅ 下一步

  1. 加入固定關節連結感測器

  2. 確保有一個、且僅一個 root link(例如 base_link

  3. 再次執行:

bash
check_urdf roscar.urdf

看到像這樣輸出就是成功:

css
robot 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 例外

接下來怎麼做?

  1. 下載並取代你專案中的 urdf/roscar.urdf(或改名也行)。

  2. 重新 build & source:

    bash
    colcon build --packages-select roscar4wheel source install/setup.bash
  3. 再次啟動 Gazebo:

    bash
    ros2 launch roscar4wheel bringup_gz.launch.py
    • 若 Gazebo GUI 仍有問題,可把 gui:=false 參數保留。


如果你還需要為輪子加上 revolute 關節、設定轉向或馬達控制,隨時告訴我!


沒有留言:

張貼留言