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 a checkout of this repository:

pip install -e .

For development (tests and linting):

pip install pytest ruff

If you run examples or tests without installing, set PYTHONPATH to include src.

export PYTHONPATH=src

Quickstart

Below are minimal examples showing how to construct elements and serialize them.

Texture asset

from asset.texture import TextureAsset

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

# ElementTree element
elem = tex.to_xml()

# Pretty string
print(tex.to_xml_str())

# Write to a file
tex.write("texture.xml")

Generated <texture> will include only attributes you set and perform validation (e.g., nchannel must be 1, 3, or 4; random in [0,1]).

Mesh asset

from asset.mesh import MeshAsset

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

print(mesh.to_xml_str())

MeshAsset supports inline data (vertex/normal/texcoord/face), reference poses (refpos/refquat), and procedural builtin shapes.

Height field asset

from asset.hfield import HFieldAsset

hfield = HFieldAsset(
		name="terrain",
		file="height.png",
		content_type="image/png",
		nrow=256,
		ncol=256,
		size=[5.0, 5.0, 1.0, 0.0],  # required
)

print(hfield.to_xml_str())

size is required and encodes (radius_x, radius_y, elevation_z, base_z).

Geom

from body.geom import Geom

g = Geom(
		name="box1",
		type="box",
		size=[0.5, 0.5, 0.5],
		rgba=[0.8, 0.2, 0.2, 1.0],
		friction=[0.5, 0.1, 0.01],
)

print(g.to_xml_str())

If friction is provided, condim is emitted as its length, matching MuJoCo’s behavior.

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.1.4.tar.gz (20.6 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.1.4-py3-none-any.whl (28.5 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: mjxml-0.1.4.tar.gz
  • Upload date:
  • Size: 20.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for mjxml-0.1.4.tar.gz
Algorithm Hash digest
SHA256 9b2201a88836978f4941abfbf9b871ccdb5687db77ccbe77cf1d95c9b1f81ab3
MD5 8bd343ea381396d2188903247c077209
BLAKE2b-256 36f092a245cc54325ad7529febad1f1375875104d573ab52eacc3af1eab5fcab

See more details on using hashes here.

File details

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

File metadata

  • Download URL: mjxml-0.1.4-py3-none-any.whl
  • Upload date:
  • Size: 28.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for mjxml-0.1.4-py3-none-any.whl
Algorithm Hash digest
SHA256 932bf25dd17db5083dd3a4b8f4d4b1ecd34bc9a35473954ec67234029fbfce5c
MD5 d3383982f2310805b8612b203ff9c8e6
BLAKE2b-256 ca72eb3466fd60e6d98ddb11693e93c9a230c5b389d1127193a699a0a39e1440

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