Chapter 13: Inertia Modeling and Parameterization

Lesson 5: CAD-to-Dynamics Pipelines (Concept + Lab)

This lesson explains how to convert mass properties from a CAD model into the inertial parameters and spatial inertia tensors required by analytical robot dynamics algorithms. We formalize the mapping from CAD outputs (mass, center of mass, inertia about arbitrary frames) to the link-level inertial parameter vectors and spatial inertia matrices used in Lagrange–Euler and Newton–Euler formulations, and implement the pipeline in Python, C++, Java, MATLAB/Simulink, and Wolfram Mathematica.

1. Role of CAD in Robot Dynamics Pipelines

Modern robot models are almost always designed first in a CAD system, which stores detailed geometric and material information for each link. From this, the CAD system can compute:

  • Link mass \( m \)
  • Center of mass (CoM) position \( \mathbf{c} \in \mathbb{R}^3 \)
  • Inertia tensor about a chosen reference point and frame

In contrast, the analytical dynamics model for an \(n\)-DOF manipulator derived in previous chapters requires, for each link, inertial parameters and a spatial inertia tensor consistent with the link frames used in the kinematic description. The joint-space dynamics equation is

\[ \mathbf{M}(\mathbf{q}) \ddot{\mathbf{q}} + \mathbf{C}(\mathbf{q},\dot{\mathbf{q}})\dot{\mathbf{q}} + \mathbf{g}(\mathbf{q}) = \boldsymbol{\tau}, \]

where all matrices and vectors depend on per-link inertial parameters introduced in Lessons 1–4 of this chapter.

Goal of this lesson. Define a mathematically precise and reproducible pipeline CAD → inertial parameters → spatial inertia → dynamics, and implement it in software.

2. CAD Mass Properties and the 10-Dimensional Parameter Vector

For each rigid link \(i\), CAD can provide (or we can compute):

  • Mass \( m_i > 0 \)
  • CoM position in some CAD frame \(C_i\): \( \mathbf{c}_i^C \in \mathbb{R}^3 \)
  • Inertia tensor about the CoM, expressed in the same frame: \( \mathbf{I}_{C_i}^{C_i} \in \mathbb{R}^{3\times 3} \)

Recall from Lesson 3 that the standard 10-parameter inertial vector for a link, referred to a chosen link frame \(L_i\), is

\[ \boldsymbol{\pi}_i^L = \begin{bmatrix} m_i \\ m_i c_{x,i}^L \\ m_i c_{y,i}^L \\ m_i c_{z,i}^L \\ I_{xx,i}^L \\ I_{yy,i}^L \\ I_{zz,i}^L \\ I_{xy,i}^L \\ I_{yz,i}^L \\ I_{xz,i}^L \end{bmatrix} \in \mathbb{R}^{10}, \]

where the CoM coordinates \( (c_{x,i}^L, c_{y,i}^L, c_{z,i}^L) \) and inertia components \( I_{\alpha\beta,i}^L \) are defined relative to the link frame \(L_i\) used in the kinematic chain (PoE or DH).

The CAD system rarely uses the same frame as \(L_i\). Therefore, we need to:

  1. Rotate the inertia tensor from CAD frame \(C_i\) to link frame \(L_i\)
  2. Apply a translation (parallel-axis theorem) to move from CoM to the link origin
  3. Collect the resulting components into the 10-parameter vector

3. Inertia Transformations Between Frames

Let \(C\) denote the CAD frame and \(L\) the link frame. Assume we know:

  • Rotation \( \mathbf{R}_{LC} \in \mathrm{SO}(3) \) from frame \(C\) to \(L\)
  • Position of the CoM relative to the link origin, expressed in \(L\): \( \mathbf{p} = \mathbf{c}^L \)

The inertia tensor about the CoM in frame \(L\) is

\[ \mathbf{I}_C^L = \mathbf{R}_{LC} \, \mathbf{I}_C^C \, \mathbf{R}_{LC}^\top. \]

To obtain the inertia about the link origin \(O_L\) (used, e.g., in URDF inertial tags), we apply the parallel-axis theorem:

