google-deepmind/mujoco 3.17.0
google-deepmind/mujoco
Captured source
source ↗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:
- `94483e166` Added bending elasticity for 1D flexes, using a twist-free isotropic
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.
- `36d0df9a5`, `897e3fcb1` Interpolated flexes (trilinear or quadratic
dofs) now support self-collision, excluding elements in the same or neighboring cells.
- `39dd10f2d` The default arena memory for flex models is now much smaller, sized from
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:
- `55c1b585a`, `d6d41f324` The damping of position actuators from
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.
- `abddec5b9` For body-based weld constraints without a specified
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_ARRAYSandMJSETCONST_SCALARSinmjxmacro.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.