Implementation:Google deepmind Mujoco Engine Core Smooth
| Knowledge Sources | |
|---|---|
| Domains | Physics Simulation, Forward Dynamics, Kinematics |
| Last Updated | 2026-02-15 04:00 GMT |
Overview
Implements the smooth (non-constraint) dynamics computations in MuJoCo, including forward kinematics, composite rigid body inertia, mass matrix factorization, recursive Newton-Euler, and tendon mechanics.
Description
This is MuJoCo's core smooth dynamics module, responsible for all computations that do not involve constraints. It includes forward kinematics in two stages (mj_kinematics1 for bodies, mj_kinematics2 for geoms/sites), center-of-mass computation (mj_comPos), camera and light positioning (mj_camlight), flex/soft-body deformation (mj_flex), tendon wrapping and length computation (mj_tendon), actuator transmission (mj_transmission), composite rigid body algorithm (mj_crb), mass matrix factorization via LDL decomposition (mj_factorM), forward/inverse mass matrix solves (mj_solveM, mj_solveM2), velocity computation (mj_comVel), subtree velocity (mj_subtreeVel), and recursive Newton-Euler for inverse dynamics (mj_rne). It also computes post-constraint forces (mj_rnePostConstraint).
Usage
These functions form the backbone of MuJoCo's forward dynamics pipeline. mj_kinematics is called first to compute positions, followed by mj_comPos, mj_tendon, mj_transmission, mj_crb, mj_factorM, and velocity-level computations. mj_rne is used in both forward and inverse dynamics.
Code Reference
Source Location
- Repository: Google_deepmind_Mujoco
- File: src/engine/engine_core_smooth.c
- Lines: 1-2738
Key Functions
// Forward kinematics
void mj_kinematics1(const mjModel* m, mjData* d); // bodies
void mj_kinematics2(const mjModel* m, mjData* d); // geoms, sites
void mj_kinematics(const mjModel* m, mjData* d); // combined
// Center of mass and camera/light
void mj_comPos(const mjModel* m, mjData* d);
void mj_camlight(const mjModel* m, mjData* d);
// Flex (soft body) computation
void mj_flex(const mjModel* m, mjData* d);
// Tendon mechanics
void mj_tendon(const mjModel* m, mjData* d);
void mj_tendonDot(const mjModel* m, mjData* d, int id, mjtNum* Jdot);
// Actuator transmission
void mj_transmission(const mjModel* m, mjData* d);
// Composite rigid body algorithm and mass matrix
void mj_crb(const mjModel* m, mjData* d);
void mj_makeM(const mjModel* m, mjData* d);
void mj_factorM(const mjModel* m, mjData* d);
void mj_factorI(mjtNum* mat, mjtNum* diaginv, int nv, ...);
// Mass matrix solve
void mj_solveM(const mjModel* m, mjData* d, mjtNum* x, const mjtNum* y, int n);
void mj_solveM2(const mjModel* m, mjData* d, mjtNum* x, const mjtNum* y, ...);
void mj_solveLD(mjtNum* restrict x, const mjtNum* qLD, const mjtNum* qLDiagInv,
int nv, int n, ...);
// Velocity computations
void mj_comVel(const mjModel* m, mjData* d);
void mj_subtreeVel(const mjModel* m, mjData* d);
// Recursive Newton-Euler
void mj_rne(const mjModel* m, mjData* d, int flg_acc, mjtNum* result);
void mj_rnePostConstraint(const mjModel* m, mjData* d);
Import
#include "engine/engine_core_smooth.h"
I/O Contract
Inputs
| Name | Type | Required | Description |
|---|---|---|---|
| m | const mjModel* | Yes | Physics model with kinematic tree, body/joint/tendon definitions |
| d | mjData* | Yes | Simulation state with qpos, qvel, and control inputs |
Outputs
| Name | Type | Description |
|---|---|---|
| d->xpos, d->xmat, d->xquat | mjtNum* | Body Cartesian positions, orientations |
| d->xipos, d->ximat | mjtNum* | Body center-of-mass positions and orientations |
| d->qM | mjtNum* | Inertia matrix (sparse) |
| d->qLD, d->qLDiagInv | mjtNum* | LDL factorization of the inertia matrix |
| d->ten_length, d->ten_moment | mjtNum* | Tendon lengths and moment arms |
| d->qfrc_bias | mjtNum* | Coriolis, centrifugal, and gravitational forces |