TrueRig
Robot-model conversion you can trust. Convert robot descriptions between URDF ↔ MJCF ↔ USD through a lossless canonical IR — and get a fidelity report of everything that changed.
The thesis is the point: existing converters fail silently. TrueRig's product is knowing what you lost.
pip install truerig
Why
Every open-source URDF→MJCF converter today fails on real robots, silently. We
reproduced this against the current urdf2mjcf (MuJoCo 3.10) on two standard
models:
| Defect | Robot | Existing tool behaviour |
|---|---|---|
| Off-diagonal inertia dropped on 32 links (up to 31.5% of the diagonal) | Unitree G1 | one buried "Warning" line |
| Closed-chain coupling (5 mimic joints → 0 constraints) | Robotiq 2F-85 | no warning at all |
package:// mesh URIs passed through unresolved / doubled paths |
both | hard load error |
| Invalid MJCF emitted (empty-name material) | Robotiq | MuJoCo refuses the file |
Out of the box, neither converted model even loads in MuJoCo without manual fixing — and once you fix the plumbing, the physics is still silently wrong.
3 of the 4 defects are pure engineering diligence. The 4th (closed chains) is genuinely lossy — so TrueRig's job isn't to pretend loss doesn't happen, it's to preserve everything it can and report the rest honestly.
How it works
URDF ─┐ ┌─ MJCF
MJCF ─┼─► frontend ─► IR ─► backend ─┼─ URDF + validate(IR) → physics checks
USD ─┘ (parse) (lossless) (emit) └─ USD + report(loss_log) → what changed
The IR is frozen (truerig/ir.py) and is lossless by construction: frontends
record all source data; backends drop only what the target can't express and log
a LossEvent for each drop. See module docstrings for per-component contracts.
What works today
- URDF ↔ MJCF — full bidirectional conversion
- URDF / MJCF → USD — experimental (UsdPhysics articulation, inertia diagonalized
losslessly);
pip install truerig[usd] - validate · report · simcheck — physics sanity checks, a fidelity report you can gate CI on, and a behavioural round-trip check in simulation
Field-tested on 12 diverse robots — Unitree G1/H1/A1/B1/Go2, ANYmal C, Franka Panda, KUKA iiwa14, Allegro Hand, Cassie, Baxter, Fetch, Solo — plus the G1/Robotiq/Z1 golden set. All convert and load in MuJoCo with full inertia and closed-chain coupling preserved; degenerate source inertia is repaired and reported, never silently. 51 tests, CI on Python 3.10–3.12.
Usage
truerig convert robot.urdf robot.mjcf --report text --strict # convert + fidelity report
truerig validate robot.urdf # physics sanity checks
truerig simcheck robot.urdf robot.mjcf # behavioural round-trip in sim
Roadmap
Embedding USD mesh geometry (currently referenced by path) and a hosted demo at truerig.xyz. Early and open (MIT) — issues and PRs welcome.
Metadata
Release files for truerig 0.1.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| truerig-0.1.1.tar.gz | 39.9 kB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| truerig-0.1.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 76.6 kB
Release files / truerig-0.1.1.tar.gz
| Download URL | truerig-0.1.1.tar.gz |
|---|---|
| Size | 39.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
b898cc7da1086db3f12077d77ae00fa03b8d13824725f61e8c017185279890ac
|
|
BLAKE2b-256 checksum How to use checksums |
6dbd02ea13205ae20313115d4433859050ec54ad1d0489782d1de82faced08bb
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 28, 2026.
Transparency logRelease files / truerig-0.1.1-py3-none-any.whl
| Download URL | truerig-0.1.1-py3-none-any.whl |
|---|---|
| Size | 36.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
0eda77ab7e67f0d4c8a827ec263414127a882f71b41faa526c12c6dd67c2d6e1
|
|
BLAKE2b-256 checksum How to use checksums |
ebf42c7f5dcf72b820fb11dee971db6df4d334df670c80668c19fc3fe2f717e6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 28, 2026.
Transparency logSecurity for truerig 0.1.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for truerig-0.1.1.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 28, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.