URDF vs SDF vs MJCF vs USD — robot description formats compared
A side-by-side comparison of the four robot description formats: structure, kinematic loops, sensors, units, ecosystem, and when to use each — with the conversion paths between them.
Four formats describe robots in 2026, and none is going away: URDF (the ROS lingua franca), SDF (Gazebo's richer native format), MJCF (MuJoCo's physics-first XML), and USD (NVIDIA Isaac's scene format, borrowed from film VFX). Choosing wrong costs a rewrite; converting carelessly costs correctness. Here's the honest comparison.
The comparison table
| URDF | SDF | MJCF | USD | |
|---|---|---|---|---|
| Origin / steward | ROS (Open Robotics) | Gazebo (Open Robotics) | MuJoCo (Google DeepMind) | Pixar → AOUSD; robotics via NVIDIA |
| Structure | Flat link/joint list, tree only | Model-frame poses, nested models | Nested body tree | Layered scene graph |
| Kinematic loops | ✕ Impossible | ✓ Allowed | ✓ Via equality constraints | ✓ Via physics schemas |
| Sensors in-format | ✕ (extensions only) | ✓ First-class | ✓ First-class | ✓ Via schemas |
| World/environment | ✕ Robot only | ✓ Worlds, physics, lights | ✓ Full scene | ✓ Full scene, composable layers |
| Angle units | Radians | Radians | Degrees by default (radian via compiler flag) | Schema-dependent |
| Box sizes | Full extents | Full extents | Half-extents | Schema-dependent |
| Best for | ROS stacks, MoveIt, interoperability | Gazebo simulation, multi-robot worlds | Fast dynamics, RL research, contact-rich tasks | Isaac Sim, GPU-parallel RL, photorealistic rendering |
| Weakness | Expressiveness ceiling | Weak support outside Gazebo | Small ecosystem outside RL | Complexity; young robotics tooling |
How to choose
- Default to URDF (generated from xacro) if you're in the ROS ecosystem or want maximum interoperability — everything imports URDF, however imperfectly.
- SDF when Gazebo is your primary simulator and you need sensors, worlds, or nested models in one file.
- MJCF when dynamics quality and speed dominate — reinforcement learning, contact-rich manipulation, legged locomotion research.
- USD when you're committed to Isaac Sim / Omniverse — GPU-parallel training or synthetic data generation at scale.
The conversion landscape (and its traps)
In practice teams author once and convert — and the conversions are where silent errors breed:
| Conversion | Status | The trap |
|---|---|---|
| URDF → SDF | Built into Gazebo, reliable | Few — this is the well-trodden direction |
| SDF → URDF | Chronically unsolved in community tooling | SDF link poses are model-frame; URDF frames come from joint origins — naive tag-copying misplaces every link. This converter does the transform composition correctly |
| URDF → MJCF | Scripts exist; most are "limited subset" | Half-extents, degree default, joint-in-child-body restructuring, dropped off-diagonal inertia. This converter handles all four and is compile-verified against MuJoCo 3.10 |
| URDF → USD | Isaac Sim importer (GUI/scripts) | Tooling locked to the Isaac environment |
| CAD (STEP) → any | Plugin-per-CAD-package, or geometry pipeline | Units, mesh density, and inertia — computed from geometry here |
The uncomfortable truth
There is no universal format and no lossless round-trip. URDF can't express what SDF can; MJCF's physics annotations have no URDF equivalent; USD's layering has no analogue anywhere else. The practical strategy is: author in the richest format your primary tool needs, convert outward with tools that report what they drop — silent lossy conversion is how a robot works in one simulator and mysteriously fails in the next. Every converter on this site lists its dropped constructs as explicit warnings for exactly that reason.