Introduction to Xacro - dhanushshettigar/Getting-Started-With-ROS2 GitHub Wiki
Xacro (XML Macros) simplifies URDF files by enabling modularity and reuse through variables and macros.
- Setting up Xacro
- Creating Variables in Xacro
- Creating Functions in Xacro
- Including a Xacro File in Another
sudo apt install ros-jazzy-xacro
cd Documents/ros2_ws/src/my_robot_description && code .
my_robot.urdf → my_robot.urdf.xacro
<robot name="my_robot" xmlns:xacro="http://www.ros.org/wiki/xacro">
urdf_path = os.path.join(
get_package_share_path('my_robot_description'),
'urdf', 'my_robot.urdf.xacro'
)
('share/' + package_name + '/urdf', ['urdf/my_robot.urdf.xacro']),
colcon build && source install/setup.bash
colcon build --symlink-install
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>
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"/>
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/*'))
Xacro simplifies robot descriptions by enabling modularization and reuse through variables, macros, and file inclusion.