Update changelog for the 3.11.0 release.

PiperOrigin-RevId: 954795939
Change-Id: I357468dd9072a5d1bab5af2529039e4924db12ed
This commit is contained in:
Michael Moss
2026-07-27 13:21:48 -07:00
committed by Copybara-Service
parent ca5337161d
commit b85fdca54f
+123 -117
View File
@@ -2,8 +2,8 @@
Changelog
=========
Upcoming version (not yet released)
-----------------------------------
Version 3.11.0 (July 27, 2026)
------------------------------
Engine
^^^^^^
@@ -13,169 +13,175 @@ Engine
:align: right
:width: 35%
- Added :ref:`geom/surfacevel<body-geom-surfacevel>`: the velocity of a geom's surface as seen by contacts, given as
a velocity field with a constant component and a rotational component about the geom frame origin. This allows
conveyor belts, treadmills and turntables to be modeled with static geoms and no degrees of freedom: friction
drives touching bodies along the motion of the surface, with the field projected onto each contact's tangent
plane. Surface velocities compose correctly with each other and with body motion.
Note that the contact rows of ``mjData.efc_vel``, and the constraint-state sensors that read them, report the
velocity relative to the moving surface rather than to the geom, since that is the quantity the constraint acts
on; for geoms without :at:`surfacevel` the two are identical. Contact-point visualization draws an arrow along the
surface velocity at contacts with moving surfaces.
1. :commit:`4787c809` Added :ref:`geom/surfacevel<body-geom-surfacevel>`: the velocity of a geom's surface as seen by
contacts, given as a velocity field with a constant component and a rotational component about the geom frame origin.
This allows conveyor belts, treadmills and turntables to be modeled with static geoms and no degrees of freedom:
friction drives touching bodies along the motion of the surface, with the field projected onto each contact's tangent
plane. Surface velocities compose correctly with each other and with body motion.
Note that the contact rows of ``mjData.efc_vel``, and the constraint-state sensors that read them, report the
velocity relative to the moving surface rather than to the geom, since that is the quantity the constraint acts
on; for geoms without :at:`surfacevel` the two are identical. Contact-point visualization draws an arrow along the
surface velocity at contacts with moving surfaces.
.. youtube:: GioWwB36XHI
:aspect: 16:7
:align: right
:width: 35%
- Added :ref:`geom/adhesion<body-geom-adhesion>` and :ref:`pair/adhesion<contact-pair-adhesion>`: an adhesive force
associated with a contact, useful for modeling sticky materials. Contacts can pull with up to the given force before
breaking, and the friction budget becomes :math:`\mu(f_N + \text{adhesion})`. Combined with :ref:`gap<body-geom-gap>`,
adhesive contacts apply "adhesion at a distance", useful for modeling magnets. Resting penetration is unaffected by
adhesion. :ref:`mj_contactForce` reports the net interface force, whose normal component can now be negative.
- Replaced midpoint integration of free bodies with :ref:`gyroscopic derivatives<geFreeBody>` in the ``implicitfast``
:ref:`integrator<geIntegrators>`: the bias-force derivative of every standalone free body is applied via a local
unsymmetric solve of its decoupled block, making ``implicitfast`` identical to ``implicit`` for such bodies.
Unlike midpoint integration, which required vacuum and no constraints, this applies in all environments (contacts,
fluid, constraints), and is compatible with discrete-time inverse dynamics. Spinning free bodies no
longer gain energy, but tumbling motion is now mildly damped; models requiring long-horizon energy conservation of
tumbling bodies in vacuum should use ``RK4``. The :ref:`invdiscrete<option-flag-invdiscrete>` flag no longer has any
effect on forward dynamics.
- Added :ref:`body/simple<body-simple>` attribute ("false"/"auto") to disable the *simple body* mass matrix
optimization. This is useful for domain randomization, where model parameters may change post-compilation.
- :ref:`mj_setConst` now recomputes the ``mjModel.{body,geom,site}_sameframe`` flags, to account for changes in
body/geom/site frames after compilation.
- Added support for :ref:`multiccd <coMultiCCD>` with arbitrarily large meshes.
- Added ``flg_gravcomp`` and ``flg_surfacevel`` boolean flags to ``mjModel``. These flags replace the fast-path checks
as originally guarded by ``ngravcomp``. Since the engine uses these integers as flags (zero vs. non-zero), the new
flags are honest boolean properties, writeable from the Python bindings at runtime. The field ``ngravcomp`` is
deprecated and will be removed in a future release.
- Replaced quadratic scratch in DFS flood-fill island discovery with a linear-memory Union-Find (disjoint set).
Contribution by :github:user:`teerthsharma`.
2. :commit:`a264d0bc` Added :ref:`geom/adhesion<body-geom-adhesion>` and :ref:`pair/adhesion<contact-pair-adhesion>`: an
adhesive force associated with a contact, useful for modeling sticky materials. Contacts can pull with up to the
given force before breaking, and the friction budget becomes :math:`\mu(f_N + \text{adhesion})`. Combined with
:ref:`gap<body-geom-gap>`, adhesive contacts apply "adhesion at a distance", useful for modeling magnets. Resting
penetration is unaffected by adhesion. :ref:`mj_contactForce` reports the net interface force, whose normal component
can now be negative.
3. :commit:`f0fa3d82` Replaced midpoint integration of free bodies with :ref:`gyroscopic derivatives<geFreeBody>` in the
``implicitfast`` :ref:`integrator<geIntegrators>`: the bias-force derivative of every standalone free body is applied
via a local unsymmetric solve of its decoupled block, making ``implicitfast`` identical to ``implicit`` for such
bodies. Unlike midpoint integration, which required vacuum and no constraints, this applies in all environments
(contacts, fluid, constraints), and is compatible with discrete-time inverse dynamics. Spinning free bodies no
longer gain energy, but tumbling motion is now mildly damped; models requiring long-horizon energy conservation of
tumbling bodies in vacuum should use ``RK4``. The :ref:`invdiscrete<option-flag-invdiscrete>` flag no longer has any
effect on forward dynamics.
4. :commit:`5618666a` Added :ref:`body/simple<body-simple>` attribute ("false"/"auto") to disable the *simple body* mass
matrix optimization. This is useful for domain randomization, where model parameters may change post-compilation.
5. :commit:`14c0b0c9` :ref:`mj_setConst` now recomputes the ``mjModel.{body,geom,site}_sameframe`` flags, to account for
changes in body/geom/site frames after compilation.
6. :commit:`2444defc` Added support for :ref:`multiccd <coMultiCCD>` with arbitrarily large meshes.
7. :commit:`a04b0c5b` Added ``flg_gravcomp`` and ``flg_surfacevel`` boolean flags to ``mjModel``. These flags replace
the fast-path checks as originally guarded by ``ngravcomp``. Since the engine uses these integers as flags (zero vs.
non-zero), the new flags are honest boolean properties, writeable from the Python bindings at runtime. The field
``ngravcomp`` is deprecated and will be removed in a future release.
8. :commit:`a1f38c8e` Replaced quadratic scratch in DFS flood-fill island discovery with a linear-memory Union-Find
(disjoint set). Contribution by :github:user:`teerthsharma`.
.. admonition:: Breaking API changes
:class: attention
- Changed the default value of :ref:`sleep_tolerance<option-sleep_tolerance>` from 1e-4 to 1e-3 (1mm/sec in SI
units).
- Removed the legacy sparse ancestor-walk inertia matrix ``mjData.qM``. The joint-space inertia matrix is now stored
exclusively in the compressed sparse row (CSR) format ``mjData.M``.
- Switched :ref:`mjd_inverseFD` to use the CSR-format ``mjData.M`` representation instead of the legacy ``mjData.qM``
for the mass matrix derivative. This changes the shape of the ``DmDq`` parameter from ``(nv x nM)`` to
``(nv x nC)``.
- :ref:`mju_round` now breaks ties away from zero rather than towards :math:`+\infty`. This only affects
negative half-integers, e.g. ``mju_round(-2.5)`` now returns -3 rather than -2.
- Removed unneeded `mjvScene` argument from :ref:`mjv_moveCamera`.
- Split up :ref:`mjrfMeshData` into `mjrfMeshData` and `mjrfMeshConfig` to allow reuploading of mesh data without
having to recreate the mesh object. Introduces :ref:`mjrfDefaultMeshConfig` and :ref:`mjrfSetMeshData` functions.
- Removed `bytes` field from :ref:`mjrVertexAttribute`.
9. :commit:`ff629889` Changed the default value of :ref:`sleep_tolerance<option-sleep_tolerance>` from 1e-4 to 1e-3
(1mm/sec in SI units).
10. :commit:`315bcfbf` Removed the legacy sparse ancestor-walk inertia matrix ``mjData.qM``. The joint-space inertia
matrix is now stored exclusively in the compressed sparse row (CSR) format ``mjData.M``.
11. :commit:`7e9ac58f` Switched :ref:`mjd_inverseFD` to use the CSR-format ``mjData.M`` representation instead of the
legacy ``mjData.qM`` for the mass matrix derivative. This changes the shape of the ``DmDq`` parameter from
``(nv x nM)`` to ``(nv x nC)``.
12. :commit:`1ea2d884` :ref:`mju_round` now breaks ties away from zero rather than towards :math:`+\infty`. This only
affects negative half-integers, e.g. ``mju_round(-2.5)`` now returns -3 rather than -2.
13. :commit:`fa36015b` Removed unneeded `mjvScene` argument from :ref:`mjv_moveCamera`.
14. :commit:`ba9a6503` Split up :ref:`mjrfMeshData` into `mjrfMeshData` and `mjrfMeshConfig` to allow reuploading of
mesh data without having to recreate the mesh object. Introduces :ref:`mjrf_defaultMeshConfig` and
:ref:`mjrf_setMeshData` functions.
15. :commit:`ba9a6503` Removed `bytes` field from :ref:`mjrVertexAttribute`.
.. admonition:: Breaking ABI changes
:class: caution
- :ref:`mjModel` gained the ``actuator_ctrlspec`` field (input signature of each actuator), and :ref:`mjsActuator`
gained ``ctrlspec``, changing their size and layout. The :ref:`mjtGain` and :ref:`mjtBias` enums gained ``so3``
members, shifting the values of ``mjGAIN_USER`` and ``mjBIAS_USER``.
- Added ``texid``, ``texuniform`` and ``texrepeat`` fields to :ref:`mjvGeom`.
- The :ref:`mjContact` struct gained an ``adhesion`` member, changing its size and layout.
16. :commit:`072e963f` :ref:`mjModel` gained the ``actuator_ctrlspec`` field (input signature of each actuator), and
:ref:`mjsActuator` gained ``ctrlspec``, changing their size and layout. The :ref:`mjtGain` and :ref:`mjtBias`
enums gained ``so3`` members, shifting the values of ``mjGAIN_USER`` and ``mjBIAS_USER``.
17. :commit:`d43c3ed4` Added ``texid``, ``texuniform`` and ``texrepeat`` fields to :ref:`mjvGeom`.
18. :commit:`a264d0bc` The :ref:`mjContact` struct gained an ``adhesion`` member, changing its size and layout.
.. admonition:: Bug fixes
:class: admonition
- Fixed a bug where ``body_margin`` excluded ``gap``, causing the mid-phase collision filter to incorrectly prune
in-gap contacts on multi-geom bodies.
19. :commit:`dddb2767` Fixed a bug where ``body_margin`` excluded ``gap``, causing the mid-phase collision filter to
incorrectly prune in-gap contacts on multi-geom bodies.
Actuation
^^^^^^^^^
- Refactored actuator infrastructure in preparation for MIMO (multi-input multi-output) actuator support. Each actuator
now has ``ctrlnum`` (number of controls) and ``outnum`` (number of force outputs). The total counts
``nu = sum(ctrlnum)`` and ``nout = sum(outnum)`` dimension ``mjData.ctrl`` and ``mjData.actuator_force``,
respectively, ``nactuator`` is the number of actuators. For existing actuators ``ctrnum = outnum = 1``, so
``nactuator == nu == nout`` and existing code is unaffected.
- Setpoints of :ref:`position<actuator-position>` and :ref:`intvelocity<actuator-intvelocity>` servos acting on 3D
rotational transmissions (ball joints, or site transmissions with a :ref:`refsite<actuator-general-refsite>` and
purely rotational gear) are now interpreted on the circle: the force uses the setpoint representative nearest the
current angle, so targets winding beyond half a turn are tracked continuously instead of slipping by full turns.
Behavior is identical whenever the error does not exceed π. Relatedly, ``intvelocity`` actuators now expose
:ref:`actlimited<actuator-intvelocity-actlimited>`, which was previously hardcoded to "true": as for
:ref:`general<actuator-general>` actuators it defaults to "auto", so activation clamping is enabled by specifying
``actrange``. Unclamped integrated setpoints are well-behaved on rotational transmissions, where they wrap.
20. :commit:`d507e921` Refactored actuator infrastructure in preparation for MIMO (multi-input multi-output) actuator
support. Each actuator now has ``ctrlnum`` (number of controls) and ``outnum`` (number of force outputs). The total
counts ``nu = sum(ctrlnum)`` and ``nout = sum(outnum)`` dimension ``mjData.ctrl`` and ``mjData.actuator_force``,
respectively, ``nactuator`` is the number of actuators. For existing actuators ``ctrnum = outnum = 1``, so
``nactuator == nu == nout`` and existing code is unaffected.
21. :commit:`56a93979` Setpoints of :ref:`position<actuator-position>` and :ref:`intvelocity<actuator-intvelocity>`
servos acting on 3D rotational transmissions (ball joints, or site transmissions with a
:ref:`refsite<actuator-general-refsite>` and purely rotational gear) are now interpreted on the circle: the force
uses the setpoint representative nearest the current angle, so targets winding beyond half a turn are tracked
continuously instead of slipping by full turns. Behavior is identical whenever the error does not exceed π.
Relatedly, ``intvelocity`` actuators now expose :ref:`actlimited<actuator-intvelocity-actlimited>`, which was
previously hardcoded to "true": as for :ref:`general<actuator-general>` actuators it defaults to "auto", so
activation clamping is enabled by specifying ``actrange``. Unclamped integrated setpoints are well-behaved on
rotational transmissions, where they wrap.
.. youtube:: 17XpwnqyCXs
:aspect: 16:7
:align: right
:width: 35%
- Added the :ref:`orientation<actuator-orientation>` actuator: a geodesic servo on a new SO(3) transmission (ball
joints, or a site with a :ref:`refsite<actuator-general-refsite>`), acting jointly on the full relative orientation
with an exact equilibrium at every commanded orientation. This is the first actuator with multiple force outputs
(3), and, with ``input="quat"``, the first with different input and output dimensions (4 controls, 3 outputs). The
input signature is recorded in the new ``mjModel.actuator_ctrlspec``, exposed as the
:ref:`input<actuator-general-input>` attribute.
- Added :ref:`mj_actuatorInputName`, returning the name of an actuator input (e.g. "qw" for the first control of a
quaternion-commanded orientation actuator). The control sliders in :ref:`simulate<saSimulate>` and MuJoCo Studio are
now generated per control and labeled with the actuator name plus the input name suffix.
- Viewer control sliders now use a defined :ref:`ctrlrange<actuator-general-ctrlrange>` even when
:ref:`ctrllimited<actuator-general-ctrllimited>` is "false": the range sets the slider span, while clamping remains
controlled by :at:`ctrllimited`.
- Added :ref:`mj_resetCtrl`, setting controls to neutral values: zero, except quaternion inputs which reset to the
identity quaternion. Called by :ref:`mj_resetData` and the viewers' "Clear All".
22. :commit:`072e963f` Added the :ref:`orientation<actuator-orientation>` actuator: a geodesic servo on a new SO(3)
transmission (ball joints, or a site with a :ref:`refsite<actuator-general-refsite>`), acting jointly on the full
relative orientation with an exact equilibrium at every commanded orientation. This is the first actuator with
multiple force outputs (3), and, with ``input="quat"``, the first with different input and output dimensions (4
controls, 3 outputs). The input signature is recorded in the new ``mjModel.actuator_ctrlspec``, exposed as the
:ref:`input<actuator-general-input>` attribute.
23. :commit:`072e963f` Added :ref:`mj_actuatorInputName`, returning the name of an actuator input (e.g. "qw" for the
first control of a quaternion-commanded orientation actuator). The control sliders in :ref:`simulate<saSimulate>`
and MuJoCo Studio are now generated per control and labeled with the actuator name plus the input name suffix.
24. :commit:`072e963f` Viewer control sliders now use a defined :ref:`ctrlrange<actuator-general-ctrlrange>` even when
:ref:`ctrllimited<actuator-general-ctrllimited>` is "false": the range sets the slider span, while clamping remains
controlled by :at:`ctrllimited`.
25. :commit:`072e963f` Added :ref:`mj_resetCtrl`, setting controls to neutral values: zero, except quaternion inputs
which reset to the identity quaternion. Called by :ref:`mj_resetData` and the viewers' "Clear All".
Solvers
^^^^^^^
- Flex elasticity (stretch, bending, interpolation stiffness) is now integrated implicitly inside the CG constraint
solver via an *effective metric*: the mass matrix is augmented with the stiffness Hessian,
so contact and elastic forces are solved against one consistent metric. This replaces the previous post-hoc CG
correction, which modified ``qacc`` after the constraint solve. The gate is ``solver="CG"`` with an implicit
integrator and flex stiffness present; Newton and PGS are unaffected. Bending-only models pay zero per-step
factorization cost (the factor is precomputed in :ref:`mj_setConst<mj_setConst>`). Inverse dynamics
(:ref:`mj_inverse<mj_inverse>`) is now discrete-consistent with forward dynamics for gated models.
- Added Nesterov momentum extrapolation with adaptive gradient restart (O'Donoghue-Candès) to the PGS solver,
significantly improving convergence. Overall PGS now requires ~2x fewer iterations.
- Added the Newton decrement -- the quadratic model's predicted cost improvement of the next iteration -- as a third
early-termination criterion of the :ref:`Newton solver<soAlgorithms>`, alongside cost improvement and gradient norm.
This reduces iteration counts at no accuracy cost. Proposed by :github:user:`adenzler-nvidia` in
:doc:`MJWarp <mjwarp/index>` pull request `1520 <https://github.com/google-deepmind/mujoco_warp/pull/1520>`__.
- The CG and Newton solvers now terminate with zero iterations when a duality-gap certificate proves that the
warmstarted solution already satisfies the tolerance. The certificate requires only the existing mass-matrix
factorization, so quiescent scenes skip Hessian construction, factorization and the line search entirely. Newton
zero-iteration exits additionally require the gradient criterion, preserving Newton's characteristic force-level
accuracy. See :ref:`Warmstart<soAlgorithms>` in the Computation chapter for details.
26. :commit:`ea230a95` Flex elasticity (stretch, bending, interpolation stiffness) is now integrated implicitly inside
the CG constraint solver via an *effective metric*: the mass matrix is augmented with the stiffness Hessian,
so contact and elastic forces are solved against one consistent metric. This replaces the previous post-hoc CG
correction, which modified ``qacc`` after the constraint solve. The gate is ``solver="CG"`` with an implicit
integrator and flex stiffness present; Newton and PGS are unaffected. Bending-only models pay zero per-step
factorization cost (the factor is precomputed in :ref:`mj_setConst<mj_setConst>`). Inverse dynamics
(:ref:`mj_inverse<mj_inverse>`) is now discrete-consistent with forward dynamics for gated models.
27. :commit:`c499f7f2` Added Nesterov momentum extrapolation with adaptive gradient restart (O'Donoghue-Candès) to the
PGS solver, significantly improving convergence. Overall PGS now requires ~2x fewer iterations.
28. :commit:`1e66efd1` Added the Newton decrement -- the quadratic model's predicted cost improvement of the next
iteration -- as a third early-termination criterion of the :ref:`Newton solver<soAlgorithms>`, alongside cost
improvement and gradient norm. This reduces iteration counts at no accuracy cost. Proposed by
:github:user:`adenzler-nvidia` in :doc:`MJWarp <mjwarp/index>` pull request
`1520 <https://github.com/google-deepmind/mujoco_warp/pull/1520>`__.
29. :commit:`c69ef030` The CG and Newton solvers now terminate with zero iterations when a duality-gap certificate
proves that the warmstarted solution already satisfies the tolerance. The certificate requires only the existing
mass-matrix factorization, so quiescent scenes skip Hessian construction, factorization and the line search
entirely. Newton zero-iteration exits additionally require the gradient criterion, preserving Newton's
characteristic force-level accuracy. See :ref:`Warmstart<soAlgorithms>` in the Computation chapter for details.
Compiler
^^^^^^^^
- :ref:`mj_encode` now supports encoding of MJB and TXT files.
- The :ref:`attach<body-attach>` element now supports self-attachment (attaching elements of the current model to
itself) by omitting the :ref:`model<body-attach-model>` attribute. It also supports attaching a frame via the new
:ref:`frame<body-attach-frame>` attribute, which is mutually exclusive with :ref:`body<body-attach-body>`.
- Fixed loading of :ref:`.mjz <MJZArchives>` archives in :ref:`simulate<saSimulate>`: the archive was unmounted
before model compilation, so assets failed to load. Failures in the :ref:`mjz <MJZArchives>` decoder now emit a
warning with the underlying error instead of the generic "could not decode content" message.
- The :ref:`mjz <MJZArchives>` decoder now searches for ``model.xml`` and ``<stem>/model.xml`` as a fallback if
``<stem>.xml`` and ``<stem>/<stem>.xml`` are not found.
- Added support for resource writing via :ref:`mju_writeResource` and the ``write`` callback in
:ref:`mjpResourceProvider`.
30. :commit:`4e1795b9` :ref:`mj_encode` now supports encoding of MJB and TXT files.
31. :commit:`c6c3ec31` The :ref:`attach<body-attach>` element now supports self-attachment (attaching elements of the
current model to itself) by omitting the :ref:`model<body-attach-model>` attribute. It also supports attaching a
frame via the new :ref:`frame<body-attach-frame>` attribute, which is mutually exclusive with
:ref:`body<body-attach-body>`.
32. :commit:`040872fd` Fixed loading of :ref:`.mjz <MJZArchives>` archives in :ref:`simulate<saSimulate>`: the archive
was unmounted before model compilation, so assets failed to load. Failures in the :ref:`mjz <MJZArchives>` decoder
now emit a warning with the underlying error instead of the generic "could not decode content" message.
33. :commit:`ebd4abae` The :ref:`mjz <MJZArchives>` decoder now searches for ``model.xml`` and ``<stem>/model.xml`` as a
fallback if ``<stem>.xml`` and ``<stem>/<stem>.xml`` are not found.
34. :commit:`dc7581ac` Added support for resource writing via :ref:`mju_writeResource` and the ``write`` callback in
:ref:`mjpResourceProvider`.
.. admonition:: Breaking API changes
:class: attention
- The return type of :ref:`mj_encode` and the :ref:`mjfEncode` callback changed from ``int`` to ``mjtSize``
(64-bit).
35. :commit:`d83ef0b6` The return type of :ref:`mj_encode` and the :ref:`mjfEncode` callback changed from ``int`` to
``mjtSize`` (64-bit).
.. admonition:: Bug fixes
:class: admonition
- Fixed a bug in the mesh compiler where normals were scaled as vectors rather than covectors.
36. :commit:`f5f9d9ef` Fixed a bug in the mesh compiler where normals were scaled as vectors rather than covectors.
Python bindings
^^^^^^^^^^^^^^^
- The bindings now support free threading (`PEP 703 <https://peps.python.org/pep-0703/>`__) for Python 3.14.
37. :commit:`a07ae6f8` The bindings now support free threading (`PEP 703 <https://peps.python.org/pep-0703/>`__) for
Python 3.14.
Documentation
^^^^^^^^^^^^^
- Expanded documentation for :ref:`spec.encode <meSaving>` workflows and added detailed documentation for the
:ref:`MJZ Archive <MJZArchives>` format (``.mjz`` / ``.zip``).
38. :commit:`1f1bfa9e` Expanded documentation for :ref:`spec.encode <meSaving>` workflows and added detailed
documentation for the :ref:`MJZ Archive <MJZArchives>` format (``.mjz`` / ``.zip``).
Version 3.10.0 (June 22, 2026)