Chapter 16: Nichols Chart and Classical Design

Lesson 5: Comparison with Bode and Nyquist Design Methods

This lesson compares controller design using Nichols charts with Bode- and Nyquist-based approaches. We develop the mathematical equivalence between the three frequency-domain representations, explain how stability margins and performance specifications are read in each, and discuss practical workflows and software implementations relevant to robotic servo and motion-control systems.

1. Unified Classical Frequency-Domain View

For a single-input single-output (SISO) unity-feedback loop with plant \( G(s) \) and controller \( C(s) \), the loop transfer function is

\[ L(s) = C(s)G(s). \]

The closed-loop transfer function from reference to output and the sensitivity function are

\[ T(s) = \frac{L(s)}{1 + L(s)}, \qquad S(s) = \frac{1}{1 + L(s)}. \]

Bode, Nyquist, and Nichols methods are all different ways of visualizing the same complex-valued function \( L(j\omega) \) (or, occasionally, \( T(j\omega) \)) as frequency \( \omega \) varies. In this sense:

  • Bode design: works in the planes \((\log\omega,\;20\log_{10}|L(j\omega)|)\) and \((\log\omega,\;\angle L(j\omega))\).
  • Nyquist design: works directly in the complex plane of \( L(j\omega) \).
  • Nichols design: works in the plane \((\angle L(j\omega),\;20\log_{10}|L(j\omega)|)\), with overlays of closed-loop contours.

Because the underlying function is identical, all three methods give the same stability and performance conclusions provided that the designer interprets them correctly and uses a sufficiently fine frequency grid.

2. Geometric Relationship Between Bode, Nyquist, and Nichols

Let \( L(j\omega) \) be parameterized simultaneously in rectangular and polar form:

\[ L(j\omega) = x(\omega) + j y(\omega) = r(\omega)\,e^{j\varphi(\omega)}, \qquad r(\omega) = |L(j\omega)|,\; \varphi(\omega) = \arg L(j\omega). \]

Then:

  • The Nyquist plot is the locus \( (x(\omega), y(\omega)) \) in the complex plane as \( \omega \) sweeps the Nyquist contour.
  • The Bode magnitude plot is the curve \( (\log_{10}\omega,\;20\log_{10} r(\omega)) \), and the Bode phase plot is \( (\log_{10}\omega,\;\varphi(\omega)\text{ (deg)}) \).
  • The Nichols plot is the curve \( (\varphi(\omega)\text{ (deg)},\;20\log_{10} r(\omega)) \).

Thus, Bode and Nichols plots are simply different projections of the same parametric curve \( L(j\omega) \) described in the Nyquist plane: one projects onto magnitude/phase vs frequency, the other projects onto magnitude vs phase.

flowchart TD
  L["Loop transfer L(jw)"] --> NQ["Nyquist: Re(L) vs Im(L)"]
  L --> BO["Bode: mag (dB) & phase vs log w"]
  L --> NI["Nichols: phase vs mag (dB)"]
  BO --> INT["Specs: margins, bandwidth, slopes"]
  NQ --> INT
  NI --> INT
        

For minimum-phase systems, Bode's gain–phase relation states that \( |L(j\omega)| \) uniquely determines \( \varphi(\omega) \). Consequently, knowledge of the Bode magnitude alone determines the Nyquist and Nichols curves up to a constant phase shift.

3. Stability Margins – Equivalence of Bode, Nyquist, Nichols

For unity negative feedback, the closed-loop characteristic equation is \( 1 + L(s) = 0 \). The Nyquist criterion tells us that, for a loop with \( P \) unstable poles of \( L(s) \) and \( N \) clockwise encirclements of the point \( -1 \) by the Nyquist plot of \( L(j\omega) \), the number of unstable closed-loop poles \( Z \) is

\[ Z = N + P. \]

