Skip to main content

Utilities to programatically create MuJoCo XML configuration files

Project description

mjxml

Programmatic, type-checked helpers for composing MuJoCo XML. Define assets and worldbody elements in Python (with Pydantic validation), serialize to XML, and write files you can load in MuJoCo.

Highlights

  • Strong typing and validation via Pydantic v2.
  • Easy XML serialization: to_xml(), to_xml_str(), write().
  • Assets: TextureAsset, MeshAsset, HFieldAsset, ModelAsset.
  • Bodies: Geom (with many MuJoCo attributes), WorldBody base.
  • Utilities: Defaults blocks, rotation helpers, and runtime type protocols.

Requirements

  • Python >= 3.13
  • Runtime deps: numpy, pydantic

Install

From PyPI:

pip install mjxml

Development

This project relies on uv. To setup a virtual environment, just do:

uv sync --dev
export PYTHONPATH=src

Quickstart

The snippets below sketch a typical flow: create assets, place them in the worldbody, and export a MuJoCo XML file.

1. Define assets with validation

from mjxml.asset.texture import TextureAsset
from mjxml.asset.mesh import MeshAsset

texture = TextureAsset(
    name="tex_grid",
    file="albedo.png",
    type="2d",
    colorspace="srgb",
    content_type="image/png",
    nchannel=3,
)

mesh = MeshAsset(
    name="m_cube",
    file="cube.obj",
    content_type="model/obj",
    scale=[1.0, 1.0, 1.0],
    inertia="exact",
)

Each asset only emits the attributes you set; Pydantic validators ensure parameters such as nchannel or scale stay within MuJoCo’s requirements.

2. Create bodies and geoms

from mjxml.body import Body, Geom

body = Body(name="torso")
body.add(
    Geom(
        name="box1",
        type="box",
        size=[0.5, 0.5, 0.5],
        material=None,
        rgba=[0.8, 0.2, 0.2, 1.0],
        friction=[0.5, 0.1, 0.01],
    )
)

Geoms automatically infer fields such as condim from the friction vector length and warn when MuJoCo would ignore an attribute.

3. Assemble a complete MujocoModel

from mjxml.model import MujocoModel

model = MujocoModel(name="demo")
model.add_asset(texture)
model.add_asset(mesh)
model.add_body(body)

root = model.to_xml()
print(model.to_xml_str())
model.write("scene.xml")

MujocoModel deduplicates identical assets, appends worldbody, actuator, and contact sections, and returns a ready-to-save ElementTree root.

Testing

Run the unit tests with pytest.

pytest -q -s

Status

This repository is under active development; expect minor API adjustments. A high-level MujocoModel aggregator is planned but not yet included.

Roadmap

  • [✅] High-level Wrapper: MujocoModel class to aggregate assets, worldbody, and other sections.
  • [✅] Body Elements: Support for joint, site, camera.
  • [=] Sections: Support for actuator, sensor, equality, contact, tendon.
  • [❌] IO: Parsing existing XML files for round-trip editing.
  • [❌] Docs: Comprehensive API documentation and more examples.

Project details


Download files

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

Source Distribution

mjxml-0.2.2.tar.gz (24.0 kB view details)

Uploaded Source

Built Distribution

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

mjxml-0.2.2-py3-none-any.whl (33.5 kB view details)

Uploaded Python 3

File details

Details for the file mjxml-0.2.2.tar.gz.

File metadata

  • Download URL: mjxml-0.2.2.tar.gz
  • Upload date:
  • Size: 24.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.0

File hashes

Hashes for mjxml-0.2.2.tar.gz
Algorithm Hash digest
SHA256 132d8c9e0c8bffd25858e822ffb10b3ea69684c62d34664c4799a4ef84f69a20
MD5 e053e3cfc23bb7bd72796c4b8bd12633
BLAKE2b-256 113360e63b28f7251a11b2d551c1db34bdf06b06900fbd656409169fc225bfb8

See more details on using hashes here.

File details

Details for the file mjxml-0.2.2-py3-none-any.whl.

File metadata

  • Download URL: mjxml-0.2.2-py3-none-any.whl
  • Upload date:
  • Size: 33.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.0

File hashes

Hashes for mjxml-0.2.2-py3-none-any.whl
Algorithm Hash digest
SHA256 5e668c1a74b503c5997bf93743677413b475862c941c0a3ffd8233b8d2f9d175
MD5 0c25bdd0be43631b7c69f2a557f398ea
BLAKE2b-256 bc2ecb1f83a743258fb4ef02e7f1b76c78e2d551d6dd07b1fe71384e621e0695

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page