Chapter 2: Actuator-Space and Joint-Space Control Basics

Lesson 1: Joint-Space Control Objectives

This lesson formalizes what it means to "control a robot in joint space". We define joint-space variables, regulation and tracking objectives, error coordinates, desired error dynamics, and basic performance indices that every subsequent joint-space controller (PD, model-based, robust, etc.) must satisfy. The focus is on precise mathematical specification of objectives, not yet on concrete controller design.

1. Conceptual Overview of Joint-Space Control

Consider an \( n \)-DOF robot manipulator with joint coordinates \( \mathbf{q}(t) \in \mathbb{R}^n \) and joint torques (actuator-space inputs) \( \boldsymbol{u}(t) \in \mathbb{R}^n \), often equal to motor torques \( \boldsymbol{u}(t) = \boldsymbol{\tau}(t) \). The standard rigid-body dynamics (which you already know from robotics kinematics/dynamics) can be written as

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

where

  • \( \mathbf{M}(\mathbf{q}) \) is the inertia matrix,
  • \( \mathbf{C}(\mathbf{q},\dot{\mathbf{q}})\dot{\mathbf{q}} \) collects Coriolis and centrifugal terms,
  • \( \mathbf{g}(\mathbf{q}) \) is gravity, \( \mathbf{f}(\dot{\mathbf{q}}) \) is friction, and
  • \( \boldsymbol{\tau}_c \) is the control torque, \( \boldsymbol{\tau}_d \) an unknown disturbance.

A joint-space controller uses measurements of \( \mathbf{q}(t),\dot{\mathbf{q}}(t) \) and a joint-space reference \( \mathbf{q}_d(t),\dot{\mathbf{q}}_d(t),\ddot{\mathbf{q}}_d(t) \) to generate \( \boldsymbol{\tau}_c(t) \) so that the joints move as desired. The logical information flow is illustrated below.

flowchart TD
  Qd["Joint reference q_d(t)"] --> E["Error e(t) = q_d(t) - q(t)"]
  E --> Ctr["Joint-space controller"]
  Ctr --> Tau["Actuator torques tau(t)"]
  Tau --> Plant["Robot joints and dynamics"]
  Plant --> Meas["Measured q(t), qdot(t)"]
  Meas --> E
        

The central object in joint-space control is the error signal \( \mathbf{e}(t) \). All control objectives are expressed in terms of how this error behaves over time.

2. Joint-Space Variables and State Representation

We assume the robot configuration is represented by joint angles or displacements \( \mathbf{q}(t) = [q_1(t),\dots,q_n(t)]^\top \). A convenient state vector is

\[ \mathbf{x}(t) = \begin{bmatrix} \mathbf{q}(t) \\ \dot{\mathbf{q}}(t) \end{bmatrix} \in \mathbb{R}^{2n}. \]

From the dynamics, we can write a first-order nonlinear state-space model with input \( \boldsymbol{u}(t) = \boldsymbol{\tau}_c(t) \):

\[ \dot{\mathbf{x}}(t) = \begin{bmatrix} \dot{\mathbf{q}}(t) \\ \mathbf{M}^{-1}(\mathbf{q}(t)) \big( \boldsymbol{\tau}_c(t) - \mathbf{C}(\mathbf{q}(t),\dot{\mathbf{q}}(t))\dot{\mathbf{q}}(t) - \mathbf{g}(\mathbf{q}(t)) - \mathbf{f}(\dot{\mathbf{q}}(t)) + \boldsymbol{\tau}_d(t) \big) \end{bmatrix} = \mathbf{f}\big(\mathbf{x}(t),\boldsymbol{\tau}_c(t),t\big). \]

While later chapters introduce sophisticated nonlinear controllers, in this lesson we only use this model to define what we want the closed-loop behavior to be. The system is also constrained by:

\[ q_i^{\min} \leq q_i(t) \leq q_i^{\max}, \quad |\dot{q}_i(t)| \leq \dot{q}_i^{\max}, \quad |\tau_{c,i}(t)| \leq \tau_i^{\max}, \]

which encode joint limits, velocity limits, and actuator torque limits. These constraints must be respected when specifying realistic joint-space objectives.

3. Regulation and Tracking Objectives in Joint Space

Let the desired joint configuration signal be \( \mathbf{q}_d(t) \). We define the tracking error as

\[ \mathbf{e}(t) = \mathbf{q}_d(t) - \mathbf{q}(t), \quad \dot{\mathbf{e}}(t) = \dot{\mathbf{q}}_d(t) - \dot{\mathbf{q}}(t). \]

Two standard classes of joint-space objectives are:

  • Regulation: The desired configuration is constant, \( \mathbf{q}_d(t) \equiv \mathbf{q}^\star \) and the objective is

    \[ \lim_{t \to \infty} \mathbf{q}(t) = \mathbf{q}^\star, \quad \lim_{t \to \infty} \dot{\mathbf{q}}(t) = \mathbf{0}. \]

  • Tracking: The desired configuration is time-varying, and the objective is

    \[ \lim_{t \to \infty} \|\mathbf{e}(t)\| = 0, \quad \lim_{t \to \infty} \|\dot{\mathbf{e}}(t)\| = 0. \]

In practice, exact convergence is impossible due to noise, unmodeled dynamics, and limited actuator bandwidth. Therefore we specify performance envelopes, for example:

\[ \|\mathbf{e}(t)\| \leq \varepsilon_{\infty} \quad \text{for all } t \geq T_s, \]

where \( T_s \) is a settling time and \( \varepsilon_{\infty} \) is the steady-state tracking accuracy.

4. Error Coordinates and Closed-Loop Error System

A convenient way to describe joint-space objectives is to rewrite the dynamics in error coordinates. Define the error state vector

\[ \mathbf{x}_e(t) = \begin{bmatrix} \mathbf{e}(t) \\ \dot{\mathbf{e}}(t) \end{bmatrix} \in \mathbb{R}^{2n}. \]

Using the definitions of \( \mathbf{e}(t) \) and \( \dot{\mathbf{e}}(t) \), we can compute

\[ \ddot{\mathbf{e}}(t) = \ddot{\mathbf{q}}_d(t) - \ddot{\mathbf{q}}(t). \]

From the robot dynamics, assuming disturbances are negligible for now (\( \boldsymbol{\tau}_d(t) \approx \mathbf{0} \)), the joint accelerations satisfy

\[ \ddot{\mathbf{q}}(t) = \mathbf{M}^{-1}(\mathbf{q}(t)) \big( \boldsymbol{\tau}_c(t) - \mathbf{C}(\mathbf{q}(t),\dot{\mathbf{q}}(t))\dot{\mathbf{q}}(t) - \mathbf{g}(\mathbf{q}(t)) - \mathbf{f}(\dot{\mathbf{q}}(t)) \big). \]

Hence the error dynamics can always be written as

\[ \ddot{\mathbf{e}}(t) = \ddot{\mathbf{q}}_d(t) - \mathbf{M}^{-1}(\mathbf{q}(t)) \big( \boldsymbol{\tau}_c(t) - \mathbf{C}(\mathbf{q}(t),\dot{\mathbf{q}}(t))\dot{\mathbf{q}}(t) - \mathbf{g}(\mathbf{q}(t)) - \mathbf{f}(\dot{\mathbf{q}}(t)) \big), \]

which shows that any joint-space controller is essentially a mapping from \( (\mathbf{x}_e, \mathbf{q}_d,\dot{\mathbf{q}}_d,\ddot{\mathbf{q}}_d) \) to \( \boldsymbol{\tau}_c \) that shapes \( \mathbf{x}_e(t) \).

flowchart TD
  Meas["Measured q, qdot"] --> Err["Compute e = q_d - q, edot = qd_dot - qdot"]
  Ref["Reference q_d, qd_dot, qd_ddot"] --> Err
  Err --> Xe["Error state x_e = [e; edot]"]
  Xe --> Spec["Desired error dynamics + performance specs"]
        

In later lessons we will propose specific control laws whose closed-loop error system can be made to approximate a desired target form.

5. Desired Error Dynamics and Second-Order Templates

A common joint-space control objective is to make each joint error behave approximately like a decoupled linear second-order system:

\[ \ddot{e}_i(t) + 2 \zeta_i \omega_{n,i} \dot{e}_i(t) + \omega_{n,i}^2 e_i(t) = 0, \quad i = 1,\dots,n, \]

where \( \omega_{n,i} > 0 \) is the natural frequency and \( \zeta_i > 0 \) is the damping ratio for joint \( i \).

