Introduction to Xacro - dhanushshettigar/Getting-Started-With-ROS2 GitHub Wiki

Introduction to Xacro

Xacro (XML Macros) simplifies URDF files by enabling modularity and reuse through variables and macros.

Table of Contents

  1. Setting up Xacro
  2. Creating Variables in Xacro
  3. Creating Functions in Xacro
  4. Including a Xacro File in Another

Setting up Xacro

Step 1: Install Xacro

sudo apt install ros-jazzy-xacro

Step 2: Open Package in VS Code

cd Documents/ros2_ws/src/my_robot_description && code .

Step 3: Rename URDF to Xacro

my_robot.urdf → my_robot.urdf.xacro

Step 4: Modify URDF

<robot name="my_robot" xmlns:xacro="http://www.ros.org/wiki/xacro">

Step 5: Update Launch File

urdf_path = os.path.join(
    get_package_share_path('my_robot_description'),
    'urdf', 'my_robot.urdf.xacro'
)

Step 6: Modify setup.py

('share/' + package_name + '/urdf', ['urdf/my_robot.urdf.xacro']),

Step 7: Build and Test

colcon build && source install/setup.bash

Optional: Enable Auto Updates

colcon build --symlink-install

Creating Variables in Xacro

Define and reuse variables:

<xacro:property name="base_length" value="0.6" />

<link name="base_link">
    <visual>
        <geometry>
            <box size="${base_length} 0.4 0.2" />
        </geometry>
        <origin xyz="0 0 0.1" rpy="0 0 0" />
        <material name="blue" />
    </visual>
</link>

<link name="right_wheel_link">
    <visual>
        <geometry>
            <cylinder radius="0.1" length="0.05" />
        </geometry>
        <origin xyz="0 0 0" rpy="${pi / 2.0} 0 0" />
        <material name="grey" />
    </visual>
</link>

Creating Functions in Xacro

Use macros to define reusable components:

<xacro:macro name="example_macro" params="a b c">
    <link name="dummy_link">
        <visual>
            <geometry>
                <box size="${a} ${b} ${c}" />
            </geometry>
        </visual>
    </link>
</xacro:macro>

<xacro:example_macro a="2" b="3" c="4"/>

<xacro:macro name="wheel_link" params="prefix">
    <link name="${prefix}_wheel_link">
        <visual>
            <geometry>
                <cylinder radius="0.1" length="0.05" />
            </geometry>
            <origin xyz="0 0 0" rpy="${pi / 2.0} 0 0" />
            <material name="grey" />
        </visual>
    </link>
</xacro:macro>

<xacro:wheel_link prefix="right"/>
<xacro:wheel_link prefix="left"/>

Including a Xacro File in Another

Step 1: Create common_properties.xacro

<?xml version="1.0"?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro">
    <material name="blue">
        <color rgba="0 0 0.5 1" />
    </material>
    <material name="grey">
        <color rgba="0.5 0.5 0.5 1" />
    </material>
</robot>

Step 2: Include in Main Xacro File

<xacro:include filename="common_properties.xacro"/>

Step 3: Update setup.py

('share/' + package_name + '/urdf', ['urdf/my_robot.urdf.xacro', 'urdf/common_properties.xacro']),

Alternatively, include all files:

from glob import glob
('share/' + package_name + '/urdf', glob('urdf/*'))

Conclusion

Xacro simplifies robot descriptions by enabling modularization and reuse through variables, macros, and file inclusion.

⚠️ **GitHub.com Fallback** ⚠️