Automated vs manual CAD-to-URDF conversion
The real question isn't "which is better" — it's which parts of the work are worth automating for your specific robot and workflow.
What's actually manual work, either way
Every conversion path — hand-written, sw2urdf-style exporters, or a fully automated tool — needs a human to confirm three things a single static CAD pose cannot reveal: joint travel/limits, which joints are motorized, and mimic relationships. Automation doesn't remove this step; it removes the tedious, error-prone part underneath it.
What automation removes
- Per-joint axis placement. Manually, you place a reference coordinate system and axis at every joint. Automated inference (from B-Rep geometry or CAD mates) reads this directly. See why B-Rep geometry makes this exact.
- Inertia calculation. Hand-computing a 3×3 tensor per link, or trusting whatever your CAD tool's mass properties happen to export, versus an exact polyhedral-mass algorithm run automatically.
- Collision mesh simplification. Manually decimating or primitive-fitting every link's collision geometry, versus automatic convex decomposition.
A practical breakdown
| Situation | Lean manual | Lean automated |
|---|---|---|
| Link count | Under ~5, simple | Growing, or already double digits |
| CAD input | Native assembly with clean mates | Bare STEP/mesh with no mates |
| Iteration | One-off, CAD won't change | CAD revises often — re-deriving by hand each time doesn't scale |
| Output needs | URDF only | Also need MJCF/USD/SDF for other simulators |
Jointly is built for the right-hand column: STEP, mesh, SolidWorks or Onshape in, a simulation-ready URDF/SDF/MJCF/USD package out, with the human step limited to confirming limits and motorization — not re-deriving axes and inertia from scratch.
Skip the manual work
Jointly does everything on this page automatically: drop in your CAD (STEP, mesh, SolidWorks or Onshape), and it infers joints, axes, inertia and collision, then exports a simulation-ready URDF, SDF, MJCF or USD. The first conversions are free.
Try Jointly free →