\[ \mathbf{I}_O^L = \mathbf{I}_C^L + m \left( \|\mathbf{p}\|^2 \mathbf{I}_3 - \mathbf{p}\mathbf{p}^\top \right). \]

Using the skew-symmetric matrix \( [\mathbf{p}]_\times \) from Chapter 2, we can also write

\[ [\mathbf{p}]_\times = \begin{bmatrix} 0 & -p_z & p_y \\ p_z & 0 & -p_x \\ -p_y & p_x & 0 \end{bmatrix}, \qquad [\mathbf{p}]_\times[\mathbf{p}]_\times^\top = \mathbf{p}\mathbf{p}^\top - \|\mathbf{p}\|^2 \mathbf{I}_3. \]

This identity is useful in spatial vector formulations. Rewriting the parallel-axis theorem:

\[ \mathbf{I}_O^L = \mathbf{I}_C^L - m \, [\mathbf{p}]_\times[\mathbf{p}]_\times^\top. \]

Once \( \mathbf{I}_O^L \) is known, its entries populate the last six components of \( \boldsymbol{\pi}_i^L \), while \( m\mathbf{c}^L \) give the linear momentum-related parameters.

4. Spatial Inertia Matrix from CAD Parameters

Recall from Lesson 2 (Spatial Inertia Tensors) that the spatial inertia matrix of a rigid body in frame \(L\) is

\[ \mathbf{I}_s^L = \begin{bmatrix} \mathbf{I}_O^L + m [\mathbf{c}^L]_\times [\mathbf{c}^L]_\times^\top & m [\mathbf{c}^L]_\times \\ -m [\mathbf{c}^L]_\times & m \mathbf{I}_3 \end{bmatrix} \in \mathbb{R}^{6\times 6}, \]

where \( \mathbf{c}^L \) is the CoM in frame \(L\) and \( \mathbf{I}_O^L \) is the inertia about the link origin.

The spatial kinetic energy for a spatial velocity \( \mathbf{v}_s^L \in \mathbb{R}^6 \) is

\[ T = \tfrac{1}{2} (\mathbf{v}_s^L)^\top \mathbf{I}_s^L \mathbf{v}_s^L, \]

from which we can prove that \( \mathbf{I}_s^L \) is symmetric positive semidefinite:

  • Symmetry follows because both \( \mathbf{I}_O^L \) and \( [\mathbf{c}^L]_\times[\mathbf{c}^L]_\times^\top \) are symmetric, and the off-diagonal blocks are negatives of each other.
  • Positive semidefiniteness follows since \( T \ge 0 \) for all physical velocities.

Conclusion: From CAD, once we know \( m \), \( \mathbf{c}^L \), and \( \mathbf{I}_O^L \), we can construct \( \mathbf{I}_s^L \) directly, guaranteeing the physical consistency constraints discussed in Lesson 4.

5. CAD/URDF Inertial Tags and Parameter Mapping

A common route is to export a CAD assembly as a URDF file. For each link, the URDF <inertial> element typically contains:

  • <mass value="m"/>
  • <origin xyz="c_x c_y c_z" rpy="r p y"/>
  • <inertia ixx="..." ixy="..." ixz="..." iyy="..." iyz="..." izz="..."/>

By convention (and assuming default exporters):

  • xyz gives CoM coordinates \( \mathbf{c}^L \) in the link frame.
  • ixx, ixy, \dots\) define the inertia tensor \( \mathbf{I}_O^L \) about the link origin, expressed in the link frame.

Hence, given a URDF with consistent frames, the mapping to the 10-D inertial parameter vector is straightforward:

\[ \boldsymbol{\pi}^L = \begin{bmatrix} m \\ m c_x^L \\ m c_y^L \\ m c_z^L \\ I_{xx}^L \\ I_{yy}^L \\ I_{zz}^L \\ I_{xy}^L \\ I_{yz}^L \\ I_{xz}^L \end{bmatrix}. \]

When the CAD exporter provides inertia about the CoM instead of the origin, we must first apply the parallel-axis theorem to obtain \( \mathbf{I}_O^L \), as in Section 3.

6. Flow of a CAD-to-Dynamics Pipeline

The overall pipeline from CAD geometry to equations of motion can be summarized as follows.

