Chapter 14: Non-Ideal Effects in Dynamics

Lesson 1: Joint Friction Models (Coulomb, viscous, Stribeck)

This lesson develops mathematical models of joint friction in robotic manipulators, starting from ideal rigid-body dynamics and augmenting them with Coulomb, viscous, and Stribeck-type nonlinear friction. We emphasize analytical structure, energy dissipation properties, and implementation in simulation code, setting the foundation for later use in identification and control.

1. Conceptual Overview of Joint Friction

In ideal manipulator dynamics, joint torques and generalized coordinates satisfy \( \mathbf{M}(q)\ddot{q} + \mathbf{C}(q,\dot{q})\dot{q} + \mathbf{g}(q) = \tau \), where \( \mathbf{M}(q) \) is the inertia matrix, \( \mathbf{C}(q,\dot{q}) \) the Coriolis/centrifugal matrix, and \( \mathbf{g}(q) \) the gravity vector. Real joints are never ideal: they exhibit friction due to contact in bearings, seals, gearboxes, and lubrication regimes.

We treat joint friction as an additional generalized torque \( \tau_{\text{fric}}(q,\dot{q}) \), so that the dynamics become

\[ \mathbf{M}(q)\ddot{q} + \mathbf{C}(q,\dot{q})\dot{q} + \mathbf{g}(q) + \tau_{\text{fric}}(q,\dot{q}) = \tau_{\text{act}}. \]

For most industrial manipulators, friction is primarily a function of joint velocity \( \dot{q} \) and can be decomposed into:

  • Coulomb friction: approximately constant magnitude, opposite to motion.
  • Viscous friction: torque proportional to velocity.
  • Stribeck effect: velocity-dependent decrease from static friction to Coulomb friction at low speeds, typically modeled with nonlinear functions of \( |\dot{q}| \).

The modeling philosophy is summarized below.

flowchart TD
  A["Ideal joint model (no friction)"] --> B["Add friction torque tau_fric(qdot)"]
  B --> C["Choose model: Coulomb / viscous / Stribeck"]
  C --> D["Identify parameters from experiments"]
  D --> E["Simulate/manipulator dynamics with friction"]
  E --> F["Validate vs. measured joint motion"]
        

In this lesson, we focus purely on modeling and properties of these friction terms; their use in control design is postponed to later control-oriented courses.

2. Coulomb Friction Model

Coulomb (dry) friction arises from microscopic asperity contact between solid surfaces, and is often modeled as a constant-magnitude torque opposing motion. For a single revolute joint with velocity \( \dot{q} \), the Coulomb torque is

\[ \tau_{\text{C}}(\dot{q}) = \begin{cases} -F_{\text{C}} & \text{if } \dot{q} > 0, \\ +F_{\text{C}} & \text{if } \dot{q} < 0, \\ \in[-F_{\text{C}}, F_{\text{C}}] & \text{if } \dot{q} = 0, \end{cases} \]

where \( F_{\text{C}} > 0 \) is the Coulomb friction level. To avoid multi-valued behavior at \( \dot{q} = 0 \), one often uses the signum approximation

\[ \tau_{\text{C}}(\dot{q}) \approx F_{\text{C}} \, \operatorname{sgn}(\dot{q}), \quad \operatorname{sgn}(\dot{q}) = \begin{cases} +1 & \text{if } \dot{q} > 0, \\ -1 & \text{if } \dot{q} < 0, \\ 0 & \text{if } \dot{q} = 0. \end{cases} \]

For an \( n \)-DOF robot, define \( \dot{q} = [\dot{q}_1,\dots,\dot{q}_n]^\top \), and parameter vector \( F_{\text{C}} = [F_{\text{C},1},\dots,F_{\text{C},n}]^\top \). A diagonal Coulomb model reads

\[ \tau_{\text{C}}(\dot{q}) = \operatorname{diag}(F_{\text{C}}) \, \operatorname{sgn}(\dot{q}), \]

where \( \operatorname{sgn}(\dot{q}) \) acts elementwise. More general couplings (e.g., through gear trains) can be represented by a full matrix, but diagonal models are standard in joint space.

In analysis, the non-differentiability of \( \operatorname{sgn}(\cdot) \) at zero is inconvenient; smooth approximations are commonly used:

\[ \operatorname{sgn}_\epsilon(\dot{q}) = \tanh\!\left(\frac{\dot{q}}{\epsilon}\right), \quad \epsilon > 0, \]

yielding a smooth Coulomb friction torque that approaches the ideal model as \( \epsilon \to 0^{+} \).

3. Viscous Friction Model

Viscous friction models shear forces in lubricant films or damping in flexible couplings, and is proportional to joint velocity. For a single joint,

\[ \tau_{\text{V}}(\dot{q}) = b \, \dot{q}, \quad b \ge 0, \]

where \( b \) is the viscous friction coefficient. In vector form,

\[ \tau_{\text{V}}(\dot{q}) = \mathbf{B}\,\dot{q}, \quad \mathbf{B} = \operatorname{diag}(b_1,\dots,b_n). \]

Energy dissipation property. Consider a single joint with inertia \( I > 0 \) and viscous friction only:

\[ I\ddot{q} + b \dot{q} = \tau_{\text{ext}}. \]

Define the kinetic energy \( V(q,\dot{q}) = \tfrac{1}{2} I \dot{q}^2 \). Its time derivative is

\[ \dot{V} = I\dot{q}\ddot{q} = \dot{q}(\tau_{\text{ext}} - b\dot{q}) = \dot{q}\,\tau_{\text{ext}} - b \dot{q}^2. \]

In the unforced case \( \tau_{\text{ext}} = 0 \), we have \( \dot{V} = -b\dot{q}^2 \le 0 \), showing that viscous friction is strictly dissipative: energy monotonically decreases and the joint asymptotically comes to rest.

For an \( n \)-DOF manipulator with \( \mathbf{M}(q) \) symmetric positive definite and viscous friction matrix \( \mathbf{B} \ge 0 \), the total kinetic energy \( V = \tfrac{1}{2}\dot{q}^\top\mathbf{M}(q)\dot{q} \) satisfies

\[ \dot{V} = \dot{q}^\top \bigl(\tau_{\text{act}} - \mathbf{g}(q)\bigr) - \dot{q}^\top \mathbf{B} \dot{q}, \]

so viscous friction always subtracts nonnegative power \( \dot{q}^\top \mathbf{B} \dot{q} \ge 0 \).

4. Stribeck Effect and Nonlinear Friction

Experimental measurements of friction torque versus velocity reveal that friction is not simply the sum of a constant plus a linear term. Instead, at very low speeds, friction is larger (static friction) and decays toward the Coulomb level as speed increases. This phenomenon is called the Stribeck effect.

A common empirical model for a single joint combines static, Coulomb, and viscous components as

\[ \tau_{\text{S}}(\dot{q}) = \Bigl(F_{\text{C}} + \bigl(F_{\text{S}} - F_{\text{C}}\bigr) e^{-\bigl(|\dot{q}|/v_{\text{s}}\bigr)^\alpha}\Bigr) \operatorname{sgn}(\dot{q}) + b \dot{q}, \]

where

  • \( F_{\text{S}} \): static friction level ("stiction"),
  • \( F_{\text{C}} \): Coulomb friction level,
  • \( v_{\text{s}} > 0 \): Stribeck velocity scale,
  • \( \alpha \ge 1 \): shape parameter,
  • \( b \ge 0 \): viscous coefficient.

The exponential term ensures that, for \( |\dot{q}| \ll v_{\text{s}} \), the friction approaches the static value \( F_{\text{S}} \), while for \( |\dot{q}| \gg v_{\text{s}} \) it approaches the Coulomb level \( F_{\text{C}} \).

Limit analysis. For any fixed \( \alpha \ge 1 \), we have:

\[ \lim_{|\dot{q}|\to 0} e^{-\bigl(|\dot{q}|/v_{\text{s}}\bigr)^\alpha} = 1, \quad \lim_{|\dot{q}|\to \infty} e^{-\bigl(|\dot{q}|/v_{\text{s}}\bigr)^\alpha} = 0. \]

Therefore,

\[ \lim_{|\dot{q}|\to 0} \tau_{\text{S}}(\dot{q}) = F_{\text{S}}\,\operatorname{sgn}(\dot{q}), \quad \lim_{|\dot{q}|\to \infty} \tau_{\text{S}}(\dot{q}) = F_{\text{C}}\,\operatorname{sgn}(\dot{q}) + b\dot{q}, \]

which shows that the model interpolates smoothly between static and dynamic friction regimes.

5. Friction in the Manipulator Equations of Motion

