welcom ! Handel home

2025年2月5日 星期三

Xacro (XML Macro) 格式 編寫工具及流程介紹

 在 ROS + Gazebo 環境中,使用 Xacro (XML Macro) 格式來編寫機器人模型能夠提高可讀性與可重用性。下面將介紹 Xacro 編寫工具、開發流程與轉換 URDF 的步驟


1. Xacro 編寫工具

在撰寫 Xacro (.xacro) 文件時,可以使用以下工具:

(1)文本編輯器

你可以使用任何文字編輯器來撰寫 Xacro 文件

  • VS Code(推薦) → 可安裝 ROS Extension 來支援語法高亮。
  • Sublime Text → 輕量級編輯器,適合快速修改。
  • Vim / Nano → 適用於終端操作。

(2)Gazebo 與 RViz

這兩個工具可以幫助你可視化機器人的 Xacro / URDF 模型

  • Gazebo:用於物理模擬,測試機器人的行為。
  • RViz:用於可視化機器人模型的結構和狀態。

(3)URDF / Xacro 轉換與檢查工具

  • 檢查 Xacro 文件是否正確
    bash
    ros2 run xacro xacro --check myrobot.xacro
  • 轉換 Xacro 為 URDF
    bash
    ros2 run xacro xacro myrobot.xacro > myrobot.urdf
  • 檢視 URDF 結構
    bash
    check_urdf myrobot.urdf
  • 在 RViz 渲染 URDF
    bash
    ros2 launch urdf_tutorial display.launch.py model:=myrobot.urdf

2. Xacro 編寫與轉換流程

(1)建立 Xacro 文件結構

通常一個機器人的 Xacro 檔案會有以下結構:

bash
myrobot_description/ │── urdf/ │ │── myrobot.xacro # 主 Xacro 檔案 │ │── macros.xacro # 儲存 Xacro 巨集函式 │ │── materials.xacro # 機器人材質定義 │ │── myrobot.gazebo # Gazebo 相關配置 │── meshes/ │ │── myrobot.dae # 3D 模型文件 │── launch/ │ │── display.launch.py # RViz 渲染 │ │── gazebo.launch.py # Gazebo 模擬啟動

(2)撰寫 myrobot.xacro

Xacro 主要由 <link><joint><xacro:macro> 等組成,示例如下:

xml
<?xml version="1.0"?> <robot name="myrobot" xmlns:xacro="http://www.ros.org/wiki/xacro"> <!-- 引入其他 Xacro 文件 --> <xacro:include filename="$(find myrobot_description)/urdf/macros.xacro"/> <xacro:include filename="$(find myrobot_description)/urdf/materials.xacro"/> <!-- 定義機器人底盤 --> <link name="chassis"> <visual> <geometry> <box size="0.5 0.3 0.1"/> </geometry> <material name="blue"/> </visual> </link> <!-- 左右輪 --> <xacro:wheel name="left_wheel" joint="left_wheel_joint" /> <xacro:wheel name="right_wheel" joint="right_wheel_joint" /> </robot>

(3)撰寫 macros.xacro(巨集)

Xacro 允許自定義巨集函式,可以簡化重複的 linkjoint 定義:

xml
<xacro:macro name="wheel" params="name joint"> <link name="${name}"> <visual> <geometry> <cylinder radius="0.05" length="0.02"/> </geometry> </visual> </link> <joint name="${joint}" type="continuous"> <parent link="chassis"/> <child link="${name}"/> <origin xyz="0 0 0" rpy="0 0 0"/> <axis xyz="0 1 0"/> </joint> </xacro:macro>

這樣就能用:

xml
<xacro:wheel name="left_wheel" joint="left_wheel_joint"/> <xacro:wheel name="right_wheel" joint="right_wheel_joint"/>

來簡化模型,而不需要手動寫多次 linkjoint


(4)轉換 Xacro 成 URDF

當 Xacro 編寫完成後,執行:

bash
ros2 run xacro xacro myrobot.xacro > myrobot.urdf

來轉換成 URDF 格式。

如果轉換成功,可以使用以下指令檢查 URDF:

bash
check_urdf myrobot.urdf

(5)在 Gazebo 或 RViz 測試

如果 URDF 正確,接下來可以在 GazeboRViz 測試:

在 RViz 渲染

bash
ros2 launch urdf_tutorial display.launch.py model:=myrobot.urdf

在 Gazebo 模擬

bash
ros2 launch gazebo_ros gazebo.launch.py

然後將 myrobot.urdf 加入 Gazebo 來測試模擬環境。


3. Xacro 開發流程總結

1. 設計機器人模型

  • 繪製機器人的結構,決定 linkjoint

2. 撰寫 Xacro

  • 定義 myrobot.xacro,使用 <xacro:macro> 優化重複部分。
  • 引入 materials.xacromacros.xacromyrobot.gazebo

3. 轉換成 URDF

bash
ros2 run xacro xacro myrobot.xacro > myrobot.urdf check_urdf myrobot.urdf

4. 在 Gazebo / RViz 測試

bash
ros2 launch urdf_tutorial display.launch.py model:=myrobot.urdf ros2 launch gazebo_ros gazebo.launch.py

5. 進行調整

  • 修改 Xacro 文件,重複執行 (步驟 3 ~ 4) 測試。

4. 其他 Xacro 進階技巧

  • 使用 arg 參數化模型

    xml
    <xacro:property name="wheel_radius" value="0.05"/> <xacro:property name="wheel_length" value="0.02"/>

    這樣可以統一修改機器人某些屬性。

  • 條件判斷

    xml
    <xacro:if value="${use_sensor}"> <sensor type="camera"> ... </sensor> </xacro:if>

    允許根據變數來決定是否加入某些元件。


結論

  • Xacro 讓 URDF 更有結構化,避免重複編寫程式碼。
  • 利用 Xacro 巨集<xacro:macro>)可以簡化 linkjoint 的定義。
  • 開發流程
    1. 撰寫 Xacro
    2. 轉換 URDF
    3. 測試與調整(Gazebo / RViz)
  • 工具推薦
    • VS Code + ROS Extension(開發)
    • Gazebo / RViz(可視化)
    • Xacro 轉換工具(檢查與轉換)

沒有留言: