Implementation:Google deepmind Mujoco Engine Passive
| Knowledge Sources | |
|---|---|
| Domains | Physics Simulation, Passive Forces, Fluid Dynamics |
| Last Updated | 2026-02-15 04:00 GMT |
Overview
Computes all passive forces in the simulation including springs, dampers, gravity compensation, fluid interactions, and flexible body mechanics.
Description
engine_passive.c implements the computation of passive (non-actuated) forces for the MuJoCo physics engine. This includes spring and damper forces for joints and tendons, gravity compensation forces, fluid interaction models (both inertia-box and ellipsoid fluid models), flexible body (flex) mechanics with edge-based deformation gradients, and passive contact forces. The file also provides interpolation of flex element states (positions, velocities, orientations) and two distinct viscous fluid models: a simplified inertia-box model and a more detailed ellipsoid model that accounts for added mass, viscous drag, and Magnus lift effects.
Usage
Invoked during the forward dynamics pipeline via mj_passive(), which accumulates all passive force contributions into d->qfrc_passive. Individual force models can be disabled via the model's disable flags (e.g., mjDSBL_SPRING, mjDSBL_DAMPER, mjDSBL_GRAVITY).
Code Reference
Source Location
- Repository: Google_deepmind_Mujoco
- File: src/engine/engine_passive.c
- Lines: 1-1049
Key Functions
// main passive force computation
void mj_passive(const mjModel* m, mjData* d);
// compute interpolated flex state: xpos, vel, quat
void mj_flexInterpState(const mjModel* m, mjData* d, int f,
mjtNum* xpos, mjtNum* vel, mjtNum* quat);
// passive contact forces
int mj_contactPassive(const mjModel* m, mjData* d);
// spring and damper forces
static void mj_springdamper(const mjModel* m, mjData* d);
// gravity compensation
static int mj_gravcomp(const mjModel* m, mjData* d);
// fluid interaction forces
static int mj_fluid(const mjModel* m, mjData* d);
// simplified inertia-box fluid model
void mj_inertiaBoxFluidModel(const mjModel* m, mjData* d, int i);
// detailed ellipsoid fluid model
void mj_ellipsoidFluidModel(const mjModel* m, mjData* d, int bodyid);
// added mass forces for fluid interaction
void mj_addedMassForces(const mjtNum local_vels[6], const mjtNum local_accels[6],
const mjtNum fluid_density, const mjtNum size[3],
mjtNum local_force[6]);
// viscous drag and lift forces
void mj_viscousForces(const mjtNum local_vels[6], const mjtNum fluid_density,
const mjtNum fluid_viscosity, const mjtNum size[3],
const mjtNum magnus_lift_coef, const mjtNum kutta_lift_coef,
const mjtNum blunt_drag_coef, const mjtNum slender_drag_coef,
const mjtNum ang_drag_coef, mjtNum local_force[6]);
Import
#include "engine/engine_passive.h"
I/O Contract
Inputs
| Name | Type | Required | Description |
|---|---|---|---|
| m | const mjModel* | Yes | Physics model with passive force parameters |
| d | mjData* | Yes | Simulation state (positions, velocities) |
| f | int | Yes (flexInterp) | Flex element index |
| i / bodyid | int | Yes (fluid) | Body index for fluid computation |
Outputs
| Name | Type | Description |
|---|---|---|
| d->qfrc_passive | mjtNum* | Accumulated passive forces in joint space |
| xpos | mjtNum* | Interpolated flex node positions (flexInterpState) |
| vel | mjtNum* | Interpolated flex node velocities (flexInterpState) |
| quat | mjtNum* | Flex element rotation quaternion (flexInterpState) |