For an \( n \)-DOF manipulator with joint vector \( q \), we model friction as an additive torque term \( \tau_{\text{fric}}(\dot{q}) \), often assumed to depend only on \( \dot{q} \):

\[ \mathbf{M}(q)\ddot{q} + \mathbf{C}(q,\dot{q})\dot{q} + \mathbf{g}(q) + \tau_{\text{fric}}(\dot{q}) = \tau_{\text{act}}. \]

A widely used combined model per joint \( i \) is

\[ \tau_{\text{fric},i}(\dot{q}_i) = F_{\text{C},i} \operatorname{sgn}(\dot{q}_i) + b_i \dot{q}_i + \Bigl(F_{\text{S},i} - F_{\text{C},i}\Bigr) e^{-\bigl(|\dot{q}_i|/v_{\text{s},i}\bigr)^\alpha} \operatorname{sgn}(\dot{q}_i). \]

Collecting terms for all joints gives

\[ \tau_{\text{fric}}(\dot{q}) = \mathbf{B}\,\dot{q} + \operatorname{diag}(F_{\text{C}})\,\operatorname{sgn}(\dot{q}) + \operatorname{diag}(F_{\text{S}}-F_{\text{C}})\, \phi\bigl(|\dot{q}|\bigr)\,\operatorname{sgn}(\dot{q}), \]

where \( \phi(|\dot{q}|) \) has diagonal entries \( e^{-\bigl(|\dot{q}_i|/v_{\text{s},i}\bigr)^\alpha} \).

The modeling workflow is:

flowchart TD
  S["Measure joint velocity and torque"] --> M1["Choose friction structure (C+V+Stribeck)"]
  M1 --> M2["Fit parameters Fc, Fs, b, vs, alpha"]
  M2 --> M3["Embed tau_fric(qdot) into dynamics M(q) qdd + C(q,qdot) qdot + g(q) + tau_fric = tau_act"]
  M3 --> M4["Use in simulation and further model-based design"]
        

In subsequent chapters on identification, these friction parameters will be estimated from recorded torque and velocity data using regression methods.

6. Energy Dissipation and Monotonicity Properties

A friction model should be passive: it should not inject mechanical energy. For a single joint with friction torque \( \tau_{\text{fric}}(\dot{q}) \), the instantaneous power dissipated is

\[ P_{\text{fric}}(\dot{q}) = \tau_{\text{fric}}(\dot{q}) \, \dot{q}. \]

For purely viscous friction \( \tau_{\text{V}}(\dot{q}) = b \dot{q} \),

\[ P_{\text{V}} = b \dot{q}^2 \ge 0, \]

so the model is strictly dissipative for any nonzero velocity. For ideal Coulomb friction \( \tau_{\text{C}}(\dot{q}) = F_{\text{C}}\operatorname{sgn}(\dot{q}) \),

\[ P_{\text{C}} = F_{\text{C}} \operatorname{sgn}(\dot{q}) \, \dot{q} = F_{\text{C}} |\dot{q}| \ge 0, \]

which is also strictly dissipative for \( \dot{q} \neq 0 \).

For the Stribeck model,

\[ \tau_{\text{S}}(\dot{q}) = \Bigl(F_{\text{C}} + \bigl(F_{\text{S}} - F_{\text{C}}\bigr) e^{-\bigl(|\dot{q}|/v_{\text{s}}\bigr)^\alpha}\Bigr) \operatorname{sgn}(\dot{q}) + b \dot{q}, \]

we have

\[ P_{\text{S}}(\dot{q}) = \Bigl(F_{\text{C}} + \bigl(F_{\text{S}} - F_{\text{C}}\bigr) e^{-\bigl(|\dot{q}|/v_{\text{s}}\bigr)^\alpha}\Bigr) |\dot{q}| + b \dot{q}^2 \ge 0, \]

assuming \( F_{\text{S}} \ge F_{\text{C}} \ge 0 \), \( b \ge 0 \). Thus the Stribeck model is also dissipative and therefore physically plausible from an energy standpoint.

7. Python Implementation of Joint Friction Models

We next implement Coulomb, viscous, and Stribeck friction models in Python using numpy. Consider a single joint with inertia \( I \), subject to an applied torque \( \tau_{\text{act}} \) and friction \( \tau_{\text{fric}}(\dot{q}) \). The dynamics are