For a single joint (dropping index \( i \)), the associated characteristic polynomial is

\[ s^2 + 2 \zeta \omega_n s + \omega_n^2 = 0, \]

with roots

\[ s_{1,2} = -\zeta \omega_n \pm \omega_n \sqrt{\zeta^2 - 1}. \]

For \( 0 < \zeta < 1 \) the system is underdamped, and the solution has oscillatory form

\[ e(t) = \mathrm{e}^{-\zeta \omega_n t} \big( A \cos(\omega_d t) + B \sin(\omega_d t) \big), \quad \omega_d = \omega_n \sqrt{1 - \zeta^2}, \]

for some constants \( A,B \) determined by initial conditions. From this standard form we obtain classical performance indices:

  • Peak time:

    \[ T_p = \frac{\pi}{\omega_d}. \]

  • Settling time (2 percent criterion):

    \[ T_s \approx \frac{4}{\zeta \omega_n}. \]

  • Maximum overshoot:

    \[ M_p = \exp\!\Bigg( - \frac{\pi \zeta}{\sqrt{1 - \zeta^2}} \Bigg). \]

Defining a joint-space objective often means: pick \( \zeta_i,\omega_{n,i} \) for each joint so that \( T_s,M_p \) satisfy the application requirements, then design the controller (next lesson) such that the closed-loop error dynamics approximate this target template.

6. Performance Indices and Cost Functionals

Beyond peak time and overshoot, we can express joint-space control objectives as cost functionals. A common quadratic performance index on a finite horizon \( [0,T] \) is

\[ J_T = \int_0^T \Big( \mathbf{e}^\top(t) \mathbf{Q} \mathbf{e}(t) + \dot{\mathbf{e}}^\top(t) \mathbf{R} \dot{\mathbf{e}}(t) + \boldsymbol{\tau}_c^\top(t) \mathbf{S} \boldsymbol{\tau}_c(t) \Big) \, \mathrm{d}t, \]

where \( \mathbf{Q},\mathbf{R},\mathbf{S} \) are positive semidefinite weighting matrices. Special cases include:

  • Integral of squared error (ISE):

    \[ \mathrm{ISE} = \int_0^\infty \mathbf{e}^\top(t)\mathbf{e}(t) \, \mathrm{d}t. \]

  • Integral of absolute error (IAE):

    \[ \mathrm{IAE} = \int_0^\infty \|\mathbf{e}(t)\|_1 \, \mathrm{d}t. \]

In optimal control (later chapters) we explicitly minimize such indices, but even in purely feedback design they provide a precise language for what "good joint tracking" means.

7. Implementation View — References, Sampling, and Discretization

Real controllers are digital. Let the sampling period be \( T_s \). The controller observes \( \mathbf{q}[k] \approx \mathbf{q}(kT_s) \) and \( \dot{\mathbf{q}}[k] \approx \dot{\mathbf{q}}(kT_s) \), and outputs a torque command \( \boldsymbol{\tau}_c[k] \) held approximately constant over \( [kT_s,(k+1)T_s) \).

The discrete-time tracking error is

\[ \mathbf{e}[k] = \mathbf{q}_d[k] - \mathbf{q}[k], \quad \dot{\mathbf{e}}[k] = \dot{\mathbf{q}}_d[k] - \dot{\mathbf{q}}[k]. \]

The joint-space objectives translate directly:

  • Exponential-like decay of \( \|\mathbf{e}[k]\| \) at a specified rate.
  • Bounds on discretized overshoot and settling time in samples.
  • Respecting discrete-time torque limits \( |\tau_{c,i}[k]| \leq \tau_i^{\max} \).

Later digital-control chapters will refine these notions, but for now the key idea is that all objectives defined in continuous time can be discretized consistently once \( T_s \) is fixed.

8. Python Lab — Joint-Space Error and Simple Objective Evaluation

In Python, joint-space variables are often represented using numpy arrays. Robotics libraries such as roboticstoolbox (Corke) or modern_robotics (Lynch & Park) provide convenient interfaces to actual robot models. Here we focus on computing errors and a simple integral-of-squared-error metric over a discrete trajectory.


import numpy as np

# Example: n-DOF joint trajectory, sampled at N steps
# q_d[k], q[k] are arrays in R^n

def joint_space_error(q_d, q, qd_d=None, qd=None, dt=0.001):
    """
    Compute joint-space position and velocity tracking error over a trajectory.

    Parameters
    ----------
    q_d : array_like, shape (N, n)
        Desired joint positions.
    q : array_like, shape (N, n)
        Measured joint positions.
    qd_d : array_like, shape (N, n) or None
        Desired joint velocities (optional).
    qd : array_like, shape (N, n) or None
        Measured joint velocities (optional).
    dt : float
        Sample time.

    Returns
    -------
    e, edot : np.ndarray
        Position and velocity error trajectories.
    ise : float
        Integral of squared position error.
    """
    q_d = np.asarray(q_d)
    q = np.asarray(q)
    assert q_d.shape == q.shape

    e = q_d - q

    if qd_d is not None and qd is not None:
        qd_d = np.asarray(qd_d)
        qd = np.asarray(qd)
        assert qd_d.shape == qd.shape
        edot = qd_d - qd
    else:
        # crude finite-difference approximation
        edot = np.zeros_like(e)
        edot[1:] = (e[1:] - e[:-1]) / dt

    # ISE over all joints and time
    ise = float(np.sum(np.sum(e**2, axis=1)) * dt)
    return e, edot, ise


# Minimal example: 2-DOF arm tracking a sinusoidal reference
if __name__ == "__main__":
    dt = 0.001
    T = 2.0
    t = np.arange(0.0, T, dt)
    N = t.size
    n = 2

    # desired joint trajectories
    qd1 = 0.5 * np.sin(2.0 * np.pi * t)
    qd2 = 0.3 * np.sin(4.0 * np.pi * t)
    q_d = np.stack([qd1, qd2], axis=1)

    # measured: assume a small phase lag and amplitude error
    q = np.stack([
        0.48 * np.sin(2.0 * np.pi * (t - 0.01)),
        0.29 * np.sin(4.0 * np.pi * (t - 0.01)),
    ], axis=1)

    e, edot, ise = joint_space_error(q_d, q, dt=dt)
    print("ISE over horizon T = ", T, " seconds:", ise)
      

This kind of function is a building block for evaluating whether a particular controller meets the joint-space objectives specified in terms of error norms and integral criteria.

9. C++, Java, MATLAB/Simulink, and Mathematica Sketches

9.1 C++ (Eigen + robotics middlewares)

In C++, joint-space computations are typically performed with Eigen for linear algebra, possibly integrated with middleware such as ROS Control or Orocos. The snippet below assumes Eigen::VectorXd for joint vectors.


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

struct JointTrajectorySample {
    Eigen::VectorXd q_d;   // desired positions
    Eigen::VectorXd q;     // measured positions
};

double computeISE(const std::vector<JointTrajectorySample>& traj,
                  double dt)
{
    if (traj.empty()) return 0.0;
    const int n = traj.front().q_d.size();
    double ise = 0.0;

    for (const auto& s : traj) {
        Eigen::VectorXd e = s.q_d - s.q;
        ise += e.squaredNorm() * dt;
    }
    return ise;
}

int main() {
    const int n = 2;
    double dt = 0.001;
    std::vector<JointTrajectorySample> traj;

    // Fill with some fake data (for illustration)
    for (int k = 0; k < 2000; ++k) {
        double t = k * dt;
        JointTrajectorySample s;
        s.q_d = Eigen::VectorXd(n);
        s.q = Eigen::VectorXd(n);

        s.q_d(0) = 0.5 * std::sin(2.0 * M_PI * t);
        s.q_d(1) = 0.3 * std::sin(4.0 * M_PI * t);

        s.q(0) = 0.48 * std::sin(2.0 * M_PI * (t - 0.01));
        s.q(1) = 0.29 * std::sin(4.0 * M_PI * (t - 0.01));

        traj.push_back(s);
    }

    double ise = computeISE(traj, dt);
    std::cout << "ISE = " << ise << std::endl;
    return 0;
}
      

9.2 Java (using EJML for linear algebra)

In Java, matrix libraries such as EJML provide efficient vector operations. Here, we sketch a simple error computation.


import org.ejml.simple.SimpleMatrix;
import java.util.List;

class JointSample {
    public SimpleMatrix qd;  // n x 1
    public SimpleMatrix q;   // n x 1
}

public class JointSpaceMetrics {

    public static double computeISE(List<JointSample> traj, double dt) {
        double ise = 0.0;
        for (JointSample s : traj) {
            SimpleMatrix e = s.qd.minus(s.q);
            double norm2 = e.dot(e);  // squared Euclidean norm
            ise += norm2 * dt;
        }
        return ise;
    }

    public static void main(String[] args) {
        // In practice: acquire samples from your robot middleware
        // and feed them into computeISE.
    }
}
      

9.3 MATLAB / Simulink

MATLAB (with Robotics System Toolbox) provides high-level interfaces to joint trajectories. The following script computes joint-space error and a simple ISE metric.


function [e, edot, ISE] = joint_space_error_matlab(qd, q, dt)
% qd, q : N-by-n arrays (desired and measured joint positions)
% dt    : sample time

arguments
    qd double
    q  double
    dt (1,1) double {mustBePositive}
end

assert(isequal(size(qd), size(q)), 'Size mismatch between qd and q');

e = qd - q;
edot           = zeros(size(e));
edot(2:end,:)  = diff(e) / dt;
edot(1,:)      = edot(2,:);

ISE = sum(sum(e.^2, 2)) * dt;
end

% Example usage:
% t  = 0:0.001:2;
% qd = [0.5*sin(2*pi*t') 0.3*sin(4*pi*t')];
% q  = [0.48*sin(2*pi*(t'-0.01)) 0.29*sin(4*pi*(t'-0.01))];
% [e, edot, ISE] = joint_space_error_matlab(qd, q, 0.001);
      

In Simulink, the same computations would be implemented using Sum, Gain, and Integrator blocks to construct \( e(t) \) and \( \dot{e}(t) \), followed by Math Function blocks to square and integrate the error.

9.4 Wolfram Mathematica

Mathematica is well suited for symbolic manipulation and continuous-time simulation of error dynamics. The snippet below simulates the second-order error template from Section 5.


(* Parameters for a single joint error dynamics *)
zeta   = 0.7;
omegaN = 8.0;

