Skip to main content

Web-based MuJoCo viewer powered by viser.

Project description

mjviser

A web-based MuJoCo viewer built on Viser.

Quick start

Run it directly with uvx (nothing to install):

uvx mjviser path/to/model.xml

Or pip install mjviser and run mjviser path/to/model.xml.

mjviser also does fuzzy path matching against the current directory:

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

If robot_descriptions is available, you can load any of its 57 MuJoCo models by name:

uvx --with robot_descriptions mjviser go1

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. You get most of what the native MuJoCo viewer offers: simulation controls, joint and actuator sliders, contact and force visualization, camera tracking, keyframes, and more.

Extension points

Viewer accepts three optional callbacks:

  • step_fn(model, data): called each simulation step. Defaults to mujoco.mj_step.
  • render_fn(scene): called each render frame. Defaults to scene.update_from_mjdata(data).
  • reset_fn(model, data): called on reset.

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

server = viser.ViserServer()
scene = ViserMujocoScene(server, model, num_envs=1)
scene.create_visualization_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 require upstream Viser support.
  • Many-body performance: models with 60+ independently-moving bodies can be slower than the native viewer due to per-body websocket 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.5.tar.gz (26.0 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.5-py3-none-any.whl (28.5 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: mjviser-0.0.5.tar.gz
  • Upload date:
  • Size: 26.0 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.5.tar.gz
Algorithm Hash digest
SHA256 bdda472737b2aa6312896a1a0b85f14320d9362ef40692f48f2fb017e627fbee
MD5 cc26387e0b41cc5936ff785e4b622169
BLAKE2b-256 b74f1bcc45a0f856dd5b65a011cdef2828a45bc043b959305bdfbb94e322f14a

See more details on using hashes here.

File details

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

File metadata

  • Download URL: mjviser-0.0.5-py3-none-any.whl
  • Upload date:
  • Size: 28.5 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.5-py3-none-any.whl
Algorithm Hash digest
SHA256 6d459181b4b2f53ce4fcd3b2d08ea3ae61ad99e0fccc632f9fe87b93d8bea111
MD5 79232fd4f773134df98e97328e04a850
BLAKE2b-256 a0b8e02bbc8366883937d6a780c0a63e787f1e95837fed812deee510ad9c70c2

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