Chapter 10: Root Locus Design Techniques

Lesson 5: Design Case Studies Using Root Locus

In this lesson we apply the root locus method to concrete design case studies, focusing on motion control for a single robot joint modeled as a DC motor. We translate time-domain performance specifications into regions in the complex plane, use root locus to select controller gains, and introduce a simple lead compensator to reshape the locus when pure gain adjustment is insufficient. We then implement these designs in Python, C++, Java, MATLAB/Simulink, and Wolfram Mathematica, with comments on their use in robotics software stacks.

1. Design Workflow Using Root Locus

Consider a unity-feedback loop with open-loop transfer function \( L(s) = C(s)G(s) \), where \(G(s)\) is the plant and \(C(s)\) is the controller (compensator). The closed-loop characteristic equation is

\[ 1 + L(s) = 0 \quad\Longleftrightarrow\quad 1 + K\,C_0(s)G(s) = 0, \]

where we often factor out a scalar gain \( K > 0 \) and keep the rest of the controller and plant inside \( C_0(s)G(s) \). The root locus is the set of closed-loop pole locations in the complex plane as \( K \) varies from \(0\) to \(+\infty\).

For a second-order dominant closed-loop pair \( s_{d} = -\zeta\omega_n \pm j\omega_n\sqrt{1-\zeta^2} \), classical step-response formulas are

\[ M_p = \exp\!\left( -\frac{\pi\zeta}{\sqrt{1-\zeta^2}} \right),\quad T_s^{(2\%)} \approx \frac{4}{\zeta\omega_n}, \]

where \( M_p \) is peak overshoot and \( T_s^{(2\%)} \) is the approximate \(2\%\)-settling time. Given specifications such as \( M_p \le 0.1 \) and \( T_s^{(2\%)} \le T_{s,\max} \), we translate them into:

  • A minimum damping ratio \( \zeta_{\min} \) such that \( M_p(\zeta_{\min}) = 0.1 \) (found numerically from the overshoot formula).
  • A minimum product \( \zeta\omega_n \) satisfying \( \zeta\omega_n \ge 4/T_{s,\max} \).

These constraints define an admissible wedge and distance from the origin in the complex plane. A typical design loop is:

flowchart TD
  A["Plant model G(s) from physics / identification"] --> B["Select controller structure C(s): gain / lead / lag / lead-lag"]
  B --> C["Translate time-domain specs to s-plane region (zeta, Ts, etc.)"]
  C --> D["Plot root locus of L(s) = C(s)G(s)"]
  D --> E["Try gain-only: \nchoose K so dominant poles \nlie in admissible region"]
  E --> F{"Specs satisfied?"}
  F -->|yes| G["Validate: time response, \nrobustness, actuator limits"]
  F -->|no| H["Add poles/zeros (lead / lag) to reshape locus"]
  H --> D
        

In the next sections we instantiate this workflow for a simple robot joint driven by a DC motor, first with gain-only control and then with a lead compensator to meet more stringent specifications.

2. Case Study 1 – Gain-Only Design for a DC Motor Joint

Consider a rotary joint of a robot arm driven by a DC motor. From Chapter 3, a common linearized model for the joint position \( \theta(s) \) with voltage input \( U(s) \) is approximated by a second-order transfer function with an integrator:

\[ G(s) = \frac{\Theta(s)}{U(s)} = \frac{100}{s(0.1s + 1)} = \frac{100}{0.1s^2 + s}. \]

We use unity feedback and a proportional controller \( C(s) = K_c \), so the open-loop is \( L(s) = K_c G(s) \). The unity-feedback closed-loop transfer function from reference \(R(s)\) to \( \Theta(s) \) is

\[ T(s) = \frac{K_c G(s)}{1 + K_c G(s)} = \frac{100K_c}{s(0.1s + 1) + 100K_c}. \]

The characteristic equation is

