Skip to main content

riggen

CI PyPI

The blazingly fast, lightweight robot assembler for RL researchers. Drop meshes in, get a simulation-ready MJCF or URDF out — in a window, or from ten lines of Python.

The sample arm in riggen: the link tree, the viewport with joint glyphs, the Joints window

Install

uv tool install riggen      # or: uvx riggen  /  pip install riggen
riggen --example arm        # the bundled sample robot

One wheel per platform (Linux x86_64 / aarch64, macOS arm64 / x86_64, Windows x86_64), Python 3.10 or later, nothing else to install — the riggen command is a native executable, import riggen the SDK over the same core, and there is no Rust toolchain on this path. On a platform without a wheel, pip install builds the SDK from source with cargo on PATH and tells you how to get the app (see Python).

The first minute

  1. riggen --example arm opens a four-part arm: link tree on the left, the viewport in the middle, Properties on the right. Orbit with the middle mouse button, zoom with the wheel, Home to frame everything.

  2. Drag the sliders in Window › Joints — the arm moves; that is the kinematic tree you will build for your own robot.

  3. File › Export…, pick MJCF, choose a directory. The dialog lists anything that would stop the export (a link with no mass, a joint with no axis) and writes arm.xml beside meshes/*.stl when there is nothing.

  4. Load it:

    python -c "import mujoco; m = mujoco.MjModel.from_xml_path('out/arm.xml'); print(m.nbody, 'bodies')"
    

    or python -m mujoco.viewer --mjcf out/arm.xml.

Then your robot: riggen base.stl upper.stl fore.stl drops each mesh as a link under the root (meters or millimetres — the import units are in the status bar). Reparent by dragging rows in the tree; Place joint puts a revolute joint on a bore by clicking its edge; Align snaps a part's bore concentric with its parent's; Properties computes the inertial from the mesh and a material, and fits a hull or primitives for collision.

What it does

  • Assembles: STL and OBJ meshes into a kinematic tree — fixed, revolute and prismatic joints, placed by clicking geometry, with limits.
  • Computes: mass, centre of mass and the inertia tensor from the mesh and a material density, or from a spec you type; convex hulls and fitted boxes / cylinders / spheres for collision.
  • Exports: MJCF and URDF from the same document, meshes baked to meters as STL, so MuJoCo loads it with zero warnings and its forward kinematics agree with riggen's (that is a CI job, not a hope).
  • Imports: an existing URDF, package:// paths resolved beside the file, to fix and convert it.
  • Stays out of the way: a native window through wgpu, a document that is plain JSON (.riggen), undo for everything, and a headless CLI.

Command line

usage:
  riggen [FILE...]        open a .riggen document, or drop meshes (.stl, .obj) as links
  riggen --example arm    open the bundled sample arm
  riggen --export mjcf|urdf|both --out DIR [--fk-samples] INPUT
                          write INPUT's export to DIR without opening a window

options:
  --example NAME          open a bundled example: arm (the five-link sample robot)
  --export FORMAT         headless export of INPUT (.riggen or .urdf): mjcf, urdf or both
  --out DIR               where --export writes; created if missing
  --fk-samples            with --export: also write <name>.fk.json, five sampled joint configurations
  --timing                print the time from launch to the first frame on stderr
  -h, --help              print this help
  -V, --version           print the version and the git commit it was built from

riggen --export needs no display, so it runs in CI and in scripts: give it a .riggen or a .urdf and it writes the model, the meshes and, with --fk-samples, five joint configurations with every body's world pose — the file python/tests/test_mjcf_load.py checks MuJoCo against.

python -m riggen is the same executable, for an environment whose bin/ is not on PATH.

Python

The same document, the same rules, from a script or a notebook:

uv add riggen        # or: pip install riggen — the wheel that has the app has the SDK
import riggen

robot = riggen.Robot("pendulum")
robot.root.add_mesh("base.stl", scale=0.001)          # your STL, in millimetres
robot.root.material = "aluminium"
arm = robot.root.add_link(
    "arm",
    riggen.Revolute("y", origin=(0, 0, 0.5), limits=(-90, 90), degrees=True),
    mesh="arm.stl", scale=0.001, material="PLA",      # and the part it moves
)
arm.geoms[0].pose = (0, 0, 0.5)                       # the mesh half a unit above the hinge
robot.export("out", format="mjcf")                    # out/pendulum.xml + out/meshes/*.stl

Every call is one document edit, checked the way the window checks it: a duplicate name, a hinge without limits or a link hung under its own child raises a riggen.EditError subclass and changes nothing. Meters and radians, Z-up; degrees=True wherever an angle is typed.

robot.fk({"arm_joint": 0.3})["arm"]                   # Pose((0.0, 0.0, 0.5), rpy=(0.0, 0.3, 0.0))
arm.inertial                                          # Inertial(mass=…, com=…, inertia=…) from the mesh
robot.link("arm").joint.limits = (-1.0, 1.0)          # radians; one edit
robot.save("pendulum.riggen")                         # the window opens this file

Place the joint by hand, keep scripting:

viewer = riggen.show(robot)      # the riggen window on a copy; click the bore, Ctrl+S
robot = viewer.wait()            # the document as the window saved it

Then MuJoCo:

import mujoco
model = mujoco.MjModel.from_xml_path("out/pendulum.xml")

riggen.load(path) reads a .riggen, riggen.load_urdf(path) an existing URDF (with packages={"name": "dir"} for package:// paths); export writes format="urdf" or "both" too, and fk_samples=True adds the five joint configurations CI compares against MuJoCo. examples/pendulum.py is the snippet above as a file; examples/arm.py builds the bundled arm from its four STLs with typed joints — its export is byte-identical to the app's. Everything is typed (py.typed) and documented in docstrings: help(riggen.Link).

The wheel is cp310-abi3: one build for every CPython from 3.10 on, which is why it needs no per-version matrix — and why it does not install on free-threaded CPython (3.13t / 3.14t) yet. An install from the source distribution (any other platform) compiles the SDK alone; riggen.show() and python -m riggen then say how to get the app: a wheel, cargo install --git, or RIGGEN_BINARY pointing at a binary you built.

Developing

Rust stable, then:

git clone https://github.com/Divelix/riggen && cd riggen
git config core.hooksPath .githooks   # fmt, clippy -D warnings, test before every commit
cargo run                             # the app
cargo test --workspace                # incl. the visual snapshot suite (needs a Vulkan driver;
                                      # lavapipe / mesa-vulkan-drivers is the reference)
python python/build_wheel.py                             # the wheel: the app binary + the extension module

A notebook on the dev build, next to the fixtures — the SDK's own venv, the extension installed editable, the app from a local build:

uv venv target/sdk-venv --python 3.12
VIRTUAL_ENV=$PWD/target/sdk-venv uvx maturin develop --uv   # rerun after a Rust change (~10 s)
uv pip install --python target/sdk-venv ipykernel mujoco pytest
target/sdk-venv/bin/python -m ipykernel install --user --name riggen-dev --display-name "riggen (dev)"
cargo build --release -p riggen-app && export RIGGEN_BINARY=$PWD/target/release/riggen   # for riggen.show()

Put notebooks in scratch/ (gitignored) on the "riggen (dev)" kernel; anything worth keeping becomes an examples/*.py, which the test suite runs. The SDK suite itself: target/sdk-venv/bin/python -m pytest python/tests/sdk.

To try a TestPyPI build in a uv project instead, give riggen its own index — an explicit one, or uv's dependency-confusion guard will find some other package's old version on TestPyPI and refuse:

[[tool.uv.index]]
name = "testpypi"
url = "https://test.pypi.org/simple/"
explicit = true

[tool.uv.sources]
riggen = { index = "testpypi" }

then uv add "riggen==<version>".

The Rust route to the binary is cargo install --git https://github.com/Divelix/riggen riggen-app; publishing the workspace to crates.io so that cargo install riggen works is a later release.

Read, in order: SEED.md (what and why), docs/01-architecture.md, docs/02-data-model.md, docs/03-roadmap.md, docs/adr/ — then AGENTS.md for the rules, agent or human. The SDK's own tests are python/tests/sdk/ (pytest, against the built wheel).

Licence

MIT or Apache-2.0, at your option.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

riggen-0.2.0.tar.gz (171.0 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

riggen-0.2.0-cp310-abi3-win_amd64.whl (8.2 MB view details)

Uploaded CPython 3.10+Windows x86-64

riggen-0.2.0-cp310-abi3-manylinux_2_28_x86_64.whl (10.5 MB view details)

Uploaded CPython 3.10+manylinux: glibc 2.28+ x86-64

riggen-0.2.0-cp310-abi3-manylinux_2_28_aarch64.whl (9.9 MB view details)

Uploaded CPython 3.10+manylinux: glibc 2.28+ ARM64

riggen-0.2.0-cp310-abi3-macosx_11_0_arm64.whl (6.9 MB view details)

Uploaded CPython 3.10+macOS 11.0+ ARM64

riggen-0.2.0-cp310-abi3-macosx_10_12_x86_64.whl (7.4 MB view details)

Uploaded CPython 3.10+macOS 10.12+ x86-64

File details

Details for the file riggen-0.2.0.tar.gz.

File metadata

  • Download URL: riggen-0.2.0.tar.gz
  • Upload date:
  • Size: 171.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for riggen-0.2.0.tar.gz
Algorithm Hash digest
SHA256 be6c4511397fd1754ad924a202122be485b1d6a3e98934ccac9da44dee94a7c6
MD5 2cc1b0540d10f6ea6271e4fc49bb58bf
BLAKE2b-256 b23057ae239455f435ed7f25a7526a0a1645c02e746d4d86ddb48b00d04fd312

See more details on using hashes here.

Provenance

The following attestation bundles were made for riggen-0.2.0.tar.gz:

Publisher: release.yml on Divelix/riggen

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file riggen-0.2.0-cp310-abi3-win_amd64.whl.

File metadata

  • Download URL: riggen-0.2.0-cp310-abi3-win_amd64.whl
  • Upload date:
  • Size: 8.2 MB
  • Tags: CPython 3.10+, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for riggen-0.2.0-cp310-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 497af108fd52729bd925c9689d153ebf92a97589cc664e6235eccdb6e6ceb3b4
MD5 0a2383348992fb20810169250e54d090
BLAKE2b-256 0074cf5ea91d30e646b08c65312d6ac96d4448be2dad6c13a7180619989781cd

See more details on using hashes here.

Provenance

The following attestation bundles were made for riggen-0.2.0-cp310-abi3-win_amd64.whl:

Publisher: release.yml on Divelix/riggen

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file riggen-0.2.0-cp310-abi3-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for riggen-0.2.0-cp310-abi3-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 e0343378c51e5e6bffe4ea5f3658e5bb142dc6f4301be42b51f17a2e931bbc31
MD5 71768dd2376f871ba15e4597b240026e
BLAKE2b-256 c638ded52a68edc1aae82f0f8510d849e7dfcdfbbd618879da7f1b7bdff64e01

See more details on using hashes here.

Provenance

The following attestation bundles were made for riggen-0.2.0-cp310-abi3-manylinux_2_28_x86_64.whl:

Publisher: release.yml on Divelix/riggen

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file riggen-0.2.0-cp310-abi3-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for riggen-0.2.0-cp310-abi3-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 ff948b5802352f9aa3aa2cd81e8455e69dabc971ad75451b596e0c6cd2fd861a
MD5 df38ae638a5ac5bd52b71616c623eecf
BLAKE2b-256 91c7451148a555de19005e21238d7ea5f0f7b49517857f127f19def85b7a93ad

See more details on using hashes here.

Provenance

The following attestation bundles were made for riggen-0.2.0-cp310-abi3-manylinux_2_28_aarch64.whl:

Publisher: release.yml on Divelix/riggen

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file riggen-0.2.0-cp310-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for riggen-0.2.0-cp310-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 ab5848d4c22f9b8bf6140c70fbfbbb8f42cab4e6e087c6ae3b38d1f0803469d8
MD5 add399294478a94b695bef449509da30
BLAKE2b-256 c1b2b53e907ed409ddbaf1ac27a9308c32c5935f4c8e4f870797b93866128f8d

See more details on using hashes here.

Provenance

The following attestation bundles were made for riggen-0.2.0-cp310-abi3-macosx_11_0_arm64.whl:

Publisher: release.yml on Divelix/riggen

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file riggen-0.2.0-cp310-abi3-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for riggen-0.2.0-cp310-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 ec369cb56685eba9e6b1faf0825e479a9bba03ef1661511181d9a17698103d8d
MD5 3fe3ad45a9bf8810593cbabe07bde858
BLAKE2b-256 ac1f0e5cc1405a8fcbfa5c9b15a7db144abf95c6ea47ecf03c245a45a54d84c0

See more details on using hashes here.

Provenance

The following attestation bundles were made for riggen-0.2.0-cp310-abi3-macosx_10_12_x86_64.whl:

Publisher: release.yml on Divelix/riggen

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

This release

0.2.0 This release

6 files

0.1.0

6 files

0.0.1

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page