ReleaseGoogle (DeepMind / Gemini)Google (DeepMind / Gemini)published Oct 22, 2026seen 1d

google-deepmind/mujoco 3.17.0

google-deepmind/mujoco

Open original ↗

Captured source

source ↗
published Oct 22, 2026seen 1dcaptured 1dhttp 200method plain

3.17.0

Repository: google-deepmind/mujoco

Tag: 3.17.0

Published: 2026-10-22T21:45:20Z

Prerelease: no

Release notes:

Version 3.17.0 (October 22, 2026)

Significant new features

1. `c00ed8153` Added a batch API in mujoco/mjbatch.h (in Python as mujoco.batch): many simulations of one model stepped on a thread pool of its own, each held as its integration state and loaded into an mjData for each call, so memory scales with threads and results are bit-identical to a plain loop at any thread count. It supports per-simulation model and option fields or models of the caller's, observations of the state after a step, recorded trajectories, persistent simulations (required for sleep), and arbitrary per-simulation functions. Follows the design of mjbatch by @kevinzakka.

Engine

2. Flex improvements:

discrete elastic rod model. The cross-section is selected with the new section attribute: a circle of the flex radius, or a box with half-sizes sectionsize that uses the stiffness of its weak axis. It is enabled by a positive young modulus, requires a straight reference configuration (curved initial poses can be set with qpos or keyframes), is compatible with edge equality constraints, and is integrated implicitly by the discrete integrator. Previously young was ignored for 1D flexes: existing models that set it now bend, and fail to compile if the cross-section is degenerate (zero radius with the default circle section), if a vertex joins a zero-length edge, or if the rod is not straight.

dofs) now support self-collision, excluding elements in the same or neighboring cells.

the flex mesh topology instead of nv^2. If the Newton solver runs out of arena memory it falls back to CG with a warning.

3. `mj_setConst` now computes only quantities derived from other fields of `mjModel`, while the compiler alone resolves spec-level conventions:

dampratio, the spring length of tendons from (-1, -1), and model statistics are now resolved only at compile time, not by `mj_setConst`. Set the model fields directly when editing a compiled model (`mj_copyBack` now copies tendon spring lengths back to the spec).

  • `c8362756d` Constraint solvers now scale their termination criteria by the trace of the current inertia

matrix (of the model or island) instead of mjModel.stat.meaninertia. Models solved with PGS, noslip or islands disabled can stop at slightly different iterations. The meaninertia attribute is deprecated and now emits a compile warning; remove it to migrate.

relpose, the relative pose in qpos0 is now recomputed by `mj_setConst` when the model is modified after compilation (matching the second body's anchor in body-based connect constraints). The compiler marks such welds with a nonzero eq_data[11], and mjNEQDATA increased from 11 to 12.

> [!WARNING] > Breaking ABI changes > > body-based welds that had no relpose at compile time. Zero eq_data[11] before calling `mj_setConst` > to set the relative pose of such a weld directly.

  • `865316f19` Added MJSETCONST_ARRAYS and MJSETCONST_SCALARS in mjxmacro.h, listing the

`mjModel` arrays and scalars read and written by each phase of `mj_setConst`.

4. `e15ecd842` Added single-shot multicontact for geoms with positive contact...

Excerpt shown — open the source for the full document.