Dynamics Notation Glossary

July 4, 2026 · View on GitHub

Attribution: This glossary maps notation from "A Quick Tutorial on Multibody Dynamics" by C. Karen Liu and Sumit Jain to DART's C++ API. The original PDF is preserved at docs/dynamics.pdf.

Navigation: ← Recursive Inverse Dynamics | Index


Core Quantities

State Variables

PDF SymbolDescriptionDART APIReturn Type
qqGeneralized positionsSkeleton::getPositions()Eigen::VectorXd
q˙\dot{q}Generalized velocitiesSkeleton::getVelocities()Eigen::VectorXd
q¨\ddot{q}Generalized accelerationsSkeleton::getAccelerations()Eigen::VectorXd
τ\tau or QQGeneralized forcesSkeleton::getForces()Eigen::VectorXd
nnNumber of DOFsSkeleton::getNumDofs()std::size_t

Dynamics Matrices

PDF SymbolDescriptionDART APIReturn Type
M(q)M(q)Mass matrixSkeleton::getMassMatrix()Eigen::MatrixXd
M1(q)M^{-1}(q)Inverse mass matrixSkeleton::getInvMassMatrix()Eigen::MatrixXd
MaugM_{aug}Augmented mass matrixSkeleton::getAugMassMatrix()Eigen::MatrixXd
C(q,q˙)C(q,\dot{q})Coriolis/centrifugal forcesSkeleton::getCoriolisForces()Eigen::VectorXd
g(q)g(q) or N(q)N(q)Gravity forcesSkeleton::getGravityForces()Eigen::VectorXd
C+gC + gCombined bias forcesSkeleton::getCoriolisAndGravityForces()Eigen::VectorXd
FkF_kConstraint forcesSkeleton::getConstraintForces()Eigen::VectorXd

Equation of Motion

The standard form in the PDF:

M(q)q¨+C(q,q˙)=QM(q)\ddot{q} + C(q,\dot{q}) = Q

In DART (with gravity and external forces):

M(q)q¨+C(q,q˙)+g(q)=τ+τext+JTλM(q)\ddot{q} + C(q,\dot{q}) + g(q) = \tau + \tau_{ext} + J^T \lambda

Per-Body Quantities

Rigid Body Properties

PDF SymbolDescriptionDART APINotes
mmMassBodyNode::getMass()Scalar
IcI_cInertia tensor (COM)BodyNode::getInertia()3×3 matrix
I0I_0Inertia at zero rotationInternalIc=RI0RTI_c = R I_0 R^T
xxCOM position (world)BodyNode::getCOM()Eigen::Vector3d
RRRotation matrixBodyNode::getTransform().rotation()Eigen::Matrix3d
vvLinear velocity (world)BodyNode::getCOMLinearVelocity()Eigen::Vector3d
ω\omegaAngular velocity (world)BodyNode::getAngularVelocity()Eigen::Vector3d
McM_cSpatial inertiaBodyNode::getSpatialInertia()6×6 matrix
VVSpatial velocityBodyNode::getSpatialVelocity()Eigen::Vector6d

Jacobians

PDF SymbolDescriptionDART APISize
JkJ_kBody JacobianBodyNode::getJacobian()6×n
JvkJ_{vk}Linear JacobianBodyNode::getLinearJacobian()3×n
JωkJ_{\omega k}Angular JacobianBodyNode::getAngularJacobian()3×n
JJ'Jacobian at pointBodyNode::getWorldJacobian(offset)6×n
J^ωk\hat{J}_{\omega k}Local angular JacobianInternal3×n(k)

Matrix Notation

Skew-Symmetric Matrix

The PDF uses [a][a] to denote the skew-symmetric matrix of vector aa:

[a]=[0a3a2a30a1a2a10][a] = \begin{bmatrix} 0 & -a_3 & a_2 \\ a_3 & 0 & -a_1 \\ -a_2 & a_1 & 0 \end{bmatrix}

In DART: dart::math::makeSkewSymmetric(a) or cross product operations.

Key Identities

IdentityMeaning
[a]b=a×b[a]b = a \times bCross product
[a]b=[b]a[a]b = -[b]aAnti-commutativity
[a]T=[a][a]^T = -[a]Skew-symmetric property
[a][a]=(aTa)I3aaT-[a][a] = (a^T a)I_3 - aa^TUseful for inertia
[a×b]=[a][b][b][a][a \times b] = [a][b] - [b][a]Jacobi identity
[Rω]=R[ω]RT[R\omega] = R[\omega]R^TRotation transformation
[ω]=R˙RT[\omega] = \dot{R}R^TAngular velocity from rotation

Coordinate Frames

PDF NotationDescription
World frameGlobal inertial frame
Rk0R_k^0Rotation from world to link k
Wk0W_k^0Homogeneous transform to link k
^\ell superscriptLocal frame of link k
ω^k\hat{\omega}_kAngular velocity in parent's frame

Tree Structure Notation

SymbolDescriptionExample
p(k)p(k)Parent link indexp(4)=2p(4) = 2
p(1,k)p(1,k)Path from root to kp(1,4)={1,2,4}p(1,4) = \{1,2,4\}
c(k)c(k)Child link indicesUsed in RNEA
n(k)n(k)DOFs in joint k1 for revolute, 3 for ball
dkd_kJoint-to-joint vectorPosition offset
ckc_kCOM in local frameConstant

Algorithm Names

PDF NameDART ImplementationComplexity
Forward DynamicscomputeForwardDynamics()O(n)O(n) via ABA
Inverse DynamicscomputeInverseDynamics()O(n)O(n) via RNEA
Mass MatrixgetMassMatrix()O(n2)O(n^2)
RNEARecursive Newton-EulerO(n)O(n)
ABAArticulated Body AlgorithmO(n)O(n)

Python (dartpy) Equivalents

import dartpy as dart

# State
q = skeleton.getPositions()      # numpy array
qdot = skeleton.getVelocities()
qddot = skeleton.getAccelerations()
tau = skeleton.getForces()

# Dynamics matrices
M = skeleton.getMassMatrix()     # numpy 2D array
C = skeleton.getCoriolisForces()
g = skeleton.getGravityForces()

# Per-body
for body in skeleton.getBodyNodes():
    mass = body.getMass()
    com = body.getCOM()
    J = body.getJacobian()

Units Convention

DART uses SI units:

QuantityUnit
Lengthmeters (m)
Masskilograms (kg)
Timeseconds (s)
ForceNewtons (N)
TorqueNewton-meters (N·m)
Angleradians (rad)

See Also


Navigation: ← Recursive Inverse Dynamics | Index