Drake
Drake C++ Documentation

Much of the problem data necessary to account for constraints in dynamical systems refers to particular Jacobian matrices.

These Jacobian matrices arise through the time derivatives of the constraint equations, e.g.:

ġₚ = ∂gₚ/∂q⋅q̇

where we assume that gₚ above is a function only of position (not time) for simplicity. The constraint solver currently operates on generalized velocities, requiring us to leverage the relationship:

q̇ = N(q)⋅v

using the left-invertible matrix N(q) between the time derivative of generalized coordinates and generalized velocities (see quasi_coordinates). This yields the requisite form:

ġₚ = ∂gₚ/∂q⋅N(q)⋅v

Fortunately, adding new constraints defined in the form gₚ(t,q) does not require considering this distinction using the operator paradigm (see, e.g., N_mult in ConstraintAccelProblemData and ConstraintVelProblemData). Since the Jacobians are described completely by the equation ġₚ = ∂gₚ/∂q⋅N(q)⋅v + ∂c/∂t, one can simply evaluate ġₚ - ∂g/∂t for a given v; no Jacobian matrix need be formed explicitly.