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),WorldBodybase. - Utilities:
Defaultsblocks, 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:
MujocoModelclass 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
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 mjxml-0.2.3.tar.gz.
File metadata
- Download URL: mjxml-0.2.3.tar.gz
- Upload date:
- Size: 23.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c4de1fed08783d0827424c1e2687ca49fefe717e1127b8cec42cf8b93e7b7db6
|
|
| MD5 |
af2c0f585ffc5baa9499d82845e4d212
|
|
| BLAKE2b-256 |
d592df2ab437f375d4461f1ec3f8a5ab220c7863fc34090a0efe87a33f41ef81
|
File details
Details for the file mjxml-0.2.3-py3-none-any.whl.
File metadata
- Download URL: mjxml-0.2.3-py3-none-any.whl
- Upload date:
- Size: 33.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
eb92e1255076622853add1b02abc1df4d7df35f2c05d8a482b2d94a8692e8667
|
|
| MD5 |
a63e176838f415fd933e5ea5b4ee009c
|
|
| BLAKE2b-256 |
da4f638ae0144c272ad50a14290ad36d4edfecc018dc767d7354e16be05d3c3c
|