\[ I \ddot{q} = \tau_{\text{act}} - \tau_{\text{fric}}(\dot{q}). \]


import numpy as np

def sign_smooth(v, eps=1e-3):
    """Smooth approximation of sign(v) using tanh."""
    return np.tanh(v / eps)

def coulomb_friction(qdot, Fc, eps=1e-3):
    """
    Coulomb friction: tau_C = Fc * sgn(qdot).
    qdot: float or ndarray
    Fc:   scalar or ndarray (same shape)
    """
    return Fc * sign_smooth(qdot, eps=eps)

def viscous_friction(qdot, b):
    """
    Viscous friction: tau_V = b * qdot.
    """
    return b * qdot

def stribeck_friction(qdot, Fc, Fs, vs, alpha=1.0, b=0.0, eps=1e-3):
    """
    Stribeck + viscous friction:
      tau = (Fc + (Fs - Fc)*exp(-(abs(qdot)/vs)**alpha))*sgn(qdot) + b*qdot
    """
    qdot = np.asarray(qdot)
    sgn = sign_smooth(qdot, eps=eps)
    phi = np.exp(- (np.abs(qdot) / vs)**alpha)
    return (Fc + (Fs - Fc) * phi) * sgn + b * qdot

def joint_dynamics_step(q, qdot, tau_act, dt,
                        I=0.1, model="stribeck",
                        params=None):
    """
    One explicit Euler integration step for a 1-DOF joint with friction.
    """
    if params is None:
        params = {}

    if model == "coulomb":
        Fc = params.get("Fc", 0.2)
        tau_f = coulomb_friction(qdot, Fc)
    elif model == "viscous":
        b = params.get("b", 0.01)
        tau_f = viscous_friction(qdot, b)
    elif model == "stribeck":
        Fc = params.get("Fc", 0.2)
        Fs = params.get("Fs", 0.3)
        vs = params.get("vs", 0.05)
        alpha = params.get("alpha", 1.0)
        b = params.get("b", 0.01)
        tau_f = stribeck_friction(qdot, Fc, Fs, vs, alpha, b)
    else:
        raise ValueError("Unknown model")

    qddot = (tau_act - tau_f) / I
    qdot_next = qdot + dt * qddot
    q_next = q + dt * qdot_next
    return q_next, qdot_next, qddot

if __name__ == "__main__":
    # Simple simulation: constant torque, compare models
    dt = 1e-3
    T = 2.0
    N = int(T / dt)

    q = 0.0
    qdot = 0.0
    tau_act = 0.4
    traj = []

    params = {"Fc": 0.2, "Fs": 0.3, "vs": 0.05, "alpha": 1.0, "b": 0.01}
    for k in range(N):
        q, qdot, qddot = joint_dynamics_step(
            q, qdot, tau_act, dt,
            I=0.1,
            model="stribeck",
            params=params
        )
        traj.append((k*dt, q, qdot, qddot))

    traj = np.array(traj)
    # traj[:,1] = q(t), traj[:,2] = qdot(t)
    # Plotting can be done with matplotlib in a separate script or notebook.
      

This modular implementation makes it straightforward to upgrade the friction model or switch between Coulomb, viscous, and Stribeck descriptions during simulation.

8. C++ Implementation of Friction Models

In C++, friction models are often embedded in real-time dynamics and control code. The following snippet illustrates a header-only implementation of the same models for a single joint.


#pragma once
#include <cmath>

namespace friction {

inline double sign_smooth(double v, double eps = 1e-3)
{
    return std::tanh(v / eps);
}

inline double coulomb(double qdot, double Fc, double eps = 1e-3)
{
    return Fc * sign_smooth(qdot, eps);
}

inline double viscous(double qdot, double b)
{
    return b * qdot;
}

inline double stribeck(double qdot,
                       double Fc, double Fs, double vs,
                       double alpha = 1.0, double b = 0.0,
                       double eps = 1e-3)
{
    const double sgn = sign_smooth(qdot, eps);
    const double abs_v = std::fabs(qdot);
    const double phi = std::exp(-std::pow(abs_v / vs, alpha));
    return (Fc + (Fs - Fc) * phi) * sgn + b * qdot;
}

struct JointFrictionParams
{
    double Fc;
    double Fs;
    double vs;
    double alpha;
    double b;
};

inline double dynamics_step(double q, double qdot,
                            double tau_act, double dt,
                            double I,
                            const JointFrictionParams& p)
{
    double tau_f = stribeck(qdot, p.Fc, p.Fs, p.vs, p.alpha, p.b);
    double qddot = (tau_act - tau_f) / I;
    // caller updates q, qdot externally; here just return acceleration
    return qddot;
}

} // namespace friction
      

