URDF Cheat Sheet — every element and attribute on one page
A complete, printable reference for URDF: every standard element (link, joint, inertial, visual, collision, geometry, material) and attribute, joint types, and the defaults parsers actually use — for when you need the syntax, not the tutorial.
A dense syntax reference, not a tutorial — for the concept-level explanation see What is URDF?. Print this page (browser print stylesheet strips the header/footer) or bookmark it.
<robot> — root element
Attribute/child
Required
Notes
name (attr)
Yes
Robot identifier
<link>
≥1
One per rigid body
<joint>
≥0 (n−1 for n links)
Connects exactly two links; must form a tree
<material>
No
Top-level named color/texture, referenced by name from <visual>
<transmission>
No
ROS-control actuator↔joint mapping (ROS-specific, not read by most non-ROS consumers)
<gazebo>
No
Gazebo-only extension block (plugins, sensors) — ignored by URDF-only consumers
<link>
Child element
Purpose
Key sub-attributes
<inertial>
Mass properties for physics
<origin xyz rpy> (COM offset), <mass value>, <inertia ixx iyy izz ixy ixz iyz> (about the COM, in the link frame)
<visual>
What renders
<origin>, <geometry>, <material> (inline or by-name reference)
<collision>
What physics/collision uses
<origin>, <geometry> — often a simplified proxy of the visual mesh
A link with no <inertial> is valid (common for the root link, sensor mounts, or purely visual links) but many physics engines drop or destabilize links with zero/missing mass — see the inertia article.
<geometry> shapes
Element
Attributes
<box>
size="x y z" (full extents, not half — the common bug)
<cylinder>
radius, length (axis along local Z)
<sphere>
radius
<mesh>
filename (STL/DAE/OBJ, often package:// — ROS-workspace-relative, breaks outside ROS), optional scale="x y z"
<joint>
Attribute/child
Required
Notes
name, type (attrs)
Yes
See joint types below
<parent link="">
Yes
Must reference an existing link name
<child link="">
Yes
The child's frame origin IS this joint's frame
<origin xyz="" rpy="">
No (defaults to identity)
Fixed transform from parent frame to joint frame, applied before any joint motion
<axis xyz="">
revolute/continuous/prismatic only
Rotation/translation axis, expressed in the joint (=child) frame; defaults to 1 0 0 in some parsers
<limit lower upper effort velocity>
Required for revolute/prismatic
Radians (revolute) or metres (prismatic); effort in N·m or N, velocity in rad/s or m/s
<dynamics damping friction>
No
Joint damping (N·m·s/rad) and static friction (N·m)
<mimic joint="" multiplier="" offset="">
No
This joint's value = multiplier × other_joint + offset (e.g. gripper fingers); not universally supported
<calibration>, <safety_controller>
No
ROS-control specific, rarely needed outside real hardware drivers
Joint types (exactly six — no more)
Type
DOF
Needs <limit>?
revolute
1 (rotation, bounded)
Yes
continuous
1 (rotation, unbounded — wheels)
No lower/upper, but effort/velocity still expected by most parsers
prismatic
1 (translation, bounded)
Yes
fixed
0 (welded)
No
floating
6 (free body)
No
planar
3 (2 translation + 1 rotation, in a plane)
No — rarely implemented by consumers
No ball, universal, or gear joints — URDF is single-axis-per-joint only. See the format comparison for what to reach for instead.
xyz = translation, rpy = roll-pitch-yaw, applied as extrinsic X→Y→Z (fixed-axis rotation) — see the rotation conventions cheat sheet if you're porting angles from another tool.
Right-handed coordinate frames throughout.
Validate your syntax against real parser behavior (not just XML well-formedness) with the free URDF validator, or see it rendered in the 3D viewer.