For a desired stable closed loop (no right-half-plane zeros of \( 1+L(s) \)), we require \( Z = 0 \), hence \( N = -P \). This condition is read:

  • Directly from the Nyquist plot via encirclements of \( -1 \).
  • From the Bode plot using gain margin and phase margin.
  • From the Nichols plot via the position of \( L(j\omega) \) relative to the \( -1 \) point mapped into the Nichols plane.

Let \( \omega_{180} \) be the frequency where the loop phase reaches \( -180^\circ \), and \( \omega_{\text{gc}} \) the frequency where \( |L(j\omega)| = 1 \) (0 dB).

\[ \text{Gain margin:}\quad \text{GM} = \frac{1}{|L(j\omega_{180})|}, \qquad \text{Phase margin:}\quad \text{PM} = 180^\circ + \angle L(j\omega_{\text{gc}}). \]

These definitions are independent of how we plot \( L(j\omega) \):

  • On a Bode plot, \( \text{GM} \) and \( \text{PM} \) are read directly from crossings of 0 dB and \( -180^\circ \).
  • On a Nyquist plot, they correspond to the distance of the Nyquist locus from the point \( -1 \) along the ray of phase \( -180^\circ \) and the angular separation between that ray and the ray through the point where \( |L(j\omega)| = 1 \).
  • On a Nichols plot, they are obtained by measuring how far the curve at \( \angle L(j\omega) = -180^\circ \) lies above or below the 0 dB line (for GM) and how far the 0 dB point lies from the \( -180^\circ \) vertical line (for PM).

Thus stability margins are invariant objects that each representation encodes geometrically in a different but equivalent way.

4. Closed-Loop Performance, M-Circles, and Nichols vs Bode

Nichols charts are particularly attractive for design because they directly overlay closed-loop performance contours on the open-loop Nichols plot. The main objects are the \( M \)-circles associated with the complementary sensitivity \( T(j\omega) \) and, sometimes, \( N \)-circles associated with the sensitivity \( S(j\omega) \).

Let \( L = L(j\omega) \), and write in rectangular form \( L = x + jy \). Then

\[ T(j\omega) = \frac{L}{1+L} = \frac{x + jy}{1 + x + jy}. \]

The squared magnitude of \( T \) is

\[ |T(j\omega)|^2 = \frac{x^2 + y^2}{(1 + x)^2 + y^2}. \]

For a fixed closed-loop magnitude level \( M = |T(j\omega)| \), we set \( |T(j\omega)|^2 = M^2 \) and obtain

\[ M^2\bigl((1 + x)^2 + y^2\bigr) = x^2 + y^2. \]

Rearranging and completing the square in \( x \) yields the circle:

\[ \left( x + \frac{1 - M^2}{1 + M^2} \right)^2 + y^2 = \left( \frac{2M}{1 + M^2} \right)^2. \]

Thus, each constant \( |T| = M \) contour is a circle in the Nyquist plane. When we map \( L(j\omega) \) into the Nichols plane (phase vs magnitude in dB), these circles become the familiar bent \( M \)-contours. A design requirement such as \( |T(j\omega)| \leq M_{\max} \) for all frequencies directly constrains the Nichols locus to lie below a corresponding \( M_{\max} \)-contour.

On a Bode plot, the same constraint appears only implicitly through bounds on the magnitude of \( T(j\omega) \). Nichols charts, by contrast, encode both open-loop and closed-loop information in a single plot, which can be more convenient when tuning by hand.

5. Workflow Comparison and Method Selection

A typical SISO loop-shaping workflow proceeds through the same logical steps regardless of visualization:

  1. Translate time-domain specs (overshoot, settling time) into frequency-domain targets (bandwidth, peak \( |T| \), margins).
  2. Choose an initial controller structure (P/PI/PID, lead, lag, lead–lag).
  3. Iteratively adjust controller parameters to place the loop shape within allowable stability and performance regions.
  4. Verify stability and robustness; iterate as needed.