In a full manipulator implementation, these functions would be applied jointwise to compute the friction torque vector before solving the multibody dynamics for accelerations.

9. Java Implementation of Friction Models

Many educational and research robot simulators are written in Java. The following class provides static methods for Coulomb, viscous, and Stribeck friction, along with a simple integrator.


public final class JointFriction {

    private JointFriction() {}

    public static double signSmooth(double v, double eps) {
        return Math.tanh(v / eps);
    }

    public static double coulomb(double qdot, double Fc, double eps) {
        return Fc * signSmooth(qdot, eps);
    }

    public static double viscous(double qdot, double b) {
        return b * qdot;
    }

    public static double stribeck(double qdot,
                                  double Fc, double Fs, double vs,
                                  double alpha, double b, double eps) {
        double sgn = signSmooth(qdot, eps);
        double absV = Math.abs(qdot);
        double phi = Math.exp(-Math.pow(absV / vs, alpha));
        return (Fc + (Fs - Fc) * phi) * sgn + b * qdot;
    }

    public static class Params {
        public double Fc = 0.2;
        public double Fs = 0.3;
        public double vs = 0.05;
        public double alpha = 1.0;
        public double b = 0.01;
        public double I = 0.1;
    }

    public static void eulerStep(double[] state, double tauAct,
                                 double dt, Params p) {
        double q = state[0];
        double qdot = state[1];
        double tauF = stribeck(qdot, p.Fc, p.Fs, p.vs, p.alpha, p.b, 1e-3);
        double qddot = (tauAct - tauF) / p.I;
        qdot += dt * qddot;
        q += dt * qdot;
        state[0] = q;
        state[1] = qdot;
    }
}
      

The method eulerStep can be called in a simulation loop to propagate joint position and velocity under a specified applied torque and friction model.

10. MATLAB / Simulink Implementation

In MATLAB, friction models can be implemented as functions or embedded directly in Simulink blocks. Below is a function-based implementation for Coulomb, viscous, and Stribeck friction for vector-valued joint velocities.


function tau_f = friction_torque(qdot, params, model)
%FRICTION_TORQUE Joint friction models: "coulomb", "viscous", "stribeck".
%
% qdot  : n x 1 joint velocity vector
% params: struct with fields Fc, Fs, vs, alpha, b (each n x 1 or scalar)
% model : string, one of 'coulomb', 'viscous', 'stribeck'

if nargin < 3
    model = 'stribeck';
end

eps = 1e-3;
qdot = qdot(:); % ensure column

switch lower(model)
    case 'coulomb'
        Fc = params.Fc;
        tau_f = Fc .* tanh(qdot / eps);

    case 'viscous'
        b = params.b;
        tau_f = b .* qdot;

    case 'stribeck'
        Fc = params.Fc;
        Fs = params.Fs;
        vs = params.vs;
        alpha = params.alpha;
        b = params.b;

        sgn = tanh(qdot / eps);
        phi = exp(-(abs(qdot) ./ vs).^alpha);
        tau_f = (Fc + (Fs - Fc) .* phi) .* sgn + b .* qdot;

    otherwise
        error('Unknown model: %s', model);
end
end
      

To integrate this into Simulink, one can use a MATLAB Function block that calls friction_torque. The torques are then subtracted from the applied torques before passing them to a joint dynamics block representing \( \mathbf{M}(q)\ddot{q} + \mathbf{C}(q,\dot{q})\dot{q} + \mathbf{g}(q) \).

For a single-DOF Simulink model, a typical structure is:

  • Block 1: input applied torque tau_act.
  • Block 2: MATLAB Function computing tau_fric(qdot).
  • Block 3: sum block computing tau_act - tau_fric.
  • Block 4: integrator-based joint dynamics (position and velocity outputs).

11. Wolfram Mathematica Implementation

In Wolfram Mathematica, friction models can be defined symbolically and then used for analysis (e.g., phase portraits) or numerical simulation via NDSolve.


signSmooth[v_, eps_: 1.*^-3] := Tanh[v/eps];