\[ s(0.1s + 1) + 100K_c = 0 \;\Longleftrightarrow\; 0.1s^2 + s + 100K_c = 0. \]

Multiplying by \(10\) gives

\[ s^2 + 10s + 1000K_c = 0. \]

Comparing with the standard second-order form \( s^2 + 2\zeta\omega_n s + \omega_n^2 = 0 \), we identify

\[ 2\zeta\omega_n = 10,\quad \omega_n^2 = 1000K_c. \]

Therefore

\[ \zeta\omega_n = 5,\quad \omega_n = \sqrt{1000K_c},\quad \zeta = \frac{5}{\sqrt{1000K_c}}. \]

The \(2\%\)-settling time is then

\[ T_s^{(2\%)} \approx \frac{4}{\zeta\omega_n} = \frac{4}{5} = 0.8\text{ s}, \]

independent of \(K_c\). Thus, with this plant and controller structure, the settling time is fixed by the motor and load parameters. The gain \(K_c\) mainly adjusts the damping ratio \(\zeta\) and overshoot.

For a step input, the peak overshoot as a function of \(K_c\) is

\[ M_p(K_c) = \exp\!\left( -\frac{\pi\zeta}{\sqrt{1-\zeta^2}} \right) = \exp\!\left( -\frac{5\pi}{\sqrt{1000K_c - 25}} \right) \quad (K_c > 0.025). \]

Suppose the design specifications are

  • \( T_s^{(2\%)} \le 0.8\text{ s} \),
  • \( M_p \le 5\% \) for a step in reference.

The settling-time specification is automatically satisfied for any \( K_c > 0 \) because \(T_s^{(2\%)} = 0.8\text{ s}\). To enforce \( M_p \le 0.05 \), we solve

\[ \exp\!\left( -\frac{5\pi}{\sqrt{1000K_c - 25}} \right) \le 0.05. \]

Taking natural logarithms (noting that both sides are positive and \(0.05 < 1\)) gives

\[ -\frac{5\pi}{\sqrt{1000K_c - 25}} \le \ln(0.05). \]

Because \( \ln(0.05) < 0 \), the inequality reverses when divided by \(\ln(0.05)\), yielding

\[ \sqrt{1000K_c - 25} \le -\frac{5\pi}{\ln(0.05)} \approx 5.24, \]

hence

\[ 1000K_c - 25 \le 5.24^2 \approx 27.5 \quad\Longrightarrow\quad K_c \le 0.0525. \]

It is also necessary that the closed-loop poles be complex (for overshoot to be defined). The discriminant of \( s^2 + 10s + 1000K_c \) is \( \Delta = 10^2 - 4\cdot 1000K_c \), which is negative for \( K_c > 0.025 \). Thus, the range of gains that give underdamped response with less than \(5\%\) overshoot is

\[ 0.025 < K_c \le 0.0525. \]

A convenient choice is \( K_c = 0.05 \). The corresponding closed-loop poles are

\[ s^2 + 10s + 50 = 0 \quad\Longrightarrow\quad s_{1,2} = -5 \pm j5. \]

These poles lie on a line of damping ratio \( \zeta = \frac{5}{\sqrt{5^2 + 5^2}} = \frac{1}{\sqrt{2}} \approx 0.707 \), which yields a peak overshoot \( M_p \approx 4.3\% \) and settling time \( T_s^{(2\%)} \approx 0.8\text{ s} \), satisfying both specifications. On the root locus of \( L(s) = K_c G(s) \), \(K_c = 0.05\) corresponds to the point where the locus passes through \(-5 \pm j5\).

3. Interpreting the Root Locus for Case Study 1

The plant \( G(s) = 100/[s(0.1s + 1)] \) has poles at \(s = 0\) and \(s = -10\). The root locus of \(L(s) = K_cG(s)\) for \(K_c > 0\) therefore:

  • Starts at the open-loop poles \(s = 0\) and \(s = -10\).
  • One branch moves along the real axis between \(0\) and \(-10\) and then departs into the complex plane as conjugate branches.
  • As \(K_c \to \infty\), the poles move towards infinity along asymptotes at angles \( \pm 90^\circ \) from the centroid at \( \sigma_a = -5 \).

