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.