Skip to main content

Web-based MuJoCo viewer powered by viser.

Project description

mjviser

Web-based MuJoCo viewer powered by Viser.

Quick start

View any MuJoCo model instantly, no install needed:

uvx mjviser path/to/model.xml

Or install and use:

pip install mjviser
mjviser path/to/model.xml

Fuzzy path matching finds models in the current directory tree:

mjviser humanoid        # finds **/humanoid*.xml
mjviser shadow_hand     # finds **/shadow_hand*.xml

When there's a single match it's used automatically. Multiple matches show a numbered list to pick from.

Browse 57 robots from robot_descriptions without cloning anything:

uvx --with robot_descriptions mjviser go1
uvx --with robot_descriptions mjviser shadow_hand
uvx --with robot_descriptions mjviser aloha

Python API

import mujoco
from mjviser import Viewer

model = mujoco.MjModel.from_xml_path("robot.xml")
data = mujoco.MjData(model)
Viewer(model, data).run()

Open the printed URL in your browser. Most of the MuJoCo native viewer's functionality is available: simulation controls, joint and actuator sliders, contact and force visualization, camera tracking, keyframes, and more.

Extension points

The Viewer accepts three callbacks for injecting custom logic:

  • step_fn(model, data): Called each simulation step. Use this to apply a controller, external forces, or any per-step logic. Defaults to mujoco.mj_step.

  • render_fn(scene): Called each render frame. Use this to push custom state to the scene, add ghost overlays, or render debug geometry. Defaults to scene.update_from_mjdata(data).

  • reset_fn(model, data): Called on reset. Use this to restore custom simulation state.

For full control over the loop, use ViserMujocoScene directly. The server is a standard viser server, so you can add custom GUI elements, scene overlays, or anything else viser supports.

server = viser.ViserServer()
scene = ViserMujocoScene(server, model, num_envs=1)
scene.create_visualization_gui()

# Add your own GUI.
with server.gui.add_folder("My Controls"):
    slider = server.gui.add_slider("Force", min=0, max=100, initial_value=0)

while True:
    mujoco.mj_step(model, data)
    scene.update_from_mjdata(data)

Examples

  • active_viewer.py: simplest usage with playback controls
  • active_viewer_with_controller.py: custom step_fn with random torques
  • passive_viewer.py: manual simulation loop with ViserMujocoScene
  • multi_env.py: 4 humanoids in parallel via mujoco-warp
  • ghost_overlay.py: custom render_fn that overlays a time-delayed ghost
  • motion_playback.py: recorded trajectory with timeline scrubber, speed control, and contact replay

Limitations

  • No mouse interaction: clicking/dragging bodies and keyboard callbacks are not yet supported; this requires upstream support in viser.
  • Performance with many bodies: models with lots of independently-moving bodies can be slower than the native MuJoCo viewer due to per-body websocket message overhead.
  • Cubemap textures: approximated via per-vertex colors rather than true cubemap rendering.

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

mjviser-0.0.4.tar.gz (26.2 kB view details)

Uploaded Source

Built Distribution

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

mjviser-0.0.4-py3-none-any.whl (28.7 kB view details)

Uploaded Python 3

File details

Details for the file mjviser-0.0.4.tar.gz.

File metadata

  • Download URL: mjviser-0.0.4.tar.gz
  • Upload date:
  • Size: 26.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.27 {"installer":{"name":"uv","version":"0.9.27","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for mjviser-0.0.4.tar.gz
Algorithm Hash digest
SHA256 9f795b4389333a73c0639892461f5bfe38adde1d44ac31e0fdc3653407a4807f
MD5 6d0a607178495c26400ae7efc8239435
BLAKE2b-256 e4cb5160dba50764ad7050e9d15da04345fc26e4ad4bde5bc1f21bf254ed8ef6

See more details on using hashes here.

File details

Details for the file mjviser-0.0.4-py3-none-any.whl.

File metadata

  • Download URL: mjviser-0.0.4-py3-none-any.whl
  • Upload date:
  • Size: 28.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.27 {"installer":{"name":"uv","version":"0.9.27","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for mjviser-0.0.4-py3-none-any.whl
Algorithm Hash digest
SHA256 7912b1429b53ce19dfab5a643f2737ec670438bf465a45d0a64c190aaa31c38f
MD5 adab07c5f2a49267070c8928751796db
BLAKE2b-256 8492072e5313bb085ca0aa9c6b0d925ad521ba8578e0b648205774cde1b6e9c0

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