The point \(s_d = -5 \pm j5\) lies exactly on the line of asymptotes and satisfies the characteristic equation for \(K_c = 0.05\). This shows that a simple gain is sufficient to place the dominant poles in a region with acceptable damping and speed for this DC motor joint.

However, suppose we want a much faster response, e.g. \( T_s^{(2\%)} \le 0.4\text{ s} \) and \( M_p \approx 5\% \). The constraint \( \zeta\omega_n \ge 4/T_s^{(2\%)} = 10 \) together with \(\zeta \approx 0.707\) suggests dominant poles around \( s_d = -10 \pm j10 \), which lie further left in the complex plane. For the uncompensated plant, the root locus does not pass through this point with any positive gain. This motivates adding a lead compensator to reshape the locus.

4. Case Study 2 – Lead Compensation for Faster Joint Response

We retain the same plant \( G(s) = 100/[s(0.1s + 1)] \) but now require

  • \( T_s^{(2\%)} \le 0.4\text{ s} \),
  • \( M_p \approx 5\% \) (i.e., \(\zeta \approx 0.7\)).

Using \( T_s^{(2\%)} \approx 4/(\zeta\omega_n) \) with \(\zeta \approx 0.707\) and \(T_s^{(2\%)} = 0.4\text{ s}\), we get

\[ \zeta\omega_n \approx \frac{4}{0.4} = 10,\quad \omega_n \approx \frac{10}{0.707} \approx 14.14. \]

Hence we desire dominant poles approximately at

\[ s_d = -\zeta\omega_n \pm j\omega_n\sqrt{1-\zeta^2} \approx -10 \pm j10. \]

For the uncompensated loop \(L_0(s) = K_c G(s)\), the angle condition at \(s_d\) is

\[ \angle L_0(s_d) = -\big(\angle(s_d - 0) + \angle(s_d + 10)\big) = -\big(\angle(-10 + j10) + \angle(j10)\big). \]

Computing the angles (in degrees),

\[ \angle(-10 + j10) = 135^\circ,\quad \angle(j10) = 90^\circ, \]

so

\[ \angle L_0(s_d) = -(135^\circ + 90^\circ) = -225^\circ \equiv 135^\circ \pmod{360^\circ}. \]

The root-locus condition for a closed-loop pole is \( \angle L(s_d) = (2k+1)\cdot 180^\circ \). If we choose \(k=0\), we require \(\angle L(s_d) = 180^\circ\), so an additional \(45^\circ\) of phase lead is needed:

\[ \phi_c = 180^\circ - 135^\circ = 45^\circ. \]

We choose a lead compensator of the form \( C_\ell(s) = K_\ell \frac{s + z_c}{s + p_c} \) with real negative zero and pole \(z_c, p_c < 0\) and \(z_c > p_c\). Let us place the zero and pole on the real axis at \( z_c = -10 \) and \( p_c = -20 \). Their angle contribution at \(s_d = -10 + j10\) is

\[ \angle(s_d - z_c) = \angle(j10) = 90^\circ,\quad \angle(s_d - p_c) = \angle(10 + j10) = 45^\circ, \]

so the net phase added by the compensator is

\[ \phi_c(s_d) = \angle(s_d - z_c) - \angle(s_d - p_c) = 90^\circ - 45^\circ = 45^\circ, \]

exactly what is required. The total angle becomes

\[ \angle L(s_d) = \angle L_0(s_d) + \phi_c(s_d) = 135^\circ + 45^\circ = 180^\circ, \]

so \(s_d\) lies on the root locus of the compensated system.

The magnitude condition determines \(K_\ell\). Let \( L(s) = C_\ell(s)G(s) \). At \(s_d\),

\[ |L(s_d)| = K_\ell\, \frac{|s_d + z_c|}{|s_d + p_c|} \frac{100}{|s_d|\cdot|0.1s_d + 1|}. \]

Using the specific numbers \(z_c = -10\), \(p_c = -20\), \(s_d = -10 + j10\), one can compute (numerically or symbolically) that

\[ \left|\frac{s_d + z_c}{s_d + p_c}\right| = \frac{|j10|}{|10 + j10|} = \frac{10}{\sqrt{10^2 + 10^2}} = \frac{1}{\sqrt{2}}, \]

\[ |G(s_d)| = \left|\frac{100}{s_d(0.1s_d + 1)}\right| = \sqrt{50}. \]

Thus

\[ |L(s_d)| = K_\ell \cdot \frac{1}{\sqrt{2}} \cdot \sqrt{50} = K_\ell \cdot 5. \]

The magnitude condition \( |L(s_d)| = 1 \) gives

\[ K_\ell = 0.2. \]

Therefore a suitable lead compensator is

\[ C_\ell(s) = 0.2\,\frac{s + 10}{s + 20}. \]

With unity feedback, the compensated loop has a dominant pole pair near \(s_d = -10 \pm j10\), giving

\[ \zeta \approx \frac{10}{\sqrt{10^2 + 10^2}} = \frac{1}{\sqrt{2}}, \quad \omega_n \approx \sqrt{10^2 + 10^2} = \sqrt{200} \approx 14.14, \]

and thus

\[ T_s^{(2\%)} \approx \frac{4}{\zeta\omega_n} \approx \frac{4}{10} = 0.4\text{ s},\quad M_p \approx 4.3\%. \]

The conceptual block diagram of this compensated joint controller is:

flowchart TD
  R["Reference r(s)"] --> C["Lead controller C_l(s) = 0.2 (s + 10)/(s + 20)"]
  C --> G["Motor and load G(s) = 100/(s (0.1 s + 1))"]
  G --> Y["Joint angle theta(s)"]
  Y --> SUM["Summing junction"] --> C
  R --> SUM
        

In practice, this design step uses software-generated root loci and s-plane plots, but the phase and magnitude calculations above show why the chosen compensator and gain satisfy the root-locus conditions analytically.

5. Python Implementation for Root-Locus-Based Joint Control

We implement both designs in Python using the python-control library for linear system analysis. In a robotics context, this can be combined with packages such as roboticstoolbox-python to embed the joint model inside a larger manipulator model.


import numpy as np
import control as ctrl
import matplotlib.pyplot as plt

# Plant: G(s) = 100 / (s (0.1 s + 1))
s = ctrl.TransferFunction.s
G = 100 / (s * (0.1 * s + 1))

# --- Case Study 1: proportional control only ---
Kc1 = 0.05
C1 = Kc1
L1 = C1 * G              # open loop
T1 = ctrl.feedback(L1, 1)  # closed loop with unity feedback

poles_T1 = ctrl.pole(T1)
print("Case 1 poles:", poles_T1)

# --- Case Study 2: lead compensator ---
Kc2 = 0.2
C_lead = Kc2 * (s + 10) / (s + 20)
L2 = C_lead * G
T2 = ctrl.feedback(L2, 1)
poles_T2 = ctrl.pole(T2)
print("Case 2 poles:", poles_T2)

# Root locus for compensated loop
plt.figure()
ctrl.rlocus(L2, kvect=np.linspace(0, 1.0, 200))
plt.title("Root locus of lead-compensated loop")

# Step responses for comparison
t = np.linspace(0, 2.0, 1000)
t1, y1 = ctrl.step_response(T1, t)
t2, y2 = ctrl.step_response(T2, t)

plt.figure()
plt.plot(t1, y1, label="Case 1: Kc = 0.05")
plt.plot(t2, y2, label="Case 2: lead C_l(s)")
plt.xlabel("Time [s]")
plt.ylabel("Joint angle response")
plt.legend()
plt.grid(True)
plt.show()

# Robotics context (conceptual sketch):
# from roboticstoolbox import DHRobot, RevoluteDH
# Define a 1-DOF robot joint whose dynamics are approximated by G(s);
# the closed-loop transfer T2(s) can be used within a higher-level
# trajectory generator or simulation loop.
      

The root locus and step responses show how the lead compensator moves dominant poles leftwards, reducing settling time while maintaining acceptable overshoot. In a full robotic manipulator model, each joint can be equipped with a similar local loop, while a higher-level controller computes reference trajectories \(r(t)\) for the joints.

6. C++ Implementation for Embedded and Robotics Control

In C++, root-locus design is typically performed offline, but the resulting controller is implemented in embedded firmware or in a ROS node. Libraries such as Eigen are widely used in robotics for matrix computations. Below we compute the closed-loop poles for the proportional design using the quadratic formula.


#include <iostream>
#include <complex>
// Optionally, for larger robotics systems:
// #include <Eigen/Dense>

int main() {
    // Characteristic polynomial: s^2 + 10 s + 1000 Kc = 0
    double Kc = 0.05;  // Case Study 1
    double a = 1.0;
    double b = 10.0;
    double c = 1000.0 * Kc;

    std::complex<double> disc = std::sqrt(
        std::complex<double>(b * b - 4.0 * a * c, 0.0)
    );
    std::complex<double> s1 = (-b + disc) / (2.0 * a);
    std::complex<double> s2 = (-b - disc) / (2.0 * a);

    std::cout << "Closed-loop poles for Kc = " << Kc << ":\n";
    std::cout << "s1 = " << s1 << "\n";
    std::cout << "s2 = " << s2 << "\n";

    // In a real robot joint controller, Kc (and possibly the lead compensator)
    // would be used inside a discrete-time control loop, e.g.
    // u[k] = Kc * (r[k] - y[k]);
    // The plant dynamics would be integrated numerically with a sampling time Ts.
    return 0;
}
      

A ROS-based joint controller might embed this logic in a node, using joint encoders to measure \( \theta(t) \) and sending voltage (or torque commands) to the actuator. Higher-level motion planners (e.g., based on collision-free path planning) remain agnostic to these low-level gains, relying only on the approximate closed-loop bandwidth and damping implied by the root-locus design.

7. Java Implementation and Numerical Analysis

Java is less common for low-level control loops but is used in robotics simulation and teaching environments. We can use numerical libraries such as EJML or Apache Commons Math for polynomial root finding and matrix computations. For the present quadratic characteristic, we can derive the roots analytically.


public class RootLocusCase1 {

    public static void main(String[] args) {
        double Kc = 0.05;  // proportional gain from Case Study 1

        // Characteristic: s^2 + 10 s + 1000 Kc = 0
        double a = 1.0;
        double b = 10.0;
        double c = 1000.0 * Kc;

        double disc = b * b - 4.0 * a * c;

        // Complex roots
        double realPart = -b / (2.0 * a);
        double imagPart = Math.sqrt(Math.abs(disc)) / (2.0 * a);

        System.out.println("Closed-loop poles for Kc = " + Kc + ":");
        System.out.println("s1 = " + realPart + " + j" + imagPart);
        System.out.println("s2 = " + realPart + " - j" + imagPart);

        // In a Java-based robot simulator, these poles can be used to set
        // integration step sizes or to compare candidate controller designs
        // before deployment to embedded hardware.
    }
}
      

For higher-order plants, a Java-based control design tool could compute full root loci numerically, using sampling in \(K\) and solving for polynomial roots at each value, then plotting trajectories of poles in the complex plane.

8. MATLAB/Simulink Implementation

MATLAB and Simulink are standard tools in control engineering and robotics. Below is a script implementing the two designs and visualizing their root loci and step responses.


% Plant and variable s
s = tf('s');
G = 100 / (s * (0.1 * s + 1));

% --- Case Study 1: proportional control ---
Kc1 = 0.05;
C1 = Kc1;
L1 = C1 * G;
T1 = feedback(L1, 1);

% --- Case Study 2: lead compensator ---
Kc2 = 0.2;
C_lead = Kc2 * (s + 10) / (s + 20);
L2 = C_lead * G;
T2 = feedback(L2, 1);

% Root locus of compensated system
figure;
rlocus(L2);
title('Root locus of lead-compensated loop');

% Step responses
t = 0:0.002:2;
[y1, t1] = step(T1, t);
[y2, t2] = step(T2, t);

figure;
plot(t1, y1, 'LineWidth', 1.5); hold on;
plot(t2, y2, 'LineWidth', 1.5);
grid on;
xlabel('Time [s]');
ylabel('Joint angle response');
legend('Case 1: Kc = 0.05', 'Case 2: Lead C_l(s)');

% Simulink implementation:
%  - Use a Transfer Fcn block for G(s).
%  - Implement C1(s) = Kc1 as a Gain block, or C_l(s) as a series of
%    Zero-Pole blocks (zero at -10, pole at -20) plus a Gain block 0.2.
%  - Close the unity feedback loop around the joint and apply step inputs
%    to observe tracking performance.
      

In robotic applications, the same Simulink model can be connected to a multi-body dynamics model of a manipulator (e.g., using Simscape Multibody) to study the interaction between joint servo loops and overall arm motion.

9. Wolfram Mathematica Implementation

Mathematica provides symbolic and numeric tools that are useful for verifying root-locus designs and performing parameter studies.


(* Define Laplace variable and plant *)
s =. ;
G[s_] := 100/(s (0.1 s + 1));

(* Case 1: proportional control *)
Kc1 = 0.05;
char1[s_] := s^2 + 10 s + 1000 Kc1;
poles1 = Solve[char1[s] == 0, s]

(* Case 2: lead compensator C_l(s) = 0.2 (s + 10)/(s + 20) *)
Kc2 = 0.2;
Cl[s_] := Kc2 (s + 10)/(s + 20);
L2[s_] := Cl[s] G[s];

(* Closed-loop characteristic 1 + L2(s) == 0 *)
char2[s_] := 1 + L2[s];
poles2 = s /. Solve[char2[s] == 0, s]

(* Root locus as K varies (keeping lead structure fixed) *)
k =. ;
Lk[s_] := k (s + 10)/(s + 20) G[s];
RootLocusPlot[Lk[s], {k, 0, 1},
  PlotRange -> All,
  AxesLabel -> {"Re(s)", "Im(s)"},
  PlotLabel -> "Root locus of lead-compensated loop"
]

(* Step responses (numerically) *)
sys1 = TransferFunctionModel[100 Kc1/(s (0.1 s + 1) + 100 Kc1), s];
sys2 = TransferFunctionModel[
   (0.2 (s + 10)/(s + 20)) 100/(s (0.1 s + 1) + 0.2 (s + 10)/(s + 20) 100),
   s
];

StepResponsePlot[{sys1, sys2}, {t, 0, 2},
  PlotLegends -> {"Case 1", "Case 2"}
]
      

Symbolic manipulation of \( \chi(s) = 1 + L(s) \) can be used to verify analytically that the chosen \(s_d\) and \(C_\ell(s)\) satisfy the angle and magnitude conditions of the root-locus method.

10. Problems and Solutions

Problem 1 (Gain selection with fixed settling time): For the plant of Case Study 1, \( G(s) = 100/[s(0.1s + 1)] \) and unity feedback with proportional controller \(C(s) = K_c\), derive the expressions for \( \zeta(K_c) \) and \( T_s^{(2\%)}(K_c) \), and show that the settling time is independent of \(K_c\).

Solution: From Section 2 the characteristic equation is

\[ s^2 + 10s + 1000K_c = 0, \]

which matches the standard second-order form \( s^2 + 2\zeta\omega_n s + \omega_n^2 = 0 \) with

\[ 2\zeta\omega_n = 10,\quad \omega_n^2 = 1000K_c. \]

Hence

\[ \zeta\omega_n = 5,\quad \omega_n = \sqrt{1000K_c},\quad \zeta(K_c) = \frac{5}{\sqrt{1000K_c}}. \]

The \(2\%\)-settling time is

\[ T_s^{(2\%)}(K_c) \approx \frac{4}{\zeta\omega_n} = \frac{4}{5}, \]

which is constant (independent of \(K_c\)). This explains why the root locus moves along curves that maintain a fixed product \(\zeta\omega_n\).

Problem 2 (Deriving overshoot constraint in terms of \(K_c\)): Using the same plant and controller, derive an explicit inequality on \(K_c\) such that the peak overshoot of the step response satisfies \( M_p \le M_{p,\max} \), where \(0 < M_{p,\max} < 1\).

Solution: From Problem 1,

\[ \zeta(K_c) = \frac{5}{\sqrt{1000K_c}}. \]

For a second-order underdamped system, overshoot is

\[ M_p(K_c) = \exp\!\left( -\frac{\pi\zeta(K_c)}{\sqrt{1-\zeta(K_c)^2}} \right) = \exp\!\left( -\frac{5\pi}{\sqrt{1000K_c - 25}} \right), \quad K_c > 0.025. \]

The requirement \(M_p(K_c) \le M_{p,\max}\) implies

\[ -\frac{5\pi}{\sqrt{1000K_c - 25}} \le \ln(M_{p,\max}), \]

and since \(\ln(M_{p,\max}) < 0\), we get

\[ \sqrt{1000K_c - 25} \le -\frac{5\pi}{\ln(M_{p,\max})}, \]

therefore

\[ K_c \le \frac{1}{1000}\left( \left(\frac{-5\pi}{\ln(M_{p,\max})}\right)^2 + 25 \right). \]

This yields an explicit upper bound on \(K_c\) for any desired overshoot level. For example, \(M_{p,\max} = 0.05\) gives \(K_c \le 0.0525\) as in Section 2.

Problem 3 (Angle condition for lead compensator): For the lead compensator of Case Study 2, \( C_\ell(s) = 0.2(s + 10)/(s + 20) \), verify analytically that the additional phase at \( s_d = -10 + j10 \) is \(45^\circ\).

Solution: The zero and pole are at \(z_c = -10\) and \(p_c = -20\), so

\[ \angle(s_d - z_c) = \angle((-10 + j10) - (-10)) = \angle(j10) = 90^\circ, \]

\[ \angle(s_d - p_c) = \angle((-10 + j10) - (-20)) = \angle(10 + j10) = 45^\circ. \]

The net phase contributed by the compensator is

\[ \phi_c(s_d) = \angle(s_d - z_c) - \angle(s_d - p_c) = 90^\circ - 45^\circ = 45^\circ, \]

as required by the root-locus angle condition.

Problem 4 (Location of uncompensated root locus relative to desired pole): For the uncompensated loop \(L_0(s) = K_cG(s)\) with \( G(s) = 100/[s(0.1s + 1)] \), compute \(\angle L_0(s_d)\) at \(s_d = -10 + j10\) and show that no positive \(K_c\) can place a closed-loop pole exactly at \(s_d\) without compensation.

Solution: As in Section 4, the plant poles are at \(0\) and \(-10\). Thus

\[ \angle L_0(s_d) = -\big(\angle(s_d - 0) + \angle(s_d + 10)\big) = -\big(135^\circ + 90^\circ\big) = -225^\circ \equiv 135^\circ \pmod{360^\circ}. \]