coulombFriction[v_, Fc_, eps_: 1.*^-3] := Fc * signSmooth[v, eps];

viscousFriction[v_, b_] := b * v;

stribeckFriction[v_, Fc_, Fs_, vs_, alpha_: 1., b_: 0., eps_: 1.*^-3] :=
 Module[{sgn, phi},
  sgn = signSmooth[v, eps];
  phi = Exp[-(Abs[v]/vs)^alpha];
  (Fc + (Fs - Fc) * phi) * sgn + b * v
 ]

(* Example: simulate 1-DOF joint with Stribeck friction *)
params = <|
   "I" -> 0.1,
   "Fc" -> 0.2,
   "Fs" -> 0.3,
   "vs" -> 0.05,
   "alpha" -> 1.0,
   "b" -> 0.01,
   "tauAct" -> 0.4
|>;

eqns = {
   q'[t] == qdot[t],
   qdot'[t] == (params["tauAct"] -
       stribeckFriction[qdot[t],
        params["Fc"], params["Fs"], params["vs"],
        params["alpha"], params["b"]
       ])/params["I"],
   q[0] == 0.,
   qdot[0] == 0.
   };

sol = NDSolve[eqns, {q, qdot}, {t, 0, 2.0}][[1]];

(* Example: plot velocity vs. time *)
Plot[qdot[t] /. sol, {t, 0, 2.0},
 AxesLabel -> {"t", "qdot"},
 PlotRange -> All]
      

Symbolic tools allow further analysis, such as studying equilibria under constant applied torque or verifying dissipativity using Lyapunov methods.

12. Problems and Solutions

Problem 1 (Equilibria with Coulomb & viscous friction):
Consider a single joint with inertia \( I > 0 \), viscous coefficient \( b \ge 0 \), and Coulomb friction \( F_{\text{C}} > 0 \). The dynamics under constant applied torque \( \tau_{\text{act}} \) are

\[ I\ddot{q} + b\dot{q} + F_{\text{C}}\operatorname{sgn}(\dot{q}) = \tau_{\text{act}}. \]

(a) Find all equilibrium velocities \( \dot{q}^\star \) (constant-velocity solutions).
(b) Determine for which values of \( \tau_{\text{act}} \) static equilibrium (\( \dot{q}^\star = 0 \)) is possible.

Solution:
(a) For a constant-velocity solution \( \dot{q}(t) = \dot{q}^\star \), we have \( \ddot{q} = 0 \), so

\[ b\dot{q}^\star + F_{\text{C}}\operatorname{sgn}(\dot{q}^\star) = \tau_{\text{act}}. \]

If \( \dot{q}^\star > 0 \), then \( \operatorname{sgn}(\dot{q}^\star) = 1 \) and

\[ b\dot{q}^\star + F_{\text{C}} = \tau_{\text{act}} \quad\Rightarrow\quad \dot{q}^\star = \frac{\tau_{\text{act}} - F_{\text{C}}}{b}. \]

This is consistent only if \( \tau_{\text{act}} > F_{\text{C}} \), which ensures \( \dot{q}^\star > 0 \). Similarly, if \( \dot{q}^\star < 0 \), then \( \operatorname{sgn}(\dot{q}^\star) = -1 \), giving

\[ b\dot{q}^\star - F_{\text{C}} = \tau_{\text{act}} \quad\Rightarrow\quad \dot{q}^\star = \frac{\tau_{\text{act}} + F_{\text{C}}}{b}, \]

which is consistent only if \( \tau_{\text{act}} < -F_{\text{C}} \). Thus, constant-velocity equilibria exist only for \( |\tau_{\text{act}}| > F_{\text{C}} \), with the velocity sign matching the torque sign.

(b) For static equilibrium \( \dot{q}^\star = 0 \), the Coulomb friction torque can take any value in \( [-F_{\text{C}}, F_{\text{C}}] \), while the viscous term is zero. The friction torque must balance the applied torque:

\[ \tau_{\text{act}} \in [-F_{\text{C}}, F_{\text{C}}]. \]

Therefore, static equilibrium is possible if and only if \( |\tau_{\text{act}}| \le F_{\text{C}} \).


Problem 2 (Dissipativity of Stribeck model):
Show that the Stribeck model

