Jump to content

Connect SuperML | Leeroopedia MCP: Equip your AI agents with best practices, code verification, and debugging knowledge. Powered by Leeroo — building Organizational Superintelligence. Contact us at founders@leeroo.com.

Implementation:Google deepmind Mujoco Engine Passive

From Leeroopedia
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

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)

Related Pages

Page Connections

Double-click a node to navigate. Hold to expand connections.
Principle
Implementation
Heuristic
Environment