The main difference is which plot you choose to manipulate in step 3:

  • Bode-based design: emphasises slopes, corner frequencies, and straight-line approximations.
  • Nyquist-based design: emphasises encirclements of \( -1 \), important with time delays and non-minimum-phase plants.
  • Nichols-based design: emphasises closed-loop performance contours (via \( M \)- and \( N \)-circles).
flowchart TD
  START["Start from specs \n(overshoot, bandwidth, margins)"] --> P1["Pick controller structure"]
  P1 --> CHOOSE["Choose design view"]
  CHOOSE --> BODE["Bode: tune gains \nand corner frequencies"]
  CHOOSE --> NYQ["Nyquist: enforce safe \ndistance from -1"]
  CHOOSE --> NICH["Nichols: keep loop \ninside M-circle limits"]
  BODE --> VERIFY["Simulate and verify"]
  NYQ --> VERIFY
  NICH --> VERIFY
  VERIFY --> ITER["Adjust design if specs not met"]
  ITER --> CHOOSE
        

For many practical robotic servos, designers sketch the desired loop shape on a Bode plot, then cross-check Nyquist stability and optionally use Nichols overlays to guarantee bounds on \( |T| \) and \( |S| \).

6. Analytical Example – Same Design in Three Views

Consider a unity-feedback loop with plant

\[ G(s) = \frac{10}{s(s+1)(s+5)}, \qquad C(s) = K. \]

This type of transfer function is a common linearized model of an actuated mechanical axis (e.g., a robotic joint with motor dynamics and load inertia). Suppose we want

  • Phase margin \( \text{PM} \geq 50^\circ \),
  • Bandwidth (closed-loop \( -3\text{ dB} \) point) around \( \omega_{\text{BW}} \approx 4 \) rad/s,
  • Low steady-state error to step input (achieved here by the pole at the origin).

The loop transfer function is

\[ L(s) = K G(s) = \frac{10K}{s(s+1)(s+5)}. \]

Bode-based design:

  1. Plot the Bode diagram of \( G(s) \) and find the frequency where the phase is about \( -130^\circ \) (to allow a phase margin of about \( 50^\circ \)).
  2. Choose \( K \) so that at that frequency the magnitude of \( L(j\omega) \) is 0 dB; this sets \( \omega_{\text{gc}} \approx \omega_{\text{BW}} \).
  3. Verify the actual phase margin and bandwidth via the Bode plot.

Nyquist-based design:

  1. Plot the Nyquist locus of \( L(j\omega) \) for a trial gain \( K \).
  2. Scale \( K \) so that the distance of the Nyquist curve from \( -1 \) corresponds to the desired phase margin (roughly the angle between the ray through the closest point and the negative real axis).
  3. Confirm that the curve does not encircle \( -1 \) (for this stable plant), i.e., \( N = 0 \).

Nichols-based design:

  1. Plot the Nichols locus of \( L(j\omega) \) along with \( M \)-circles for \( |T| \) and optionally \( N \)-circles for \( |S| \).
  2. Adjust \( K \) until the locus lies between the desired \( M \)-circles (e.g., peak \( |T| \) less than about 2 dB, corresponding to modest overshoot) while preserving sufficient distance from the critical region corresponding to Nyquist encirclement of \( -1 \).
  3. Read off the resulting gain and phase margins directly from the Nichols diagram.

All three methods arrive at the same gain \( K \) (up to numerical tolerance) but emphasize different visual cues. Nichols is particularly efficient when constraints on \( |T| \) and \( |S| \) must be enforced simultaneously over multiple frequency bands.

7. Python Lab — Bode, Nyquist, Nichols with python-control

The python-control library provides Bode, Nyquist, and Nichols plotting functions, and is widely used for prototyping robot servo loops and actuator controllers. Below we reproduce the example plant and compare the three views.


import numpy as np
import matplotlib.pyplot as plt
import control as ctrl  # python-control

# Plant: typical lightly damped robotic joint axis (simplified)
s = ctrl.TransferFunction.s
G = 10 / (s * (s + 1) * (s + 5))