\[ \tau_{\text{S}}(\dot{q}) = \Bigl(F_{\text{C}} + \bigl(F_{\text{S}} - F_{\text{C}}\bigr) e^{-\bigl(|\dot{q}|/v_{\text{s}}\bigr)^\alpha}\Bigr) \operatorname{sgn}(\dot{q}) + b \dot{q} \]

is dissipative in the sense that \( P_{\text{S}}(\dot{q}) = \tau_{\text{S}}(\dot{q})\,\dot{q} \ge 0 \) for all \( \dot{q} \), assuming \( F_{\text{S}} \ge F_{\text{C}} \ge 0 \) and \( b \ge 0 \).

Solution:
We compute

\[ P_{\text{S}}(\dot{q}) = \Bigl(F_{\text{C}} + \bigl(F_{\text{S}} - F_{\text{C}}\bigr) e^{-\bigl(|\dot{q}|/v_{\text{s}}\bigr)^\alpha}\Bigr) \operatorname{sgn}(\dot{q}) \, \dot{q} + b \dot{q}^2. \]

Since \( \operatorname{sgn}(\dot{q}) \, \dot{q} = |\dot{q}| \), and the exponential is positive, we have

\[ P_{\text{S}}(\dot{q}) = \Bigl(F_{\text{C}} + \bigl(F_{\text{S}} - F_{\text{C}}\bigr) e^{-\bigl(|\dot{q}|/v_{\text{s}}\bigr)^\alpha}\Bigr) |\dot{q}| + b \dot{q}^2. \]

The term in parentheses is nonnegative because \( F_{\text{C}} \ge 0 \) and \( F_{\text{S}} - F_{\text{C}} \ge 0 \). Thus the first term is nonnegative. The second term is also nonnegative since \( b \ge 0 \). Therefore \( P_{\text{S}}(\dot{q}) \ge 0 \) for all \( \dot{q} \).


Problem 3 (Linear regression form for Coulomb + viscous identification):
Suppose we model a joint's friction torque as

\[ \tau_{\text{fric}}(\dot{q}) = F_{\text{C}}\operatorname{sgn}(\dot{q}) + b \dot{q}. \]

Given a dataset of measured pairs \( (\dot{q}_k, \tau_k) \), show how to write this as a linear regression \( \tau_k = \varphi_k^\top \theta + \varepsilon_k \), and identify \( \theta \).

Solution:
Define the parameter vector \( \theta = [F_{\text{C}}, b]^\top \). For each sample \( k \), define the regressor

\[ \varphi_k = \begin{bmatrix} \operatorname{sgn}(\dot{q}_k) \\ \dot{q}_k \end{bmatrix}. \]

Then

\[ \tau_k = F_{\text{C}}\operatorname{sgn}(\dot{q}_k) + b \dot{q}_k = \begin{bmatrix} \operatorname{sgn}(\dot{q}_k) & \dot{q}_k \end{bmatrix} \begin{bmatrix} F_{\text{C}} \\[0.2em] b \end{bmatrix} = \varphi_k^\top \theta. \]

Collecting all samples in matrix form \( \mathbf{\Phi}\theta \approx \mathbf{\tau} \), the least-squares estimate is

\[ \hat{\theta} = \bigl(\mathbf{\Phi}^\top \mathbf{\Phi}\bigr)^{-1} \mathbf{\Phi}^\top \mathbf{\tau}. \]


Problem 4 (Passivity of viscous friction in multibody systems):
Consider an \( n \)-DOF manipulator with dynamics

\[ \mathbf{M}(q)\ddot{q} + \mathbf{C}(q,\dot{q})\dot{q} + \mathbf{g}(q) + \mathbf{B}\dot{q} = \tau_{\text{act}}, \]

where \( \mathbf{M}(q) \) is positive definite and \( \mathbf{B} \) is positive semidefinite. Let \( V(q,\dot{q}) = \tfrac{1}{2}\dot{q}^\top\mathbf{M}(q)\dot{q} + U(q) \) be the total mechanical energy, where \( U(q) \) is potential energy associated with gravity. Show that \( \dot{V} = \dot{q}^\top\tau_{\text{act}} - \dot{q}^\top\mathbf{B}\dot{q} \).

Solution:
Differentiating \( V \), we obtain

\[ \dot{V} = \tfrac{1}{2}\dot{q}^\top \dot{\mathbf{M}}(q) \dot{q} + \dot{q}^\top \mathbf{M}(q)\ddot{q} + \nabla U(q)^\top \dot{q}. \]

