Add documentation for MJX API

PiperOrigin-RevId: 860108133
Change-Id: I85469efcfe49d320ef8b89c9d174f33499a22b31
This commit is contained in:
Taylor Howell
2026-01-23 07:52:27 -08:00
committed by Copybara-Service
parent c55c9a7bf1
commit 4a64017a5f
7 changed files with 204 additions and 24 deletions
+1
View File
@@ -18,6 +18,7 @@ build:
- asdf global uv latest
- uv venv $READTHEDOCS_VIRTUALENV_PATH
- UV_PROJECT_ENVIRONMENT=$READTHEDOCS_VIRTUALENV_PATH uv pip install -r doc/requirements.txt
- UV_PROJECT_ENVIRONMENT=$READTHEDOCS_VIRTUALENV_PATH uv pip install mujoco mujoco-mjx
# replace mujoco.mjx.third_party.mujoco_warp import paths with mujoco_warp
- |
find mjx/mujoco/mjx/third_party/mujoco_warp -type f -exec sed -i 's/mujoco\.mjx\.third_party\.mujoco_warp/mujoco_warp/g' {} \;
+27
View File
@@ -78,6 +78,33 @@ add_module_names = False
toc_object_entries_show_parents = 'hide'
default_role = 'literal'
# Suppress warnings from docstrings with RST formatting issues
def setup(app):
import logging
class SphinxWarningFilter(logging.Filter):
def filter(self, record):
msg = record.getMessage()
# e.g. qpos0: qpos values at default pose (*, nq)
if 'Inline emphasis start-string' in msg:
return False
# e.g. see `name` for details
if 'Inline interpreted text' in msg:
return False
# e.g. multi-line definition without trailing blank line
if 'Definition list ends without a blank line' in msg:
return False
# e.g. mjsactuator_ reference in C++ docstrings
if 'Unknown target name' in msg:
return False
return True
for handler in logging.getLogger('sphinx').handlers:
handler.addFilter(SphinxWarningFilter())
# GitHub-related options
github_username = 'google-deepmind'
github_repository = 'mujoco'
+5
View File
@@ -4,6 +4,11 @@
MuJoCo XLA (MJX)
================
.. toctree::
:hidden:
API <mjx_api.rst>
Starting with version 3.0.0, MuJoCo includes MuJoCo XLA (MJX) under the
`mjx <https://github.com/google-deepmind/mujoco/tree/main/mjx>`__ directory. MJX allows MuJoCo to run on compute
hardware supported by the `XLA <https://www.tensorflow.org/xla>`__ compiler via the
+44
View File
@@ -0,0 +1,44 @@
MJX API
=======
.. automodule:: mujoco.mjx
:members:
:imported-members:
:special-members: False
:private-members: False
:exclude-members:
__init__,
__format__,
__new__,
__eq__,
__hash__,
__repr__,
__weakref__,
__or__,
__and__,
__xor__,
__ror__,
__rand__,
__rxor__,
__invert__,
__delattr__,
__setattr__,
__getattr__,
__getattribute__,
__reduce__,
__reduce_ex__,
__sizeof__,
__str__,
__module__,
__doc__,
__dict__,
__class__,
__le__,
__lt__,
__ge__,
__gt__,
__ne__,
__bool__,
__init_subclass__,
replace,
+6 -1
View File
@@ -14,6 +14,12 @@
# ==============================================================================
"""Public API for MJX."""
# isort: off
from mujoco.mjx._src.forward import step
from mujoco.mjx._src.types import Model
from mujoco.mjx._src.types import Data
# isort: on
# pylint:disable=g-importing-member
from mujoco.mjx._src.collision_driver import collision
from mujoco.mjx._src.constraint import make_constraint
@@ -26,7 +32,6 @@ from mujoco.mjx._src.forward import fwd_position
from mujoco.mjx._src.forward import fwd_velocity
from mujoco.mjx._src.forward import implicit
from mujoco.mjx._src.forward import rungekutta4
from mujoco.mjx._src.forward import step
from mujoco.mjx._src.inverse import inverse
from mujoco.mjx._src.io import get_data
from mujoco.mjx._src.io import get_data_into
+2 -2
View File
@@ -251,8 +251,8 @@ def ray(
bodyexclude: ignore geoms on specified body id or sequence of body ids
Returns:
dist: distance from ray origin to geom surface (or -1.0 for no intersection)
id: id of intersected geom (or -1 for no intersection)
Distance from ray origin to geom surface (or -1.0 for no intersection) and
id of intersected geom (or -1 for no intersection)
"""
dists, ids = [], []
+119 -21
View File
@@ -49,7 +49,7 @@ class Impl(enum.Enum):
class DisableBit(enum.IntFlag):
"""Disable default feature bitflags.
Members:
Attributes:
CONSTRAINT: entire constraint solver
EQUALITY: equality constraints
FRICTIONLOSS: joint and tendon frictionloss constraints
@@ -86,7 +86,7 @@ class DisableBit(enum.IntFlag):
class EnableBit(enum.IntFlag):
"""Enable optional feature bitflags.
Members:
Attributes:
INVDISCRETE: discrete-time inverse dynamics
"""
@@ -100,7 +100,7 @@ class EnableBit(enum.IntFlag):
class JointType(enum.IntEnum):
"""Type of degree of freedom.
Members:
Attributes:
FREE: global position and orientation (quat) (7,)
BALL: orientation (quat) relative to parent (4,)
SLIDE: sliding distance along body-fixed axis (1,)
@@ -122,7 +122,7 @@ class JointType(enum.IntEnum):
class IntegratorType(enum.IntEnum):
"""Integrator mode.
Members:
Attributes:
EULER: semi-implicit Euler
RK4: 4th-order Runge Kutta
IMPLICITFAST: implicit in velocity, no rne derivative
@@ -137,7 +137,7 @@ class IntegratorType(enum.IntEnum):
class GeomType(enum.IntEnum):
"""Type of geometry.
Members:
Attributes:
PLANE: plane
HFIELD: height field
SPHERE: sphere
@@ -163,7 +163,7 @@ class GeomType(enum.IntEnum):
class ConvexMesh(PyTreeNode):
"""Geom properties for convex meshes.
Members:
Attributes:
vert: vertices of the convex mesh
face: faces of the convex mesh
face_normal: normal vectors for the faces
@@ -181,7 +181,7 @@ class ConvexMesh(PyTreeNode):
class ConeType(enum.IntEnum):
"""Type of friction cone.
Members:
Attributes:
PYRAMIDAL: pyramidal
ELLIPTIC: elliptic
"""
@@ -193,7 +193,7 @@ class ConeType(enum.IntEnum):
class JacobianType(enum.IntEnum):
"""Type of constraint Jacobian.
Members:
Attributes:
DENSE: dense
SPARSE: sparse
AUTO: sparse if nv>60 and device is TPU, dense otherwise
@@ -207,7 +207,7 @@ class JacobianType(enum.IntEnum):
class SolverType(enum.IntEnum):
"""Constraint solver algorithm.
Members:
Attributes:
CG: Conjugate gradient (primal)
NEWTON: Newton (primal)
"""
@@ -220,7 +220,7 @@ class SolverType(enum.IntEnum):
class EqType(enum.IntEnum):
"""Type of equality constraint.
Members:
Attributes:
CONNECT: connect two bodies at a point (ball joint)
WELD: fix relative position and orientation of two bodies
JOINT: couple the values of two scalar joints with cubic
@@ -237,7 +237,7 @@ class EqType(enum.IntEnum):
class WrapType(enum.IntEnum):
"""Type of tendon wrap object.
Members:
Attributes:
JOINT: constant moment arm
PULLEY: pulley used to split tendon
SITE: pass through site
@@ -255,7 +255,7 @@ class WrapType(enum.IntEnum):
class TrnType(enum.IntEnum):
"""Type of actuator transmission.
Members:
Attributes:
JOINT: force on joint
JOINTINPARENT: force on joint, expressed in parent frame
TENDON: force on tendon
@@ -272,7 +272,7 @@ class TrnType(enum.IntEnum):
class DynType(enum.IntEnum):
"""Type of actuator dynamics.
Members:
Attributes:
NONE: no internal dynamics; ctrl specifies force
INTEGRATOR: integrator: da/dt = u
FILTER: linear filter: da/dt = (u-a) / tau
@@ -291,7 +291,7 @@ class DynType(enum.IntEnum):
class GainType(enum.IntEnum):
"""Type of actuator gain.
Members:
Attributes:
FIXED: fixed gain
AFFINE: const + kp*length + kv*velocity
MUSCLE: muscle FLV curve computed by muscle_gain
@@ -306,7 +306,7 @@ class GainType(enum.IntEnum):
class BiasType(enum.IntEnum):
"""Type of actuator bias.
Members:
Attributes:
NONE: no bias
AFFINE: const + kp*length + kv*velocity
MUSCLE: muscle passive force computed by muscle_bias
@@ -321,7 +321,7 @@ class BiasType(enum.IntEnum):
class ConstraintType(enum.IntEnum):
"""Type of constraint.
Members:
Attributes:
EQUALITY: equality constraint
LIMIT_JOINT: joint limit
LIMIT_TENDON: tendon limit
@@ -342,7 +342,7 @@ class ConstraintType(enum.IntEnum):
class CamLightType(enum.IntEnum):
"""Type of camera light.
Members:
Attributes:
FIXED: pos and rot fixed in body
TRACK: pos tracks body, rot fixed in global
TRACKCOM: pos tracks subtree com, rot fixed in body
@@ -360,7 +360,7 @@ class CamLightType(enum.IntEnum):
class SensorType(enum.IntEnum):
"""Type of sensor.
Members:
Attributes:
MAGNETOMETER: magnetometer
CAMPROJECTION: camera projection
RANGEFINDER: rangefinder
@@ -436,7 +436,7 @@ class SensorType(enum.IntEnum):
class ObjType(PyTreeNode):
"""Type of object.
Members:
Attributes:
UNKNOWN: unknown object type
BODY: body
XBODY: body, used to access regular frame instead of i-frame
@@ -673,7 +673,57 @@ class ModelJAX(PyTreeNode):
class Model(PyTreeNode):
"""Static model of the scene that remains unchanged with each physics step."""
"""Static model of the scene that remains unchanged with each physics step.
Attributes:
nq: number of generalized coordinates
nv: number of degrees of freedom
nu: number of actuators/controls
na: number of activation states
nbody: number of bodies
njnt: number of joints
ngeom: number of geoms
nsite: number of sites
ncam: number of cameras
nlight: number of lights
nmesh: number of meshes
nmeshvert: number of vertices for all meshes
nmeshnormal: number of normals in all meshes
nmeshtexcoord: number of texcoords in all meshes
nmeshface: number of faces for all meshes
nmeshgraph: number of ints in mesh auxiliary data
nmeshpoly: number of polygons in all meshes
nmeshpolyvert: number of vertices in all polygons
nmeshpolymap: number of polygons in vertex map
nhfield: number of heightfields
nhfielddata: size of elevation data
ntex: number of textures
ntexdata: size of texture data
nmat: number of materials
npair: number of predefined geom pairs
nexclude: number of excluded geom pairs
neq: number of equality constraints
ntendon: number of tendons
nwrap: number of wrap objects in all tendon paths
nsensor: number of sensors
nnumeric: number of numeric custom fields
ntuple: number of tuple custom fields
nkey: number of keyframes
nmocap: number of mocap bodies
nM: number of non-zeros in sparse inertia matrix
nB: number of non-zeros in B matrix
nC: number of non-zeros in C matrix
nD: number of non-zeros in D matrix
nJmom: number of non-zeros in Jacobian momentum matrix
ngravcomp: number of bodies with nonzero gravcomp
nuserdata: number of elements in userdata
nsensordata: number of elements in sensor data vector
npluginstate: number of plugin state values
opt: physics options
stat: model statistics
qpos0: qpos values at default pose
qpos_spring: reference pose for springs
"""
nq: int
nv: int
@@ -1149,7 +1199,55 @@ class DataJAX(PyTreeNode):
class Data(PyTreeNode):
"""Dynamic state that updates each step."""
"""Dynamic state that updates each step.
Attributes:
time: simulation time
qpos: position
qvel: velocity
act: actuator activation
qacc_warmstart: warm start for solver
plugin_state: plugin state values
ctrl: control input
qfrc_applied: applied generalized force
xfrc_applied: applied Cartesian force/torque
eq_active: enable/disable equality constraints
mocap_pos: positions of mocap bodies
mocap_quat: orientations of mocap bodies
qacc: acceleration
act_dot: time-derivative of actuator activation
userdata: user data
sensordata: sensor data output
xpos: Cartesian position of body frame
xquat: Cartesian orientation of body frame
xmat: rotation matrix of body frame
xipos: Cartesian position of body com
ximat: rotation matrix of body inertia
xanchor: Cartesian position of joint anchor
xaxis: Cartesian joint axis
ten_length: tendon lengths
geom_xpos: Cartesian position of geoms
geom_xmat: rotation matrix of geoms
site_xpos: Cartesian position of sites
site_xmat: rotation matrix of sites
cam_xpos: camera positions
cam_xmat: camera rotation matrices
subtree_com: com of each subtree
cvel: center of mass based velocity
cdof: center of mass based jacobian
cdof_dot: time-derivative of cdof
qfrc_bias: C(qpos,qvel)
qfrc_gravcomp: gravity compensation term
qfrc_fluid: fluid drag and buoyancy forces
qfrc_passive: passive force
qfrc_actuator: actuator force
actuator_force: actuator force in actuation space
actuator_length: actuator lengths
qfrc_smooth: smooth dynamics force
qacc_smooth: acceleration without constraints
qfrc_constraint: constraint force
qfrc_inverse: net external force for inverse dynamics
"""
# global properties:
time: jax.Array