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).

#Typeaα (°)dθ (°)

Standard vs modified DH — why the URDF differs

Per-row transformURDF joint origin
Standard DHRz(θ)·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) DHRx(α)·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. New to URDF itself? Start with what is URDF?