Implementation:Google deepmind Mujoco Engine Derivative FD
| Knowledge Sources | |
|---|---|
| Domains | Physics Simulation, Finite Differences, Optimal Control |
| Last Updated | 2026-02-15 04:00 GMT |
Overview
Implements finite-difference derivative computation for MuJoCo's forward dynamics, inverse dynamics, passive forces, and state transitions.
Description
This module provides finite-difference (FD) methods for computing derivatives when analytical derivatives are unavailable or as a validation tool. It supports forward, backward, and centered differencing schemes with automatic clamping to joint limits. Key functions include mjd_stepFD for computing the full forward dynamics Jacobian (state transition derivatives), mjd_transitionFD for transition derivatives including sensor outputs, mjd_inverseFD for inverse dynamics derivatives, and mjd_smooth_velFD and mjd_passive_velFD for finite-difference approximations of velocity derivatives. Internal helpers manage state save/restore, state differencing that correctly handles quaternion DOFs (stateDiff), and clamped differencing for boundary cases.
Usage
Used for computing dynamics derivatives when analytical derivatives are not available (e.g., for custom actuators or plugins), for validation of analytical derivatives, and as the primary derivative computation method for model-based control and system identification applications. mjd_transitionFD is the most commonly used function for reinforcement learning and trajectory optimization.
Code Reference
Source Location
- Repository: Google_deepmind_Mujoco
- File: src/engine/engine_derivative_fd.c
- Lines: 1-710
Key Functions
// Step forward dynamics with skip options
void mj_stepSkip(const mjModel* m, mjData* d, int skipstage, int skipsensor);
// Finite-difference passive force velocity derivatives
void mjd_passive_velFD(const mjModel* m, mjData* d, mjtNum eps);
// Finite-difference smooth dynamics velocity derivatives
void mjd_smooth_velFD(const mjModel* m, mjData* d, mjtNum eps);
// Finite-difference forward dynamics Jacobian (full state transition)
void mjd_stepFD(const mjModel* m, mjData* d, mjtNum eps, mjtByte flg_centered,
mjtNum* A, mjtNum* B, mjtNum* C, mjtNum* D);
// Finite-difference transition derivatives (with sensor output)
void mjd_transitionFD(const mjModel* m, mjData* d, mjtNum eps, mjtByte flg_centered,
mjtNum* A, mjtNum* B, mjtNum* C, mjtNum* D);
// Finite-difference inverse dynamics derivatives
void mjd_inverseFD(const mjModel* m, mjData* d, mjtNum eps, mjtByte flg_actuation,
mjtNum* DfDq, mjtNum* DfDv, mjtNum* DfDa,
mjtNum* DsDq, mjtNum* DsDv, mjtNum* DsDa,
mjtNum* DmDq);
Import
#include "engine/engine_derivative_fd.h"
I/O Contract
Inputs
| Name | Type | Required | Description |
|---|---|---|---|
| m | const mjModel* | Yes | Physics model |
| d | mjData* | Yes | Simulation state (modified and restored during FD) |
| eps | mjtNum | Yes | Finite-difference perturbation step size |
| flg_centered | mjtByte | Yes | Use centered (1) or forward (0) differencing |
Outputs
| Name | Type | Description |
|---|---|---|
| A | mjtNum* | State transition matrix dstate_next/dstate (2nv+na x 2nv+na) |
| B | mjtNum* | Control matrix dstate_next/dctrl (2nv+na x nu) |
| C | mjtNum* | Sensor state Jacobian dsensor/dstate (nsensordata x 2nv+na) |
| D | mjtNum* | Sensor control Jacobian dsensor/dctrl (nsensordata x nu) |