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
- 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.
- 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.
- 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.
- Al-Bender, F., Lampaert, V., & Swevers, J. (2004). Modelling of friction using generalized Maxwell-slip models. Tribology Letters, 16(1–2), 81–93.
- 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.
- Boyer, F., Porez, M., & Khalil, W. (2012). Macro-continuous models of multi-link systems with frictional joints. Multibody System Dynamics, 27(1), 27–49.
- Dahl, P. R. (1976). Solid friction damping of mechanical vibrations. AIAA Journal, 14(12), 1675–1682.
- Karnopp, D. (1985). Computer simulation of stick-slip friction in mechanical dynamic systems. Journal of Dynamic Systems, Measurement, and Control, 107(1), 100–103.
- Dupont, P., Armstrong, B., & Hayward, V. (2002). Elasto-plastic friction model: Contact compliance and stiction. Proceedings of the American Control Conference, 1072–1077.