flowchart TD
  A["CAD model (geometry, assemblies)"] --> B["Assign materials and densities"]
  B --> C["Compute per-link mass, com, inertia in CAD"]
  C --> D["Export mass properties or URDF/SDF"]
  D --> E["Parse model in Python/C++/Matlab"]
  E --> F["Build inertial parameters and spatial inertia tensors"]
  F --> G["Assemble multibody model and equations of motion M(q)ddq + C(q,dq)dq + g(q) = tau"]
  G --> H["Run validation: symmetry, positive definiteness, energy checks"]
        

Each of the following sections implements parts of nodes E, F, and G in different programming environments.

7. Python Lab — From CAD/URDF to Spatial Inertia

We now implement the core transformations in Python using numpy. We assume that the URDF exporter has provided CoM and inertia about the link origin in the link frame. For more complex cases, an additional rotation/translation step would be added before building the spatial inertia.


import numpy as np
from dataclasses import dataclass

@dataclass
class LinkInertialURDF:
    mass: float               # m > 0
    com: np.ndarray           # shape (3,), CoM in link frame
    I_origin: np.ndarray      # shape (3,3), inertia about link origin

def skew(v: np.ndarray) -> np.ndarray:
    """Return the 3x3 skew-symmetric matrix [v]_x."""
    vx, vy, vz = v
    return np.array([
        [0.0, -vz,  vy],
        [vz,  0.0, -vx],
        [-vy, vx,  0.0],
    ])

def spatial_inertia_from_urdf(link: LinkInertialURDF) -> np.ndarray:
    """
    Build 6x6 spatial inertia matrix from URDF-like inertial data.
    Assumes:
      - com is expressed in the same frame as I_origin.
      - I_origin is inertia about link origin, expressed in link frame.
    """
    m = link.mass
    c = link.com.reshape(3, 1)
    I_O = link.I_origin

    S = skew(c.flatten())
    upper_left = I_O + m * S @ S.T
    upper_right = m * S
    lower_left = -m * S
    lower_right = m * np.eye(3)

    I_spatial = np.block([
        [upper_left,  upper_right],
        [lower_left,  lower_right],
    ])
    return I_spatial

def inertial_parameters_10d(link: LinkInertialURDF) -> np.ndarray:
    """Return 10-dim inertial parameter vector [m, mc, I_components]^T."""
    m = link.mass
    cx, cy, cz = link.com
    I = link.I_origin
    pi = np.array([
        m,
        m * cx, m * cy, m * cz,
        I[0, 0], I[1, 1], I[2, 2],
        I[0, 1], I[1, 2], I[0, 2],
    ])
    return pi

# Example: simple numeric test
link = LinkInertialURDF(
    mass=5.0,
    com=np.array([0.1, 0.0, 0.0]),
    I_origin=np.array([
        [0.2, 0.0, 0.0],
        [0.0, 0.3, 0.0],
        [0.0, 0.0, 0.4],
    ])
)

I_spatial = spatial_inertia_from_urdf(link)
pi_10 = inertial_parameters_10d(link)

print("Spatial inertia:\n", I_spatial)
print("10D inertial parameters:\n", pi_10)

# Simple symmetry and positive-definiteness checks
sym_err = np.linalg.norm(I_spatial - I_spatial.T)
eigvals = np.linalg.eigvalsh(I_spatial)
print("Symmetry error:", sym_err)
print("Eigenvalues:", eigvals)
      

The eigenvalues of the spatial inertia must be nonnegative in a physically consistent model. Small negative values arise only from numerical round-off and indicate that the CAD-to-dynamics pipeline is correctly enforcing positive definiteness.

8. C++ Lab — Eigen-Based Spatial Inertia Construction

In C++, robotics libraries such as RBDL and Pinocchio use Eigen to represent spatial inertia. The following minimal example shows how to construct a 6x6 spatial inertia matrix from mass, CoM, and inertia about the origin.


#include <iostream>
#include <Eigen/Dense>

struct RigidBodyInertia {
    double mass;
    Eigen::Vector3d com;     // CoM in link frame
    Eigen::Matrix3d I_origin; // Inertia about link origin
};

