DH to URDF Converter — Denavit-Hartenberg parameters to a robot description
Free online Denavit-Hartenberg to URDF converter: enter a standard or modified (Craig) DH parameter table and get a correct URDF joint chain, with the tool/flange offset handled explicitly instead of silently dropped.
Lengths (a, d) in metres; angles (α, θ) in degrees. θ and d below are the fixed offset for the row's type — the actuated joint's own travel is defined separately by the type (revolute varies θ about the offset, prismatic varies d about the offset).
| # | Type | a | α (°) | d | θ (°) |
|---|
Standard vs modified DH — why the URDF differs
| Per-row transform | URDF joint origin | |
|---|---|---|
| Standard DH | Rz(θ)·Tz(d)·Tx(a)·Rx(α) | Each joint's origin absorbs the previous row's (a, α) — and the last row's own (a, α) becomes a trailing fixed joint to a flange link, since it has no "next" joint to fold into. |
| Modified (Craig) DH | Rx(α)·Tx(a)·Rz(θ)·Tz(d) | Each joint's origin uses its own row's (a, α, d) directly — no index shift, no trailing joint. |
Most published DH tables don't say which convention they use, and the two give different, both valid-looking transforms for the same numbers — the #1 way a DH→URDF conversion goes subtly wrong. If your kinematics don't match the datasheet, try the other convention before assuming your numbers are wrong.
Verified: both constructions are checked against the raw per-row DH transform product (300 random multi-joint chains per convention, parsed back out of the generated URDF and compared to 1e-8) and against the textbook 2-link planar arm (joint origins land at exactly the link lengths along x, as expected).
Next: check the tree and joint limits with the URDF validator, or see it articulate in the 3D viewer (each joint gets a small orange sphere marker so the chain is visible before you add real geometry). Converting rotations by hand instead? See the rotation converter.