For \(s_d\) to lie on the root locus, we need \( \angle L_0(s_d) = (2k+1)\cdot 180^\circ \). The value \(135^\circ\) is not congruent to any odd multiple of \(180^\circ\), so there is no real positive gain \(K_c\) such that \(s_d\) is a closed-loop pole of the uncompensated system. This motivates the addition of the lead compensator.

Problem 5 (Design variant): For the same plant \(G(s)\), suppose we desire dominant poles at \(s_d = -8 \pm j8\). Propose a different lead compensator \( \tilde{C}_\ell(s) \) with real zero and pole on the negative real axis that provides the required phase advance at \(s_d\). Outline the steps needed to determine the zero, pole, and gain of \(\tilde{C}_\ell(s)\).

Solution (outline):

  1. Compute the plant phase at \(s_d\): \( \phi_G = \angle G(s_d) \).
  2. Compute the desired phase: \( \phi_{\text{req}} = (2k+1)\cdot 180^\circ \) for some integer \(k\), typically \(k=0\).
  3. Compute the required phase contribution from the compensator: \( \phi_c = \phi_{\text{req}} - \phi_G \).
  4. Choose a real zero \(z_c = -a\) and a real pole \(p_c = -b\) with \(a > 0\), \(b > a\), and solve \( \angle(s_d + a) - \angle(s_d + b) = \phi_c \) for \(a\) and \(b\). This may require numerical methods.
  5. Using the magnitude condition \( |C_\ell(s_d)G(s_d)| = 1 \), compute the gain \(K_\ell\) so that \( C_\ell(s) = K_\ell (s + a)/(s + b) \) places a closed-loop pole at \(s_d\).

This mirrors the procedure used in Case Study 2 but with different numerical values and potentially a different combination of zero and pole locations on the real axis.

11. Summary

In this lesson we moved beyond abstract root-locus rules and applied them to concrete controller designs for a robot joint modeled as a DC motor. For a plant \(G(s) = 100/[s(0.1s + 1)]\), we showed how a pure proportional controller can satisfy moderate overshoot and settling-time requirements, and how the resulting closed-loop poles lie on the root locus at \(s = -5 \pm j5\).

We then imposed stricter specifications and demonstrated that the uncompensated root locus cannot pass through the desired poles \(s_d = -10 \pm j10\) for any positive gain. By adding a lead compensator \(C_\ell(s) = 0.2(s + 10)/(s + 20)\), we reshaped the locus so that the angle and magnitude conditions are satisfied at \(s_d\), yielding a closed loop with \(T_s^{(2\%)} \approx 0.4\text{ s}\) and \(M_p \approx 4.3\%\).

Finally, we implemented these designs in multiple programming languages and software environments used in control engineering and robotics, reinforcing the link between analytic design (via root locus) and practical deployment on robot hardware and simulation platforms.

12. References

  1. Evans, W.R. (1948). Control system synthesis by root-locus method. Transactions of the American Institute of Electrical Engineers, 67(1), 547–551.
  2. Evans, W.R. (1950). Graphical analysis of control systems. Transactions of the American Institute of Electrical Engineers, 69(1), 127–137.
  3. Jury, E.I. (1962). A simplified stability criterion for linear discrete systems. Proceedings of the IRE, 50(6), 1493–1500.
  4. MacFarlane, A.G.J. (1955). On the root locus of linear feedback systems. Proceedings of the IEE, Part II, 102(1), 78–88.
  5. Kuo, B.C. (1963). Frequency-response and root-locus design of feedback control systems. IRE Transactions on Automatic Control, 8(2), 143–152.
  6. Atherton, D.P. (1968). The application of Evans' root locus method to practical feedback systems. International Journal of Control, 7(2), 115–135.
  7. Davison, E.J. (1970). The output control of linear time-invariant systems. IEEE Transactions on Automatic Control, 15(2), 219–225.