Skip to main content

URDF Robot Modeling

Introduction​

URDF (Unified Robot Description Format) is an XML format for describing robot geometry, kinematics, dynamics, and visual properties for simulation and visualization.

Learning Objectives:

  • Understand URDF structure (links, joints, sensors)
  • Create a simple robot model from scratch
  • Visualize robots in RViz
  • Add sensors and collision geometry

What is URDF?​

URDF describes:

  • Links: Robot body parts (chassis, wheels, arms)
  • Joints: Connections between links (revolute, prismatic, fixed)
  • Visual: How the robot looks (meshes, colors)
  • Collision: Simplified geometry for physics
  • Inertial: Mass, center of mass, inertia tensor

Basic URDF Structure​

<?xml version="1.0"?>
<robot name="my_robot">
<!-- Links -->
<link name="base_link">
<visual>
<geometry>
<box size="0.5 0.3 0.1"/>
</geometry>
<material name="blue">
<color rgba="0 0 1 1"/>
</material>
</visual>
</link>

<!-- Joints -->
<joint name="base_to_wheel" type="continuous">
<parent link="base_link"/>
<child link="wheel_link"/>
<origin xyz="0 0 -0.1" rpy="0 0 0"/>
<axis xyz="0 1 0"/>
</joint>

<link name="wheel_link">
<visual>
<geometry>
<cylinder radius="0.05" length="0.02"/>
</geometry>
</visual>
</link>
</robot>

Joint Types​

TypeDescriptionExample
fixedNo movementCamera mount
revoluteRotation with limitsRobot elbow
continuousUnlimited rotationWheel
prismaticLinear slidingElevator
floating6 DOF free movementQuadrotor

Simple Mobile Robot Example​

<?xml version="1.0"?>
<robot name="simple_robot">
<!-- Base Link -->
<link name="base_link">
<visual>
<geometry>
<box size="0.6 0.4 0.2"/>
</geometry>
<material name="gray">
<color rgba="0.5 0.5 0.5 1"/>
</material>
</visual>
<collision>
<geometry>
<box size="0.6 0.4 0.2"/>
</geometry>
</collision>
<inertial>
<mass value="10"/>
<inertia ixx="0.1" ixy="0" ixz="0" iyy="0.1" iyz="0" izz="0.1"/>
</inertial>
</link>

<!-- Left Wheel -->
<joint name="left_wheel_joint" type="continuous">
<parent link="base_link"/>
<child link="left_wheel"/>
<origin xyz="0 0.25 0" rpy="-1.57 0 0"/>
<axis xyz="0 0 1"/>
</joint>

<link name="left_wheel">
<visual>
<geometry>
<cylinder radius="0.1" length="0.05"/>
</geometry>
<material name="black">
<color rgba="0 0 0 1"/>
</material>
</visual>
</link>

<!-- Right Wheel (similar structure) -->
<!-- ... -->
</robot>

Visualizing in RViz​

# Install joint_state_publisher_gui
sudo apt install ros-humble-joint-state-publisher-gui

# Launch RViz with URDF
ros2 launch urdf_tutorial display.launch.py model:=my_robot.urdf

Adding Sensors​

Camera​

<link name="camera_link">
<visual>
<geometry>
<box size="0.05 0.05 0.05"/>
</geometry>
</visual>
</link>

<joint name="camera_joint" type="fixed">
<parent link="base_link"/>
<child link="camera_link"/>
<origin xyz="0.3 0 0.1" rpy="0 0 0"/>
</joint>

LiDAR​

<link name="lidar_link">
<visual>
<geometry>
<cylinder radius="0.05" length="0.07"/>
</geometry>
</visual>
</link>

<joint name="lidar_joint" type="fixed">
<parent link="base_link"/>
<child link="lidar_link"/>
<origin xyz="0 0 0.15" rpy="0 0 0"/>
</joint>

URDF Best Practices​

  1. Use descriptive names: left_wheel_joint not joint_1
  2. Add collision geometry: Simplified shapes for physics
  3. Include inertial properties: Required for Gazebo simulation
  4. Check with check_urdf: Validates XML structure
# Validate URDF
check_urdf my_robot.urdf

# Convert to graphical tree
urdf_to_graphiz my_robot.urdf

Xacro: Programmable URDF​

Xacro adds macros and variables to reduce repetition:

<?xml version="1.0"?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="robot">
<!-- Define properties -->
<xacro:property name="wheel_radius" value="0.1"/>
<xacro:property name="wheel_width" value="0.05"/>

<!-- Wheel macro -->
<xacro:macro name="wheel" params="prefix reflect">
<link name="${prefix}_wheel">
<visual>
<geometry>
<cylinder radius="${wheel_radius}" length="${wheel_width}"/>
</geometry>
</visual>
</link>
<joint name="${prefix}_wheel_joint" type="continuous">
<parent link="base_link"/>
<child link="${prefix}_wheel"/>
<origin xyz="0 ${reflect * 0.25} 0" rpy="-1.57 0 0"/>
<axis xyz="0 0 1"/>
</joint>
</xacro:macro>

<!-- Use macro -->
<xacro:wheel prefix="left" reflect="1"/>
<xacro:wheel prefix="right" reflect="-1"/>
</robot>

Convert Xacro to URDF:

xacro robot.urdf.xacro > robot.urdf

Exercises​

  1. Create a simple robot with a base and two wheels
  2. Add a camera sensor to your robot
  3. Visualize your robot in RViz
  4. Convert your URDF to Xacro with macros for repeated parts

Summary​

URDF describes robot structure using links (parts) and joints (connections). RViz visualizes URDF models, and Xacro simplifies complex robot descriptions with macros.

Further Reading​