Robot-model conversion (URDF/MJCF/USD) you can trust — with a fidelity report of everything it changed.
Project description
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.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file truerig-0.1.1.tar.gz.
File metadata
- Download URL: truerig-0.1.1.tar.gz
- Upload date:
- Size: 39.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b898cc7da1086db3f12077d77ae00fa03b8d13824725f61e8c017185279890ac
|
|
| MD5 |
148cff4717acee462445a47953c11d63
|
|
| BLAKE2b-256 |
6dbd02ea13205ae20313115d4433859050ec54ad1d0489782d1de82faced08bb
|
Provenance
The following attestation bundles were made for truerig-0.1.1.tar.gz:
Publisher:
publish.yml on Sputnikboi/truerig
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
truerig-0.1.1.tar.gz -
Subject digest:
b898cc7da1086db3f12077d77ae00fa03b8d13824725f61e8c017185279890ac - Sigstore transparency entry: 2277430183
- Sigstore integration time:
-
Permalink:
Sputnikboi/truerig@4f5997263cdbe2ecab53948e69808697c00b54a7 -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/Sputnikboi
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@4f5997263cdbe2ecab53948e69808697c00b54a7 -
Trigger Event:
release
-
Statement type:
File details
Details for the file truerig-0.1.1-py3-none-any.whl.
File metadata
- Download URL: truerig-0.1.1-py3-none-any.whl
- Upload date:
- Size: 36.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0eda77ab7e67f0d4c8a827ec263414127a882f71b41faa526c12c6dd67c2d6e1
|
|
| MD5 |
2993a0e4d2d81a90dd39df987fb1168f
|
|
| BLAKE2b-256 |
ebf42c7f5dcf72b820fb11dee971db6df4d334df670c80668c19fc3fe2f717e6
|
Provenance
The following attestation bundles were made for truerig-0.1.1-py3-none-any.whl:
Publisher:
publish.yml on Sputnikboi/truerig
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
truerig-0.1.1-py3-none-any.whl -
Subject digest:
0eda77ab7e67f0d4c8a827ec263414127a882f71b41faa526c12c6dd67c2d6e1 - Sigstore transparency entry: 2277430277
- Sigstore integration time:
-
Permalink:
Sputnikboi/truerig@4f5997263cdbe2ecab53948e69808697c00b54a7 -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/Sputnikboi
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@4f5997263cdbe2ecab53948e69808697c00b54a7 -
Trigger Event:
release
-
Statement type: