1976 lines
87 KiB
TeX
1976 lines
87 KiB
TeX
% Created 2020-12-04 ven. 23:52
|
|
% Intended LaTeX compiler: pdflatex
|
|
\documentclass[a4paper, 10pt, DIV=12, parskip=full]{scrreprt}
|
|
\usepackage[utf8]{inputenc}
|
|
\usepackage[T1]{fontenc}
|
|
\usepackage{graphicx}
|
|
\usepackage{grffile}
|
|
\usepackage{longtable}
|
|
\usepackage{wrapfig}
|
|
\usepackage{rotating}
|
|
\usepackage[normalem]{ulem}
|
|
\usepackage{amsmath}
|
|
\usepackage{textcomp}
|
|
\usepackage{amssymb}
|
|
\usepackage{capt-of}
|
|
\usepackage{hyperref}
|
|
\usepackage[most]{tcolorbox}
|
|
\usepackage{bm}
|
|
\usepackage{booktabs}
|
|
\usepackage{tabularx}
|
|
\usepackage{array}
|
|
\usepackage{siunitx}
|
|
\input{preamble.tex}
|
|
\author{Dehaeze Thomas}
|
|
\date{\today}
|
|
\title{A brief and practical introduction to \(\mathcal{H}_\infty\) Control}
|
|
\hypersetup{
|
|
pdfauthor={Dehaeze Thomas},
|
|
pdftitle={A brief and practical introduction to \(\mathcal{H}_\infty\) Control},
|
|
pdfkeywords={},
|
|
pdfsubject={},
|
|
pdfcreator={Emacs 27.1 (Org mode 9.5)},
|
|
pdflang={English}}
|
|
\begin{document}
|
|
|
|
\maketitle
|
|
\tableofcontents
|
|
|
|
|
|
\chapter*{Introduction}
|
|
\label{sec:orgd1c4555}
|
|
The purpose of this document is to give a \emph{practical introduction} to the wonderful world of \(\mathcal{H}_\infty\) Control.
|
|
|
|
No attend is made to provide an exhaustive treatment of the subject.
|
|
\(\mathcal{H}_\infty\) Control is a very broad topic and entire books are written on it.
|
|
Therefore, for more advanced discussion, please have a look at the recommended references at the bottom of this document.
|
|
|
|
When possible, Matlab scripts used for the example/exercises are provided such that you can easily test them on your computer.
|
|
|
|
|
|
The general structure of this document is as follows:
|
|
\begin{itemize}
|
|
\item A short introduction to \emph{model based control} is given in Section \ref{sec:model_based_control}
|
|
\item Classical \emph{open} loop shaping method is presented in Section \ref{sec:open_loop_shaping}.
|
|
It is also shown that \(\mathcal{H}_\infty\) synthesis can be used for \emph{open} loop shaping
|
|
\item Important concepts indispensable for \(\mathcal{H}_\infty\) control such as the \(\mathcal{H}_\infty\) norm and the generalized plant are introduced in Section \ref{sec:h_infinity_introduction}
|
|
\item A very important step in \(\mathcal{H}_\infty\) control is to express the control specifications (performances, robustness, etc.) as an \(\mathcal{H}_\infty\) optimization problem. Such procedure is described in Section \ref{sec:modern_interpretation_specification}
|
|
\item One of the most useful use of the \(\mathcal{H}_\infty\) control is the shaping of closed-loop transfer functions.
|
|
Such technique is presented in Section \ref{sec:closed-loop-shaping}
|
|
\item Finally, complete examples of the use of \(\mathcal{H}_\infty\) Control for practical problems are provided in Section \ref{sec:h_infinity_mixed_sensitivity}
|
|
\end{itemize}
|
|
|
|
\chapter{Introduction to Model Based Control}
|
|
\label{sec:org906ea4a}
|
|
\label{sec:model_based_control}
|
|
|
|
\section{Model Based Control - Methodology}
|
|
\label{sec:org56271e2}
|
|
\label{sec:model_based_control_methodology}
|
|
|
|
The typical methodology for \textbf{Model Based Control} techniques is schematically shown in Figure \ref{fig:control-procedure}.
|
|
|
|
It consists of three steps:
|
|
\begin{enumerate}
|
|
\item \textbf{Identification or modeling}: a mathematical model \(G(s)\) representing the plant dynamics is obtained
|
|
\item \textbf{Translate the specifications into mathematical criteria}:
|
|
\begin{itemize}
|
|
\item \uline{Specifications}: Response Time, Noise Rejection, Maximum input amplitude, Robustness, \ldots{}
|
|
\item \uline{Mathematical Criteria}: Cost Function, Shape of transfer function, Phase/Gain margin, Roll-Off, \ldots{}
|
|
\end{itemize}
|
|
\item \textbf{Synthesis}: research of a controller \(K(s)\) that satisfies the specifications for the model of the system
|
|
\end{enumerate}
|
|
|
|
\begin{figure}[htbp]
|
|
\centering
|
|
\includegraphics[scale=1]{figs/control-procedure.png}
|
|
\caption{\label{fig:control-procedure}Typical Methodoly for Model Based Control}
|
|
\end{figure}
|
|
|
|
In this document, we will suppose a model of the plant is available (step 1 already performed), and we will focus on steps 2 and 3.
|
|
|
|
|
|
In Section \ref{sec:open_loop_shaping}, steps 2 and 3 will be described for a control techniques called \textbf{classical (open-)loop shaping}.
|
|
|
|
Then, steps 2 and 3 for the \textbf{\(\mathcal{H}_\infty\) Loop Shaping} of closed-loop transfer functions will be discussed in Sections \ref{sec:modern_interpretation_specification}, \ref{sec:closed-loop-shaping} and \ref{sec:h_infinity_mixed_sensitivity}.
|
|
|
|
\section{From Classical Control to Robust Control}
|
|
\label{sec:orgd4cb731}
|
|
\label{sec:comp_classical_modern_robust_control}
|
|
|
|
Many different model based control techniques have been developed since the birth of \emph{classical control theory} in the '30s.
|
|
|
|
|
|
\textbf{Classical control} methods were developed starting from 1930 based on tools such as the Laplace and Fourier transforms.
|
|
It was then natural to study systems in the frequency domain using tools such as the Bode and Nyquist plots.
|
|
Controllers were manually tuned to optimize criteria such as control bandwidth, gain and phase margins.
|
|
|
|
|
|
The '60s saw the development of control techniques based on a state-space.
|
|
Linear algebra and matrices were used instead of the frequency domain tool of the class control theory.
|
|
This allows multi-inputs multi-outputs systems to be easily treated.
|
|
Kalman introduced the well known \emph{Kalman estimator} as well the notion of optimality by minimizing quadratic cost functions.
|
|
This set of developments is loosely termed \textbf{Modern Control} theory.
|
|
|
|
|
|
By the 1980's, modern control theory was shown to have some robustness issues and to lack the intuitive tools that the classical control methods were offering.
|
|
This led to a new control theory called \textbf{Robust control} that blends the best features of classical and modern techniques.
|
|
This robust control theory is the subject of this document.
|
|
|
|
|
|
The three presented control methods are compared in Table \ref{tab:comparison_control_methods}.
|
|
|
|
Note that in parallel, there have been numerous other developments, including non-linear control, adaptive control, machine-learning control just to name a few.
|
|
|
|
|
|
\begin{table}[htbp]
|
|
\caption{\label{tab:comparison_control_methods}Table summurazing the main differences between classical, modern and robust control}
|
|
\centering
|
|
\begin{tabularx}{\linewidth}{lccc}
|
|
\toprule
|
|
& \textbf{Classical Control} & \textbf{Modern Control} & \textbf{Robust Control}\\
|
|
\midrule
|
|
\textbf{Date} & 1930- & 1960- & 1980-\\
|
|
\midrule
|
|
\textbf{Tools} & Transfer Functions & State Space formulation & Systems/Signal Norms\\
|
|
& Nyquist, Bode Plots & Riccati Equations & Closed Loop TF\\
|
|
& Root Locus & Kalman Filters & Closed Loop Shaping\\
|
|
& Phase/Gain margins & & Weighting Functions\\
|
|
& Open Loop Shaping & & Disk margin\\
|
|
\midrule
|
|
\textbf{Controllers} & P, PI, PID & Full State Feedback & General Control Conf.\\
|
|
& Leads, Lags & LQG, LQR & \\
|
|
\midrule
|
|
\textbf{Advantages} & Study Stability & Automatic Synthesis & Automatic Synthesis\\
|
|
& Simple & MIMO & MIMO\\
|
|
& Natural & Optimization Problem & Optimization Problem\\
|
|
& & & Guaranteed Robustness\\
|
|
\midrule
|
|
\textbf{Disadvant.} & Manual Method & No Guaranteed Robustness & Requires knowledge of tools\\
|
|
& Only SISO & Rejection of Pert. & Need good model of the system\\
|
|
& No input usage lim. & & \\
|
|
\bottomrule
|
|
\end{tabularx}
|
|
\end{table}
|
|
|
|
\section{Example System}
|
|
\label{sec:org24dcae9}
|
|
\label{sec:example_system}
|
|
|
|
Throughout this document, multiple examples and practical application of presented control strategies will be provided.
|
|
Most of them will be applied on a physical system presented in this section.
|
|
|
|
This system is shown in Figure \ref{fig:mech_sys_1dof_inertial_contr}.
|
|
It could represent an active suspension stage supporting a payload.
|
|
The \emph{inertial} motion of the payload is measured using an inertial sensor and this is feedback to a force actuator.
|
|
Such system could be used to actively isolate the payload (disturbance rejection problem) or to make it follow a trajectory (tracking problem).
|
|
|
|
The notations used on Figure \ref{fig:mech_sys_1dof_inertial_contr} are listed and described in Table \ref{tab:example_notations}.
|
|
|
|
\begin{figure}[htbp]
|
|
\centering
|
|
\includegraphics[scale=1]{figs/mech_sys_1dof_inertial_contr.png}
|
|
\caption{\label{fig:mech_sys_1dof_inertial_contr}Test System consisting of a payload with a mass \(m\) on top of an active system with a stiffness \(k\), damping \(c\) and an actuator. A feedback controller \(K(s)\) is added to position / isolate the payload.}
|
|
\end{figure}
|
|
|
|
\begin{table}[htbp]
|
|
\caption{\label{tab:example_notations}Example system variables}
|
|
\centering
|
|
\begin{tabularx}{\linewidth}{cXcc}
|
|
\toprule
|
|
\textbf{Notation} & \textbf{Description} & \textbf{Value} & \textbf{Unit}\\
|
|
\midrule
|
|
\(m\) & Payload's mass to position / isolate & \(10\) & [kg]\\
|
|
\(k\) & Stiffness of the suspension system & \(10^6\) & [N/m]\\
|
|
\(c\) & Damping coefficient of the suspension system & \(400\) & [N/(m/s)]\\
|
|
\(y\) & Payload absolute displacement (measured by an inertial sensor) & & [m]\\
|
|
\(d\) & Ground displacement, it acts as a disturbance & & [m]\\
|
|
\(u\) & Actuator force & & [N]\\
|
|
\(r\) & Wanted position of the mass (the reference) & & [m]\\
|
|
\(\epsilon = r - y\) & Position error & & [m]\\
|
|
\(K\) & Feedback controller & to be designed & [N/m]\\
|
|
\bottomrule
|
|
\end{tabularx}
|
|
\end{table}
|
|
|
|
\begin{exercice}
|
|
Derive the following open-loop transfer functions:
|
|
\begin{align}
|
|
G(s) &= \frac{y}{u} \\
|
|
G_d(s) &= \frac{y}{d}
|
|
\end{align}
|
|
|
|
\tcbsubtitle{Hint}
|
|
You can follow this generic procedure:
|
|
\begin{enumerate}
|
|
\item List all applied forces ot the mass: Actuator force, Stiffness force (Hooke's law), \ldots{}
|
|
\item Apply the Newton's Second Law on the payload
|
|
\[ m \ddot{y} = \Sigma F \]
|
|
\item Transform the differential equations into the Laplace domain:
|
|
\[ \frac{d\ \cdot}{dt} \Leftrightarrow \cdot \times s \]
|
|
\item Write \(y(s)\) as a function of \(u(s)\) and \(w(s)\)
|
|
\end{enumerate}
|
|
\tcbsubtitle{Results}
|
|
\begin{align}
|
|
G(s) &= \frac{1}{m s^2 + cs + k} \\
|
|
G_d(s) &= \frac{cs + k}{m s^2 + cs + k}
|
|
\end{align}
|
|
\end{exercice}
|
|
|
|
Having obtained \(G(s)\) and \(G_d(s)\), we can transform the system shown in Figure \ref{fig:mech_sys_1dof_inertial_contr} into a classical feedback architecture as shown in Figure \ref{fig:open_loop_shaping}.
|
|
|
|
\begin{figure}[htbp]
|
|
\centering
|
|
\includegraphics[scale=1]{figs/classical_feedback_test_system.png}
|
|
\caption{\label{fig:classical_feedback_test_system}Block diagram corresponding to the example system of Figure \ref{fig:mech_sys_1dof_inertial_contr}}
|
|
\end{figure}
|
|
|
|
|
|
Let's define the system parameters on Matlab.
|
|
\begin{minted}[linenos,firstnumber=1]{matlab}
|
|
k = 1e6; % Stiffness [N/m]
|
|
c = 4e2; % Damping [N/(m/s)]
|
|
m = 10; % Mass [kg]
|
|
\end{minted}
|
|
|
|
And now the system dynamics \(G(s)\) and \(G_d(s)\).
|
|
\begin{minted}[linenos,firstnumber=4]{matlab}
|
|
G = 1/(m*s^2 + c*s + k); % Plant
|
|
Gd = (c*s + k)/(m*s^2 + c*s + k); % Disturbance
|
|
\end{minted}
|
|
|
|
The Bode plots of \(G(s)\) and \(G_d(s)\) are shown in Figures \ref{fig:bode_plot_example_afm} and \ref{fig:bode_plot_example_Gd}.
|
|
|
|
\begin{figure}[htbp]
|
|
\centering
|
|
\includegraphics[scale=1]{figs/bode_plot_example_afm.png}
|
|
\caption{\label{fig:bode_plot_example_afm}Bode plot of the plant \(G(s)\)}
|
|
\end{figure}
|
|
|
|
\begin{figure}[htbp]
|
|
\centering
|
|
\includegraphics[scale=1]{figs/bode_plot_example_Gd.png}
|
|
\caption{\label{fig:bode_plot_example_Gd}Magnitude of the disturbance transfer function \(G_d(s)\)}
|
|
\end{figure}
|
|
|
|
\chapter{Classical Open Loop Shaping}
|
|
\label{sec:org2383b8a}
|
|
\label{sec:open_loop_shaping}
|
|
After an introduction to classical Loop Shaping in Section \ref{sec:open_loop_shaping_introduction}, a practical example is given in Section \ref{sec:loop_shaping_example}.
|
|
Such Loop Shaping is usually performed manually with tools coming from the classical control theory.
|
|
|
|
However, the \(\mathcal{H}_\infty\) synthesis can be used to automate the Loop Shaping process.
|
|
This is presented in Section \ref{sec:h_infinity_open_loop_shaping} and applied on the same example in Section \ref{sec:h_infinity_open_loop_shaping_example}.
|
|
|
|
\section{Introduction to Loop Shaping}
|
|
\label{sec:orgca87141}
|
|
\label{sec:open_loop_shaping_introduction}
|
|
|
|
\begin{definition}
|
|
\textbf{Loop Shaping} refers to a control design procedure that involves explicitly shaping the magnitude of the \textbf{Loop Transfer Function} \(L(s)\).
|
|
\end{definition}
|
|
|
|
\begin{definition}
|
|
The \textbf{Loop Gain} (or Loop transfer function) \(L(s)\) usually refers to as the product of the controller and the plant (see Figure \ref{fig:open_loop_shaping}):
|
|
\begin{equation}
|
|
L(s) = G(s) \cdot K(s) \label{eq:loop_gain}
|
|
\end{equation}
|
|
|
|
Its name comes from the fact that this is actually the ``gain around the loop''.
|
|
|
|
\begin{center}
|
|
\includegraphics[scale=1]{figs/open_loop_shaping.png}
|
|
\captionof{figure}{\label{fig:open_loop_shaping}Classical Feedback Architecture}
|
|
\end{center}
|
|
\end{definition}
|
|
|
|
This synthesis method is one of main way controllers are design in the classical control theory.
|
|
It is widely used and generally successful as many characteristics of the closed-loop system depend on the shape of the open loop gain \(L(s)\) such as:
|
|
\begin{itemize}
|
|
\item \textbf{Good Tracking}: \(L\) large
|
|
\item \textbf{Good disturbance rejection}: \(L\) large
|
|
\item \textbf{Attenuation of measurement noise on plant output}: \(L\) small
|
|
\item \textbf{Small magnitude of input signal}: \(L\) small
|
|
\item \textbf{Nominal stability}: \(L\) small (RHP zeros and time delays)
|
|
\item \textbf{Robust stability}: \(L\) small (neglected dynamics)
|
|
\end{itemize}
|
|
|
|
The shaping of the Loop Gain is done manually by combining several leads, lags, notches\ldots{}
|
|
This process is very much simplified by the fact that the loop gain \(L(s)\) depends \textbf{linearly} on \(K(s)\) \eqref{eq:loop_gain}.
|
|
A typical wanted Loop Shape is shown in Figure \ref{fig:open_loop_shaping_shape}.
|
|
Another interesting Loop shape called ``Bode Step'' is described in \cite{lurie02_system_archit_trades_using_bode}.
|
|
|
|
\begin{figure}[htbp]
|
|
\centering
|
|
\includegraphics[scale=1]{figs/open_loop_shaping_shape.png}
|
|
\caption{\label{fig:open_loop_shaping_shape}Typical Wanted Shape for the Loop Gain \(L(s)\)}
|
|
\end{figure}
|
|
|
|
The shaping of \textbf{closed-loop} transfer functions is obviously not as simple as they don't depend linearly on \(K(s)\).
|
|
But this is were the \(\mathcal{H}_\infty\) Synthesis will be useful!
|
|
More details on that in Sections \ref{sec:modern_interpretation_specification} and \ref{sec:closed-loop-shaping}.
|
|
|
|
\section{Example of Manual Open Loop Shaping}
|
|
\label{sec:orgc736296}
|
|
\label{sec:loop_shaping_example}
|
|
|
|
\begin{exampl}
|
|
Let's take our example system described in Section \ref{sec:example_system} and design a controller using the Open-Loop shaping synthesis approach.
|
|
The specifications are:
|
|
\begin{enumerate}
|
|
\item \textbf{Disturbance rejection}: Highest possible rejection below 1Hz
|
|
\item \textbf{Positioning speed}: Bandwidth of approximately 10Hz
|
|
\item \textbf{Noise attenuation}: Roll-off of -40dB/decade past 30Hz
|
|
\item \textbf{Robustness}: Gain margin > 3dB and Phase margin > 30 deg
|
|
\end{enumerate}
|
|
\end{exampl}
|
|
|
|
\begin{exercice}
|
|
Using \texttt{SISOTOOL}, design a controller that fulfills the specifications.
|
|
|
|
\begin{minted}[]{matlab}
|
|
sisotool(G)
|
|
\end{minted}
|
|
|
|
\tcbsubtitle{Hint}
|
|
You can follow this procedure:
|
|
\begin{enumerate}
|
|
\item In order to have good disturbance rejection at low frequency, add a simple or double \textbf{integrator}
|
|
\item In terms of the loop gain, the \textbf{bandwidth} can be defined at the frequency \(\omega_c\) where \(|l(j\omega_c)|\) first crosses 1 from above.
|
|
Therefore, adjust the \textbf{gain} such that \(L(j\omega)\) crosses 1 at around 10Hz
|
|
\item The roll-off at high frequency for noise attenuation should already be good enough.
|
|
If not, add a \textbf{low pass filter}
|
|
\item Add a \textbf{Lead} centered around the crossover frequency (10 Hz) and tune it such that sufficient phase margin is added.
|
|
Verify that the gain margin is good enough.
|
|
\end{enumerate}
|
|
\end{exercice}
|
|
|
|
Let's say we came up with the following controller.
|
|
\begin{minted}[]{matlab}
|
|
K = 14e8 * ... % Gain
|
|
1/(s^2) * ... % Double Integrator
|
|
1/(1 + s/2/pi/40) * ... % Low Pass Filter
|
|
(1 + s/(2*pi*10/sqrt(8)))/(1 + s/(2*pi*10*sqrt(8))); % Lead
|
|
\end{minted}
|
|
|
|
The bode plot of the Loop Gain is shown in Figure \ref{fig:loop_gain_manual_afm} and we can verify that we have the wanted stability margins using the \texttt{margin} command:
|
|
\begin{minted}[]{matlab}
|
|
[Gm, Pm, ~, Wc] = margin(G*K)
|
|
\end{minted}
|
|
|
|
\begin{center}
|
|
\begin{tabular}{lr}
|
|
\toprule
|
|
Requirements & Manual Method\\
|
|
\midrule
|
|
Gain Margin \(> 3\) [dB] & 3.1\\
|
|
Phase Margin \(> 30\) [deg] & 35.4\\
|
|
Crossover \(\approx 10\) [Hz] & 10.1\\
|
|
\bottomrule
|
|
\end{tabular}
|
|
\end{center}
|
|
|
|
\begin{figure}[htbp]
|
|
\centering
|
|
\includegraphics[scale=1]{figs/loop_gain_manual_afm.png}
|
|
\caption{\label{fig:loop_gain_manual_afm}Bode Plot of the obtained Loop Gain \(L(s) = G(s) K(s)\)}
|
|
\end{figure}
|
|
|
|
\section{\(\mathcal{H}_\infty\) Loop Shaping Synthesis}
|
|
\label{sec:orga9060d3}
|
|
\label{sec:h_infinity_open_loop_shaping}
|
|
|
|
The synthesis of controllers based on the Loop Shaping method can be automated using the \(\mathcal{H}_\infty\) Synthesis.
|
|
|
|
Using Matlab, it can be easily performed using the \texttt{loopsyn} command:
|
|
\begin{minted}[]{matlab}
|
|
K = loopsyn(G, Lw);
|
|
\end{minted}
|
|
where:
|
|
\begin{itemize}
|
|
\item \texttt{G} is the (LTI) plant
|
|
\item \texttt{Lw} is the wanted loop shape
|
|
\item \texttt{K} is the synthesize controller
|
|
\end{itemize}
|
|
|
|
\begin{seealso}
|
|
Matlab documentation of \texttt{loopsyn} (\href{https://www.mathworks.com/help/robust/ref/loopsyn.html}{link}).
|
|
\end{seealso}
|
|
|
|
Therefore, by just providing the wanted loop shape and the plant model, the \(\mathcal{H}_\infty\) Loop Shaping synthesis generates a \emph{stabilizing} controller such that the obtained loop gain \(L(s)\) matches the specified one with an accuracy \(\gamma\).
|
|
|
|
Even though we will not go into details and explain how such synthesis is working, an example is provided in the next section.
|
|
|
|
\section{Example of the \(\mathcal{H}_\infty\) Loop Shaping Synthesis}
|
|
\label{sec:orgc755cbe}
|
|
\label{sec:h_infinity_open_loop_shaping_example}
|
|
|
|
To apply the \(\mathcal{H}_\infty\) Loop Shaping Synthesis, the wanted shape of the loop gain should be determined from the specifications.
|
|
This is summarized in Table \ref{tab:open_loop_shaping_specifications}.
|
|
|
|
Such shape corresponds to the typical wanted Loop gain Shape shown in Figure \ref{fig:open_loop_shaping_shape}.
|
|
|
|
\begin{table}[htbp]
|
|
\caption{\label{tab:open_loop_shaping_specifications}Wanted Loop Shape corresponding to each specification}
|
|
\centering
|
|
\begin{tabularx}{\linewidth}{lXX}
|
|
\toprule
|
|
& \textbf{Specification} & \textbf{Corresponding Loop Shape}\\
|
|
\midrule
|
|
\textbf{Dist. Rej.} & Highest possible rejection below 1Hz & Slope of -40dB/dec at low frequency\\
|
|
\textbf{Pos. Speed} & Bandwidth of approximately 10Hz & \(L\) crosses 1 at 10Hz\\
|
|
\textbf{Noise Att.} & Roll-off of -40dB/decade past 30Hz & Roll-off of -40dB/decade past 30Hz\\
|
|
\textbf{Robustness} & \(\Delta G > 3dB\), \(\Delta \phi > 30^o\) & Slope of -20dB/decade near the crossover\\
|
|
\bottomrule
|
|
\end{tabularx}
|
|
\end{table}
|
|
|
|
Then, a (stable, minimum phase) transfer function \(L_w(s)\) should be created that has the same gain as the wanted shape of the Loop gain.
|
|
For this example, a double integrator and a lead centered on 10Hz are used.
|
|
Then the gain is adjusted such that the \(|L_w(j2 \pi 10)| = 1\).
|
|
|
|
Using Matlab, we have:
|
|
\begin{minted}[]{matlab}
|
|
Lw = 2.3e3 * ...
|
|
1/(s^2) * ... % Double Integrator
|
|
(1 + s/(2*pi*10/sqrt(3)))/(1 + s/(2*pi*10*sqrt(3))); % Lead
|
|
\end{minted}
|
|
|
|
The \(\mathcal{H}_\infty\) open loop shaping synthesis is then performed using the \texttt{loopsyn} command:
|
|
\begin{minted}[]{matlab}
|
|
[K, ~, GAM] = loopsyn(G, Lw);
|
|
\end{minted}
|
|
|
|
The obtained Loop Gain is shown in Figure \ref{fig:open_loop_shaping_hinf_L} and matches the specified one by a factor \(\gamma \approx 2\).
|
|
|
|
\begin{figure}[htbp]
|
|
\centering
|
|
\includegraphics[scale=1]{figs/open_loop_shaping_hinf_L.png}
|
|
\caption{\label{fig:open_loop_shaping_hinf_L}Obtained Open Loop Gain \(L(s) = G(s) K(s)\) and comparison with the wanted Loop gain \(L_w\)}
|
|
\end{figure}
|
|
|
|
|
|
\begin{important}
|
|
When using the \(\mathcal{H}_\infty\) Synthesis, it is usually recommended to analyze the obtained controller.
|
|
|
|
This is usually done by breaking down the controller into simple elements such as low pass filters, high pass filters, notches, leads, etc.
|
|
\end{important}
|
|
|
|
Let's briefly analyze the obtained controller which bode plot is shown in Figure \ref{fig:open_loop_shaping_hinf_K}:
|
|
\begin{itemize}
|
|
\item two integrators are used at low frequency to have the wanted low frequency high gain
|
|
\item a lead is added centered with the crossover frequency to increase the phase margin
|
|
\item a notch is added at the resonance of the plant to increase the gain margin (this is very typical of \(\mathcal{H}_\infty\) controllers, and can be an issue, more info on that latter)
|
|
\end{itemize}
|
|
|
|
\begin{figure}[htbp]
|
|
\centering
|
|
\includegraphics[scale=1]{figs/open_loop_shaping_hinf_K.png}
|
|
\caption{\label{fig:open_loop_shaping_hinf_K}Obtained controller \(K\) using the open-loop \(\mathcal{H}_\infty\) shaping}
|
|
\end{figure}
|
|
|
|
|
|
Let's finally compare the obtained stability margins of the \(\mathcal{H}_\infty\) controller and of the manually developed controller in Table \ref{tab:open_loop_shaping_compare}.
|
|
|
|
\begin{table}[htbp]
|
|
\caption{\label{tab:open_loop_shaping_compare}Comparison of the characteristics obtained with the two methods}
|
|
\centering
|
|
\begin{tabularx}{\linewidth}{Xcc}
|
|
\toprule
|
|
\textbf{Specifications} & \textbf{Manual Method} & \textbf{\(\mathcal{H}_\infty\) Method}\\
|
|
\midrule
|
|
Gain Margin \(> 3\) [dB] & 3.1 & 31.7\\
|
|
Phase Margin \(> 30\) [deg] & 35.4 & 54.7\\
|
|
Crossover \(\approx 10\) [Hz] & 10.1 & 9.9\\
|
|
\bottomrule
|
|
\end{tabularx}
|
|
\end{table}
|
|
|
|
\chapter{A first Step into the \(\mathcal{H}_\infty\) world}
|
|
\label{sec:orgfc80984}
|
|
\label{sec:h_infinity_introduction}
|
|
In this section, the \(\mathcal{H}_\infty\) Synthesis method, which is based on the optimization of the \(\mathcal{H}_\infty\) norm of transfer functions, is introduced.
|
|
|
|
After the \(\mathcal{H}_\infty\) norm is defined in Section \ref{sec:h_infinity_norm}, the \(\mathcal{H}_\infty\) synthesis procedure is described in Section \ref{sec:h_infinity_synthesis} .
|
|
|
|
The generalized plant, a very useful tool to describe a control problem, is presented in Section \ref{sec:generalized_plant}.
|
|
The \(\mathcal{H}_\infty\) is then applied to this generalized plant in Section \ref{sec:h_infinity_general_synthesis}.
|
|
|
|
Finally, an example showing how to convert a typical feedback control architecture into a generalized plant is given in Section \ref{sec:generalized_plant_derivation}.
|
|
|
|
\section{The \(\mathcal{H}_\infty\) Norm}
|
|
\label{sec:org23de71d}
|
|
\label{sec:h_infinity_norm}
|
|
|
|
\begin{definition}
|
|
The \(\mathcal{H}_\infty\) norm of a multi-input multi-output system \(G(s)\) is defined as the peak of the maximum singular value of its frequency response
|
|
\begin{equation}
|
|
\|G(s)\|_\infty = \max_\omega \bar{\sigma}\big( G(j\omega) \big)
|
|
\end{equation}
|
|
|
|
For a single-input single-output system \(G(s)\), it is simply the peak value of \(|G(j\omega)|\) as a function of frequency:
|
|
\begin{equation}
|
|
\|G(s)\|_\infty = \max_{\omega} |G(j\omega)| \label{eq:hinf_norm_siso}
|
|
\end{equation}
|
|
\end{definition}
|
|
|
|
\begin{exampl}
|
|
Let's compute the \(\mathcal{H}_\infty\) norm of our test plant \(G(s)\) using the \texttt{hinfnorm} function:
|
|
\begin{minted}[]{matlab}
|
|
hinfnorm(G)
|
|
\end{minted}
|
|
|
|
\begin{verbatim}
|
|
7.9216e-06
|
|
\end{verbatim}
|
|
|
|
|
|
We can see in Figure \ref{fig:hinfinity_norm_siso_bode} that indeed, the \(\mathcal{H}_\infty\) norm of \(G(s)\) does corresponds to the peak value of \(|G(j\omega)|\).
|
|
|
|
\begin{center}
|
|
\includegraphics[scale=1]{figs/hinfinity_norm_siso_bode.png}
|
|
\captionof{figure}{\label{fig:hinfinity_norm_siso_bode}Example of the \(\mathcal{H}_\infty\) norm of a SISO system}
|
|
\end{center}
|
|
\end{exampl}
|
|
|
|
\section{\(\mathcal{H}_\infty\) Synthesis}
|
|
\label{sec:org251bca8}
|
|
\label{sec:h_infinity_synthesis}
|
|
|
|
\begin{definition}
|
|
The \(\mathcal{H}_\infty\) synthesis is a method that uses an \textbf{algorithm} (LMI optimization, Riccati equation) to find a controller that stabilizes the system and that \textbf{minimizes} the \(\mathcal{H}_\infty\) norms of defined transfer functions.
|
|
\end{definition}
|
|
|
|
Why optimizing the \(\mathcal{H}_\infty\) norm of transfer functions is a pertinent choice will become clear when we will translate the typical control specifications into the \(\mathcal{H}_\infty\) norm of transfer functions in Section \ref{sec:modern_interpretation_specification}.
|
|
|
|
\begin{important}
|
|
Then applying the \(\mathcal{H}_\infty\) synthesis to a plant, the engineer work usually consists of the following steps:
|
|
\begin{enumerate}
|
|
\item Write the problem as standard \(\mathcal{H}_\infty\) problem using the generalized plant (described in the next section)
|
|
\item Translate the specifications as \(\mathcal{H}_\infty\) norms of transfer functions (Section \ref{sec:modern_interpretation_specification})
|
|
\item Make the synthesis and analyze the obtained controller
|
|
\end{enumerate}
|
|
|
|
As the \(\mathcal{H}_\infty\) synthesis usually gives very high order controllers, an additional step that reduces the controller order is sometimes required for practical implementation.
|
|
\end{important}
|
|
|
|
Note that there are many ways to use the \(\mathcal{H}_\infty\) Synthesis:
|
|
\begin{itemize}
|
|
\item Traditional \(\mathcal{H}_\infty\) Synthesis (\texttt{hinfsyn} \href{https://www.mathworks.com/help/robust/ref/hinfsyn.html}{doc})
|
|
\item Open Loop Shaping \(\mathcal{H}_\infty\) Synthesis (\texttt{loopsyn} \href{https://www.mathworks.com/help/robust/ref/loopsyn.html}{doc})
|
|
\item Mixed Sensitivity Loop Shaping (\texttt{mixsyn} \href{https://www.mathworks.com/help/robust/ref/lti.mixsyn.html}{doc})
|
|
\item Fixed-Structure \(\mathcal{H}_\infty\) Synthesis (\texttt{hinfstruct} \href{https://www.mathworks.com/help/robust/ref/lti.hinfstruct.html}{doc})
|
|
\item Signal Based \(\mathcal{H}_\infty\) Synthesis, and many more\ldots{}
|
|
\end{itemize}
|
|
|
|
\section{The Generalized Plant}
|
|
\label{sec:orgada260f}
|
|
\label{sec:generalized_plant}
|
|
|
|
The first step when applying the \(\mathcal{H}_\infty\) synthesis is usually to write the problem as a standard \(\mathcal{H}_\infty\) problem.
|
|
This consist of deriving the \textbf{Generalized Plant} for the current problem.
|
|
|
|
The generalized plant, usually noted \(P(s)\), is shown in Figure \ref{fig:general_plant}.
|
|
It has two \emph{sets} of inputs \([w,\,u]\) and two \emph{sets} of outputs \([z\,v]\) such that:
|
|
\begin{equation}
|
|
\begin{bmatrix} z \\ v \end{bmatrix} = P \begin{bmatrix} w \\ u \end{bmatrix}
|
|
\end{equation}
|
|
|
|
The meaning of these inputs and outputs are summarized in Table \ref{tab:notation_general}.
|
|
|
|
A practical example about how to derive the generalized plant for a classical control problem is given in Section \ref{sec:generalized_plant_derivation}.
|
|
|
|
\begin{important}
|
|
\begin{center}
|
|
\includegraphics[scale=1]{figs/general_plant.png}
|
|
\captionof{figure}{\label{fig:general_plant}Inputs and Outputs of the generalized Plant}
|
|
\end{center}
|
|
|
|
\begin{center}
|
|
\captionof{table}{\label{tab:notation_general}Notations for the general configuration}
|
|
\begin{tabularx}{0.8\linewidth}{cX}
|
|
\toprule
|
|
\textbf{Notation} & \textbf{Meaning}\\
|
|
\midrule
|
|
\(P\) & Generalized plant model\\
|
|
\(w\) & Exogenous inputs: references, disturbances, noises\\
|
|
\(z\) & Exogenous outputs: signals to be minimized\\
|
|
\(v\) & Controller inputs: measurements\\
|
|
\(u\) & Control signals\\
|
|
\bottomrule
|
|
\end{tabularx}
|
|
\end{center}
|
|
\end{important}
|
|
|
|
\section{The \(\mathcal{H}_\infty\) Synthesis applied on the Generalized plant}
|
|
\label{sec:org1d8fc5f}
|
|
\label{sec:h_infinity_general_synthesis}
|
|
|
|
Once the generalized plant is obtained, the \(\mathcal{H}_\infty\) synthesis problem can be stated as follows:
|
|
|
|
\begin{important}
|
|
\begin{description}
|
|
\item[{\(\mathcal{H}_\infty\) Synthesis applied on the generalized plant}]
|
|
\end{description}
|
|
Find a stabilizing controller \(K\) that, using the sensed outputs \(v\), generates control signals \(u\) such that the \(\mathcal{H}_\infty\) norm of the closed-loop transfer function from \(w\) to \(z\) is minimized.
|
|
|
|
After \(K\) is found, the system is \emph{robustified} by adjusting the response around the unity gain frequency to increase stability margins.
|
|
|
|
The obtained controller \(K\) and the generalized plant are connected as shown in Figure \ref{fig:general_control_names}.
|
|
|
|
\begin{center}
|
|
\includegraphics[scale=1]{figs/general_control_names.png}
|
|
\captionof{figure}{\label{fig:general_control_names}General Control Configuration}
|
|
\end{center}
|
|
\end{important}
|
|
|
|
Using Matlab, the \(\mathcal{H}_\infty\) Synthesis applied on a Generalized plant can be applied using the \texttt{hinfsyn} command (\href{https://www.mathworks.com/help/robust/ref/hinfsyn.html}{documentation}):
|
|
\begin{minted}[]{matlab}
|
|
K = hinfsyn(P, nmeas, ncont);
|
|
\end{minted}
|
|
where:
|
|
\begin{itemize}
|
|
\item \texttt{P} is the generalized plant transfer function matrix
|
|
\item \texttt{nmeas} is the number of sensed output (size of \(v\))
|
|
\item \texttt{ncont} is the number of control signals (size of \(u\))
|
|
\item \texttt{K} obtained controller (of size \texttt{ncont x nmeas}) that minimizes the \(\mathcal{H}_\infty\) norm from \(w\) to \(z\).
|
|
\end{itemize}
|
|
|
|
Note that the general control configure of Figure \ref{fig:general_control_names}, as its name implies, is quite \emph{general} and can represent feedback control as well as feedforward control architectures.
|
|
|
|
\section{From a Classical Feedback Architecture to a Generalized Plant}
|
|
\label{sec:orgead7d16}
|
|
\label{sec:generalized_plant_derivation}
|
|
|
|
The procedure to convert a typical control architecture as the one shown in Figure \ref{fig:classical_feedback_tracking} to a generalized Plant is as follows:
|
|
\begin{enumerate}
|
|
\item Define signals of the generalized plant: \(w\), \(z\), \(u\) and \(v\)
|
|
\item Remove \(K\) and rearrange the inputs and outputs to match the generalized configuration shown in Figure \ref{fig:general_plant}
|
|
\end{enumerate}
|
|
|
|
\begin{exercice}
|
|
Consider the feedback control architecture shown in Figure \ref{fig:classical_feedback_tracking}.
|
|
Suppose we want to design \(K\) using the general \(\mathcal{H}_\infty\) synthesis, and suppose the signals to be minimized are the control input \(u\) and the tracking error \(\epsilon\).
|
|
\begin{enumerate}
|
|
\item Convert the control architecture to a generalized configuration
|
|
\item Compute the transfer function matrix of the generalized plant \(P\) using Matlab as a function or \(K\) and \(G\)
|
|
\end{enumerate}
|
|
|
|
\begin{center}
|
|
\includegraphics[scale=1]{figs/classical_feedback_tracking.png}
|
|
\captionof{figure}{\label{fig:classical_feedback_tracking}Classical Feedback Control Architecture (Tracking)}
|
|
\end{center}
|
|
|
|
\tcbsubtitle{Hint}
|
|
First, define the signals of the generalized plant:
|
|
\begin{itemize}
|
|
\item Exogenous inputs: \(w = r\)
|
|
\item Signals to be minimized:
|
|
Usually, we want to minimize the tracking errors \(\epsilon\) and the control signal \(u\): \(z = [\epsilon,\ u]\)
|
|
\item Controller inputs: this is the signal at the input of the controller: \(v = \epsilon\)
|
|
\item Controller outputs: signal generated by the controller: \(u\)
|
|
\end{itemize}
|
|
|
|
Then, Remove \(K\) and rearrange the inputs and outputs as in Figure \ref{fig:general_plant}.
|
|
\tcbsubtitle{Anwser}
|
|
The obtained generalized plant shown in Figure \ref{fig:mixed_sensitivity_ref_tracking}.
|
|
|
|
\begin{center}
|
|
\includegraphics[scale=1]{figs/mixed_sensitivity_ref_tracking.png}
|
|
\captionof{figure}{\label{fig:mixed_sensitivity_ref_tracking}Generalized plant of the Classical Feedback Control Architecture (Tracking)}
|
|
\end{center}
|
|
|
|
Using Matlab, the generalized plant can be defined as follows:
|
|
\begin{minted}[]{matlab}
|
|
P = [1 -G;
|
|
0 1;
|
|
1 -G]
|
|
P.InputName = {'w', 'u'};
|
|
P.OutputName = {'e', 'u', 'v'};
|
|
\end{minted}
|
|
\end{exercice}
|
|
|
|
\chapter{Modern Interpretation of Control Specifications}
|
|
\label{sec:orgf4eb6c5}
|
|
\label{sec:modern_interpretation_specification}
|
|
As shown in Section \ref{sec:open_loop_shaping}, the loop gain \(L(s) = G(s) K(s)\) is a useful and easy tool when manually designing controllers.
|
|
This is mainly due to the fact that \(L(s)\) is very easy to shape as it depends \emph{linearly} on \(K(s)\).
|
|
Moreover, important quantities such as the stability margins and the control bandwidth can be estimated from the shape/phase of \(L(s)\).
|
|
|
|
However, the loop gain \(L(s)\) does \textbf{not} directly give the performances of the closed-loop system.
|
|
As a matter of fact, the behavior of the closed-loop system by the \textbf{closed-loop} transfer functions.
|
|
These are derived of a typical feedback architecture functions in Section \ref{sec:closed_loop_tf}.
|
|
|
|
|
|
The modern interpretation of control specifications then consists of determining the \textbf{required shape of the closed-loop transfer functions} such that the system behavior corresponds to the requirements.
|
|
Once this is done, the \(\mathcal{H}_\infty\) synthesis can be used to generate a controller that will \textbf{shape} the closed-loop transfer function as specified..
|
|
This method is presented in Section \ref{sec:closed-loop-shaping}.
|
|
|
|
|
|
One of the most important closed-loop transfer function is called the \textbf{sensitivity function}.
|
|
Its link with the closed-loop behavior of the feedback system is studied in Section \ref{sec:sensitivity_transfer_functions}.
|
|
|
|
The robustness (stability margins) of the system can also be linked to the shape of the sensitivity function with the use of the \textbf{module margin} (Section \ref{sec:module_margin}).
|
|
|
|
Links between typical control specifications and shapes of the closed-loop transfer functions are summarized in Section \ref{sec:other_requirements}.
|
|
|
|
\section{Closed Loop Transfer Functions and the Gang of Four}
|
|
\label{sec:org40d15a2}
|
|
\label{sec:closed_loop_tf}
|
|
|
|
Consider the typical feedback system shown in Figure \ref{fig:gang_of_four_feedback}.
|
|
|
|
The behavior (performances) of this feedback system is determined by the closed-loop transfer functions from the inputs (\(r\), \(d\) and \(n\)) to the important signals such as \(\epsilon\), \(u\) and \(y\).
|
|
|
|
Depending on the specification, different closed-loop transfer functions do matter.
|
|
These are summarized in Table \ref{tab:spec_closed_loop_tf}.
|
|
|
|
\begin{figure}[htbp]
|
|
\centering
|
|
\includegraphics[scale=1]{figs/gang_of_four_feedback.png}
|
|
\caption{\label{fig:gang_of_four_feedback}Simple Feedback Architecture with \(r\) the reference signal, \(\epsilon\) the tracking error, \(d\) a disturbance acting at the plant input \(u\), \(y\) is the output signal and \(n\) the measurement noise}
|
|
\end{figure}
|
|
|
|
\begin{table}[htbp]
|
|
\caption{\label{tab:spec_closed_loop_tf}Typical Specification and associated closed-loop transfer function}
|
|
\centering
|
|
\begin{tabularx}{0.8\linewidth}{Xl}
|
|
\toprule
|
|
\textbf{Specification} & \textbf{CL Transfer Function}\\
|
|
\midrule
|
|
Reference Tracking & From \(r\) to \(\epsilon\)\\
|
|
Disturbance Rejection & From \(d\) to \(y\)\\
|
|
Measurement Noise Filtering & From \(n\) to \(y\)\\
|
|
Small Command Amplitude & From \(n,r,d\) to \(u\)\\
|
|
Stability & All\\
|
|
Robustness (stability margins) & Module margin (see Section \ref{sec:module_margin})\\
|
|
\bottomrule
|
|
\end{tabularx}
|
|
\end{table}
|
|
|
|
\begin{exercice}
|
|
For the feedback system in Figure \ref{fig:gang_of_four_feedback}, write the output signals \([\epsilon, u, y]\) as a function of the systems \(K(s), G(s)\) and the input signals \([r, d, n]\).
|
|
|
|
\tcbsubtitle{Hint}
|
|
Take one of the output (e.g. \(y\)), and write it as a function of the inputs \([d, r, n]\) going step by step around the loop:
|
|
\begin{align*}
|
|
y &= G u \\
|
|
&= G (d + K \epsilon) \\
|
|
&= G \big(d + K (r - n - y) \big) \\
|
|
&= G d + GK r - GK n - GK y
|
|
\end{align*}
|
|
|
|
Isolate \(y\) at the right hand side, and finally obtain:
|
|
\[ y = \frac{GK}{1+ GK} r + \frac{G}{1 + GK} d - \frac{GK}{1 + GK} n \]
|
|
|
|
Do the same procedure for \(u\) and \(\epsilon\)
|
|
\tcbsubtitle{Answer}
|
|
The following equations should be obtained:
|
|
\begin{align}
|
|
y &= \frac{GK}{1 + GK} r + \frac{G}{1 + GK} d - \frac{GK}{1 + GK} n \\
|
|
\epsilon &= \frac{1 }{1 + GK} r - \frac{G}{1 + GK} d - \frac{G }{1 + GK} n \\
|
|
u &= \frac{K }{1 + GK} r - \frac{1}{1 + GK} d - \frac{K }{1 + GK} n
|
|
\end{align}
|
|
\end{exercice}
|
|
|
|
\begin{important}
|
|
We can see that they are 4 different closed-loop transfer functions describing the behavior of the feedback system in Figure \ref{fig:gang_of_four_feedback}.
|
|
These called the \textbf{Gang of Four}:
|
|
\begin{align}
|
|
S &= \frac{1 }{1 + GK}, \quad \text{the sensitivity function} \\
|
|
T &= \frac{GK}{1 + GK}, \quad \text{the complementary sensitivity function} \\
|
|
GS &= \frac{G }{1 + GK}, \quad \text{the load disturbance sensitivity function} \\
|
|
KS &= \frac{K }{1 + GK}, \quad \text{the noise sensitivity function}
|
|
\end{align}
|
|
\end{important}
|
|
|
|
\begin{seealso}
|
|
If a feedforward controller is included, a \textbf{Gang of Six} transfer functions can be defined.
|
|
More on that in this \href{https://www.youtube.com/watch?v=b\_8v8scghh8}{short video}.
|
|
\end{seealso}
|
|
|
|
The behavior of the feedback system in Figure \ref{fig:gang_of_four_feedback} is fully described by the following set of equations:
|
|
\begin{align}
|
|
\epsilon &= S r - GS d - GS n \\
|
|
y &= T r + GS d - T n \\
|
|
u &= KS r - S d - KS n
|
|
\end{align}
|
|
|
|
Thus, for reference tracking, we have to shape the \emph{closed-loop} transfer function from \(r\) to \(\epsilon\), that is the sensitivity function \(S(s)\).
|
|
Similarly, to reduce the effect of measurement noise \(n\) on the output \(y\), we have to act on the complementary sensitivity function \(T(s)\).
|
|
|
|
\section{The Sensitivity Function}
|
|
\label{sec:org6e8bfcd}
|
|
\label{sec:sensitivity_transfer_functions}
|
|
|
|
The sensitivity function is indisputably the most important closed-loop transfer function of a feedback system.
|
|
In this section, we will see how the shape of the sensitivity function will impact the performances of the closed-loop system.
|
|
|
|
|
|
Suppose we have developed a ``\emph{reference}'' controller \(K_r(s)\) and made three small changes to obtained three controllers \(K_1(s)\), \(K_2(s)\) and \(K_3(s)\).
|
|
The obtained sensitivity functions for these four controllers are shown in Figure \ref{fig:sensitivity_shape_effect} and the corresponding step responses are shown in Figure \ref{fig:sensitivity_shape_effect_step}.
|
|
|
|
The comparison of the sensitivity functions shapes and their effect on the step response is summarized in Table \ref{tab:compare_sensitivity_shapes}.
|
|
|
|
\begin{table}[htbp]
|
|
\caption{\label{tab:compare_sensitivity_shapes}Comparison of the sensitivity function shape and the corresponding step response for the three controller variations}
|
|
\centering
|
|
\begin{tabularx}{0.9\linewidth}{lXX}
|
|
\toprule
|
|
\textbf{Controller} & \textbf{Sensitivity Function Shape} & \textbf{Change of the Step Response}\\
|
|
\midrule
|
|
\(K_1(s)\) & Larger bandwidth \(\omega_b\) & Faster rise time\\
|
|
\(K_2(s)\) & Larger peak value \(\Vert S\Vert_\infty\) & Large overshoot and oscillations\\
|
|
\(K_3(s)\) & Larger low frequency gain \(\vert S(j\cdot 0)\vert\) & Larger static error\\
|
|
\bottomrule
|
|
\end{tabularx}
|
|
\end{table}
|
|
|
|
\begin{figure}[htbp]
|
|
\centering
|
|
\includegraphics[scale=1]{figs/sensitivity_shape_effect.png}
|
|
\caption{\label{fig:sensitivity_shape_effect}Sensitivity function magnitude \(|S(j\omega)|\) corresponding to the reference controller \(K_r(s)\) and the three modified controllers \(K_i(s)\)}
|
|
\end{figure}
|
|
|
|
\begin{figure}[htbp]
|
|
\centering
|
|
\includegraphics[scale=1]{figs/sensitivity_shape_effect_step.png}
|
|
\caption{\label{fig:sensitivity_shape_effect_step}Step response (response from \(r\) to \(y\)) for the different controllers}
|
|
\end{figure}
|
|
|
|
\begin{definition}
|
|
\begin{description}
|
|
\item[{Closed-Loop Bandwidth}] The closed-loop bandwidth \(\omega_b\) is the frequency where \(|S(j\omega)|\) first crosses \(1/\sqrt{2} = -3dB\) from below.
|
|
|
|
In general, a large bandwidth corresponds to a faster rise time.
|
|
\end{description}
|
|
\end{definition}
|
|
|
|
\begin{important}
|
|
From the simple analysis above, we can draw a first estimation of the wanted shape for the sensitivity function (Figure \ref{fig:h-infinity-spec-S}):
|
|
\begin{itemize}
|
|
\item A small magnitude at low frequency to make the static errors small
|
|
\item A wanted minimum closed-loop bandwidth in order to have fast rise time and good rejection of perturbations
|
|
\item A small peak value (small \(\mathcal{H}_\infty\) norm) in order to limit large overshoot and oscillations.
|
|
This generally means higher robustness.
|
|
This will become clear in the next section about the \textbf{module margin}.
|
|
\end{itemize}
|
|
|
|
\begin{center}
|
|
\includegraphics[scale=1]{figs/h-infinity-spec-S.png}
|
|
\captionof{figure}{\label{fig:h-infinity-spec-S}Typical wanted shape of the Sensitivity transfer function}
|
|
\end{center}
|
|
\end{important}
|
|
|
|
\section{Robustness: Module Margin}
|
|
\label{sec:org47b850d}
|
|
\label{sec:module_margin}
|
|
|
|
Let's start this section by an example demonstrating why the phase and gain margins might not be good indicators of robustness.
|
|
Will follow a discussion about the module margin, a robustness indicator that can be linked to the \(\mathcal{H}_\infty\) norm of \(S\) and that will prove to be very useful.
|
|
|
|
\begin{exampl}
|
|
Consider the following plant \(G_t(s)\):
|
|
\begin{minted}[]{matlab}
|
|
w0 = 2*pi*100;
|
|
xi = 0.1;
|
|
k = 1e7;
|
|
|
|
Gt = 1/k*(s/w0/4 + 1)/(s^2/w0^2 + 2*xi*s/w0 + 1);
|
|
\end{minted}
|
|
|
|
Let's say we have designed a controller \(K_t(s)\) that gives the loop gain shown in Figure \ref{fig:phase_gain_margin_model_plant}.
|
|
|
|
\begin{minted}[]{matlab}
|
|
Kt = 1.2e6*(s + w0)/s;
|
|
\end{minted}
|
|
|
|
The following characteristics can be determined from the Loop gain in Figure \ref{fig:phase_gain_margin_model_plant}:
|
|
\begin{itemize}
|
|
\item Control bandwidth of \(\approx 10\, \text{Hz}\)
|
|
\item Infinite gain margin (the phase of the loop-gain never reaches \(-180^o\))
|
|
\item More than \(90^o\) of phase margin
|
|
\end{itemize}
|
|
|
|
This clearly indicate very good robustness of the closed-loop system!
|
|
Or does it? Let's find out.
|
|
|
|
\begin{center}
|
|
\includegraphics[scale=1]{figs/phase_gain_margin_model_plant.png}
|
|
\captionof{figure}{\label{fig:phase_gain_margin_model_plant}Bode plot of the obtained Loop Gain \(L(s)\)}
|
|
\end{center}
|
|
|
|
Now let's suppose the controller is implemented in practice, and the ``real'' plant \(G_r(s)\) as a slightly lower damping factor than the one estimated for the model:
|
|
\begin{minted}[]{matlab}
|
|
xi = 0.03;
|
|
\end{minted}
|
|
|
|
The obtained ``real'' loop gain is shown in Figure \ref{fig:phase_gain_margin_real_plant}.
|
|
At a frequency little bit above 100Hz, the phase of the loop gain reaches -180 degrees while its magnitude is more than one which indicates instability.
|
|
|
|
It is confirmed by checking the stability of the closed loop system:
|
|
\begin{minted}[]{matlab}
|
|
isstable(feedback(Gr,K))
|
|
\end{minted}
|
|
|
|
\begin{verbatim}
|
|
0
|
|
\end{verbatim}
|
|
|
|
|
|
\begin{center}
|
|
\includegraphics[scale=1]{figs/phase_gain_margin_real_plant.png}
|
|
\captionof{figure}{\label{fig:phase_gain_margin_real_plant}Bode plots of \(L(s)\) (loop gain corresponding the nominal plant) and \(L_r(s)\) (loop gain corresponding to the real plant)}
|
|
\end{center}
|
|
|
|
Therefore, even a small change of the plant parameter renders the system unstable even though both the gain margin and the phase margin for the nominal plant are excellent.
|
|
|
|
This is due to the fact that the gain and phase margin are robustness indicators corresponding a \textbf{pure} change or gain or a \textbf{pure} change of phase but not a combination of both.
|
|
\end{exampl}
|
|
|
|
Let's now determine a new robustness indicator based on the Nyquist Stability Criteria.
|
|
|
|
\begin{definition}
|
|
\begin{description}
|
|
\item[{Nyquist Stability Criteria (for stable systems)}] If the open-loop transfer function \(L(s)\) is stable, then the closed-loop system will be unstable for any encirclement of the point \(-1\) on the Nyquist plot.
|
|
|
|
\item[{Nyquist Plot}] The Nyquist plot shows the evolution of \(L(j\omega)\) in the complex plane from \(\omega = 0 \to \infty\).
|
|
\end{description}
|
|
\end{definition}
|
|
|
|
\begin{seealso}
|
|
For more information about the \emph{general} Nyquist Stability Criteria, you may want to look at \href{https://www.youtube.com/watch?v=sof3meN96MA}{this} video.
|
|
\end{seealso}
|
|
|
|
From the Nyquist stability criteria, it is clear that we want \(L(j\omega)\) to be as far as possible from the \(-1\) point (called the \emph{unstable point}) in the complex plane.
|
|
This minimum distance is called the \textbf{module margin}.
|
|
|
|
\begin{definition}
|
|
\begin{description}
|
|
\item[{Module Margin}] The Module Margin \(\Delta M\) is defined as the \textbf{minimum distance} between the point \(-1\) and the loop gain \(L(j\omega)\) in the complex plane.
|
|
\end{description}
|
|
\end{definition}
|
|
|
|
\begin{exampl}
|
|
A typical Nyquist plot is shown in Figure \ref{fig:module_margin_example}.
|
|
The gain, phase and module margins are graphically shown to have an idea of what they represent.
|
|
|
|
\begin{center}
|
|
\includegraphics[scale=1]{figs/module_margin_example.png}
|
|
\captionof{figure}{\label{fig:module_margin_example}Nyquist plot with visual indication of the Gain margin \(\Delta G\), Phase margin \(\Delta \phi\) and Module margin \(\Delta M\)}
|
|
\end{center}
|
|
\end{exampl}
|
|
|
|
As expected from Figure \ref{fig:module_margin_example}, there is a close relationship between the module margin and the gain and phase margins.
|
|
We can indeed show that for a given value of the module margin \(\Delta M\), we have:
|
|
\begin{equation}
|
|
\Delta G \ge \frac{1}{1 - \Delta M}; \quad \Delta \phi \ge \Delta M
|
|
\end{equation}
|
|
|
|
Let's now try to express the Module margin \(\Delta M\) as an \(\mathcal{H}_\infty\) norm of a closed-loop transfer function:
|
|
\begin{align*}
|
|
\Delta M &= \text{minimum distance between } L(j\omega) \text{ and point } (-1) \\
|
|
&= \min_\omega |L(j\omega) - (-1)| \\
|
|
&= \min_\omega |1 + L(j\omega)| \\
|
|
&= \frac{1}{\max_\omega \frac{1}{|1 + L(j\omega)|}} \\
|
|
&= \frac{1}{\max_\omega \left| \frac{1}{1 + G(j\omega)K(j\omega)}\right|} \\
|
|
&= \frac{1}{\|S\|_\infty}
|
|
\end{align*}
|
|
|
|
Therefore, for a given \(\mathcal{H}_\infty\) norm of \(S\) (\(\|S\|_\infty = M_S\)), we have:
|
|
\begin{equation}
|
|
\Delta G \ge \frac{M_S}{M_S - 1}; \quad \Delta \phi \ge \frac{1}{M_S}
|
|
\end{equation}
|
|
|
|
\begin{important}
|
|
The \(\mathcal{H}_\infty\) norm of the sensitivity function \(\|S\|_\infty\) is a measure of the Module margin \(\Delta M\) and therefore an indicator of the system robustness.
|
|
|
|
\begin{equation}
|
|
\Delta M = \frac{1}{\|S\|_\infty} \label{eq:module_margin_S}
|
|
\end{equation}
|
|
|
|
The wanted robustness of the closed-loop system can be specified by setting a maximum value on \(\|S\|_\infty\).
|
|
\end{important}
|
|
|
|
Note that this is why large peak value of \(|S(j\omega)|\) usually indicate robustness problems.
|
|
And we now understand why setting an upper bound on the magnitude of \(S\) is generally a good idea.
|
|
|
|
\begin{exampl}
|
|
Typical, we require \(\|S\|_\infty < 2 (6dB)\) which implies \(\Delta G \ge 2\) and \(\Delta \phi \ge 29^o\)
|
|
\end{exampl}
|
|
|
|
\begin{seealso}
|
|
To learn more about module/disk margin, you can check out \href{https://www.youtube.com/watch?v=XazdN6eZF80}{this} video.
|
|
\end{seealso}
|
|
|
|
\section{Summary of typical specification and associated wanted shaping}
|
|
\label{sec:org5f5ba8c}
|
|
\label{sec:other_requirements}
|
|
|
|
\begin{table}[htbp]
|
|
\caption{\label{tab:specification_modern}Typical Specifications and corresponding wanted norms of open and closed loop tansfer functions}
|
|
\centering
|
|
\begin{tabularx}{0.9\linewidth}{lXX}
|
|
\toprule
|
|
& \textbf{Open-Loop Shaping} & \textbf{Closed-Loop Shaping}\\
|
|
\midrule
|
|
Reference Tracking & \(L\) large & \(S\) small\\
|
|
Disturbance Rejection & \(L\) large & \(GS\) small\\
|
|
Measurement Noise Filtering & \(L\) small & \(T\) small\\
|
|
Small Command Amplitude & \(K\) and \(L\) small & \(KS\) small\\
|
|
Robustness & Phase/Gain margins & Module margin: \(\Vert S\Vert_\infty\) small\\
|
|
\bottomrule
|
|
\end{tabularx}
|
|
\end{table}
|
|
|
|
\chapter{\(\mathcal{H}_\infty\) Shaping of closed-loop transfer functions}
|
|
\label{sec:org2b02046}
|
|
\label{sec:closed-loop-shaping}
|
|
In the previous sections, we have seen that the performances of the system depends on the \textbf{shape} of the closed-loop transfer function.
|
|
Therefore, the synthesis problem is to design \(K(s)\) such that closed-loop system is stable and such that the closed-loop transfer functions such as \(S\), \(KS\) and \(T\) are shaped as wanted.
|
|
This is clearly not simple as these closed-loop transfer functions does not depend linearly on \(K\).
|
|
But don't worry, the \(\mathcal{H}_\infty\) synthesis will do this job for us!
|
|
|
|
To do so, \textbf{weighting functions} are included in the generalized plant and the \(\mathcal{H}_\infty\) synthesis applied on the \textbf{weighted} generalized plant.
|
|
Such procedure is presented in Section \ref{sec:weighting_functions}.
|
|
|
|
Some advice on the design of weighting functions are given in Section \ref{sec:weighting_functions_design}.
|
|
|
|
An example of the \(\mathcal{H}_\infty\) shaping of the sensitivity function is studied in Section \ref{sec:sensitivity_shaping_example}.
|
|
|
|
Multiple closed-loop transfer functions can be shaped at the same time.
|
|
Such synthesis is usually called \textbf{Mixed-sensitivity Loop Shaping} and is one of the most powerful tool of the robust control theory.
|
|
Some insight on the use and limitations of such techniques are given in Section \ref{sec:shaping_multiple_tf}.
|
|
|
|
\section{How to Shape closed-loop transfer function? Using Weighting Functions!}
|
|
\label{sec:org6ed8543}
|
|
\label{sec:weighting_functions}
|
|
|
|
Suppose we apply the \(\mathcal{H}_\infty\) synthesis on the generalized plant \(P(s)\) shown in Figure \ref{fig:loop_shaping_S_without_W}.
|
|
It will generate a controller \(K(s)\) such that the \(\mathcal{H}_\infty\) norm of closed-loop transfer function from \(r\) to \(\epsilon\) is minimized which is equal to the sensitivity function \(S\).
|
|
Therefore, the synthesis objective is to minimize the \(\mathcal{H}_\infty\) norm of the sensitivity function: \(\|S\|_\infty\).
|
|
|
|
However, as the \(\mathcal{H}_\infty\) norm is the maximum peak value of the transfer function's magnitude, this synthesis is quite useless as it will just try to decrease of peak value of \(S\).
|
|
Clearly this does not allow to \textbf{shape} the norm of \(S(j\omega)\) over all frequencies nor specify the wanted low frequency gain of \(S\) or bandwidth requirements.
|
|
|
|
\begin{figure}[htbp]
|
|
\centering
|
|
\includegraphics[scale=1]{figs/loop_shaping_S_without_W.png}
|
|
\caption{\label{fig:loop_shaping_S_without_W}Generalized Plant}
|
|
\end{figure}
|
|
|
|
|
|
\begin{important}
|
|
The \emph{trick} is to include a \textbf{weighting function} \(W_S(s)\) in the generalized plant as shown in Figure \ref{fig:loop_shaping_S_with_W}.
|
|
|
|
Now, the closed-loop transfer function from \(w\) to \(z\) is equal to \(W_s(s)S(s)\) and applying the \(\mathcal{H}_\infty\) synthesis to the \emph{weighted} generalized plant \(\tilde{P}(s)\) will generate a controller \(K(s)\) such that \(\|W_s(s)S(s)\|_\infty\) is minimized.
|
|
\end{important}
|
|
|
|
Let's now show how this is equivalent as \textbf{shaping} the sensitivity function:
|
|
\begin{align}
|
|
& \left\| W_s(s) S(s) \right\|_\infty < 1\nonumber \\
|
|
\Leftrightarrow & \left| W_s(j\omega) S(j\omega) \right| < 1 \quad \forall \omega\nonumber \\
|
|
\Leftrightarrow & \left| S(j\omega) \right| < \frac{1}{\left| W_s(j\omega) \right|} \quad \forall \omega \label{eq:sensitivity_shaping}
|
|
\end{align}
|
|
|
|
\begin{important}
|
|
As shown in Equation \eqref{eq:sensitivity_shaping}, the objective of the \(\mathcal{H}_\infty\) synthesis applied on the \emph{weighted} plant is to make the norm sensitivity function smaller than the inverse of the norm of the weighting function, and that at all frequencies.
|
|
|
|
Therefore, the choice of the weighting function \(W_s(s)\) is very important: its inverse magnitude will define the wanted \textbf{upper bound} of the sensitivity function magnitude over all frequencies.
|
|
\end{important}
|
|
|
|
\begin{figure}[htbp]
|
|
\centering
|
|
\includegraphics[scale=1]{figs/loop_shaping_S_with_W.png}
|
|
\caption{\label{fig:loop_shaping_S_with_W}Weighted Generalized Plant}
|
|
\end{figure}
|
|
|
|
\begin{exercice}
|
|
Using matlab, compute the weighted generalized plant shown in Figure \ref{fig:first_order_weight} as a function of \(G(s)\) and \(W_S(s)\).
|
|
|
|
\tcbsubtitle{Hint}
|
|
The weighted generalized plant can be defined in Matlab using two techniques:
|
|
\begin{itemize}
|
|
\item by writing manually the 4 transfer functions from \([w, u]\) to \([\tilde{\epsilon}, v]\)
|
|
\item by pre-multiplying the (non-weighted) generalized plant by a block-diagonal transfer function matrix containing the weights for the outputs \(z\) and \texttt{1} for the outputs \(v\)
|
|
\end{itemize}
|
|
\tcbsubtitle{Answer}
|
|
The two solutions below can be used.
|
|
|
|
\begin{minted}[]{matlab}
|
|
Pw = [Ws -Ws*G;
|
|
1 -G];
|
|
\end{minted}
|
|
|
|
The second solution is however more general, and can also be used when weights are added at the inputs by post-multiplying instead of pre-multiplying.
|
|
|
|
\begin{minted}[]{matlab}
|
|
P = [1 -G;
|
|
1 -G];
|
|
Pw = blkdiag(Ws, 1)*P;
|
|
\end{minted}
|
|
\end{exercice}
|
|
|
|
\section{Design of Weighting Functions}
|
|
\label{sec:org6cb9a44}
|
|
\label{sec:weighting_functions_design}
|
|
|
|
Weighting function included in the generalized plant must be \textbf{proper}, \textbf{stable} and \textbf{minimum phase} transfer functions.
|
|
|
|
\begin{definition}
|
|
\begin{description}
|
|
\item[{proper}] more poles than zeros, this implies \(\lim_{\omega \to \infty} |W(j\omega)| < \infty\)
|
|
\item[{stable}] no poles in the right half plane
|
|
\item[{minimum phase}] no zeros in the right half plane
|
|
\end{description}
|
|
\end{definition}
|
|
|
|
Good guidelines for design of weighting function are given in \cite{bibel92_guidel_h}.
|
|
|
|
There is a Matlab function called \texttt{makeweight} that allows to design first-order weights by specifying the low frequency gain, high frequency gain, and the gain at a specific frequency:
|
|
\begin{minted}[]{matlab}
|
|
W = makeweight(dcgain,[freq,mag],hfgain)
|
|
\end{minted}
|
|
with:
|
|
\begin{itemize}
|
|
\item \texttt{dcgain}: low frequency gain
|
|
\item \texttt{[freq,mag]}: frequency \texttt{freq} at which the gain is \texttt{mag}
|
|
\item \texttt{hfgain}: high frequency gain
|
|
\end{itemize}
|
|
|
|
\begin{exampl}
|
|
The Matlab code below produces a weighting function with the following characteristics (Figure \ref{fig:first_order_weight}):
|
|
\begin{itemize}
|
|
\item Low frequency gain of 100
|
|
\item Gain of 1 at 10Hz
|
|
\item High frequency gain of 0.5
|
|
\end{itemize}
|
|
|
|
\begin{minted}[]{matlab}
|
|
Ws = makeweight(1e2, [2*pi*10, 1], 1/2);
|
|
\end{minted}
|
|
|
|
\begin{center}
|
|
\includegraphics[scale=1]{figs/first_order_weight.png}
|
|
\captionof{figure}{\label{fig:first_order_weight}Obtained Magnitude of the Weighting Function}
|
|
\end{center}
|
|
\end{exampl}
|
|
|
|
\begin{seealso}
|
|
Quite often, higher orders weights are required.
|
|
|
|
In such case, the following formula can be used:
|
|
|
|
\begin{equation}
|
|
W(s) = \left( \frac{
|
|
\frac{1}{\omega_0} \sqrt{\frac{1 - \left(\frac{G_0}{G_c}\right)^{\frac{2}{n}}}{1 - \left(\frac{G_c}{G_\infty}\right)^{\frac{2}{n}}}} s + \left(\frac{G_0}{G_c}\right)^{\frac{1}{n}}
|
|
}{
|
|
\left(\frac{1}{G_\infty}\right)^{\frac{1}{n}} \frac{1}{\omega_0} \sqrt{\frac{1 - \left(\frac{G_0}{G_c}\right)^{\frac{2}{n}}}{1 - \left(\frac{G_c}{G_\infty}\right)^{\frac{2}{n}}}} s + \left(\frac{1}{G_c}\right)^{\frac{1}{n}}
|
|
}\right)^n \label{eq:weight_formula_advanced}
|
|
\end{equation}
|
|
|
|
The parameters permit to specify:
|
|
\begin{itemize}
|
|
\item the low frequency gain: \(G_0 = lim_{\omega \to 0} |W(j\omega)|\)
|
|
\item the high frequency gain: \(G_\infty = lim_{\omega \to \infty} |W(j\omega)|\)
|
|
\item the absolute gain at \(\omega_0\): \(G_c = |W(j\omega_0)|\)
|
|
\item the absolute slope between high and low frequency: \(n\)
|
|
\end{itemize}
|
|
|
|
A Matlab function implementing Equation \eqref{eq:weight_formula_advanced} is shown below:
|
|
|
|
\begin{minted}[]{matlab}
|
|
function [W] = generateWeight(args)
|
|
arguments
|
|
args.G0 (1,1) double {mustBeNumeric, mustBePositive} = 0.1
|
|
args.G1 (1,1) double {mustBeNumeric, mustBePositive} = 10
|
|
args.Gc (1,1) double {mustBeNumeric, mustBePositive} = 1
|
|
args.wc (1,1) double {mustBeNumeric, mustBePositive} = 2*pi
|
|
args.n (1,1) double {mustBeInteger, mustBePositive} = 1
|
|
end
|
|
|
|
if (args.Gc <= args.G0 && args.Gc <= args.G1) || (args.Gc >= args.G0 && args.Gc >= args.G1)
|
|
eid = 'value:range';
|
|
msg = 'Gc must be between G0 and G1';
|
|
throwAsCaller(MException(eid,msg))
|
|
end
|
|
|
|
s = zpk('s');
|
|
|
|
W = (((1/args.wc) * sqrt((1-(args.G0/args.Gc)^(2/args.n))/(1-(args.Gc/args.G1)^(2/args.n)))*s + (args.G0/args.Gc)^(1/args.n)) / ((1/args.G1)^(1/args.n) * (1/args.wc) * sqrt((1-(args.G0/args.Gc)^(2/args.n))/(1-(args.Gc/args.G1)^(2/args.n)))*s + (1/args.Gc)^(1/args.n)))^args.n;
|
|
|
|
end
|
|
\end{minted}
|
|
|
|
Let's use this function to generate three weights with the same high and low frequency gains, but but different slopes.
|
|
|
|
\begin{minted}[]{matlab}
|
|
W1 = generateWeight('G0', 1e2, 'G1', 1/2, 'Gc', 1, 'wc', 2*pi*10, 'n', 1);
|
|
W2 = generateWeight('G0', 1e2, 'G1', 1/2, 'Gc', 1, 'wc', 2*pi*10, 'n', 2);
|
|
W3 = generateWeight('G0', 1e2, 'G1', 1/2, 'Gc', 1, 'wc', 2*pi*10, 'n', 3);
|
|
\end{minted}
|
|
|
|
The obtained shapes are shown in Figure \ref{fig:high_order_weight}.
|
|
|
|
\begin{center}
|
|
\includegraphics[scale=1]{figs/high_order_weight.png}
|
|
\captionof{figure}{\label{fig:high_order_weight}Higher order weights using Equation \eqref{eq:weight_formula_advanced}}
|
|
\end{center}
|
|
\end{seealso}
|
|
|
|
\section{Shaping the Sensitivity Function}
|
|
\label{sec:org9084e2e}
|
|
\label{sec:sensitivity_shaping_example}
|
|
|
|
Let's design a controller using the \(\mathcal{H}_\infty\) shaping of the sensitivity function that fulfils the following requirements:
|
|
\begin{enumerate}
|
|
\item Bandwidth of at least 10Hz
|
|
\item Small static errors for step responses
|
|
\item Robustness: Large module margin \(\Delta M > 0.5\) (\(\Rightarrow \Delta G > 2\) and \(\Delta \phi > 29^o\))
|
|
\end{enumerate}
|
|
|
|
As usual, the plant used is the one presented in Section \ref{sec:example_system}.
|
|
|
|
\begin{exercice}
|
|
Translate the requirements as upper bounds on the Sensitivity function and design the corresponding weighting functions using Matlab.
|
|
|
|
\tcbsubtitle{Hint}
|
|
The typical wanted upper bound of the sensitivity function is shown in Figure \ref{fig:h-infinity-spec-S-bis}.
|
|
|
|
More precisely:
|
|
\begin{enumerate}
|
|
\item Recall that the closed-loop bandwidth is defined as the frequency \(|S(j\omega)|\) first crosses \(1/\sqrt{2} = -3dB\) from below
|
|
\item For the small static error, -60dB is usually enough as other factors (measurement noise, disturbances) will anyhow limit the performances
|
|
\item Recall that the module margin is equal to the inverse of the \(\mathcal{H}_\infty\) norm of the sensitivity function:
|
|
\[ \Delta M = \frac{1}{\|S\|_\infty} \]
|
|
\end{enumerate}
|
|
|
|
Remember that the wanted upper bound of the sensitivity function is defined by the \textbf{inverse} magnitude of the weight.
|
|
|
|
\begin{center}
|
|
\includegraphics[scale=1]{figs/h-infinity-spec-S.png}
|
|
\captionof{figure}{\label{fig:h-infinity-spec-S-bis}Typical wanted shape of the Sensitivity transfer function}
|
|
\end{center}
|
|
\tcbsubtitle{Answer}
|
|
We want to design the weighting function \(W_s(s)\) such that:
|
|
\begin{enumerate}
|
|
\item \(|W_s(j \cdot 2 \pi 10)| = \sqrt{2}\)
|
|
\item \(|W_s(j \cdot 0)| = 10^3\)
|
|
\item \(\|W_s\|_\infty = 0.5\)
|
|
\end{enumerate}
|
|
|
|
Using Matlab, such weighting function can be generated using the \texttt{makeweight} function as shown below:
|
|
\begin{minted}[]{matlab}
|
|
Ws = makeweight(1e3, [2*pi*10, sqrt(2)], 1/2);
|
|
\end{minted}
|
|
|
|
Or using the \texttt{generateWeight} function:
|
|
\begin{minted}[]{matlab}
|
|
Ws = generateWeight('G0', 1e3, ...
|
|
'G1', 1/2, ...
|
|
'Gc', sqrt(2), 'wc', 2*pi*10, ...
|
|
'n', 2);
|
|
\end{minted}
|
|
\end{exercice}
|
|
|
|
Let's say we came up with the following weighting function:
|
|
\begin{minted}[]{matlab}
|
|
Ws = generateWeight('G0', 1e3, ...
|
|
'G1', 1/2, ...
|
|
'Gc', sqrt(2), 'wc', 2*pi*10, ...
|
|
'n', 2);
|
|
\end{minted}
|
|
|
|
The weighting function is then added to the generalized plant.
|
|
\begin{minted}[]{matlab}
|
|
P = [1 -G;
|
|
1 -G];
|
|
Pw = blkdiag(Ws, 1)*P;
|
|
\end{minted}
|
|
|
|
And the \(\mathcal{H}_\infty\) synthesis is performed on the \emph{weighted} generalized plant.
|
|
\begin{minted}[]{matlab}
|
|
K = hinfsyn(Pw, 1, 1, 'Display', 'on');
|
|
\end{minted}
|
|
|
|
\begin{verbatim}
|
|
Test bounds: 0.5 <= gamma <= 0.51
|
|
|
|
gamma X>=0 Y>=0 rho(XY)<1 p/f
|
|
5.05e-01 0.0e+00 0.0e+00 3.000e-16 p
|
|
Limiting gains...
|
|
5.05e-01 0.0e+00 0.0e+00 3.461e-16 p
|
|
5.05e-01 -3.5e+01 # -4.9e-14 1.732e-26 f
|
|
|
|
Best performance (actual): 0.503
|
|
\end{verbatim}
|
|
|
|
\(\gamma \approx 0.5\) means that the \(\mathcal{H}_\infty\) synthesis generated a controller \(K(s)\) that stabilizes the closed-loop system, and such that the \(\mathcal{H}_\infty\) norm of the closed-loop transfer function from \(w\) to \(z\) is less than \(\gamma\):
|
|
\begin{align*}
|
|
& \| W_s(s) S(s) \|_\infty \approx 0.5 \\
|
|
& \Leftrightarrow |S(j\omega)| < \frac{0.5}{|W_s(j\omega)|} \quad \forall \omega
|
|
\end{align*}
|
|
|
|
This is indeed what we can see by comparing \(|S|\) and \(|W_S|\) in Figure \ref{fig:results_sensitivity_hinf}.
|
|
|
|
\begin{important}
|
|
Obtaining \(\gamma < 1\) means that the \(\mathcal{H}_\infty\) synthesis found a controller such that the specified closed-loop transfer functions are bellow the specified upper bounds.
|
|
|
|
Yet, obtaining a \(\gamma\) slightly above one does not necessary means the synthesis is unsuccessful.
|
|
It just means that at some frequency, one of the closed-loop transfer functions is above the specified upper bound by a factor \(\gamma\).
|
|
\end{important}
|
|
|
|
\begin{figure}[htbp]
|
|
\centering
|
|
\includegraphics[scale=1]{figs/results_sensitivity_hinf.png}
|
|
\caption{\label{fig:results_sensitivity_hinf}Weighting function and obtained closed-loop sensitivity}
|
|
\end{figure}
|
|
|
|
\section{Shaping multiple closed-loop transfer functions - Limitations}
|
|
\label{sec:org08a5a05}
|
|
\label{sec:shaping_multiple_tf}
|
|
As was shown in Section \ref{sec:modern_interpretation_specification}, each of the four main closed-loop transfer functions (called the \emph{gang of four}) will impact different characteristics of the closed-loop system.
|
|
This is summarized in Table \ref{tab:usual_shaping_gang_four}.
|
|
|
|
Therefore, we might want to shape multiple closed-loop transfer functions at the same time.
|
|
For instance \(S\) could be shape to have good step responses, \(KS\) to limit the input usage and \(T\) to filter measurement noise.
|
|
When multiple closed-loop transfer function are shaped at the same time, it is refereed to as \textbf{Mixed-Sensitivity \(\mathcal{H}_\infty\) Control} and is the subject of Section \ref{sec:h_infinity_mixed_sensitivity}.
|
|
|
|
\begin{table}[htbp]
|
|
\caption{\label{tab:usual_shaping_gang_four}Typical specifications and corresponding shaping of the \emph{Gang of four}}
|
|
\centering
|
|
\begin{tabularx}{0.9\linewidth}{llX}
|
|
\toprule
|
|
\textbf{Specifications} & \textbf{TF} & \textbf{Wanted shape}\\
|
|
\midrule
|
|
Fast Reference Tracking & \(S\) & Set lower bound on the bandwidth\\
|
|
Small Steady State Errors & \(S\) & Small low frequency gain\\
|
|
Follow Step ref. inputs & \(S\) & Slope of +20dB/dec at low frequency\\
|
|
Follow Ramp ref. inputs & \(S\) & Slope of +40dB/dec at low frequency\\
|
|
Follow Sin. ref. inputs & \(S\) & Small magnitude centered on the sin. frequency\\
|
|
\midrule
|
|
Output Disturbance Rejection & \(S\) & Small gain in the disturbance bandwidth\\
|
|
Input Disturbance Rejection & \(GS\) & Small gain in the disturbance bandwidth\\
|
|
Prevent notching resonances & \(GS\) & Limit gain around resonance\\
|
|
\midrule
|
|
Small Command Amplitude & \(KS\) & Small at high frequency\\
|
|
Limitation of the Bandwidth & \(T\) & Set an upper bound on the bandwidth\\
|
|
Measurement Noise Filtering & \(T\) & Small high frequency gain\\
|
|
\midrule
|
|
Stability margins & \(S\) & Module margin: \(\Vert S\Vert_\infty\) small\\
|
|
Robust to unmodelled dynamics & \(T\) & Small at freq. where uncertainty is large\\
|
|
\bottomrule
|
|
\end{tabularx}
|
|
\end{table}
|
|
|
|
Depending on which closed-loop transfer function are to be shaped, different weighted generalized plant can be used.
|
|
Some of them are described below for reference, it is a good exercise to try to re-design such weighted generalized plants.
|
|
\begin{exampl}[after title={~- Shape $S$ and $KS$}]
|
|
\begin{center}
|
|
\includegraphics[scale=1]{figs/general_conf_shaping_S_KS.png}
|
|
\captionof{figure}{\label{fig:general_conf_shaping_S_KS}Generalized Plant to shape \(S\) and \(KS\)}
|
|
\end{center}
|
|
|
|
Weighting functions:
|
|
\begin{itemize}
|
|
\item \(W_1(s)\) is used to shape \(S\)
|
|
\item \(W_2(s)\) is used to shape \(KS\)
|
|
\end{itemize}
|
|
|
|
\begin{minted}[]{matlab}
|
|
P = [1 -G
|
|
0 1
|
|
1 -G];
|
|
Pw = blkdiag(W1, W2, 1)*P;
|
|
\end{minted}
|
|
\end{exampl}
|
|
\begin{exampl}[after title={~- Shape $S$ and $T$}]
|
|
\begin{center}
|
|
\includegraphics[scale=1]{figs/general_conf_shaping_S_T.png}
|
|
\captionof{figure}{\label{fig:general_conf_shaping_S_T}Generalized Plant to shape \(S\) and \(T\)}
|
|
\end{center}
|
|
|
|
Weighting functions:
|
|
\begin{itemize}
|
|
\item \(W_1\) is used to shape \(S\)
|
|
\item \(W_2\) is used to shape \(T\)
|
|
\end{itemize}
|
|
|
|
\begin{minted}[]{matlab}
|
|
P = [1 -G
|
|
0 G
|
|
1 -G];
|
|
Pw = blkdiag(W1, W2, 1)*P;
|
|
\end{minted}
|
|
\end{exampl}
|
|
\begin{exampl}[after title={~- Shape $S$ and $GS$}]
|
|
\begin{center}
|
|
\includegraphics[scale=1]{figs/general_conf_shaping_S_GS.png}
|
|
\captionof{figure}{\label{fig:general_conf_shaping_S_GS}Generalized Plant to shape \(S\) and \(GS\)}
|
|
\end{center}
|
|
|
|
Weighting functions:
|
|
\begin{itemize}
|
|
\item \(W_1\) is used to shape \(S\)
|
|
\item \(W_2\) is used to shape \(GS\)
|
|
\end{itemize}
|
|
|
|
\begin{minted}[]{matlab}
|
|
P = [1 -1
|
|
G -G
|
|
G -G];
|
|
Pw = blkdiag(W1, W2, 1)*P;
|
|
\end{minted}
|
|
\end{exampl}
|
|
\begin{exampl}[after title={~- Shape $S$, $T$ and $KS$}]
|
|
\begin{center}
|
|
\includegraphics[scale=1]{figs/general_conf_shaping_S_T_KS.png}
|
|
\captionof{figure}{\label{fig:general_conf_shaping_S_T_KS}Generalized Plant to shape \(S\), \(T\) and \(KS\)}
|
|
\end{center}
|
|
|
|
Weighting functions:
|
|
\begin{itemize}
|
|
\item \(W_1\) is used to shape \(S\)
|
|
\item \(W_2\) is used to shape \(KS\)
|
|
\item \(W_3\) is used to shape \(T\)
|
|
\end{itemize}
|
|
|
|
\begin{minted}[]{matlab}
|
|
P = [1 -G
|
|
0 1
|
|
0 G
|
|
1 -G];
|
|
Pw = blkdiag(W1, W2, W3, 1)*P;
|
|
\end{minted}
|
|
\end{exampl}
|
|
\begin{exampl}[after title={~- Shape $S$, $T$ and $GS$}]
|
|
\begin{center}
|
|
\includegraphics[scale=1]{figs/general_conf_shaping_S_T_GS.png}
|
|
\captionof{figure}{\label{fig:general_conf_shaping_S_T_GS}Generalized Plant to shape \(S\), \(T\) and \(GS\)}
|
|
\end{center}
|
|
|
|
Weighting functions:
|
|
\begin{itemize}
|
|
\item \(W_1\) is used to shape \(S\)
|
|
\item \(W_2\) is used to shape \(GS\)
|
|
\item \(W_3\) is used to shape \(T\)
|
|
\end{itemize}
|
|
|
|
\begin{minted}[]{matlab}
|
|
P = [1 -1
|
|
G -G
|
|
0 1
|
|
G -G];
|
|
Pw = blkdiag(W1, W2, W3, 1)*P;
|
|
\end{minted}
|
|
\end{exampl}
|
|
\begin{exampl}[after title={~- Shape $S$, $T$, $KS$ and $GS$}]
|
|
\begin{center}
|
|
\includegraphics[scale=1]{figs/general_conf_shaping_S_T_KS_GS.png}
|
|
\captionof{figure}{\label{fig:general_conf_shaping_S_T_KS_GS}Generalized Plant to shape \(S\), \(T\), \(KS\) and \(GS\)}
|
|
\end{center}
|
|
|
|
Weighting functions:
|
|
\begin{itemize}
|
|
\item \(W_1\) is used to shape \(S\)
|
|
\item \(W_2\) is used to shape \(KS\)
|
|
\item \(W_1W_3\) is used to shape \(GS\)
|
|
\item \(W_2W_3\) is used to shape \(T\)
|
|
\end{itemize}
|
|
|
|
\begin{minted}[]{matlab}
|
|
P = [ 1 -G -G
|
|
0 0 1
|
|
1 -G -G];
|
|
Pw = blkdiag(W1, W2, 1)*P*blkdiag(1, W3, 1);
|
|
\end{minted}
|
|
\end{exampl}
|
|
\begin{important}
|
|
When shaping multiple closed-loop transfer functions, one should be very careful about the three following points that are further discussed:
|
|
\begin{itemize}
|
|
\item The shaped closed-loop transfer functions are linked by mathematical relations and cannot be shaped independently
|
|
\item Closed-loop transfer function can only be shaped in certain frequency range
|
|
\item The size of the obtained controller may be very large and not implementable in practice
|
|
\end{itemize}
|
|
\end{important}
|
|
|
|
\begin{warning}
|
|
Mathematical relations are linking the closed-loop transfer functions.
|
|
For instance, the sensitivity function \(S(s)\) and the complementary sensitivity function \(T(s)\) are linked by the following well known relation:
|
|
\begin{equation}
|
|
S(s) + T(s) = 1
|
|
\end{equation}
|
|
|
|
This means that \(|S(j\omega)|\) and \(|T(j\omega)|\) cannot be made small at the same time!
|
|
|
|
It is therefore \textbf{not} possible to shape the four closed-loop transfer functions independently.
|
|
The weighting function should be carefully design such as these fundamental relations are not violated.
|
|
\end{warning}
|
|
|
|
For practical control systems, above some frequency (the control bandwidth), the loop gain is much smaller than 1.
|
|
On the other size, there is a frequency range where the loop gain is much larger than 1, this frequency range is called the bandwidth.
|
|
Let's see what does that means for the closed-loop transfer function.
|
|
First, take the case of the sensibility function:
|
|
\begin{align*}
|
|
&|G(j\omega) K(j\omega)| \ll 1 \Longrightarrow |S(j\omega)| = \frac{1}{1 + |G(j\omega)K(j\omega)|} \approx 1 \\
|
|
&|G(j\omega) K(j\omega)| \gg 1 \Longrightarrow |S(j\omega)| = \frac{1}{1 + |G(j\omega)K(j\omega)|} \approx \frac{1}{|G(j\omega)K(j\omega)|}
|
|
\end{align*}
|
|
|
|
This means that the Sensitivity function cannot be shaped at frequencies where the loop gain is small.
|
|
|
|
Similar relationship can be found for \(T\), \(KS\) and \(GS\).
|
|
|
|
\begin{exercice}
|
|
Determine the approximate norms of \(T\), \(KS\) and \(GS\) for large loop gains (\(|G(j\omega) K(j\omega)| \gg 1\)) and small loop gains (\(|G(j\omega) K(j\omega)| \ll 1\)).
|
|
|
|
\tcbsubtitle{Hint}
|
|
You can follows this procedure for \(T\), \(KS\) and \(GS\):
|
|
\begin{enumerate}
|
|
\item Write the closed-loop transfer function as a function of \(K(s)\) and \(G(s)\)
|
|
\item Take \(|K(j\omega)G(j\omega)| \gg 1\) and conclude on the norm of the closed-loop transfer function
|
|
\item Take \(|K(j\omega)G(j\omega)| \ll 1\) and conclude
|
|
\end{enumerate}
|
|
\tcbsubtitle{Answer}
|
|
The obtained constrains are shown in Figure \ref{fig:h-infinity-4-blocs-constrains}.
|
|
\end{exercice}
|
|
|
|
Depending on the frequency band, the norms of the closed-loop transfer functions are a function of the controller \(K\) and therefore can be shaped.
|
|
However, in some frequency band, the norms do not depend on the controller and therefore \textbf{cannot} be shaped.
|
|
|
|
Therefore the weighting functions should only focus on certainty frequency range depending on the transfer function being shaped.
|
|
These regions are summarized in Figure \ref{fig:h-infinity-4-blocs-constrains}.
|
|
|
|
\begin{figure}[htbp]
|
|
\centering
|
|
\includegraphics[scale=1]{figs/h-infinity-4-blocs-constrains.png}
|
|
\caption{\label{fig:h-infinity-4-blocs-constrains}Shaping the Gang of Four. Blue regions indicate that the transfer function can be shaped using \(K\). Red regions indicate this is not the case}
|
|
\end{figure}
|
|
|
|
\begin{warning}
|
|
The order (e.g. number of state) of the controller given by the \(\mathcal{H}_\infty\) synthesis is equal to the order (e.g. number of state) of the weighted generalized plant.
|
|
It is thus equal to the \textbf{sum} of the number of state of the non-weighted generalized plant and the number of state of all the weighting functions.
|
|
Then, the \(\mathcal{H}_\infty\) synthesis usually generate a controller with a very high order that is not implementable in practice.
|
|
|
|
Two approaches can be used to obtain controllers with reasonable order:
|
|
\begin{enumerate}
|
|
\item use simple weights (usually first order)
|
|
\item perform a model reduction on the obtained high order controller
|
|
\end{enumerate}
|
|
\end{warning}
|
|
|
|
\chapter{Mixed-Sensitivity \(\mathcal{H}_\infty\) Control - Example}
|
|
\label{sec:org4999065}
|
|
\label{sec:h_infinity_mixed_sensitivity}
|
|
Let's now apply the \(\mathcal{H}_\infty\) Shaping control procedure on a practical example.
|
|
|
|
In Section \ref{sec:ex_control_problem} the control problem is presented.
|
|
The design procedure used to apply the \(\mathcal{H}_\infty\) Mixed Sensitivity synthesis is described in Section \ref{sec:ex_control_procedure}.
|
|
|
|
The important step of interpreting the specifications as wanted shape of closed-loop transfer functions is performed in Section \ref{sec:ex_specification_interpretation}.
|
|
|
|
Finally, the shaping of closed-loop transfer functions is performed in Sections \ref{sec:ex_shaping_S}, \ref{sec:ex_shaping_GS} and \ref{sec:ex_shaping_T}.
|
|
|
|
\section{Control Problem}
|
|
\label{sec:org4641813}
|
|
\label{sec:ex_control_problem}
|
|
|
|
Let's consider our usual \emph{test system} shown in Figure \ref{fig:ex_test_system}.
|
|
|
|
\begin{figure}[htbp]
|
|
\centering
|
|
\includegraphics[scale=1]{figs/ex_test_system.png}
|
|
\caption{\label{fig:ex_test_system}Test System consisting of a payload with a mass \(m\) on top of an active system with a stiffness \(k\), damping \(c\) and an actuator. A feedback controller \(K(s)\) is added to position / isolate the payload.}
|
|
\end{figure}
|
|
|
|
\begin{important}
|
|
The control specifications are:
|
|
\begin{itemize}
|
|
\item The displacement \(y\) should follow reference inputs \(r\) with negligible static error after 0.1s
|
|
\item Reject disturbances \(d\) in less than 0.1s
|
|
\item Limit the effect of measurement noise \(n\) on the output displacement \(y\)
|
|
\item Obtain a Robust System with good stability margins
|
|
\end{itemize}
|
|
\end{important}
|
|
|
|
The considered inputs are:
|
|
\begin{itemize}
|
|
\item disturbances \(d\) as step inputs with an amplitude of \(5\,\mu m\)
|
|
\item reference inputs with are ramp inputs with a slope of \(100\,\mu m/s\) and a time duration of \(0.2\,s\)
|
|
\item measurement noise \(n\) with a large spectral density at high frequency (increasing starting from 100Hz)
|
|
\end{itemize}
|
|
|
|
\section{Control Design Procedure}
|
|
\label{sec:org2f6babe}
|
|
\label{sec:ex_control_procedure}
|
|
|
|
Here is the general design procedure that will be followed:
|
|
\begin{enumerate}
|
|
\item Compute the model of the plant
|
|
\item Write the control system as a general control problem
|
|
\item Translate the specifications into the wanted shape of closed-loop transfer functions
|
|
\item Chose the suitable weighted general plant to shape the wanted quantities
|
|
\item Shape sequentially the chosen closed-loop transfer functions
|
|
\end{enumerate}
|
|
|
|
Let's first convert the system of Figure \ref{fig:ex_test_system} into the classical feedback architecture of Figure \ref{fig:classical_feedback_test_system_bis}.
|
|
|
|
\begin{figure}[htbp]
|
|
\centering
|
|
\includegraphics[scale=1]{figs/ex_test_system_feedback.png}
|
|
\caption{\label{fig:classical_feedback_test_system_bis}Block diagram corresponding to the example system}
|
|
\end{figure}
|
|
|
|
The two transfer functions present in the system are derived and defined below:
|
|
\begin{minted}[linenos,firstnumber=1]{matlab}
|
|
k = 1e6; % Stiffness [N/m]
|
|
c = 4e2; % Damping [N/(m/s)]
|
|
m = 10; % Mass [kg]
|
|
|
|
% Control Plant
|
|
G = 1/(m*s^2 + c*s + k);
|
|
% Disturbance dynamics
|
|
Gd = (c*s + k)/(m*s^2 + c*s + k);
|
|
\end{minted}
|
|
|
|
We also define the inputs signals that will be used for time domain simulations.
|
|
They are graphically shown in Figure \ref{fig:ex_inputs_signals}.
|
|
\begin{minted}[linenos,firstnumber=9]{matlab}
|
|
% Time Vector
|
|
t = 0:1e-4:0.5;
|
|
|
|
% Reference Input
|
|
r = zeros(size(t));
|
|
r(t>0.05 & t<=0.25) = 1e-4*(t(t>0.05 & t<=0.25)-0.05);
|
|
r(t>0.25) = 2e-5;
|
|
|
|
% Measurement Noise
|
|
Fs = 1e3; % Sampling Frequency [Hz]
|
|
Ts = 1/Fs; % Sampling Time [s]
|
|
n = sqrt(Fs/2)*randn(1, length(t)); % Signal with an ASD equal to one
|
|
n = lsim(1e-6*(s + 2*pi*1e2)^2/(s + 2*pi*1e3)^2/(1+s/2/pi/500), n, t)'; % Shaped noise
|
|
|
|
% Disturbance
|
|
d = zeros(size(t));
|
|
d(t>0.3) = 5e-6;
|
|
\end{minted}
|
|
|
|
\begin{figure}[htbp]
|
|
\centering
|
|
\includegraphics[scale=1]{figs/ex_inputs_signals.png}
|
|
\caption{\label{fig:ex_inputs_signals}Time domain inputs signals}
|
|
\end{figure}
|
|
|
|
We also define the generalized plant corresponding to the system and that will be used for time domain simulations (Figure \ref{fig:ex_general_plant_sim}).
|
|
\begin{figure}[htbp]
|
|
\centering
|
|
\includegraphics[scale=1]{figs/ex_general_plant_sim.png}
|
|
\caption{\label{fig:ex_general_plant_sim}Generalized plant that will be used for simulations}
|
|
\end{figure}
|
|
|
|
The Generalized plant of Figure \ref{fig:ex_general_plant_sim} is defined on Matlab as follows:
|
|
\begin{minted}[linenos,firstnumber=26]{matlab}
|
|
Psim = [0 0 Gd G
|
|
0 0 0 1
|
|
1 -1 -Gd -G];
|
|
|
|
Psim.InputName = {'r', 'n', 'd', 'u'};
|
|
Psim.OutputName = {'y', 'u', 'e'};
|
|
\end{minted}
|
|
|
|
Time domain simulations will be performed by first computing the closed-loop system using the \texttt{lft} command and then using the \texttt{lsim} command on the closed-loop system:
|
|
\begin{minted}[linenos,firstnumber=32]{matlab}
|
|
% Compute the closed-Loop System, K is the controller
|
|
P_CL = lft(Psim, K);
|
|
|
|
% Time simulation of the closed-loop system with specified inputs
|
|
z = lsim(P_CL, [r; n; d], t);
|
|
% The two outputs are
|
|
y = z(:,1); % Output Motion [m]
|
|
u = z(:,2); % Input usage [N]
|
|
\end{minted}
|
|
|
|
\section{Modern Interpretation of control specifications}
|
|
\label{sec:orga74724d}
|
|
\label{sec:ex_specification_interpretation}
|
|
|
|
\begin{exercice}
|
|
\begin{enumerate}
|
|
\item Translate the control specifications into wanted shape of closed-loop transfer functions
|
|
\item Conclude and the closed-loop transfer functions to be shaped
|
|
\item Chose a general configuration architecture that allows to shape these transfer function
|
|
\item Using Matlab, define the generalized plant
|
|
\end{enumerate}
|
|
|
|
\tcbsubtitle{Hint}
|
|
\begin{enumerate}
|
|
\item Make use of Table \ref{tab:usual_shaping_gang_four}
|
|
\item Make use of Table \ref{tab:usual_shaping_gang_four}
|
|
\item See Section \ref{sec:shaping_multiple_tf}
|
|
\item See Section \ref{sec:shaping_multiple_tf}
|
|
\end{enumerate}
|
|
\end{exercice}
|
|
|
|
After converting the control specifications into wanted shape of closed-loop transfer functions, we might come up with the Table \ref{tab:ex_specification_shapes}.
|
|
|
|
In such case, we want to shape \(S\), \(GS\) and \(T\).
|
|
|
|
\begin{table}[htbp]
|
|
\caption{\label{tab:ex_specification_shapes}Control Specifications and associated wanted shape of the closed-loop transfer functions}
|
|
\centering
|
|
\begin{tabularx}{0.7\linewidth}{llX}
|
|
\toprule
|
|
\textbf{Specification} & \textbf{TF} & \textbf{Wanted Shape}\\
|
|
\midrule
|
|
Follow Step Reference & \(S\) & +40dB of slope at low frequency\\
|
|
Reject Disturbances & \(S\), \(GS\) & Small gain\\
|
|
Reject measurement noise & \(T\) & Small high frequency (>100Hz) gain\\
|
|
Robust System & \(S\) & Small \(\Vert S \Vert_\infty\)\\
|
|
\bottomrule
|
|
\end{tabularx}
|
|
\end{table}
|
|
|
|
To do so, we use to generalized plant shown in Figure \ref{fig:ex_general_plant} for the synthesis where the three closed-loop tranfert functions from \(w\) to \([z_1\,,z_2\,,z_3]\) are respectively \(S\), \(GS\) and \(T\).
|
|
|
|
This generalized plant is defined on Matlab as follows:
|
|
\begin{minted}[linenos,firstnumber=40]{matlab}
|
|
P = [1 -1
|
|
G -G
|
|
0 1
|
|
G -G];
|
|
\end{minted}
|
|
|
|
\begin{figure}[htbp]
|
|
\centering
|
|
\includegraphics[scale=1]{figs/ex_general_plant.png}
|
|
\caption{\label{fig:ex_general_plant}Generalized plant chosen for the shaping of \(S\), \(GS\) \(T\)}
|
|
\end{figure}
|
|
|
|
However, to performed the \(\mathcal{H}_\infty\) loop shaping, we have to include \textbf{weighting function} to the Generalized plant.
|
|
We obtain the \textbf{weighted generalized plant} in Figure \ref{fig:ex_general_weighted_plant}, and that is computed using Matlab as follows:
|
|
\begin{minted}[linenos,firstnumber=44]{matlab}
|
|
Pw = blkdiag(W1, W2, W3, 1)*P;
|
|
\end{minted}
|
|
|
|
\begin{figure}[htbp]
|
|
\centering
|
|
\includegraphics[scale=1]{figs/ex_general_weighted_plant.png}
|
|
\caption{\label{fig:ex_general_weighted_plant}Generalized weighted plant used for the \(\mathcal{H}_\infty\) Synthesis}
|
|
\end{figure}
|
|
|
|
Finlay, performing the \(\mathcal{H}_\infty\) Shaping of \(S\), \(GS\) and \(T\) is as simple as ruining the \texttt{hinfsyn} command:
|
|
\begin{minted}[linenos,firstnumber=45]{matlab}
|
|
K = hinfsyn(Pw, 1, 1);
|
|
\end{minted}
|
|
|
|
|
|
Now let's shape the three closed-loop transfer functions sequentially:
|
|
\begin{itemize}
|
|
\item \(S\) is shaped in Section \ref{sec:ex_shaping_S}
|
|
\item \(GS\) is shaped in Section \ref{sec:ex_shaping_GS}
|
|
\item \(T\) is shaped in Section \ref{sec:ex_shaping_T}
|
|
\end{itemize}
|
|
|
|
\section{Step 1 - Shaping of \(S\)}
|
|
\label{sec:orgfba6439}
|
|
\label{sec:ex_shaping_S}
|
|
|
|
Let's first shape the Sensitivity function as it is usually the most important of the \emph{Gang of four} closed-loop transfer functions.
|
|
To do so, we have to create a weight \(W_1(s)\) that defines the wanted upper bound on \(|S(j\omega)|\):
|
|
\begin{itemize}
|
|
\item small low frequency gain: \(|S(j\cdot 0)| = 10^{-3}\)
|
|
\item minimum crossover frequency of \(\approx 10Hz\): \(|S(j2\pi 10)| < \frac{1}{\sqrt{2}}\)
|
|
\item small maximum peak magnitude for robustness properties: \(\|S\|_\infty < 2\)
|
|
\end{itemize}
|
|
|
|
The weighting function is design using the \texttt{generateWeigh} function and its inverse shape can be seen in Figure
|
|
\begin{minted}[linenos,firstnumber=46]{matlab}
|
|
W1 = generateWeight('G0', 1e3, ...
|
|
'G1', 1/2, ...
|
|
'Gc', sqrt(2), 'wc', 2*pi*10, ...
|
|
'n', 1);
|
|
\end{minted}
|
|
|
|
To not constrain \(GS\) and \(T\) for the shaping of \(S\), \(W_2\) and \(W_3\) are first taken as very small gains:
|
|
\begin{minted}[linenos,firstnumber=50]{matlab}
|
|
W2 = tf(1e-8);
|
|
W3 = tf(1e-8);
|
|
\end{minted}
|
|
|
|
The \(\mathcal{H}_\infty\) synthesis is performed and the obtained closed-loop transfer functions \(S\), \(GS\), and \(T\) and compared with the upper bounds set by the weighting functions in Figure \ref{fig:ex_results_1}.
|
|
|
|
\begin{minted}[linenos,firstnumber=52]{matlab}
|
|
Pw = blkdiag(W1, W2, W3, 1)*P;
|
|
K1 = hinfsyn(Pw, 1, 1, 'Display', 'on');
|
|
\end{minted}
|
|
|
|
\begin{verbatim}
|
|
Test bounds: 0.5 <= gamma <= 0.51
|
|
|
|
gamma X>=0 Y>=0 rho(XY)<1 p/f
|
|
5.05e-01 0.0e+00 0.0e+00 5.511e-14 p
|
|
Limiting gains...
|
|
5.05e-01 0.0e+00 0.0e+00 1.867e-14 p
|
|
|
|
Best performance (actual): 0.502
|
|
\end{verbatim}
|
|
|
|
\begin{figure}[htbp]
|
|
\centering
|
|
\includegraphics[scale=1]{figs/ex_results_1.png}
|
|
\caption{\label{fig:ex_results_1}Obtained Shape Closed-Loop transfer functions (dashed black lines indicate inverse magnitude of the weighting functions)}
|
|
\end{figure}
|
|
|
|
Time domain simulation is then performed and the obtained output displacement and control inputs are shown in Figure \ref{fig:ex_time_domain_1}.
|
|
|
|
We can see:
|
|
\begin{itemize}
|
|
\item we are not able to follow the ramp input. This have to be solved by modifying the weighting function \(W_1(s)\)
|
|
\item we have poor rejection of disturbances. This we be solve by shaping \(GS\) in Section \ref{sec:ex_shaping_GS}
|
|
\item we have quite large effect of the measurement noise. This will be solved by shaping \(T\) in Section \ref{sec:ex_shaping_T}
|
|
\end{itemize}
|
|
|
|
\begin{figure}[htbp]
|
|
\centering
|
|
\includegraphics[scale=1]{figs/ex_time_domain_1.png}
|
|
\caption{\label{fig:ex_time_domain_1}Time domain simulation results}
|
|
\end{figure}
|
|
|
|
Remember that in order to follow ramp inputs, the sensitivity function should have a slope of +40dB/dec at low frequency (Table \ref{tab:usual_shaping_gang_four}).
|
|
|
|
To do so, let's modify \(W_1\) to impose a slope of +40dB/dec at low frequency.
|
|
This can simple be done by using a second order weight:
|
|
\begin{minted}[linenos,firstnumber=54]{matlab}
|
|
W1 = generateWeight('G0', 1e3, ...
|
|
'G1', 1/2, ...
|
|
'Gc', sqrt(2), 'wc', 2*pi*15, ...
|
|
'n', 2);
|
|
\end{minted}
|
|
|
|
The \(\mathcal{H}_\infty\) synthesis is performed using the new weights and the obtained closed-loop shaped are shown in figure \ref{fig:ex_results_1b}.
|
|
|
|
The time domain signals are shown in Figure \ref{fig:ex_time_domain_1b} and it is confirmed that the ramps are now follows without static errors.
|
|
|
|
\begin{figure}[htbp]
|
|
\centering
|
|
\includegraphics[scale=1]{figs/ex_results_1b.png}
|
|
\caption{\label{fig:ex_results_1b}Obtained Shape Closed-Loop transfer functions}
|
|
\end{figure}
|
|
|
|
\begin{figure}[htbp]
|
|
\centering
|
|
\includegraphics[scale=1]{figs/ex_time_domain_1b.png}
|
|
\caption{\label{fig:ex_time_domain_1b}Time domain simulation results}
|
|
\end{figure}
|
|
|
|
\section{Step 2 - Shaping of \(GS\)}
|
|
\label{sec:org0c2dbb8}
|
|
\label{sec:ex_shaping_GS}
|
|
|
|
Looking at Figure \ref{fig:ex_results_2}, it is clear that the rejection of disturbances is not satisfactory.
|
|
This can also be seen by the large peak of \(GS\) in Figure \ref{fig:ex_results_1b}.
|
|
|
|
This poor rejection of disturbances is actually due to the fact that the obtain controller has at notch at the resonance frequency of the plant.
|
|
|
|
|
|
To overcome this issue, we can simply increase the magnitude of \(W_2\) to limit the peak magnitude of \(GS\)
|
|
Let's take \(W_2\) as a simple constant gain:
|
|
\begin{minted}[linenos,firstnumber=58]{matlab}
|
|
W2 = tf(4e5);
|
|
\end{minted}
|
|
|
|
The \(\mathcal{H}_\infty\) Synthesis is performed and the obtained closed-loop transfer functions are shown in Figure \ref{fig:ex_results_2}.
|
|
\begin{figure}[htbp]
|
|
\centering
|
|
\includegraphics[scale=1]{figs/ex_results_2.png}
|
|
\caption{\label{fig:ex_results_2}Obtained Shape Closed-Loop transfer functions}
|
|
\end{figure}
|
|
|
|
Time domain simulation results are shown in Figure \ref{fig:ex_time_domain_2}.
|
|
If is shown that indeed, the disturbance rejection performance are much better and only very small oscillation is obtained.
|
|
|
|
\begin{figure}[htbp]
|
|
\centering
|
|
\includegraphics[scale=1]{figs/ex_time_domain_2.png}
|
|
\caption{\label{fig:ex_time_domain_2}Time domain simulation results}
|
|
\end{figure}
|
|
|
|
\section{Step 3 - Shaping of \(T\)}
|
|
\label{sec:org98a0d1b}
|
|
\label{sec:ex_shaping_T}
|
|
|
|
Finally, we want to limit the effect of the noise on the displacement output.
|
|
|
|
To do so, \(T\) is shaped such that its high frequency gain is reduced.
|
|
|
|
This is done by increasing the high frequency gain of the weighting function \(W_3\) until the \(\mathcal{H}_\infty\) synthesis gives \(\gamma \approx 1\).
|
|
|
|
The final weighting function \(W_3\) is defined as follows:
|
|
\begin{minted}[linenos,firstnumber=59]{matlab}
|
|
W3 = generateWeight('G0', 1e-1, ...
|
|
'G1', 1e4, ...
|
|
'Gc', 1, 'wc', 2*pi*70, ...
|
|
'n', 2);
|
|
\end{minted}
|
|
|
|
The \(\mathcal{H}_\infty\) synthesis is performed and \(\gamma\) is closed to one.
|
|
The obtained closed-loop transfer functions are shown in Figure \ref{fig:ex_results_3} and we can obverse that:
|
|
\begin{itemize}
|
|
\item The high frequency gain of \(T\) is indeed reduced
|
|
\item This comes as the expense of a large magnitude both \(GS\) and \(S\).
|
|
This means we will probably have slightly less good disturbance rejection and tracking performances.
|
|
\end{itemize}
|
|
|
|
\begin{figure}[htbp]
|
|
\centering
|
|
\includegraphics[scale=1]{figs/ex_results_3.png}
|
|
\caption{\label{fig:ex_results_3}Obtained Shape Closed-Loop transfer functions}
|
|
\end{figure}
|
|
|
|
The time domain simulation signals are shown in Figure \ref{fig:ex_time_domain_3}.
|
|
We can indeed see a slightly less good disturbance rejection.
|
|
However, the vibrations induced by the sensor noise is well reduced.
|
|
This can be seen when zooming on the output signal in Figure \ref{fig:ex_time_domaim_3_zoom}.
|
|
|
|
\begin{figure}[htbp]
|
|
\centering
|
|
\includegraphics[scale=1]{figs/ex_time_domain_3.png}
|
|
\caption{\label{fig:ex_time_domain_3}Time domain simulation results}
|
|
\end{figure}
|
|
|
|
\begin{figure}[htbp]
|
|
\centering
|
|
\includegraphics[scale=1]{figs/ex_time_domaim_3_zoom.png}
|
|
\caption{\label{fig:ex_time_domaim_3_zoom}Zoom on the output signal}
|
|
\end{figure}
|
|
|
|
\section{Conclusion and Discussion}
|
|
\label{sec:org544ddf1}
|
|
|
|
Hopefully this practical example will help you apply the \(\mathcal{H}_\infty\) Shaping synthesis on other control problems.
|
|
|
|
As an exercise, plot and analyze the evolution of the controller and loop gain transfer functions during the 3 synthesis steps.
|
|
|
|
If the large input usage is considered to be not acceptable, the shaping of \(KS\) could be included in the synthesis and all the \emph{Gang of four} closed-loop transfer function shapes.
|
|
|
|
\chapter{Conclusion}
|
|
\label{sec:org6166298}
|
|
\label{sec:conclusion}
|
|
|
|
Hopefully, this document gave you a glimpse on how useful and powerful the \(\mathcal{H}_\infty\) loop shaping synthesis can be.
|
|
One of the true power of \(\mathcal{H}_\infty\) synthesis is that is can easily be applied to multi-input multi-output systems!
|
|
If you want to know more about the ``\(\mathcal{H}_\infty\) and robust control world'' some resources are given below.
|
|
|
|
\chapter*{Resources}
|
|
\label{sec:orgd57bda1}
|
|
For a complete treatment of multivariable robust control, I would highly recommend this book \cite{skogestad07_multiv_feedb_contr}.
|
|
If you want to nice reference book in French, look at \cite{duc99_comman_h}.
|
|
|
|
You can also look at the very good lectures below.
|
|
|
|
\href{https://www.youtube.com/embed/?listType=playlist&list=PLn8PRpmsu08qFLMfgTEzR8DxOPE7fBiin}{Robust Control - Brian Douglas}
|
|
|
|
\href{https://www.youtube.com/embed/?listType=playlist&list=PLsjPUqcL7ZIFHCObUU_9xPUImZ203gB4o}{Control Bootcamp - Steve Brunton}
|
|
|
|
\printbibliography
|
|
\end{document}
|