Using the standard property of robot dynamics \( \dot{\mathbf{M}}(q) - 2\mathbf{C}(q,\dot{q}) \) is skew-symmetric, we have

\[ \dot{q}^\top \mathbf{C}(q,\dot{q})\dot{q} = \tfrac{1}{2}\dot{q}^\top\dot{\mathbf{M}}(q)\dot{q}. \]

Multiply the dynamics by \( \dot{q}^\top \):

\[ \dot{q}^\top \mathbf{M}(q)\ddot{q} + \dot{q}^\top \mathbf{C}(q,\dot{q})\dot{q} + \dot{q}^\top \mathbf{g}(q) + \dot{q}^\top \mathbf{B}\dot{q} = \dot{q}^\top\tau_{\text{act}}. \]

Since \( \mathbf{g}(q) = \nabla U(q) \) and using the skew-symmetry property, we get

\[ \dot{q}^\top \mathbf{M}(q)\ddot{q} + \tfrac{1}{2}\dot{q}^\top\dot{\mathbf{M}}(q)\dot{q} + \dot{q}^\top\nabla U(q) + \dot{q}^\top\mathbf{B}\dot{q} = \dot{q}^\top\tau_{\text{act}}. \]

The left-hand side is precisely \( \dot{V} + \dot{q}^\top\mathbf{B}\dot{q} \), so

\[ \dot{V} + \dot{q}^\top\mathbf{B}\dot{q} = \dot{q}^\top\tau_{\text{act}} \quad\Rightarrow\quad \dot{V} = \dot{q}^\top\tau_{\text{act}} - \dot{q}^\top\mathbf{B}\dot{q}. \]

This shows that viscous friction subtracts the nonnegative term \( \dot{q}^\top\mathbf{B}\dot{q} \) from the power input.

13. Summary

In this lesson, we augmented ideal manipulator dynamics with joint friction models of increasing sophistication. Coulomb friction captures constant-magnitude opposition to motion, viscous friction introduces linear damping, and the Stribeck model interpolates between static and dynamic friction regimes. We analyzed their energy dissipation properties and incorporated them into the standard equation of motion \( \mathbf{M}(q)\ddot{q} + \mathbf{C}(q,\dot{q})\dot{q} + \mathbf{g}(q) = \tau_{\text{act}} - \tau_{\text{fric}}(\dot{q}) \).

On the implementation side, we developed reusable friction model functions in Python, C++, Java, MATLAB/Simulink, and Wolfram Mathematica, enabling realistic simulation of joint behavior. These models will be essential in later chapters on identification, validation, and in future courses dedicated to friction compensation and robust control.

14. References

  1. Armstrong-Hélouvry, B., Dupont, P., & de Wit, C. C. (1994). A survey of models, analysis tools and compensation methods for the control of machines with friction. Automatica, 30(7), 1083–1138.
  2. Canudas de Wit, C., Olsson, H., Åström, K. J., & Lischinsky, P. (1995). A new model for control of systems with friction. IEEE Transactions on Automatic Control, 40(3), 419–425.
  3. Olsson, H., Åström, K. J., de Wit, C. C., Gäfvert, M., & Lischinsky, P. (1998). Friction models and friction compensation. European Journal of Control, 4(3), 176–195.
  4. Al-Bender, F., Lampaert, V., & Swevers, J. (2004). Modelling of friction using generalized Maxwell-slip models. Tribology Letters, 16(1–2), 81–93.
  5. Swevers, J., Al-Bender, F., Ganseman, C., & Projogo, T. (2000). An integrated friction model structure with improved presliding behavior for accurate friction compensation. IEEE Transactions on Automatic Control, 45(4), 675–686.
  6. Boyer, F., Porez, M., & Khalil, W. (2012). Macro-continuous models of multi-link systems with frictional joints. Multibody System Dynamics, 27(1), 27–49.
  7. Dahl, P. R. (1976). Solid friction damping of mechanical vibrations. AIAA Journal, 14(12), 1675–1682.
  8. Karnopp, D. (1985). Computer simulation of stick-slip friction in mechanical dynamic systems. Journal of Dynamic Systems, Measurement, and Control, 107(1), 100–103.
  9. Dupont, P., Armstrong, B., & Hayward, V. (2002). Elasto-plastic friction model: Contact compliance and stiction. Proceedings of the American Control Conference, 1072–1077.