inline Eigen::Matrix3d skew(const Eigen::Vector3d& v) {
    Eigen::Matrix3d S;
    S <<  0.0,   -v.z(),  v.y(),
           v.z(),  0.0,   -v.x(),
          -v.y(),  v.x(),  0.0;
    return S;
}

Eigen::Matrix<double,6,6> spatialInertia(const RigidBodyInertia& rb) {
    const double m = rb.mass;
    const Eigen::Matrix3d S = skew(rb.com);

    Eigen::Matrix<double,6,6> I = Eigen::Matrix<double,6,6>::Zero();
    I.block<3,3>(0,0) = rb.I_origin + m * S * S.transpose();
    I.block<3,3>(0,3) = m * S;
    I.block<3,3>(3,0) = -m * S;
    I.block<3,3>(3,3) = m * Eigen::Matrix3d::Identity();
    return I;
}

int main() {
    RigidBodyInertia link;
    link.mass = 5.0;
    link.com  = Eigen::Vector3d(0.1, 0.0, 0.0);
    link.I_origin <<
        0.2, 0.0, 0.0,
        0.0, 0.3, 0.0,
        0.0, 0.0, 0.4;

    Eigen::Matrix<double,6,6> Isp = spatialInertia(link);

    std::cout << "Spatial inertia:\n" << Isp << std::endl;
    return 0;
}
      

In a full robotics codebase, this function would be called for each link after parsing the URDF or a CAD export, and the resulting spatial inertias would be passed to the recursive Newton–Euler or articulated body algorithms described in Chapters 11 and 12.

9. Java Lab — Minimal Inertia Handling

Java is less common for low-level robot dynamics, but we can still implement the basic inertial parameter handling in a straightforward way using arrays. Below is a minimal class that stores a link's inertial parameters and provides a method to compute the 10-D parameter vector.


public final class LinkInertial {
    private final double mass;
    private final double[] com;  // length 3
    private final double[][] Iorigin; // 3x3 inertia about origin

    public LinkInertial(double mass, double[] com, double[][] Iorigin) {
        if (com.length != 3) {
            throw new IllegalArgumentException("com must have length 3");
        }
        if (Iorigin.length != 3 || Iorigin[0].length != 3) {
            throw new IllegalArgumentException("Iorigin must be 3x3");
        }
        this.mass = mass;
        this.com = com.clone();
        this.Iorigin = new double[3][3];
        for (int i = 0; i < 3; ++i) {
            System.arraycopy(Iorigin[i], 0, this.Iorigin[i], 0, 3);
        }
    }

    public double[] inertialParameters10d() {
        double[] pi = new double[10];
        pi[0] = mass;
        pi[1] = mass * com[0];
        pi[2] = mass * com[1];
        pi[3] = mass * com[2];
        pi[4] = Iorigin[0][0];      // Ixx
        pi[5] = Iorigin[1][1];      // Iyy
        pi[6] = Iorigin[2][2];      // Izz
        pi[7] = Iorigin[0][1];      // Ixy
        pi[8] = Iorigin[1][2];      // Iyz
        pi[9] = Iorigin[0][2];      // Ixz
        return pi;
    }
}
      

A higher-level Java robotics framework could read URDF XML, fill this structure, and then hand off the parameter vectors to dynamics routines or numerical optimization (e.g., for identification or simulation).

10. MATLAB/Simulink Lab — URDF Import and Dynamics Checks

MATLAB's Robotics System Toolbox can import URDF models directly into a rigidBodyTree object, which stores mass and inertia for each link and can compute the joint-space inertia matrix \( \mathbf{M}(\mathbf{q}) \).


% Import URDF exported from CAD
robot = importrobot("my_manipulator.urdf");

% Use joint-space data format for direct matrix computation
robot.DataFormat = "row";

% Inspect one link's inertial parameters
body = robot.Bodies{3};  % third link
inertial = body.Inertia; % [Ixx Iyy Izz Ixy Iyz Ixz]
mass = body.Mass;
com  = body.CenterOfMass; % [cx cy cz]

fprintf("Mass: %.3f\n", mass);
fprintf("CoM:  [%.3f %.3f %.3f]\n", com(1), com(2), com(3));
fprintf("Inertia (Ixx Iyy Izz Ixy Iyz Ixz):\n");
disp(inertial);

