A robot policy can look excellent in a video and still fail when a gripper touches an object, a wheel loses traction or a fast-moving body crosses a thin obstacle between simulation steps. Contact dynamics are where a physics engine earns its keep.
MuJoCo is an open-source physics engine for articulated bodies and contact-rich simulation. The core repository is Apache-2.0 licensed. It is used in robotics, biomechanics and reinforcement-learning research. It is not a game engine or a complete robot operating system. Its job is to simulate the physical system that another program can control.
MuJoCo is in the spotlight for a concrete reason: a weekly GitHub Trending snapshot collected on November 14, 2026 at 06:58 UTC ranked the repository eighth, with 1,764 stars gained over the previous seven days. Version 4.0.0 arrived on November 6, followed by 4.0.1 on November 11. This is a meaningful release cycle, not a newly created project.
Source: google-deepmind/mujoco.
What changed in MuJoCo 4.0
The 4.0 release is a substantial step beyond the older "load an XML model and open a viewer" workflow.
The release announcement highlights MuJoCo Studio, a newer visualization and interaction workflow built around Dear ImGui and Filament, browser-based viewing, model editing and a more composable tool experience. The release also includes deformable simulation work and speculative contacts.
Speculative contacts address a familiar simulation problem: a fast-moving convex object can tunnel through a thin obstacle if it travels from one side to the other during a single time step. The new option lets the engine reason about a possible contact before the objects visibly overlap. That can improve robustness for high-speed interactions, but it does not remove the need to choose a sensible timestep or validate a model.
The 4.0.1 patch is important if you are upgrading. It fixed a sparse Cholesky factorization bug introduced in 4.0.0 that could produce an incorrect Hessian factor for models with sparse constraint Jacobians. The release also enabled the MuJoCo Studio web viewer on Windows through the packaged WebAssembly client.
In other words, 4.0.0 introduced a new set of capabilities, and 4.0.1 followed quickly with a correctness fix. Read both release notes before using 4.0 in a research pipeline.
Install the Python bindings
The official repository documents Python 3.11 or later for the native bindings. A standard install is:
python -m venv .venv
source .venv/bin/activate
python -m pip install --upgrade pip
pip install mujoco
On Windows, activate the virtual environment with .venv\Scripts\activate instead. The package includes the native MuJoCo library and Python bindings. If you need a headless or minimal installation, the 4.0 release announcement also documents the mujoco-core package and optional rendering extras.
A minimal simulation loop
MuJoCo separates a model from its mutable simulation data. MjModel describes the system, while MjData holds the state that changes as the simulation advances.
Create a file named model.xml:
<mujoco model="falling_box">
<worldbody>
<geom type="plane" size="2 2 0.1"/>
<body name="box" pos="0 0 1">
<freejoint/>
<geom type="box" size="0.1 0.1 0.1" mass="1"/>
</body>
</worldbody>
</mujoco>
Then create simulate.py:
import mujoco
model = mujoco.MjModel.from_xml_path("model.xml")
data = mujoco.MjData(model)
for _ in range(1000):
mujoco.mj_step(model, data)
print("Final position:", data.qpos[:3].copy())
Run it:
python simulate.py
The loop advances the physical model through 1,000 simulation steps. The copy on the final position is intentional: MuJoCo updates its data structures in place, so a saved NumPy view can change after later simulation steps.
This example is not a controller or a robotics policy. It is the smallest useful starting point for understanding the model/data split and the simulation loop. Add actuators, sensors, constraints and control logic only after the passive model behaves as expected.
Where developers use it
MuJoCo is useful for repeatable robotics experiments, reinforcement-learning rollouts, biomechanics, system identification and custom simulation tooling. Online tutorials and browser demos make it easier to inspect models before setting up the native engine, although browser execution is not a performance substitute for native simulation.
Important limitations
A physics engine is only as useful as the model supplied to it. Incorrect mass, friction, geometry, actuator limits or contact parameters can produce convincing but misleading results. Simulation success is not proof that a robot will behave the same way in the physical world.
MuJoCo is also not a complete robotics stack. You still need to build or integrate the controller, sensors, planning layer, robot description pipeline and hardware interface that your application requires.
Version 4.0 is a major version. If you have existing models or research code, pin the version and run regression tests. Pay particular attention to contact-heavy models, sparse constraints and any custom plugin libraries. The 4.0.1 release notes describe a real solver issue fixed after 4.0.0, which is exactly why a major upgrade should not be treated as a routine package bump.
MuJoCo versus other simulation options
| Tool | Consider it when |
|---|---|
| MuJoCo | You want a focused, high-performance physics engine with C++ and Python interfaces |
| Bullet | You want a widely used general-purpose physics library and ecosystem |
| NVIDIA Isaac Sim | You need a larger robotics simulation environment with NVIDIA's rendering and robotics tooling |
| Gazebo | You want a robotics simulation ecosystem that integrates with ROS workflows |
| Drake | You need a broader mathematical and systems framework for robotics and control |
These tools overlap, but they are not interchangeable. Choose based on your models, contact requirements, rendering needs, integrations and reproducibility requirements.
A sensible upgrade path
If you are starting fresh, install the current 4.0 release and begin with the official Python tutorial. If you maintain a 3.x project, create a separate environment, read the 4.0 announcement, compare the 4.0.0 notes with 4.0.1, and validate your models before switching production experiments.
A recent community walkthrough of the 4.0 release is embedded below. It is not an official DeepMind tutorial.
Sources and further reading
What would you simulate first: a manipulator, a legged robot or a contact-heavy reinforcement-learning environment?
AI disclosure: This article was prepared with AI assistance; technical claims and commands were checked against the linked primary sources.

Top comments (0)