eq = e''[t] + 2 zeta omegaN e'[t] + omegaN^2 e[t] == 0;
ic = {e[0] == 0.1, e'[0] == 0};

sol = NDSolve[{eq, ic}, e, {t, 0, 2}][[1]];

Plot[Evaluate[e[t] /. sol], {t, 0, 2},
  AxesLabel -> {"t", "e(t)"},
  PlotLabel -> "Joint error dynamics"
]
      

Here, the objective is encoded entirely in the differential equation; a real controller must be designed so that the actual error trajectory matches this idealized solution as closely as possible.

10. Problems and Solutions

Problem 1 (Error Coordinate Transformation): Consider the rigid-body robot dynamics with no disturbances, \( \boldsymbol{\tau}_d(t) \equiv \mathbf{0} \), and let \( \mathbf{q}_d(t) \) be a smooth desired trajectory. Derive explicit expressions for \( \dot{\mathbf{x}}_e(t) \) in terms of \( \mathbf{x}_e(t),\mathbf{q}_d(t),\dot{\mathbf{q}}_d(t),\ddot{\mathbf{q}}_d(t),\boldsymbol{\tau}_c(t) \).

Solution: By definition, \( \mathbf{e} = \mathbf{q}_d - \mathbf{q} \), so \( \dot{\mathbf{e}} = \dot{\mathbf{q}}_d - \dot{\mathbf{q}} \) and \( \ddot{\mathbf{e}} = \ddot{\mathbf{q}}_d - \ddot{\mathbf{q}} \). The state \( \mathbf{x}_e \) is \( \mathbf{x}_e = [\mathbf{e}^\top,\dot{\mathbf{e}}^\top]^\top \). Hence

\[ \dot{\mathbf{x}}_e(t) = \begin{bmatrix} \dot{\mathbf{e}}(t) \\ \ddot{\mathbf{e}}(t) \end{bmatrix} = \begin{bmatrix} \dot{\mathbf{q}}_d(t) - \dot{\mathbf{q}}(t) \\ \ddot{\mathbf{q}}_d(t) - \ddot{\mathbf{q}}(t) \end{bmatrix}. \]

Using the dynamics,

\[ \ddot{\mathbf{q}}(t) = \mathbf{M}^{-1}(\mathbf{q}(t)) \big( \boldsymbol{\tau}_c(t) - \mathbf{C}(\mathbf{q}(t),\dot{\mathbf{q}}(t))\dot{\mathbf{q}}(t) - \mathbf{g}(\mathbf{q}(t)) - \mathbf{f}(\dot{\mathbf{q}}(t)) \big). \]

Substituting into \( \ddot{\mathbf{e}} \) yields

\[ \ddot{\mathbf{e}}(t) = \ddot{\mathbf{q}}_d(t) - \mathbf{M}^{-1}(\mathbf{q}(t)) \big( \boldsymbol{\tau}_c(t) - \mathbf{C}(\mathbf{q}(t),\dot{\mathbf{q}}(t))\dot{\mathbf{q}}(t) - \mathbf{g}(\mathbf{q}(t)) - \mathbf{f}(\dot{\mathbf{q}}(t)) \big). \]

Together these equations provide the desired explicit form for \( \dot{\mathbf{x}}_e(t) \).

Problem 2 (Second-Order Error Dynamics Properties): Assume the desired error dynamics for a single joint are \( \ddot{e}(t) + 2\zeta \omega_n \dot{e}(t) + \omega_n^2 e(t) = 0 \) with \( 0 < \zeta < 1 \). Show that the error converges to zero and compute the steady-state energy \( \int_0^\infty e^2(t)\,\mathrm{d}t \) in terms of \( \zeta,\omega_n \) and the initial conditions.

Solution: The roots are \( s_{1,2} = -\zeta \omega_n \pm \mathrm{i}\omega_d \) with \( \omega_d = \omega_n\sqrt{1-\zeta^2} \). Since \( \zeta \omega_n > 0 \), the real part is negative and thus \( e(t) \to 0 \). The solution can be written as

\[ e(t) = \mathrm{e}^{-\zeta \omega_n t} \big( A \cos(\omega_d t) + B \sin(\omega_d t) \big), \]

where \( A = e(0) \) and \( B = (\dot{e}(0) + \zeta \omega_n e(0))/\omega_d \). Then

\[ \int_0^\infty e^2(t) \,\mathrm{d}t = \frac{1}{4 \zeta \omega_n} \Big( A^2 + B^2 \Big), \]

obtained by standard integrals of exponentially damped sinusoids. This shows that larger \( \zeta \) and \( \omega_n \) reduce the integral of squared error, but excessively large \( \omega_n \) may violate actuator limits in practice.

Problem 3 (Simple Joint-Space Objective with Constraints): Suppose a revolute joint has limits \( q^{\min} = -\pi/2 \), \( q^{\max} = \pi/2 \) and maximum torque \( \tau^{\max} \). You are given a desired step from \( q(0) = 0 \) to \( q_d(t) \equiv 0.9(\pi/2) \). Formulate joint-space performance specifications (in terms of settling time and overshoot) that are consistent with these limits.

Solution: Because \( q_d \) is close to the upper limit, we must prevent overshoot from violating \( q^{\max} \). Define overshoot as \( M_p = (q_{\max,\text{traj}} - q_d) / (q_d - q(0)) \). The constraint \( q_{\max,\text{traj}} \leq q^{\max} \) implies

\[ M_p \leq \frac{q^{\max} - q_d}{q_d - q(0)} = \frac{\pi/2 - 0.9(\pi/2)}{0.9(\pi/2)} = \frac{0.1}{0.9} \approx 0.111. \]

Thus we may specify \( M_p \leq 0.1 \). For the settling time, if we desire \( T_s \leq 0.5 \) seconds, using \( T_s \approx 4/(\zeta \omega_n) \) we obtain the condition \( \zeta \omega_n \geq 8 \). A complete specification is therefore

  • \( M_p \leq 0.1 \) (joint limit safety),
  • \( T_s \leq 0.5 \) seconds (responsiveness), and
  • actuator torque bounds \( |\tau_c(t)| \leq \tau^{\max} \).

A later controller design must ensure its parameters satisfy these inequalities.

Problem 4 (Discrete-Time ISE Approximation): Let \( \mathbf{e}(t) \) be a continuous-time error signal, and suppose we have sampled values \( \mathbf{e}[k] = \mathbf{e}(kT_s) \), \( k = 0,\dots,N-1 \). Show that the discrete-time sum

\[ \mathrm{ISE}_N = T_s \sum_{k=0}^{N-1} \mathbf{e}^\top[k]\mathbf{e}[k] \]

converges to the continuous-time integral \( \int_0^{T} \mathbf{e}^\top(t)\mathbf{e}(t)\,\mathrm{d}t \) as \( T_s \to 0 \) with \( T = NT_s \).

Solution: The sum is precisely a Riemann sum approximation to the integral:

\[ T_s \sum_{k=0}^{N-1} \mathbf{e}^\top[k]\mathbf{e}[k] = \sum_{k=0}^{N-1} \mathbf{e}^\top(kT_s)\mathbf{e}(kT_s) \, T_s. \]

Since \( \mathbf{e}(t) \) is assumed continuous, \( \mathbf{e}^\top(t)\mathbf{e}(t) \) is continuous and bounded on \( [0,T] \). Therefore, by the definition of the Riemann integral, the limit of the Riemann sums as \( T_s \to 0 \) is equal to the integral

\[ \lim_{T_s \to 0} T_s \sum_{k=0}^{N-1} \mathbf{e}^\top[k]\mathbf{e}[k] = \int_0^{T} \mathbf{e}^\top(t)\mathbf{e}(t)\,\mathrm{d}t. \]

This justifies using the discrete-time ISE approximation in numerical simulations.

Problem 5 (Multi-DOF Error Norm): For a 3-DOF robot, the joint errors are \( e_1,e_2,e_3 \). Define \( \mathbf{e} = [e_1,e_2,e_3]^\top \). Show that constraining each scalar error by \( |e_i(t)| \leq \varepsilon_i \) implies a bound on the Euclidean norm \( \|\mathbf{e}(t)\|_2 \), and derive the tightest such upper bound in terms of \( \varepsilon_i \).

Solution: By definition,

\[ \|\mathbf{e}(t)\|_2 = \sqrt{e_1^2(t) + e_2^2(t) + e_3^2(t)}. \]

If \( |e_i(t)| \leq \varepsilon_i \) for all \( i \), then \( e_i^2(t) \leq \varepsilon_i^2 \). Therefore,

\[ \|\mathbf{e}(t)\|_2 \leq \sqrt{\varepsilon_1^2 + \varepsilon_2^2 + \varepsilon_3^2}. \]

This is the tightest bound because it can be attained by choosing \( e_i(t) = \pm \varepsilon_i \). Hence, a joint-space specification that bounds each scalar error immediately implies a bound on the overall joint-space error norm.

11. Summary

In this lesson we rigorously defined joint-space control objectives for robot manipulators. Starting from the standard rigid-body dynamics, we introduced joint-space state variables, regulation and tracking goals, and error coordinates. We then specified desired second-order error dynamics in terms of natural frequency and damping ratio, connected these to classical performance indices (settling time, overshoot), and introduced quadratic performance functionals such as ISE. Finally, we illustrated how to compute joint-space error trajectories and associated metrics in Python, C++, Java, MATLAB/Simulink, and Mathematica. Subsequent lessons will design specific joint-space controllers (e.g., PD, PID with gravity compensation) to realize the objectives formalized here.

12. References

  1. Takegaki, M., & Arimoto, S. (1981). A new feedback method for dynamic control of manipulators. Journal of Dynamic Systems, Measurement, and Control, 103(2), 119–125.
  2. Slotine, J.-J. E., & Li, W. (1987). On the adaptive control of robot manipulators. International Journal of Robotics Research, 6(3), 49–59.
  3. Spong, M. W., & Vidyasagar, M. (1989). Robot Dynamics and Control. Various journal articles and monographs on joint-space control theory.
  4. Ortega, R., Loria, A., Nicklasson, P. J., & Sira-Ramirez, H. (1994). Passivity-based control of Euler–Lagrange systems: A general survey. Automatica, 30(4), 535–548.
  5. Kelly, R. (1996). A simple set-point robot control based on Lyapunov's stability theory. IEEE Transactions on Robotics and Automation, 12(5), 804–807.
  6. Lozano, R., Fantoni, I., & Block, D. J. (2000). Stabilization of the inverted pendulum around its homoclinic orbit. Systems & Control Letters, 40(3), 197–204. (for second-order error dynamics templates).
  7. Ortega, R., Spong, M. W., Gomez-Estern, F., & Blankenstein, G. (2002). Stabilization of a class of underactuated mechanical systems via interconnection and damping assignment. IEEE Transactions on Automatic Control, 47(8), 1218–1233.