Skip to content

Releases: google-deepmind/mujoco


07 May 20:10
Choose a tag to compare


10 Apr 20:08
Choose a tag to compare

See the changelog.


05 Mar 22:52
Choose a tag to compare

See the changelog.


05 Feb 22:16
Choose a tag to compare

See the changelog.


18 Dec 21:59
Choose a tag to compare

See the changelog.


13 Dec 20:43
Choose a tag to compare

See the changelog.


15 Nov 20:34
Choose a tag to compare

See the changelog.


18 Oct 12:10
Choose a tag to compare

New features

  1. Added simulation on GPU and TPU via the new MuJoCo XLA (MJX) Python module. Python users can now natively run MuJoCo simulations at millions of steps per second on Google TPU or their own accelerator hardware.

    • MJX is designed to work with on-device reinforcement learning algorithms. This Colab notebook demonstrates using MJX along with reinforcement learning to train humanoid and quadruped robots to locomote: Open In Colab
    • The MJX API is compatible with MuJoCo but is missing some features in this release. See the outline of MJX feature parity for more details.
  2. Added new signed distance field (SDF) collision primitive. SDFs can take any shape and are not constrained to be convex. Collision points are found by minimizing the maximum of the two colliding SDFs via gradient descent.

    • Added new SDF plugin for defining implicit geometries. The plugin must define methods computing an SDF and its gradient at query points. See the documentation for more details.
  3. Added new low-level model element called flex, used to define deformable objects. These simplicial complexes can be of dimension 1, 2 or 3, corresponding to stretchable lines, triangles or tetrahedra. Two new MJCF elements are used to define flexes. The top-level deformable section contains the low-level flex definition. The flexcomp element, similar to composite is a convenience macro for creating deformables, and supports the GMSH tetrahedral file format.

    • Added shell passive force plugin, computing bending forces using a constant precomputed Hessian (cotangent operator).

      Note: This feature is still under development and subject to change. In particular, deformable object functionality is currently available both via deformable and composite, and both are modifiable by the first-party elasticity plugins. We expect some of this functionality to be unified in the future.

  4. Added constraint island discovery with mj_island. Constraint islands are disjoint sets of constraints and degrees-of-freedom that do not interact. The only solver which currently supports islands is CG. Island discovery can be activated using a new enable flag. If island discovery is enabled, geoms, contacts and tendons will be colored according to the corresponding island, see video. Island discovery is currently disabled for models that have deformable objects (see previous item).

  5. Added mjThreadPool and mjTask which allow for multi-threaded operations within the MuJoCo engine pipeline. If engine-internal threading is enabled, the following operations will be multi-threaded:

    • Island constraint resolution, if island discovery is enabled and the CG solver is selected. The 22 humanoids model shows a 3x speedup compared to the single threaded simulation.
    • Inertia-related computations and collision detection will happen in parallel.

    Engine-internal threading is a work in progress and currently only available in first-party code via the testspeed utility, exposed with the npoolthread flag.

  6. Added capability to initialize composite particles from OBJ files. Fixes #642 and #674.



Breaking API changes

  1. Removed the macros mjMARKSTACK and mjFREESTACK.

    Migration: These macros have been replaced by new functions mj_markStack and mj_freeStack. These functions manage the mjData stack in a fully encapsulated way (i.e., without introducing a local variable at the call site).

  2. Renamed mj_stackAlloc to mj_stackAllocNum. The new function mj_stackAllocByte allocates an arbitrary number of bytes and has an additional argument for specifying the alignment of the returned pointer.

    Migration: The functionality for allocating mjtNum arrays is now available via mj_stackAllocNum.

  3. Renamed the nstack field in mjModel and mjData to narena. Changed narena, pstack, and maxuse_stack to count number of bytes rather than number of mjtNums.

  4. Changed mjData.solver, the array used to collect solver diagnostic information. This array of mjSolverStat structs is now of length mjNISLAND * mjNSOLVER, interpreted as as a matrix. Each row of length mjNSOLVER contains separate solver statistics for each constraint island. If the solver does not use islands, only row 0 is filled.

    • The new constant mjNISLAND was set to 20.
    • mjNSOLVER was reduced from 1000 to 200.
    • Added mjData.solver_nisland: the number of islands for which the solver ran.
    • Renamed mjData.solver_iter to solver_niter. Both this member and mjData.solver_nnz are now integer vectors of length mjNISLAND.
  5. Removed mjOption.collision and the associated option/collision attribute.


    • For models which have <option collision="all"/>, delete the attribute.
    • For models which have <option collision="dynamic"/>, delete all pair elements.
    • For models which have <option collision="pair"/>, disable all dynamic collisions (determined via contype/conaffinity) by first deleting all contype and conaffinity attributes in the model and then setting them globally to 0 using
      <default> <geom contype="0" conaffinity="0"/> </default>.
  6. Removed the rope and cloth composite objects.

    Migration: Users should use the cable and shell elasticity plugins.

  7. Added mjData.eq_active user input variable, for enabling/disabling the state of equality constraints. Renamed mjModel.eq_active to mjModel.eq_active0, which now has the semantic of "initial value of mjData.eq_active". Fixes #876.

    Migration: Replace uses of mjModel.eq_active with mjData.eq_active.

  8. Changed the default of autolimits from "false" to "true". This is a minor breaking change. The potential breakage applies to models which have elements with "range" defined and "limited" not set. Such models cannot be loaded since version 2.2.2 (July 2022).

  1. Added a new dyntype, filterexact, which updates first-order filter states with the exact formula rather than with Euler integration.

  2. Added an actuator attribute, actearly, which uses semi-implicit integration for actuator forces: using the next step's actuator state to compute the current actuator forces.

  3. Renamed actuatorforcerange and actuatorforcelimited, introduced in the previous ve...