# Proportional controller
K = 40.0  # choose a trial gain
C = ctrl.TransferFunction([K], [1])
L = C * G

# 1) Bode plot with stability margins
omega = np.logspace(-2, 2, 500)
mag, phase, w = ctrl.bode_plot(L, omega, dB=True, Hz=False, deg=True, Plot=False)
# python-control 0.10+ can return a ControlPlot; here we use the older API style
ctrl.bode_plot(L, omega, dB=True, Hz=False, deg=True, Plot=True)
gm, pm, wg, wp = ctrl.margin(L)
print("Gain margin (abs):", gm, "at w =", wg)
print("Phase margin (deg):", pm, "at w =", wp)

# 2) Nyquist plot
plt.figure()
ctrl.nyquist_plot(L)

# 3) Nichols plot with chart grid (closed-loop M- and N-contours)
plt.figure()
ctrl.nichols_plot(L, omega, grid=True)

plt.show()
      

For robotics, python-control can be combined with a robotics modeling library (e.g., Robotics Toolbox for Python) to extract linear joint models around operating points and then design classical compensators using the frequency-domain views presented here. The resulting controller gains can subsequently be deployed to embedded hardware or ROS-based controllers.

8. MATLAB/Simulink Lab — Classical Design and Robotics Toolboxes

MATLAB's Control System Toolbox provides direct support for Bode, Nyquist, and Nichols plots, and is tightly integrated with robotics toolboxes for manipulator and mobile robot modeling. The following script illustrates the same plant and compares designs in the three views.


% Plant and controller
s = tf('s');
G = 10 / (s*(s + 1)*(s + 5));
K = 40;
C = K;
L = C*G;

% 1) Bode design and margins
figure;
margin(L); % Bode plus gain/phase margins

% 2) Nyquist plot
figure;
nyquist(L);

% 3) Nichols plot (open-loop Nichols)
figure;
nichols(L); grid on;

% Example: enforce a minimum phase margin and bandwidth by interactive tuning
% nichols(L) can be used with 'nicholsedit' in some releases, or use sisotool:
% sisotool(G);

% Robotics connection:
% - Use Robotics System Toolbox or Robotics Toolbox for MATLAB to build a
%   manipulator model.
% - Linearize the robot joint dynamics about a pose using LINEARIZE or linmod.
% - Use Bode/Nyquist/Nichols plots of the joint loop to design the servo gains.

      

In Simulink, the same controller can be implemented with Transfer Function and PID blocks, and tuned using the Frequency Response Estimator together with the Control System Designer app, making it straightforward to test robot joint controllers in simulation before deployment.

9. C++ and ROS Control — Embedding Classical Designs

In many robotic platforms, especially those based on ROS or ROS 2, frequency-domain controller design is performed offline (e.g., in Python or MATLAB), and the resulting gains are implemented in C++ using libraries such as control_toolbox together with ros2_control.


#include <control_toolbox/pid.hpp>
#include <chrono>

class JointVelocityController {
public:
  JointVelocityController(double kp, double ki, double kd, double dt)
    : pid_(kp, ki, kd, -1e6, 1e6), dt_(dt) {}

  double update(double velocity_command, double velocity_measured) {
    double error = velocity_command - velocity_measured;
    // control_toolbox::Pid::computeCommand takes error and dt
    double u = pid_.computeCommand(error, rclcpp::Duration::from_seconds(dt_));
    return u; // send to motor driver
  }

private:
  control_toolbox::Pid pid_;
  double dt_;
};

// In your ROS2 node, choose kp, ki, kd from Bode/Nichols design:
int main() {
  // Example gains obtained by Nichols-chart tuning for desired margins
  double kp = 40.0;
  double ki = 0.0;
  double kd = 0.0;

  double dt = 0.001; // 1 kHz loop
  JointVelocityController ctrl(kp, ki, kd, dt);
  // Inside a timer callback, call ctrl.update(...) each cycle.
}
      

Here, the numerical values kp, ki, and kd can be chosen by matching the desired Nyquist or Nichols loop shape of the robot joint model. The same loop can be inspected in Bode, Nyquist, or Nichols form; the selection only affects the designer's visualization, not the actual controller code.

10. Java (WPILib) and Wolfram Mathematica

In Java-based educational and competition robotics (e.g., FRC), the WPILib library provides PID controllers that can use gains derived from any of the three frequency-domain methods. The classical design still takes place in a tool like Python, MATLAB, or Mathematica; the gains are then implemented in the robot code.


import edu.wpi.first.math.controller.PIDController;

public class JointServo {
  private final PIDController pid;

  public JointServo() {
    // Gains tuned offline via Bode/Nyquist/Nichols
    double kp = 40.0;
    double ki = 0.0;
    double kd = 0.0;
    pid = new PIDController(kp, ki, kd);
    pid.setTolerance(0.01); // rad/s tolerance, for example
  }

  public double update(double setpoint, double measurement) {
    pid.setSetpoint(setpoint);
    double output = pid.calculate(measurement);
    return output; // send to motor drive
  }
}
      

Wolfram Mathematica offers symbolic and numeric tools for classical analysis and design, including BodePlot, NyquistPlot, and NicholsPlot. This is particularly useful for deriving exact expressions and then exporting numeric controller parameters for robotic applications.


(* Define transfer function model *)
s = LaplaceTransform[t, t, s];
G = TransferFunctionModel[10/(s (s + 1) (s + 5)), s];

(* Open-loop with proportional controller *)
K = 40;
L = K G;

(* 1) Bode, Nyquist, Nichols *)
BodePlot[L, {1/100, 100}]
NyquistPlot[L, {1/100, 100}]
NicholsPlot[L, {1/100, 100}]

(* 2) Closed-loop transfer function *)
T = SystemsModelFeedbackConnect[L, 1];

(* 3) Symbolic analysis of step response overshoot, etc. *)
Simplify[TransferFunctionPoles[T]]
      

The symbolic capabilities are valuable when connecting linear frequency-domain designs with more detailed nonlinear robot models (for instance via Wolfram SystemModeler or other multibody simulation tools).

11. Problems and Solutions

Problem 1 (Derivation of M-Circles): Starting from \( T(j\omega) = \dfrac{L(j\omega)}{1 + L(j\omega)} \) with \( L(j\omega) = x + jy \), derive the equation of the constant closed-loop magnitude contour \( |T(j\omega)| = M \) in the \( x\text{–}y \) plane.

Solution:

We have

\[ T(j\omega) = \frac{x + jy}{1 + x + jy}, \qquad |T(j\omega)|^2 = \frac{x^2 + y^2}{(1 + x)^2 + y^2}. \]

Setting \( |T(j\omega)|^2 = M^2 \) gives

\[ M^2\bigl((1 + x)^2 + y^2\bigr) = x^2 + y^2. \]

Expand the left-hand side:

\[ M^2(x^2 + 2x + 1 + y^2) = x^2 + y^2. \]

Collect terms in \( x^2 \), \( x \), \( y^2 \), and constants:

\[ (M^2 - 1)x^2 + 2M^2 x + (M^2 - 1)y^2 + M^2 = 0. \]

Divide by \( M^2 - 1 \) (assuming \( M \neq 1 \)):

\[ x^2 + y^2 + \frac{2M^2}{M^2 - 1}x + \frac{M^2}{M^2 - 1} = 0. \]

Complete the square in \( x \). The coefficient of \( x \) is \( \dfrac{2M^2}{M^2 - 1} \), so we add and subtract \( \left(\dfrac{M^2}{M^2 - 1}\right)^2 \):

\[ \left( x + \frac{M^2}{M^2 - 1} \right)^2 + y^2 = \left( \frac{M}{M^2 - 1} \right)^2. \]

Equivalently, by a simple algebraic re-parameterization, the center and radius can be written in the more standard form

\[ \left( x + \frac{1 - M^2}{1 + M^2} \right)^2 + y^2 = \left( \frac{2M}{1 + M^2} \right)^2, \]

which matches the usual expression for \( M \)-circles. Mapping these circles into the Nichols plane yields the curved magnitude contours superimposed on the Nichols grid.

Problem 2 (Gain Margin Consistency): Let the gain margin be defined as \( \text{GM} = \dfrac{1}{|L(j\omega_{180})|} \), where \( \omega_{180} \) is the solution of \( \angle L(j\omega_{180}) = -180^\circ \). Show that \( \text{GM} \) computed from the Bode plot is identical to the ratio of the distance from the origin to the point \( L(j\omega_{180}) \) in the Nyquist plane and hence independent of the chosen representation.

Solution:

On the Bode plot, \( |L(j\omega_{180})| \) is read directly from the magnitude graph at the frequency where the phase is \( -180^\circ \). By definition of magnitude in the Nyquist plane, \( |L(j\omega_{180})| \) is also the Euclidean distance from the origin to the point \( L(j\omega_{180}) \), namely

\[ |L(j\omega_{180})| = \sqrt{\bigl(\Re L(j\omega_{180})\bigr)^2 + \bigl(\Im L(j\omega_{180})\bigr)^2}. \]

The Nyquist definition of gain margin is the factor by which the loop gain can be multiplied before the Nyquist curve passes through \( -1 \) along the ray of phase \( -180^\circ \). This factor is precisely \( 1/|L(j\omega_{180})| \), so the gain margin obtained from the Bode and Nyquist plots must coincide. The Nichols plot is constructed from the same \( |L(j\omega_{180})| \), represented as \( 20\log_{10}|L(j\omega_{180})| \), so the gain margin is likewise invariant.

Problem 3 (Phase Margin and Nichols Plot): Show that the phase margin defined via the Bode plot as \( \text{PM} = 180^\circ + \angle L(j\omega_{\text{gc}}) \) coincides with the horizontal distance in degrees between the point where the Nichols locus crosses 0 dB and the vertical line at \( -180^\circ \).

Solution:

In the Nichols plane, a point on the plot is given by \( (\varphi(\omega), 20\log_{10}|L(j\omega)|) \). The frequency \( \omega_{\text{gc}} \) where the Bode magnitude is 0 dB satisfies \( |L(j\omega_{\text{gc}})| = 1 \), so the corresponding Nichols point lies on the horizontal line at 0 dB and has phase \( \varphi(\omega_{\text{gc}}) = \angle L(j\omega_{\text{gc}}) \).

The phase margin is defined as the additional negative phase required to reach \( -180^\circ \) at gain crossover:

\[ \text{PM} = 180^\circ + \angle L(j\omega_{\text{gc}}) = -\angle L(j\omega_{\text{gc}}) - (-180^\circ). \]

Geometrically, this is exactly the horizontal (phase) distance from the phase of the Nichols point on the 0 dB line to the vertical line at \( -180^\circ \). Hence the phase margin is read identically from Bode and Nichols representations.

Problem 4 (Choice of Representation): For each of the following plants, indicate which representation (Bode, Nyquist, Nichols) is usually most informative for hand design and briefly justify your answer:

  1. A strictly proper, minimum-phase, low-order servo plant for a robot joint.
  2. A process plant with significant time delay \( e^{-s\tau} \).
  3. A plant with right-half-plane zeros and a tight bound on peak \( |T| \).

Solution:

  1. For a strictly proper, minimum-phase servo plant, Bode plots are usually the most convenient: a few asymptotic slopes and corner frequencies give accurate intuition, and tuning lead/lag compensators to meet margin and bandwidth specifications is straightforward.
  2. Time-delay plants are well suited to Nyquist plots, because the delay produces a spiralling locus and Nyquist encirclement of \( -1 \) is a direct and robust way to assess stability. Bode plots can be used, but phase wraps may obscure multiple encirclements.
  3. For right-half-plane zeros and strict constraints on \( |T| \), the Nichols plot with \( M \)-circles provides an excellent way to ensure that the Nichols locus remains inside allowable closed-loop gain contours while respecting Nyquist stability. Bode plots do not show closed-loop constraints as directly on the same axes.

Problem 5 (Second-Order Approximation and Phase Margin): Consider a closed-loop system whose dominant poles can be approximated by a standard second-order system with damping ratio \( \zeta \). Show that the phase margin around gain crossover is approximately a monotone increasing function of \( \zeta \), and explain qualitatively how this is visible in both Bode and Nichols plots.

Solution:

For a standard second-order closed-loop system, the relation between damping ratio \( \zeta \) and phase margin \( \text{PM} \) at gain crossover can be derived by equating magnitude and phase of the loop transfer function at the crossover frequency. The resulting formula (though algebraically involved) yields an increasing mapping \( \zeta \mapsto \text{PM} \) for \( 0 < \zeta < 1 \). Qualitatively:

  • In the Bode plot, increasing \( \zeta \) reduces the resonant peak in \( |T(j\omega)| \) and flattens the magnitude around crossover, which corresponds to a larger phase margin.
  • In the Nichols plot, the locus moves away from higher \( M \)-circles (lower resonant peak) and shifts to a less negative phase at 0 dB, directly increasing the measured phase margin.

Hence designs with larger phase margin (within reasonable bounds) correspond to more heavily damped dominant poles and smaller overshoot, independent of whether one works in Bode, Nyquist, or Nichols coordinates.

12. Summary

In this lesson we emphasized that Bode, Nyquist, and Nichols design methods are three geometric views of the same loop transfer function \( L(j\omega) \). We showed that stability margins and closed-loop performance bounds (e.g., via \( M \)-circles) are invariant objects that simply appear with different geometric interpretations in each plot. Nichols charts provide an especially compact way to visualize closed-loop constraints directly on the open-loop curve, whereas Bode plots highlight slopes and corner frequencies and Nyquist plots highlight encirclements of the critical point \( -1 \). We also demonstrated how modern software tools in Python, MATLAB/Simulink, C++/ROS, Java (WPILib), and Mathematica all support these classical design frameworks and can be integrated into robotic control workflows.

13. References

  1. Bode, H. W. (1945). Network Analysis and Feedback Amplifier Design. Van Nostrand.
  2. Nyquist, H. (1932). Regeneration theory. Bell System Technical Journal, 11(1), 126–147.
  3. Nichols, N. B. (1947). Charts for the design of servomechanism loops. Transactions of the American Institute of Electrical Engineers, 66(1), 193–196.
  4. Horowitz, I. M. (1963). Synthesis of Feedback Systems. Academic Press.
  5. Franklin, G. F., Powell, J. D., & Emami-Naeini, A. (2015). Feedback Control of Dynamic Systems (7th ed.). Pearson.
  6. Skogestad, S., & Postlethwaite, I. (2005). Multivariable Feedback Control: Analysis and Design (2nd ed.). Wiley. (Classical loop-shaping viewpoint in a robust-control context.)
  7. Rosenbrock, H. H. (1969). Nyquist's criterion in the feedback system design. Proceedings of the IEE, 116(11), 1945–1950.
  8. Safonov, M. G., & Athans, M. (1977). Gain and phase margin for multiloop LQG regulators. IEEE Transactions on Automatic Control, 22(2), 173–179.
  9. Karimi, A., Garcia, D., & Longchamp, R. (2003). PID controller tuning using Bode's integrals. IEEE Transactions on Control Systems Technology, 11(6), 812–821.
  10. Maciejowski, J. M. (1989). Multivariable Feedback Design. Addison-Wesley.