% Compute joint-space inertia at a configuration q
q = homeConfiguration(robot);
q_vec = [q.JointPosition];  % row vector
M = massMatrix(robot, q_vec);

% Basic checks: symmetry and positive definiteness
symErr = norm(M - M.');
eigM   = eig(M);

fprintf("M symmetry error: %.3e\n", symErr);
fprintf("Eigenvalues of M(q):\n");
disp(eigM);

% Simulink: use 'Rigid Body Tree' block to simulate dynamics
% - Set the 'Robot description' parameter to 'robot'
% - Connect joint torques and states to other Simulink blocks
      

In Simulink, the same rigidBodyTree can be used in a dedicated block to simulate dynamics under arbitrary torque inputs, providing a direct interface from CAD-based URDF to time-domain simulations.

11. Wolfram Mathematica Lab — Symbolic Inertia from CAD Parameters

Mathematica is convenient for symbolic manipulation of inertia parameters and for verifying physical consistency analytically. Suppose we have CAD-derived parameters \( m \), \( \mathbf{c} \), and \( \mathbf{I}_O \) (all possibly symbolic).


(* Mass and center of mass *)
m  = Symbol["m", Positive -> True];
cx = Symbol["cx"]; cy = Symbol["cy"]; cz = Symbol["cz"];
c  = {cx, cy, cz};

(* Inertia tensor about origin in link frame *)
Ixx = Symbol["Ixx"]; Iyy = Symbol["Iyy"]; Izz = Symbol["Izz"];
Ixy = Symbol["Ixy"]; Iyz = Symbol["Iyz"]; Ixz = Symbol["Ixz"];

Iorigin = {
  {Ixx, Ixy, Ixz},
  {Ixy, Iyy, Iyz},
  {Ixz, Iyz, Izz}
};

(* Skew-symmetric matrix of c *)
S[v_] := {
  {0, -v[[3]],  v[[2]]},
  {v[[3]], 0,  -v[[1]]},
  {-v[[2]], v[[1]], 0}
};

Scc = S[c];

(* Spatial inertia matrix (6x6) *)
Ispatial = ArrayFlatten[{
  {Iorigin + m Scc . Transpose[Scc], m Scc},
  {-m Scc, m IdentityMatrix[3]}
}];

(* Verify symmetry symbolically *)
Simplify[Transpose[Ispatial] - Ispatial]

(* Kinetic energy expression *)
vs = Array[Subscript[v, #] &, 6]; (* spatial velocity components *)
T  = 1/2 vs . Ispatial . vs;

(* Check that T is quadratic and nonnegative in vs when m > 0 and Iorigin is positive semidefinite *)
      

Symbolic checks of the kinetic energy and symmetry properties can be used to validate CAD export scripts or to derive minimal parameter sets (e.g., by eliminating dependent combinations of symbolic parameters).

12. Problems and Solutions

Problem 1 (Parallel-Axis Theorem from CAD Data). A uniform rectangular link has mass \( m \), dimensions \( a \) along \(x\), \( b \) along \(y\), \( c \) along \(z\). CAD provides inertia about the CoM in the principal axes: \[ I_{xx}^C = \tfrac{1}{12} m (b^2 + c^2),\quad I_{yy}^C = \tfrac{1}{12} m (a^2 + c^2),\quad I_{zz}^C = \tfrac{1}{12} m (a^2 + b^2). \] The CoM is at the geometric center. The link frame origin is at one corner of the box, axes aligned with the edges. Compute the inertia tensor about the link origin \(O_L\).

Solution. The vector from origin to CoM is

\[ \mathbf{p} = \begin{bmatrix} a/2 \\ b/2 \\ c/2 \end{bmatrix}. \]

Since the CoM principal axes coincide with the link axes, no rotation is needed, so \( \mathbf{I}_C^L = \mathbf{I}_C^C \). Applying the parallel-axis theorem:

\[ \mathbf{I}_O^L = \mathbf{I}_C^L + m \left( \|\mathbf{p}\|^2 \mathbf{I}_3 - \mathbf{p}\mathbf{p}^\top \right), \qquad \|\mathbf{p}\|^2 = \tfrac{1}{4}(a^2 + b^2 + c^2). \]

A straightforward computation gives

\[ \mathbf{I}_O^L = \begin{bmatrix} \tfrac{1}{3}m(b^2 + c^2) & -\tfrac{1}{4}m a b & -\tfrac{1}{4}m a c \\ -\tfrac{1}{4}m a b & \tfrac{1}{3}m(a^2 + c^2) & -\tfrac{1}{4}m b c \\ -\tfrac{1}{4}m a c & -\tfrac{1}{4}m b c & \tfrac{1}{3}m(a^2 + b^2) \end{bmatrix}. \]

This is the inertia tensor that must be placed in the URDF <inertia> tag if the link origin is at the corner.

Problem 2 (Symmetry and Positive Semidefiniteness of Spatial Inertia). Let \( \mathbf{I}_s^L \) be the spatial inertia matrix constructed from CAD parameters as in Section 4. Prove that it is symmetric and positive semidefinite if \( m > 0 \) and \( \mathbf{I}_O^L \) is symmetric positive semidefinite.

Solution.

  • Symmetry: write \[ \mathbf{I}_s^L = \begin{bmatrix} \mathbf{A} & \mathbf{B} \\ -\mathbf{B} & \mathbf{D} \end{bmatrix} \] with \( \mathbf{A} = \mathbf{I}_O^L + m[\mathbf{c}]_\times[\mathbf{c}]_\times^\top \), \( \mathbf{B} = m[\mathbf{c}]_\times \), \( \mathbf{D} = m\mathbf{I}_3 \). Since \( \mathbf{I}_O^L \) and \( [\mathbf{c}]_\times[\mathbf{c}]_\times^\top \) are symmetric, \( \mathbf{A}^\top = \mathbf{A} \). Also \( \mathbf{D}^\top = \mathbf{D} \) and \( \mathbf{B}^\top = -\mathbf{B} \), so \( (\mathbf{I}_s^L)^\top = \mathbf{I}_s^L \).
  • Positive semidefinite: for any spatial velocity \( \mathbf{v}_s^L = [\boldsymbol{\omega}^\top, \mathbf{v}^\top]^\top \), we have \[ T = \tfrac{1}{2}(\mathbf{v}_s^L)^\top \mathbf{I}_s^L \mathbf{v}_s^L \] equal to the physical kinetic energy of a rigid body, which is known to be nonnegative and to vanish only for zero velocity. Thus \( \mathbf{I}_s^L \) is positive semidefinite, and positive definite if the body has nonzero mass and inertia.

Problem 3 (Composite Inertia of Rigidly Attached Bodies). Two rigid sub-bodies A and B are rigidly attached and move as a single link. CAD provides \( m_A, \mathbf{c}_A, \mathbf{I}_{C_A}^A \) and \( m_B, \mathbf{c}_B, \mathbf{I}_{C_B}^B \), all expressed in the same link frame. Derive formulas for the composite mass \( m_{AB} \), CoM \( \mathbf{c}_{AB} \), and inertia about \( \mathbf{c}_{AB} \).

Solution.

  • Mass:

    \[ m_{AB} = m_A + m_B. \]

  • CoM (using the definition of center of mass):

    \[ \mathbf{c}_{AB} = \frac{m_A \mathbf{c}_A + m_B \mathbf{c}_B}{m_{AB}}. \]

  • Inertia about \( \mathbf{c}_{AB} \): first move each inertia tensor from its own CoM to \( \mathbf{c}_{AB} \) using the parallel-axis theorem, then sum:

    \[ \mathbf{I}_{AB}^{C_{AB}} = \mathbf{I}_A^{C_A} + m_A \left( \|\mathbf{c}_A - \mathbf{c}_{AB}\|^2 \mathbf{I}_3 - (\mathbf{c}_A - \mathbf{c}_{AB})(\mathbf{c}_A - \mathbf{c}_{AB})^\top \right) \]

    \[ \quad\quad + \mathbf{I}_B^{C_B} + m_B \left( \|\mathbf{c}_B - \mathbf{c}_{AB}\|^2 \mathbf{I}_3 - (\mathbf{c}_B - \mathbf{c}_{AB})(\mathbf{c}_B - \mathbf{c}_{AB})^\top \right). \]

These formulas are used internally when several CAD parts are welded into a single link in the dynamics model.

Problem 4 (Pipeline Validation Flow). Sketch a conceptual flow for validating a CAD-to-dynamics pipeline at the level of a single link and its contribution to \( \mathbf{M}(\mathbf{q}) \).

Solution (conceptual flow):

flowchart TD
  S["Start: CAD mass properties for link"] --> P1["Build 10-dim inertial parameters"]
  P1 --> P2["Construct spatial inertia Is"]
  P2 --> C1["Check symmetry(Is) and eigenvalues(Is)"]
  C1 --> M["Insert link into multibody model"]
  M --> C2["Compute M(q) at sample configurations"]
  C2 --> V["Check M(q) symmetry, positive definiteness, energy conservation in simulation"]
      

Problem 5 (Effect of Unit Inconsistencies). Suppose a CAD model uses millimeters for geometry but kilograms for mass, and the dynamics code assumes meters. Qualitatively describe the impact on \( \mathbf{M}(\mathbf{q}) \) and on simulated trajectories if the length scale is not converted.

Solution. If dimensions are in millimeters but treated as meters, all distances are scaled by \( 10^{-3} \), so inertia entries (which scale with length squared) are scaled by \( 10^{-6} \) relative to their correct values. The mass matrix \( \mathbf{M}(\mathbf{q}) \) becomes artificially small, causing simulated accelerations \( \ddot{\mathbf{q}} \) for a given torque \( \boldsymbol{\tau} \) to become unrealistically large. The resulting motion appears extremely "light" and fast compared to the physical system. This illustrates why consistent unit handling is a critical part of the CAD-to-dynamics pipeline.

13. Summary

In this lesson we connected CAD-based mass properties to the inertial parameters and spatial inertia tensors required by analytical robot dynamics. Starting from CAD outputs \( (m, \mathbf{c}, \mathbf{I}) \), we used rotations and the parallel-axis theorem to construct inertia tensors about the link origins, built the 10-dimensional inertial parameter vector, and assembled the 6x6 spatial inertia matrix used in recursive algorithms. We implemented these steps in Python, C++, Java, MATLAB/Simulink, and Wolfram Mathematica and emphasized validation checks (symmetry, positive definiteness, energy interpretation) that ensure physical consistency. These CAD-to-dynamics pipelines are the foundation for identification (Chapter 19) and for model-based control based on the equations of motion.

14. References

  1. Featherstone, R. (1983). The calculation of robot dynamics using articulated-body inertias. International Journal of Robotics Research, 2(1), 13–30.
  2. Orin, D. E., & Schrader, W. W. (1984). Efficient computation of the Jacobian for robot manipulators. International Journal of Robotics Research, 3(4), 66–75.
  3. Gautier, M. (1990). Numerical calculation of the base inertial parameters of robots. Journal of Robotic Systems, 8(4), 485–506.
  4. Khalil, W., & Dombre, E. (1992). General approach to the dynamic modeling of robots. Journal of Intelligent and Robotic Systems, 5(3), 187–202.
  5. Armstrong, B., Khatib, O., & Burdick, J. (1986). The explicit dynamic model and inertial parameters of the PUMA 560 arm. IEEE International Conference on Robotics and Automation, 510–518.
  6. Khosla, P., & Kanade, T. (1985). Parameter identification of robot dynamics. IEEE Conference on Decision and Control, 1754–1760.
  7. Gautier, M., & Khalil, W. (1992). Exciting trajectories for the identification of base inertial parameters of robots. International Journal of Robotics Research, 11(4), 362–375.
  8. Featherstone, R., & Orin, D. (2000). Robot dynamics: Equations and algorithms. IEEE International Conference on Robotics and Automation, 826–834.
  9. Donald, B. R., & Pai, D. K. (1990). On the computation of manipulator inertia matrices and their inverses. International Journal of Robotics Research, 9(3), 113–127.
  10. Abhinav, S., & Saha, S. K. (2011). Identification of dynamic parameters of robots from CAD models. Mechanism and Machine Theory, 46(2), 310–326.