Read more


20 Jul 09:56
Choose a tag to compare


  1. Added primitive collider for sphere-cylinder contacts, previously this pair used the generic convex-convex collider.
  2. Added joint-actuatorforcerange for clamping total actuator force at joints and sensor-jointactuatorfrc<sensor-jointactuatorfrc> for measuring total actuation force applied at a joint. The most important use case for joint-level actuator force clamping is to ensure that Cartesian actuator forces are realizable by individual motors at the joints. See Actuator force clamping for details.
  3. Added an optional content_type attribute to hfield, texture, and mesh assets. This attribute supports a formatted Media Type (previously known as MIME type) string used to determine the type of the asset file without resorting to pulling the type from the file extension.
  4. Added analytic derivatives for quaternion subtraction and integration (rotation with an angular velocity). Derivatives are in the 3D tangent space.
  5. Added mjv_connector which has identical functionality to mjv_makeConnector, but with more convenient "from-to" argument parametrization. mjv_makeConnector is now deprecated.
  6. Bumped oldest supported MacOS from version 10.12 to 11. MacOS 11 is the oldest version still maintained by Apple.

Python bindings

  1. The passive viewer handle now exposes update_hfield, update_mesh, and update_texture methods to allow users to update renderable assets. (#812 , #958, #965)
  2. Allow a custom keyboard event callback to be specified in the passive viewer. (#766)
  3. Fix GLFW crash when Python exits while the passive viewer is running. (#790)


  1. Added simple car example model.


20 Jun 18:05
Choose a tag to compare

NOTE: MuJoCo 2.3.6 is the last version to officially support Python 3.7.


  1. Added 3x3x3 cube example model. See README for details.

Bug fixes

  1. Fixed a bug that was causing an incorrect computation of the mesh bounding box and coordinate frame if the volume was invalid. In such case, now MuJoCo only accepts a non-watertight geometry if shellinertia is equal to true.
  2. Fixed the sparse Jacobian multiplication logic that is used to compute derivatives for tendon damping and fluid force, which affects the behaviour of the implicit and implicitfast integrators.
  3. Fixes to mj_ray, in line with geom visualisation conventions:
    • Planes and height-fields respect the geom_group and flg_static arguments. Before this change, rays would intersect planes and height-fields unconditionally.
    • flg_static now applies to all static geoms, not just those which are direct children of the world body.


  1. Added touch-grid sensor plugin. See documentation for details, and associated touch_grid.xml example model. The plugin includes in-scene visualisation.
  2. Added Visualization tab to simulate UI, corresponding to elements of the visual MJCF element. After modifying values in the GUI, a saved XML will contain the new values. The modifiable members of mjStatistic (extent, meansize and center) are computed by the compiler and therefore do not have defaults. In order for these attributes to appear in the saved XML, a value must be specified in the loaded XML.
  3. Increased text width for UI elements in the default spacing.


  1. Added mj_getState and mj_setState for getting and setting the simulation state as a concatenated vector of floating point numbers. See the State section for details.
  2. Added mjContact.solreffriction, allowing different solref parameters for the normal and frictional axes of contacts when using elliptic friction cones. This attribute is required for elastic frictional collisions, see associated example model mimicking the spin-bounce recoil behaviour of elastic rubber balls. This is an advanced option currently only supported by explicit contact pairs, using the solreffriction attribute.
  3. Added mjd_inverseFD for finite-differenced inverse-dynamics derivatives.
  4. Added functions for operations on banded-then-dense “arrowhead” matrices. Such matrices are common when doing direct trajectory optimization. See mju_cholFactorBand documentation for details.
  5. Added mj_multiRay function for intersecting multiple rays emanating from a single point. This is significantly faster than calling mj_ray multiple times.
  6. Ray-mesh collisions are now up to 10x faster, using a bounding volume hierarchy of mesh faces.
  7. Increased mjMAXUIITEM (maximum number of UI elements per section in Simulate) to 100.
  8. Added documentation for resource providers.
  9. Changed the formula for mju_sigmoid, a finite-support sigmoid $s: \mathbf{R} \rightarrow [0, 1]$. Previously, the smooth part consisted of two stitched quadratics, once continuously differentiable. It is now a single quintic, twice continuously differentiable:

$$ s(x) = \begin{cases} 0, & & x \le 0 \\ 6x^5 - 15x^4 + 10x^3, & 0 \lt & x \lt 1 \\ 1, & 1 \le & x \qquad \end{cases} $$

  1. Added optional tausmooth attribute to muscle actuators. When positive, the time-constant $\tau$ of muscle activation/deactivation uses mju_sigmoid to transition smoothly between the two extremal values given by the Millard et al. (2013) muscle model, within a range of width tausmooth. See Muscle actuators for more details. Relatedly, mju_muscleDynamics now takes 3 parameters instead of 2, adding the new smoothing-width parameter.
  2. Moved public C macro definitions out of mujoco.h into a new public header file called mjmacro.h. The new file is included by mujoco.h so this change does not break existing user code.
  3. Added instrumentation for the Address Sanitizer (ASAN) and Memory Sanitizer (MSAN) to detect memory bugs when allocating from the mjData stack and arena.
  4. Removed pstack and parena from the output of mj_printData, since these are implementation details of the mjData allocators that are affected by diagnostic paddings in instrumented builds.
  5. Removed the mj_activate and mj_deactivate functions. These had been kept around for compatibility with old user code from when MuJoCo was closed source, but have been no-op functions since open sourcing.