From 6ce8fb5cba699ed7bf23ad214ee1e5790653f27a Mon Sep 17 00:00:00 2001 From: Thomas Dehaeze Date: Wed, 2 Dec 2020 19:01:04 +0100 Subject: [PATCH] Re-worked section 2 --- figs/open_loop_shaping_shape.pdf | Bin 48353 -> 63625 bytes figs/open_loop_shaping_shape.png | Bin 17223 -> 15643 bytes figs/open_loop_shaping_shape.svg | 370 +++++++------ ieee.csl | 400 ++++++++++++++ index.html | 887 +++++++++++++++++-------------- index.org | 238 +++++---- 6 files changed, 1226 insertions(+), 669 deletions(-) create mode 100644 ieee.csl diff --git a/figs/open_loop_shaping_shape.pdf b/figs/open_loop_shaping_shape.pdf index 1ee3813949d6c429cc3dd373139491818b1b7bf9..d9ba8345debdd1fcb1249c4eb231685195a1f0f4 100644 GIT binary patch delta 45388 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 E2R~b)!~g&Q delta 30097 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 diff --git a/figs/open_loop_shaping_shape.png b/figs/open_loop_shaping_shape.png index c638274df5836c6e5de669690b7afbaabcbc5529..200aa4514e083d0341169e8561e94bc2539bfa35 100644 GIT binary patch literal 15643 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

bZpJrIr&;}dk;5H8f<~hzr?!8B3883 zuv6|@3Q)|+4V>{AO0c{^CTu?bXLnuAF!9*va`_TOzx%79i}(Y$JMoSpY16_Ww*Bl_ z^@0_Se;NFy472w-%LFcP9b#1lkjZ(v77m@V(Zc2x3?}kP+uxqeDf$3lrMJ9#YxOj` zQ979Tx?ss~=z=Hj^QL{K*g|G?xc zhj_-jpNE}0(heWPs4rY^ZdD+WKiAN=_w3U?=76VkLax4IsmudULgI5i zV)fq0%ghEb5JXE(>Ax*mWjooE?2@T)5H4UdSnU35@Ys6Uw51#0bBl)`yOoxucjdbL zt=dbyL+PR1V&USXuW4gS^RJHIa4>Dqg_EtRkhJq+&l{=v3HAiiR7E_*^Cz1eoY6O9 zB~(2xb^-(u^Fww- z6@QyCv$)&QY>t~U)vh7vke$@qmLn{Xw)mV@K?vL8{!m~l%D(Fy>_h(TM3nM^@~DO5 zVv!!;?XVphFQ|{@%Ng`CWwSpUXeB-u4{$kT_1vru7%X#xnf#H0XZ9G~Ep5xLH~wxcTb}U3CV9csdozh-5&kT(DMl<98!RK;bP|ILkfTQy+u5gFDVn-95%oQ zk61QEE8tfDst~IV__fmP6NBNbFDz5T>WbnYQAmE-*-HtYIvqw6CMjND0wm$R2z;|K zLoTf1n;(nWx31Y|P0;qU$mTC;L7ku#MaiA>Ws!3)1bii0UEX2$PG3W|YJ2$v&0GJv zOkL4Y8BV&~=JGftH}+p1^pWKuYw24Q4OwR0`iV8RB~R;3h{BJ5r-ulE3AH%3jO~2% zQZJz&K&R#n$7dL5T}-HgB35pyE4+Cf*U&w*m+7ttF~u6ZY$}R-bqJIbdZ%ENT#2=x zMczLhZh{sSu}Og&Ko!H7W}nqaiTZ{z4XlD4S)}d^oka0}R!HmnbpHOGxt!>_;S?7Z zT7K&ATQ`XSG^n|@?ldvR5^%vUcF)w~kL7MJcuY}EaoEo!Z15g@F?laU&R4!Zq3jv9 zo1J;u4({diKdIgGY+EFr&8}vQ?b3udYM3AGEjFMw0O7A$a(7XjDx})!lCBcN4bfG< zVX3(&-6HWKmSJA1V7FofSBETKh3Vx0+daUi;%`~hpBFuTSN@Nse6%i3(dgcFS68~D zSw%hdQDMZpE&{<~7?6%*x9PS32E5sB;-8<;Ftrxadn+t7Ifs!$er#$2B*%OWS%0jQk4W)3fck; zQLQ5}dWc(PJYC>{hws+}yumG*tp)A2H3Cm-L{vIX36_U;@2X@xicDC@GO<Wl7B@4NGy@w0tHa_e#{>rHbCDK>H-A~r1<045$HY=Akf^B4K&<` zZ`)Rd)0B&xs*{%|#Ffl+#egf@LWl0p_SoY1bg5Ip@0^Ubq))%A#y3I($I*Jb3L1M0 zp%HC(#3q8U^qo`VR%KtK0hHxQckQr5VC@)k7yp+Jj%~GB6i>a+01AzYtj1F4sA)&A zAFFF((#k?0N#b4M{Mot z+emoC^POK(;ATf(Rd@c(GMOJ`QxY4bB_vnZB7SuwiV*As_A(c*KUdu$d>cZqNnZA{|Qz*Ca2EV>S{wq$XHjf9Qe~Z z;q^a(>(#b3CtYb3C!8P1R-H?%JIad?G-hv3F%>M%M^p|c2P%DLt23-LJY)(jxJ1hAT62*jTBNELekRI&sx9$w zY#^aawc%=VdQgFa$-!=Tw=sWzMj+FMJ+`mq5J9bSpM2B{9V!c}-YFg_iPyx6)TYd$ zSwfQd7zGQebax7#&eFX=pg)f9xw#j5MAph38ZS`#XI7-Q0LXEfX_eq*E^l4m-zB?t zU-l^w+` - + @@ -38,72 +38,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -117,198 +51,288 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + - + - - + + - + - + - - + + - + - + - + - + - + - + - - + + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - + + + + - - - - - - - - - + + + + - + + + + - - - + + + + - - - - - - - - - - - - - + + + + + - - - - - - - - - + + + + + + + + + + + + + + + + + + - + + + + + - + + + + + + - - - - - - - - - - - + + + + + + + + + + + + + + + + + - - + + - - + + - - - - - + + + + + - - - - - - + + + + + + - + - + - + diff --git a/ieee.csl b/ieee.csl new file mode 100644 index 0000000..2089efb --- /dev/null +++ b/ieee.csl @@ -0,0 +1,400 @@ + + diff --git a/index.html b/index.html index 9f7e864..399c5a0 100644 --- a/index.html +++ b/index.html @@ -3,7 +3,7 @@ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> - + A brief and practical introduction to \(\mathcal{H}_\infty\) Control @@ -30,56 +30,56 @@

Table of Contents

@@ -103,33 +103,33 @@ When possible, Matlab scripts used for the example/exercises are provided such t The general structure of this document is as follows:

    -
  • A short introduction to model based control is given in Section 1
  • -
  • Classical open loop shaping method is presented in Section 2. +
  • A short introduction to model based control is given in Section 1
  • +
  • Classical open loop shaping method is presented in Section 2. It is also shown that \(\mathcal{H}_\infty\) synthesis can be used for open loop shaping
  • -
  • Important concepts indispensable for \(\mathcal{H}_\infty\) control such as the \(\mathcal{H}_\infty\) norm and the generalized plant are introduced in Section 3
  • -
  • 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 4
  • +
  • Important concepts indispensable for \(\mathcal{H}_\infty\) control such as the \(\mathcal{H}_\infty\) norm and the generalized plant are introduced in Section 3
  • +
  • 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 4
  • 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 5
  • -
  • Finally, complete examples of the use of \(\mathcal{H}_\infty\) Control for practical problems are provided in Section 6.
  • +Such technique is presented in Section 5 +
  • Finally, complete examples of the use of \(\mathcal{H}_\infty\) Control for practical problems are provided in Section 6.
-
-

1 Introduction to Model Based Control

+
+

1 Introduction to Model Based Control

- +

-
-

1.1 Model Based Control - Methodology

+
+

1.1 Model Based Control - Methodology

- +

-The typical methodology for Model Based Control techniques is schematically shown in Figure 1. +The typical methodology for Model Based Control techniques is schematically shown in Figure 1.

@@ -146,7 +146,7 @@ It consists of three steps: -

+

control-procedure.png

Figure 1: Typical Methodoly for Model Based Control

@@ -158,20 +158,20 @@ In this document, we will suppose a model of the plant is available (step 1 alre

-In Section 2, steps 2 and 3 will be described for a control techniques called classical (open-)loop shaping. +In Section 2, steps 2 and 3 will be described for a control techniques called classical (open-)loop shaping.

-Then, steps 2 and 3 for the \(\mathcal{H}_\infty\) Loop Shaping of closed-loop transfer functions will be discussed in Sections 4, 5 and 6. +Then, steps 2 and 3 for the \(\mathcal{H}_\infty\) Loop Shaping of closed-loop transfer functions will be discussed in Sections 4, 5 and 6.

-
-

1.2 From Classical Control to Robust Control

+
+

1.2 From Classical Control to Robust Control

- +

@@ -197,20 +197,20 @@ This set of developments is loosely termed 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 lead to a new control theory called Robust control that blends the best features of classical and modern techniques. +This led to a new control theory called 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 1. +The three presented control methods are compared in Table 1.

Note that in parallel, there have been numerous other developments, including non-linear control, adaptive control, machine-learning control just to name a few.

- +
@@ -355,37 +355,40 @@ Note that in parallel, there have been numerous other developments, including no
Table 1: Table summurazing the main differences between classical, modern and robust control
- - -
-

robustness_performance.png -

-

Figure 2: Comparison of the performance and robustness of classical control methods, modern control methods and robust control methods. The required information on the plant to succesfuly apply each of the control methods are indicated by the colors.

-
-
-

1.3 Example System

+
+

1.3 Example System

- +

-Let’s consider the model shown in Figure 3. -It could represent a suspension system with a payload to position or isolate using an force actuator and an inertial sensor. -The notations used are listed in Table 2. +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 2. +It could represent an active suspension stage supporting a payload. +The 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 2 are listed and described in Table 2.

-
+

mech_sys_1dof_inertial_contr.png

-

Figure 3: 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.

+

Figure 2: 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.

- +
@@ -471,7 +474,7 @@ The notations used are listed in Table 2.
Table 2: Example system variables
-
+

Derive the following open-loop transfer functions:

@@ -504,14 +507,14 @@ You can follow this generic procedure:

-Having obtained \(G(s)\) and \(G_d(s)\), we can transform the system shown in Figure 3 into a classical feedback form as shown in Figure 7. +Having obtained \(G(s)\) and \(G_d(s)\), we can transform the system shown in Figure 2 into a classical feedback architecture as shown in Figure 6.

-
+

classical_feedback_test_system.png

-

Figure 4: Block diagram corresponding to the example system

+

Figure 3: Block diagram corresponding to the example system of Figure 2

@@ -526,7 +529,7 @@ Let’s define the system parameters on Matlab.

-And now the system dynamics \(G(s)\) and \(G_d(s)\) (their bode plots are shown in Figures 5 and 6). +And now the system dynamics \(G(s)\) and \(G_d(s)\).

4: G = 1/(m*s^2 + c*s + k); % Plant
@@ -534,119 +537,138 @@ And now the system dynamics \(G(s)\) and \(G_d(s)\) (their bode plots are shown
 
+

+The Bode plots of \(G(s)\) and \(G_d(s)\) are shown in Figures 4 and 5. +

-
+ +

bode_plot_example_afm.png

-

Figure 5: Bode plot of the plant \(G(s)\)

+

Figure 4: Bode plot of the plant \(G(s)\)

-
+

bode_plot_example_Gd.png

-

Figure 6: Magnitude of the disturbance transfer function \(G_d(s)\)

+

Figure 5: Magnitude of the disturbance transfer function \(G_d(s)\)

-
-

2 Classical Open Loop Shaping

+
+

2 Classical Open Loop Shaping

- + +

+

+After an introduction to classical Loop Shaping in Section 2.1, a practical example is given in Section 2.2. +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 2.3 and applied on the same example in Section 2.4.

-
-
-

2.1 Introduction to Loop Shaping

+
+

2.1 Introduction to Loop Shaping

- +

-
+

-Loop Shaping refers to a design procedure that involves explicitly shaping the magnitude of the Loop Transfer Function \(L(s)\). +Loop Shaping refers to a control design procedure that involves explicitly shaping the magnitude of the Loop Transfer Function \(L(s)\).

-
+

-The Loop Gain \(L(s)\) usually refers to as the product of the controller and the plant (“Gain around the loop”, see Figure 7): +The Loop Gain (or Loop transfer function) \(L(s)\) usually refers to as the product of the controller and the plant (see Figure 6):

\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”. +

-
+ +

open_loop_shaping.png

-

Figure 7: Classical Feedback Architecture

+

Figure 6: Classical Feedback Architecture

-This synthesis method is widely used as many characteristics of the closed-loop system depend on the shape of the open loop gain \(L(s)\) such as: +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:

    -
  • Performance: \(L\) large
  • +
  • Good Tracking: \(L\) large
  • Good disturbance rejection: \(L\) large
  • -
  • Limitation of measurement noise on plant output: \(L\) small
  • -
  • Small magnitude of input signal: \(K\) and \(L\) small
  • +
  • Attenuation of measurement noise on plant output: \(L\) small
  • +
  • Small magnitude of input signal: \(L\) small
  • Nominal stability: \(L\) small (RHP zeros and time delays)
  • Robust stability: \(L\) small (neglected dynamics)

-The Open Loop shape is usually done manually has the loop gain \(L(s)\) depends linearly on \(K(s)\) \eqref{eq:loop_gain}. -

- -

-\(K(s)\) then consists of a combination of leads, lags, notches, etc. such that \(L(s)\) has the wanted shape (an example is shown in Figure 8). +The shaping of the Loop Gain is done manually by combining several leads, lags, notches… +This process is very much simplified by the fact that the loop gain \(L(s)\) depends linearly on \(K(s)\) \eqref{eq:loop_gain}. +A typical wanted Loop Shape is shown in Figure 7. +Another interesting Loop shape called “Bode Step” is described in [1].

-
+

open_loop_shaping_shape.png

-

Figure 8: Typical Wanted Shape for the Loop Gain \(L(s)\)

+

Figure 7: Typical Wanted Shape for the Loop Gain \(L(s)\)

+ +

+The shaping of 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 4 and 5. +

-
-

2.2 Example of Open Loop Shaping

+
+

2.2 Example of Manual Open Loop Shaping

- +

-
+

-Let’s take our example system and try to apply the Open-Loop shaping strategy to design a controller that fulfils the following specifications: +Let’s take our example system described in Section 1.3 and design a controller using the Open-Loop shaping synthesis approach. +The specifications are:

-
    -
  • Performance: Bandwidth of approximately 10Hz
  • -
  • Noise Attenuation: Roll-off of -40dB/decade past 30Hz
  • +
      +
    1. Disturbance rejection: Highest possible rejection below 1Hz
    2. +
    3. Positioning speed: Bandwidth of approximately 10Hz
    4. +
    5. Noise attenuation: Roll-off of -40dB/decade past 30Hz
    6. Robustness: Gain margin > 3dB and Phase margin > 30 deg
    7. -
+
-
+

-Using SISOTOOL, design a controller that fulfill the specifications. +Using SISOTOOL, design a controller that fulfills the specifications.

@@ -654,32 +676,36 @@ Using SISOTOOL, design a controller that fulfill the specifications
+
Hint +

+You can follow this procedure: +

+
    +
  1. In order to have good disturbance rejection at low frequency, add a simple or double integrator
  2. +
  3. In terms of the loop gain, the bandwidth can be defined at the frequency \(\omega_c\) where \(|l(j\omega_c)|\) first crosses 1 from above. +Therefore, adjust the gain such that \(L(j\omega)\) crosses 1 at around 10Hz
  4. +
  5. The roll-off at high frequency for noise attenuation should already be good enough. +If not, add a low pass filter
  6. +
  7. Add a 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.
  8. +
+
+

-In order to have the wanted Roll-off, two integrators are used, a lead is also added to have sufficient phase margin. -

- -

-The obtained controller is shown below, and the bode plot of the Loop Gain is shown in Figure 9. +Let’s say we came up with the following controller.

-
K = 14e8 * ... % Gain
-    1/(s^2) * ... % Double Integrator
+
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
 
- -
-

loop_gain_manual_afm.png -

-

Figure 9: Bode Plot of the obtained Loop Gain \(L(s) = G(s) K(s)\)

-
-

-And we can verify that we have the wanted stability margins: +The bode plot of the Loop Gain is shown in Figure 8 and we can verify that we have the wanted stability margins using the margin command:

[Gm, Pm, ~, Wc] = margin(G*K)
@@ -717,29 +743,32 @@ And we can verify that we have the wanted stability margins:
 
 
 
+
+
+
+

loop_gain_manual_afm.png +

+

Figure 8: Bode Plot of the obtained Loop Gain \(L(s) = G(s) K(s)\)

+
-
-

2.3 \(\mathcal{H}_\infty\) Loop Shaping Synthesis

+
+

2.3 \(\mathcal{H}_\infty\) Loop Shaping Synthesis

- +

-The Open Loop Shaping synthesis can be performed using the \(\mathcal{H}_\infty\) Synthesis. +The synthesis of controllers based on the Loop Shaping method can be automated using the \(\mathcal{H}_\infty\) Synthesis.

-Even though we will not go into details, we will provide one example. -

- -

-Using Matlab, the \(\mathcal{H}_\infty\) Loop Shaping Synthesis can be performed using the loopsyn command: +Using Matlab, it can be easily performed using the loopsyn command:

-
K = loopsyn(G, Gd);
+
K = loopsyn(G, Lw);
 

@@ -747,39 +776,96 @@ where:

  • G is the (LTI) plant
  • -
  • Gd is the wanted loop shape
  • +
  • Lw is the wanted loop shape
  • K is the synthesize controller
-
+

Matlab documentation of loopsyn (link).

+ +

+Therefore, by just providing the wanted loop shape and the plant model, the \(\mathcal{H}_\infty\) Loop Shaping synthesis generates a 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. +

-
-

2.4 Example of the \(\mathcal{H}_\infty\) Loop Shaping Synthesis

+
+

2.4 Example of the \(\mathcal{H}_\infty\) Loop Shaping Synthesis

- +

-Let’s reuse the previous plant. +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 3.

-Translate the specification into the wanted shape of the open loop gain. +Such shape corresponds to the typical wanted Loop gain Shape shown in Figure 7.

-
    -
  • Performance: Bandwidth of approximately 10Hz: \(|L_w(j2 \pi 10)| = 1\)
  • -
  • Noise Attenuation: Roll-off of -40dB/decade past 30Hz
  • -
  • Robustness: Gain margin > 3dB and Phase margin > 30 deg
  • -
+ + + +++ ++ ++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 3: Wanted Loop Shape corresponding to each specification
 SpecificationCorresponding Loop Shape
Disturbance RejectionHighest possible rejection below 1HzSlope of -40dB/decade at low frequency to have a high loop gain
Positioning SpeedBandwidth of approximately 10Hz\(L\) crosses 1 at 10Hz: \(\vert L_w(j2 \pi 10)\vert = 1\)
Noise AttenuationRoll-off of -40dB/decade past 30HzRoll-off of -40dB/decade past 30Hz
RobustnessGain margin > 3dB and Phase margin > 30 degSlope of -20dB/decade near the crossover
+ +

+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: +

Lw = 2.3e3 * ...
      1/(s^2) * ... % Double Integrator
@@ -788,26 +874,38 @@ Translate the specification into the wanted shape of the open loop gain.
 

-The \(\mathcal{H}_\infty\) optimal open loop shaping synthesis is performed using the loopsyn command: +The \(\mathcal{H}_\infty\) open loop shaping synthesis is then performed using the loopsyn command:

[K, ~, GAM] = loopsyn(G, Lw);
 
-

-It is always important to analyze the controller after the synthesis is performed. +The obtained Loop Gain is shown in Figure 9 and matches the specified one by a factor \(\gamma \approx 2\). +

+ + +
+

open_loop_shaping_hinf_L.png +

+

Figure 9: Obtained Open Loop Gain \(L(s) = G(s) K(s)\) and comparison with the wanted Loop gain \(L_w\)

+
+ + +
+

+When using the \(\mathcal{H}_\infty\) Synthesis, it is usually recommended to analyze the obtained controller.

-In the end, a synthesize controller is just a combination of low pass filters, high pass filters, notches, leads, etc. +This is usually done by breaking down the controller into simple elements such as low pass filters, high pass filters, notches, leads, etc.

-Let’s briefly analyze the obtained controller which bode plot is shown in Figure 10: +Let’s briefly analyze the obtained controller which bode plot is shown in Figure 10:

  • two integrators are used at low frequency to have the wanted low frequency high gain
  • @@ -816,29 +914,19 @@ Let’s briefly analyze the obtained controller which bode plot is shown in
-
+

open_loop_shaping_hinf_K.png

Figure 10: Obtained controller \(K\) using the open-loop \(\mathcal{H}_\infty\) shaping

-

-The obtained Loop Gain is shown in Figure 11 and matches the specified one by a factor \(\gamma\). -

- - -
-

open_loop_shaping_hinf_L.png -

-

Figure 11: Obtained Open Loop Gain \(L(s) = G(s) K(s)\) and comparison with the wanted Loop gain \(L_w\)

-

-Let’s now compare the obtained stability margins of the \(\mathcal{H}_\infty\) controller and of the manually developed controller in Table 3. +Let’s finally compare the obtained stability margins of the \(\mathcal{H}_\infty\) controller and of the manually developed controller in Table 4.

- - +
Table 3: Comparison of the characteristics obtained with the two methods
+@@ -878,29 +966,29 @@ Let’s now compare the obtained stability margins of the \(\mathcal{H}_\inf -
-

3 A first Step into the \(\mathcal{H}_\infty\) world

+
+

3 A first Step into the \(\mathcal{H}_\infty\) world

- +

-
-

3.1 The \(\mathcal{H}_\infty\) Norm

+
+

3.1 The \(\mathcal{H}_\infty\) Norm

- +

-
+

The \(\mathcal{H}_\infty\) norm is defined as the peak of the maximum singular value of the frequency response

@@ -917,7 +1005,7 @@ For a SISO system \(G(s)\), it is simply the peak value of \(|G(j\omega)|\) as a
-
+

Let’s compute the \(\mathcal{H}_\infty\) norm of our test plant \(G(s)\) using the hinfnorm function:

@@ -932,28 +1020,28 @@ Let’s compute the \(\mathcal{H}_\infty\) norm of our test plant \(G(s)\) u

-We can see that the \(\mathcal{H}_\infty\) norm of \(G(s)\) does corresponds to the peak value of \(|G(j\omega)|\) as a function of frequency as shown in Figure 12. +We can see that the \(\mathcal{H}_\infty\) norm of \(G(s)\) does corresponds to the peak value of \(|G(j\omega)|\) as a function of frequency as shown in Figure 11.

-
+

hinfinity_norm_siso_bode.png

-

Figure 12: Example of the \(\mathcal{H}_\infty\) norm of a SISO system

+

Figure 11: Example of the \(\mathcal{H}_\infty\) norm of a SISO system

-
-

3.2 \(\mathcal{H}_\infty\) Synthesis

+
+

3.2 \(\mathcal{H}_\infty\) Synthesis

- +

-
+

\(\mathcal{H}_\infty\) synthesis is a method that uses an algorithm (LMI optimization, Riccati equation) to find a controller that stabilize the system and that minimizes the \(\mathcal{H}_\infty\) norms of defined transfer functions.

@@ -989,11 +1077,11 @@ Note that there are many ways to use the \(\mathcal{H}_\infty\) Synthesis:
-
-

3.3 The Generalized Plant

+
+

3.3 The Generalized Plant

- +

@@ -1003,9 +1091,9 @@ It makes things much easier for the following steps.

-The generalized plant, usually noted \(P(s)\), is shown in Figure 13. +The generalized plant, usually noted \(P(s)\), is shown in Figure 12. It has two inputs and two outputs (both could contains many signals). -The meaning of the inputs and outputs are summarized in Table 4. +The meaning of the inputs and outputs are summarized in Table 5.

@@ -1018,15 +1106,15 @@ It can indeed represent feedback as well as feedforward control architectures. \end{equation} -

+

general_plant.png

-

Figure 13: Inputs and Outputs of the generalized Plant

+

Figure 12: Inputs and Outputs of the generalized Plant

-
-
Table 4: Comparison of the characteristics obtained with the two methods
- +
+
Table 4: Notations for the general configuration
+@@ -1071,18 +1159,18 @@ It can indeed represent feedback as well as feedforward control architectures. -
-

3.4 The \(\mathcal{H}_\infty\) Synthesis applied on the Generalized plant

+
+

3.4 The \(\mathcal{H}_\infty\) Synthesis applied on the Generalized plant

- +

Once the generalized plant is obtained, the \(\mathcal{H}_\infty\) synthesis problem can be stated as follows:

-
+
\(\mathcal{H}_\infty\) Synthesis applied on the generalized plant
@@ -1097,10 +1185,10 @@ After \(K\) is found, the system is robustified by adjusting the response
-
+

general_control_names.png

-

Figure 14: General Control Configuration

+

Figure 13: General Control Configuration

@@ -1129,32 +1217,32 @@ where:

-
-

3.5 From a Classical Feedback Architecture to a Generalized Plant

+
+

3.5 From a Classical Feedback Architecture to a Generalized Plant

- +

-The procedure to convert a typical control architecture as the one shown in Figure 15 to a generalized Plant is as follows: +The procedure to convert a typical control architecture as the one shown in Figure 14 to a generalized Plant is as follows:

  1. Define signals (\(w\), \(z\), \(u\) and \(v\)) of the generalized plant
  2. -
  3. Remove \(K\) and rearrange the inputs and outputs to match the generalized configuration shown in Figure 13
  4. +
  5. Remove \(K\) and rearrange the inputs and outputs to match the generalized configuration shown in Figure 12
-
+
    -
  1. Convert the tracking control architecture shown in Figure 15 to a generalized configuration
  2. +
  3. Convert the tracking control architecture shown in Figure 14 to a generalized configuration
  4. Compute the transfer function matrix using Matlab as a function or \(K\) and \(G\)
-
+

classical_feedback_tracking.png

-

Figure 15: Classical Feedback Control Architecture (Tracking)

+

Figure 14: Classical Feedback Control Architecture (Tracking)

Hint @@ -1170,20 +1258,20 @@ Usually, we want to minimize the tracking errors \(\epsilon\) and the control si

-Then, Remove \(K\) and rearrange the inputs and outputs as in Figure 13. +Then, Remove \(K\) and rearrange the inputs and outputs as in Figure 12.

Answer

-The obtained generalized plant shown in Figure 16. +The obtained generalized plant shown in Figure 15.

-
+

mixed_sensitivity_ref_tracking.png

-

Figure 16: Generalized plant of the Classical Feedback Control Architecture (Tracking)

+

Figure 15: Generalized plant of the Classical Feedback Control Architecture (Tracking)

@@ -1204,21 +1292,21 @@ P.OutputName = {'e', 'u

-
-

4 Modern Interpretation of Control Specifications

+
+

4 Modern Interpretation of Control Specifications

- +

-As shown in Section 2, the loop gain \(L(s) = G(s) K(s)\) is a useful and easy tool when manually designing controllers. +As shown in Section 2, 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 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)\).

@@ -1228,12 +1316,12 @@ However, the loop gain \(L(s)\) does not directly give the performances o

-If we consider the feedback system shown in Figure 17, we can link to the following specifications to closed-loop transfer functions. -This is summarized in Table 5. +If we consider the feedback system shown in Figure 16, we can link to the following specifications to closed-loop transfer functions. +This is summarized in Table 6.

-
Table 5: Notations for the general configuration
- +
Table 5: Typical Specification and associated closed-loop transfer function
+@@ -1274,33 +1362,33 @@ This is summarized in Table 5. - +
Table 6: Typical Specification and associated closed-loop transfer function
Robustness (stability margins)Module margin (see Section 4.3)Module margin (see Section 4.3)
-
+

gang_of_four_feedback.png

-

Figure 17: Simple Feedback Architecture

+

Figure 16: Simple Feedback Architecture

-
-

4.1 Closed Loop Transfer Functions

+
+

4.1 Closed Loop Transfer Functions

- +

As the performances of a controlled system depend on the closed loop transfer functions, it is very important to derive these closed-loop transfer functions as a function of the plant \(G(s)\) and controller \(K(s)\).

-
+

-Write the output signals \([\epsilon, u, y]\) as a function of the systems \(K(s), G(s)\) and of the input signals \([r, d, n]\) as shown in Figure 17. +Write the output signals \([\epsilon, u, y]\) as a function of the systems \(K(s), G(s)\) and of the input signals \([r, d, n]\) as shown in Figure 16.

Hint @@ -1337,9 +1425,9 @@ The following equations should be obtained:
-
+

-We can see that they are 4 different transfer functions describing the behavior of the system in Figure 17. +We can see that they are 4 different transfer functions describing the behavior of the system in Figure 16. These called the Gang of Four:

\begin{align} @@ -1351,7 +1439,7 @@ These called the Gang of Four:
-
+

If a feedforward controller is included, a Gang of Six transfer functions can be defined. More on that in this short video. @@ -1375,11 +1463,11 @@ Similarly, to reduce the effect of measurement noise \(n\) on the output \(y\),

-
-

4.2 Sensitivity Function

+
+

4.2 Sensitivity Function

- +

@@ -1390,15 +1478,15 @@ In this section, we will see how the shape of the sensitivity function will impa

Suppose we have developed a “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 are shown in Figure 18 and the corresponding step responses are shown in Figure 19. +The obtained sensitivity functions are shown in Figure 17 and the corresponding step responses are shown in Figure 18.

-The comparison of the sensitivity functions shapes and their effect on the step response is summarized in Table 6. +The comparison of the sensitivity functions shapes and their effect on the step response is summarized in Table 7.

- - +
Table 6: Comparison of the sensitivity function shape and the corresponding step response for the three controller variations
+@@ -1436,20 +1524,20 @@ The comparison of the sensitivity functions shapes and their effect on the step
Table 7: Comparison of the sensitivity function shape and the corresponding step response for the three controller variations
-
+

sensitivity_shape_effect.png

-

Figure 18: Sensitivity function magnitude \(|S(j\omega)|\) corresponding to the reference controller \(K_r(s)\) and the three modified controllers \(K_i(s)\)

+

Figure 17: Sensitivity function magnitude \(|S(j\omega)|\) corresponding to the reference controller \(K_r(s)\) and the three modified controllers \(K_i(s)\)

-
+

sensitivity_shape_effect_step.png

-

Figure 19: Step response (response from \(r\) to \(y\)) for the different controllers

+

Figure 18: Step response (response from \(r\) to \(y\)) for the different controllers

-
+
Closed-Loop Bandwidth

The closed-loop bandwidth \(\omega_b\) is the frequency where \(|S(j\omega)|\) first crosses \(1/\sqrt{2} = -3dB\) from below. @@ -1462,9 +1550,9 @@ In general, a large bandwidth corresponds to a faster rise time.

-
+

-From the simple analysis above, we can draw a first estimation of the wanted shape for the sensitivity function in Figure 20. +From the simple analysis above, we can draw a first estimation of the wanted shape for the sensitivity function in Figure 19.

@@ -1479,28 +1567,28 @@ This will become clear in the next section about the module margin. -

+

h-infinity-spec-S.png

-

Figure 20: Typical wanted shape of the Sensitivity transfer function

+

Figure 19: Typical wanted shape of the Sensitivity transfer function

-
-

4.3 Robustness: Module Margin

+
+

4.3 Robustness: Module Margin

- +

Let’s start by an example demonstrating why the phase and gain margins might not be good indicators of robustness.

-
+

Let’s consider the following plant \(G_t(s)\):

@@ -1514,7 +1602,7 @@ Gt = 1/k*(s

-Let’s say we have designed a controller \(K_t(s)\) that gives the loop gain shown in Figure 21. +Let’s say we have designed a controller \(K_t(s)\) that gives the loop gain shown in Figure 20.

@@ -1523,7 +1611,7 @@ Let’s say we have designed a controller \(K_t(s)\) that gives the loop gai

-The following characteristics can be determined from Figure 21: +The following characteristics can be determined from Figure 20:

  • bandwidth of \(\approx 10\, \text{Hz}\)
  • @@ -1536,10 +1624,10 @@ This might indicate very good robustness properties of the closed-loop system.

    -
    +

    phase_gain_margin_model_plant.png

    -

    Figure 21: Bode plot of the obtained Loop Gain \(L(s)\)

    +

    Figure 20: Bode plot of the obtained Loop Gain \(L(s)\)

    @@ -1552,7 +1640,7 @@ Now let’s suppose the “real” plant \(G_r(s)\) as a slightly lo

    -The obtained “real” loop gain is shown in Figure 22. +The obtained “real” loop gain is shown in Figure 21. At a frequency little bit above 100Hz, the phase of the loop gain reaches -180 degrees while its magnitude is more than one which indicated instability.

    @@ -1570,10 +1658,10 @@ It is confirmed by checking the stability of the closed loop system: -
    +

    phase_gain_margin_real_plant.png

    -

    Figure 22: Bode plots of \(L(s)\) (loop gain corresponding the nominal plant) and \(L_r(s)\) (loop gain corresponding to the real plant)

    +

    Figure 21: Bode plots of \(L(s)\) (loop gain corresponding the nominal plant) and \(L_r(s)\) (loop gain corresponding to the real plant)

    @@ -1590,7 +1678,7 @@ This is due to the fact that the gain and phase margin are robustness indicators Let’s now determine a new robustness indicator based on the Nyquist Stability Criteria.

    -
    +
    Nyquist Stability Criteria (for stable systems)
    If the open-loop transfer function \(L(s)\) is stable, then the closed-loop system is unstable for any encirclement of the point \(−1\) on the Nyquist plot.
    @@ -1599,7 +1687,7 @@ Let’s now determine a new robustness indicator based on the Nyquist Stabil
    -
    +

    For more information about the general Nyquist Stability Criteria, you may want to look at this video.

    @@ -1611,30 +1699,30 @@ From the Nyquist stability criteria, it is clear that we want \(L(j\omega)\) to This minimum distance is called the module margin.

    -
    +
    Module Margin
    The Module Margin \(\Delta M\) is defined as the minimum distance between the point \(-1\) and the loop gain \(L(j\omega)\) in the complex plane.
    -
    +

    -A typical Nyquist plot is shown in Figure 23. +A typical Nyquist plot is shown in Figure 22. The gain, phase and module margins are graphically shown to have an idea of what they represent.

    -
    +

    module_margin_example.png

    -

    Figure 23: Nyquist plot with visual indication of the Gain margin \(\Delta G\), Phase margin \(\Delta \phi\) and Module margin \(\Delta M\)

    +

    Figure 22: Nyquist plot with visual indication of the Gain margin \(\Delta G\), Phase margin \(\Delta \phi\) and Module margin \(\Delta M\)

    -As expected from Figure 23, there is a close relationship between the module margin and the gain and phase margins. +As expected from Figure 22, 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} @@ -1653,7 +1741,7 @@ Let’s now try to express the Module margin \(\Delta M\) as an \(\mathcal{H &= \frac{1}{\|S\|_\infty} \end{align*} -
    +

    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.

    @@ -1673,14 +1761,14 @@ Note that this is why large peak value of \(|S(j\omega)|\) usually indicate robu And we know understand why setting an upper bound on the magnitude of \(S\) is generally a good idea.

    -
    +

    Typical, we require \(\|S\|_\infty < 2 (6dB)\) which implies \(\Delta G \ge 2\) and \(\Delta \phi \ge 29^o\)

    -
    +

    To learn more about module/disk margin, you can check out this video.

    @@ -1689,11 +1777,11 @@ To learn more about module/disk margin, you can check out -

    4.4 Other Requirements

    +
    +

    4.4 Other Requirements

    - +

    @@ -1722,8 +1810,8 @@ with: Noise Attenuation: typical wanted shape for \(T\)

    - - +
    Table 7: Typical Specifications and corresponding wanted norms of open and closed loop tansfer functions
    +@@ -1775,11 +1863,11 @@ Noise Attenuation: typical wanted shape for \(T\) -
    -

    5 \(\mathcal{H}_\infty\) Shaping of closed-loop transfer functions

    +
    +

    5 \(\mathcal{H}_\infty\) Shaping of closed-loop transfer functions

    - +

    In the previous sections, we have seen that the performances of the system depends on the shape of the closed-loop transfer function. @@ -1796,22 +1884,22 @@ But don’t worry, the \(\mathcal{H}_\infty\) synthesis will do this job for

    This -Section 5.1 -Section 5.2 -Section 5.3 -Section 5.4 +Section 5.1 +Section 5.2 +Section 5.3 +Section 5.4

    -
    -

    5.1 How to Shape closed-loop transfer function? Using Weighting Functions!

    +
    +

    5.1 How to Shape closed-loop transfer function? Using Weighting Functions!

    - +

    -If the \(\mathcal{H}_\infty\) synthesis is applied on the generalized plant \(P(s)\) shown in Figure 24, 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. +If the \(\mathcal{H}_\infty\) synthesis is applied on the generalized plant \(P(s)\) shown in Figure 23, 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. This closed-loop transfer function actually correspond to the sensitivity function. Therefore, it will minimize the the \(\mathcal{H}_\infty\) norm of the sensitivity function: \(\|S\|_\infty\).

    @@ -1821,16 +1909,16 @@ However, as the \(\mathcal{H}_\infty\) norm is the maximum peak value of the tra

    -
    +

    loop_shaping_S_without_W.png

    -

    Figure 24: Generalized Plant

    +

    Figure 23: Generalized Plant

    -
    +

    -The trick is to include a weighting function \(W_S(s)\) in the generalized plant as shown in Figure 25. +The trick is to include a weighting function \(W_S(s)\) in the generalized plant as shown in Figure 24.

    @@ -1848,7 +1936,7 @@ Let’s now show how this is equivalent as shaping the sensitivity fu \Leftrightarrow & \left| S(j\omega) \right| < \frac{1}{\left| W_s(j\omega) \right|} \quad \forall \omega \label{eq:sensitivity_shaping} \end{align} -

    +

    As shown in Equation \eqref{eq:sensitivity_shaping}, the \(\mathcal{H}_\infty\) synthesis applying on the weighted generalized plant allows to shape the magnitude of the sensitivity transfer function.

    @@ -1860,15 +1948,15 @@ Therefore, the choice of the weighting function \(W_s(s)\) is very important: it
    -
    +

    loop_shaping_S_with_W.png

    -

    Figure 25: Weighted Generalized Plant

    +

    Figure 24: Weighted Generalized Plant

    -
    +

    -Using matlab, compute the weighted generalized plant shown in Figure 26 as a function of \(G(s)\) and \(W_S(s)\). +Using matlab, compute the weighted generalized plant shown in Figure 25 as a function of \(G(s)\) and \(W_S(s)\).

    Hint @@ -1906,18 +1994,18 @@ The second solution is however more general, and can also be used when weights a
    -
    -

    5.2 Design of Weighting Functions

    +
    +

    5.2 Design of Weighting Functions

    - +

    Weighting function included in the generalized plant must be proper, stable and minimum phase transfer functions.

    -
    +
    proper
    more poles than zeros, this implies \(\lim_{\omega \to \infty} |W(j\omega)| < \infty\)
    stable
    no poles in the right half plane
    @@ -1942,9 +2030,9 @@ with:
  • hfgain: high frequency gain
  • -
    +

    -The Matlab code below produces a weighting function with the following characteristics (Figure 26): +The Matlab code below produces a weighting function with the following characteristics (Figure 25):

    • Low frequency gain of 100
    • @@ -1958,15 +2046,15 @@ The Matlab code below produces a weighting function with the following character
    -
    +

    first_order_weight.png

    -

    Figure 26: Obtained Magnitude of the Weighting Function

    +

    Figure 25: Obtained Magnitude of the Weighting Function

    -
    +

    Quite often, higher orders weights are required.

    @@ -1998,7 +2086,7 @@ A Matlab function implementing Equation \eqref{eq:weight_formula_advanced} is sh

    -
    function [W] = generateWeight(args)
    +
    function [W] = generateWeight(args)
         arguments
             args.G0 (1,1) double {mustBeNumeric, mustBePositive} = 0.1
             args.G1 (1,1) double {mustBeNumeric, mustBePositive} = 10
    @@ -2033,25 +2121,25 @@ W3 = generateWeight('G0', 1e2, 27.
    +The obtained shapes are shown in Figure 26.
     

    -
    +

    high_order_weight.png

    -

    Figure 27: Higher order weights using Equation \eqref{eq:weight_formula_advanced}

    +

    Figure 26: Higher order weights using Equation \eqref{eq:weight_formula_advanced}

    -
    -

    5.3 Shaping the Sensitivity Function

    +
    +

    5.3 Shaping the Sensitivity Function

    - +

    @@ -2064,17 +2152,17 @@ Let’s design a controller using the \(\mathcal{H}_\infty\) synthesis that

    -As usual, the plant used is the one presented in Section 1.3. +As usual, the plant used is the one presented in Section 1.3.

    -
    +

    Translate the requirements as upper bounds on the Sensitivity function and design the corresponding Weight using Matlab.

    Hint

    -The typical wanted upper bound of the sensitivity function is shown in Figure 28. +The typical wanted upper bound of the sensitivity function is shown in Figure 27.

    @@ -2092,10 +2180,10 @@ Remember that the wanted upper bound of the sensitivity function is defined by t

    -
    +

    h-infinity-spec-S.png

    -

    Figure 28: Typical wanted shape of the Sensitivity transfer function

    +

    Figure 27: Typical wanted shape of the Sensitivity transfer function

    @@ -2157,7 +2245,7 @@ And the \(\mathcal{H}_\infty\) synthesis is performed on the weighted gen
    -
    +
     Test bounds:  0.5 <=  gamma  <=  0.51
     
      gamma        X>=0        Y>=0       rho(XY)<1    p/f
    @@ -2178,10 +2266,10 @@ Best performance (actual): 0.503
     \end{aligned}
     
     

    -This is indeed what we can see by comparing \(|S|\) and \(|W_S|\) in Figure 29. +This is indeed what we can see by comparing \(|S|\) and \(|W_S|\) in Figure 28.

    -
    +

    Having \(\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.

    @@ -2194,24 +2282,24 @@ It just means that at some frequency, one of the closed-loop transfer functions
    -
    +

    results_sensitivity_hinf.png

    -

    Figure 29: Weighting function and obtained closed-loop sensitivity

    +

    Figure 28: Weighting function and obtained closed-loop sensitivity

    -
    -

    5.4 Shaping multiple closed-loop transfer functions

    +
    +

    5.4 Shaping multiple closed-loop transfer functions

    - +

    -As was shown in Section 4, depending on the specifications, up to four closed-loop transfer function may be shaped (the Gang of four). -This was summarized in Table 7. +As was shown in Section 4, depending on the specifications, up to four closed-loop transfer function may be shaped (the Gang of four). +This was summarized in Table 8.

    @@ -2219,7 +2307,7 @@ For instance to limit the control input \(u\), \(KS\) should be shaped while to

    -When multiple closed-loop transfer function are shaped at the same time, it is refereed to as “Mixed-Sensitivity \(\mathcal{H}_\infty\) Control” and is the subject of Section 6. +When multiple closed-loop transfer function are shaped at the same time, it is refereed to as “Mixed-Sensitivity \(\mathcal{H}_\infty\) Control” and is the subject of Section 6.

    @@ -2227,14 +2315,14 @@ Depending on the closed-loop transfer function being shaped, different general c

    Shaping of S and KS -
    +

    general_conf_shaping_S_KS.png

    -

    Figure 30: Generalized Plant to shape \(S\) and \(KS\)

    +

    Figure 29: Generalized Plant to shape \(S\) and \(KS\)

    -
    P = [W1 -G*W1
    +
    P = [W1 -G*W1
          0   W2
          1  -G];
     
    @@ -2247,14 +2335,14 @@ Depending on the closed-loop transfer function being shaped, different general c
    Shaping of S and T -
    +

    general_conf_shaping_S_T.png

    -

    Figure 31: Generalized Plant to shape \(S\) and \(T\)

    +

    Figure 30: Generalized Plant to shape \(S\) and \(T\)

    -
    P = [W1 -G*W1
    +
    P = [W1 -G*W1
          0   G*W2
          1   -G];
     
    @@ -2267,14 +2355,14 @@ Depending on the closed-loop transfer function being shaped, different general c
    Shaping of S and GS -
    +

    general_conf_shaping_S_GS.png

    -

    Figure 32: Generalized Plant to shape \(S\) and \(GS\)

    +

    Figure 31: Generalized Plant to shape \(S\) and \(GS\)

    -
    P = [W1   -W1
    +
    P = [W1   -W1
          G*W2 -G*W2
          G    -G];
     
    @@ -2286,14 +2374,14 @@ Depending on the closed-loop transfer function being shaped, different general c
    Shaping of S, T and KS -
    +

    general_conf_shaping_S_T_KS.png

    -

    Figure 33: Generalized Plant to shape \(S\), \(T\) and \(KS\)

    +

    Figure 32: Generalized Plant to shape \(S\), \(T\) and \(KS\)

    -
    P = [W1 -G*W1
    +
    P = [W1 -G*W1
          0   W2
          0   G*W3
          1   -G];
    @@ -2308,14 +2396,14 @@ Depending on the closed-loop transfer function being shaped, different general c
     
    Shaping of S, T and GS -
    +

    general_conf_shaping_S_T_GS.png

    -

    Figure 34: Generalized Plant to shape \(S\), \(T\) and \(GS\)

    +

    Figure 33: Generalized Plant to shape \(S\), \(T\) and \(GS\)

    -
    P = [W1   -W1
    +
    P = [W1   -W1
          G*W2 -G*W2
          0     W3
          G    -G];
    @@ -2330,14 +2418,14 @@ Depending on the closed-loop transfer function being shaped, different general c
     
    Shaping of S, T, KS and GS -
    +

    general_conf_shaping_S_T_KS_GS.png

    -

    Figure 35: Generalized Plant to shape \(S\), \(T\), \(KS\) and \(GS\)

    +

    Figure 34: Generalized Plant to shape \(S\), \(T\), \(KS\) and \(GS\)

    -
    P = [ W1  -W1*G*W3 -G*W1
    +
    P = [ W1  -W1*G*W3 -G*W1
           0    0        W2
           1   -G*W3    -G];
     
    @@ -2361,7 +2449,7 @@ When shaping multiple closed-loop transfer functions, one should be verify caref -
    +

    Mathematical relations are linking the closed-loop transfer functions. For instance, the sensitivity function \(S(s)\) and the complementary sensitivity function \(T(s)\) as link by the following well known relation: @@ -2394,7 +2482,7 @@ The control bandwidth is clearly limited by physical constrains such as sampling Similar relationship can be found for \(T\), \(KS\) and \(GS\).

    -
    +

    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\)).

    @@ -2412,7 +2500,7 @@ You can follows this procedure for \(T\), \(KS\) and \(GS\):
    Answer

    -The obtained constrains are shown in Figure 36. +The obtained constrains are shown in Figure 35.

    @@ -2425,17 +2513,17 @@ However, in some frequency bands, the norms do not depend on the controller and

    Therefore the weighting functions should only focus on certainty frequency range depending on the transfer function being shaped. -These regions are summarized in Figure 36. +These regions are summarized in Figure 35.

    -
    +

    h-infinity-4-blocs-constrains.png

    -

    Figure 36: Shaping the Gang of Four: Limitations

    +

    Figure 35: Shaping the Gang of Four: Limitations

    -
    +

    The order (resp. number of state) of the controller given by the \(\mathcal{H}_\infty\) synthesis is equal to the order (resp. number of state) of the weighted generalized plant. It is thus equal to the sum of the number of state of the non-weighted generalized plant and the number of state of all the weighting functions. @@ -2454,16 +2542,16 @@ Two approaches can be used to obtain controllers with reasonable order:

    -
    -

    6 Mixed-Sensitivity \(\mathcal{H}_\infty\) Control - Example

    +
    +

    6 Mixed-Sensitivity \(\mathcal{H}_\infty\) Control - Example

    - +

    -
    -

    6.1 Control Problem

    +
    +

    6.1 Control Problem

    • [ ] Control Diagram
    • @@ -2516,8 +2604,8 @@ d(t>0.5) = 5e-4;
    -
    -

    6.2 Control Design Procedure

    +
    +

    6.2 Control Design Procedure

    Table 8: Typical Specifications and corresponding wanted norms of open and closed loop tansfer functions
    @@ -2564,10 +2652,10 @@ d(t>0.5) = 5e-4;
    -
    +

    mixed_sensitivity_control_schematic.png

    -

    Figure 37: Generalized Plant used for the Mixed Sensitivity Synthesis

    +

    Figure 36: Generalized Plant used for the Mixed Sensitivity Synthesis

      @@ -2586,11 +2674,11 @@ d(t>0.5) = 5e-4;
    -
    -

    6.3 Step 1 - Shaping of \(S\)

    +
    +

    6.3 Step 1 - Shaping of \(S\)

    - +

    @@ -2622,7 +2710,7 @@ W3 = tf(0.1);

    -
    +
     K1 = hinfsyn(Pw, 1, 1, 'Display', 'on');
     
       Test bounds:  0.5 <=  gamma  <=  0.552
    @@ -2683,11 +2771,11 @@ xlabel('Time [s]'); ylabel(
    -

    6.4 Step 2 - Shaping of \(KS\)

    +
    +

    6.4 Step 2 - Shaping of \(KS\)

    - +

    @@ -2708,7 +2796,7 @@ xlabel('Time [s]'); ylabel( +
     K1 = hinfsyn(Pw, 1, 1, 'Display', 'on');
     
       Test bounds:  0.51 <=  gamma  <=  1.2
    @@ -2767,11 +2855,11 @@ xlabel('Time [s]'); ylabel(
    -

    6.5 Step 3 - Shaping of \(T\)

    +
    +

    6.5 Step 3 - Shaping of \(T\)

    - +

    @@ -2792,7 +2880,7 @@ xlabel('Time [s]'); ylabel( +
     K3 = hinfsyn(Pw, 1, 1, 'Display', 'on');
     
       Test bounds:  0.578 <=  gamma  <=  1.66
    @@ -2854,18 +2942,18 @@ xlabel('Time [s]'); ylabel(
    -

    7 Conclusion

    +
    +

    7 Conclusion

    - +

    -
    -

    Resources

    -
    +
    +

    Resources

    +

    @@ -2873,12 +2961,19 @@ xlabel('Time [s]'); ylabel(

    + +

    Bibliography

    +
    +
    +
    [1]
    B. J. Lurie, A. Ghavimi, F. Y. Hadaegh, and E. Mettler, “System Architecture Trades Using Bode-Step Control Design,” Journal of Guidance, Control, and Dynamics, vol. 25, no. 2, pp. 309–315, 2002, [Online]. Available: https://doi.org/10.2514/2.4883.
    +
    +

    Author: Dehaeze Thomas

    -

    Created: 2020-12-02 mer. 16:46

    +

    Created: 2020-12-02 mer. 19:00

    diff --git a/index.org b/index.org index e259d64..89b3e5b 100644 --- a/index.org +++ b/index.org @@ -14,6 +14,8 @@ #+HTML_MATHJAX: align: center tagside: right font: TeX +#+CSL_STYLE: ieee.csl + #+PROPERTY: header-args:matlab :session *MATLAB* #+PROPERTY: header-args:matlab+ :comments org #+PROPERTY: header-args:matlab+ :results none @@ -455,24 +457,27 @@ The Bode plots of $G(s)$ and $G_d(s)$ are shown in Figures [[fig:bode_plot_examp ** Introduction :ignore: -- Section [[sec:open_loop_shaping_introduction]] -- Section [[sec:loop_shaping_example]] -- Section [[sec:h_infinity_open_loop_shaping]] -- Section [[sec:h_infinity_open_loop_shaping_example]] +After an introduction to classical Loop Shaping in Section [[sec:open_loop_shaping_introduction]], a practical example is given in Section [[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 [[sec:h_infinity_open_loop_shaping]] and applied on the same example in Section [[sec:h_infinity_open_loop_shaping_example]]. ** Introduction to Loop Shaping <> #+begin_definition -*Loop Shaping* refers to a design procedure that involves explicitly shaping the magnitude of the *Loop Transfer Function* $L(s)$. +*Loop Shaping* refers to a control design procedure that involves explicitly shaping the magnitude of the *Loop Transfer Function* $L(s)$. #+end_definition #+begin_definition -The *Loop Gain* $L(s)$ usually refers to as the product of the controller and the plant ("Gain around the loop", see Figure [[fig:open_loop_shaping]]): +The *Loop Gain* (or Loop transfer function) $L(s)$ usually refers to as the product of the controller and the plant (see Figure [[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_src latex :file open_loop_shaping.pdf \begin{tikzpicture} \node[addb={+}{}{}{}{-}] (addsub) at (0, 0){}; @@ -499,17 +504,19 @@ The *Loop Gain* $L(s)$ usually refers to as the product of the controller and th [[file:figs/open_loop_shaping.png]] #+end_definition -This synthesis method is widely used as many characteristics of the closed-loop system depend on the shape of the open loop gain $L(s)$ such as: -- *Performance*: $L$ large +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: +- *Good Tracking*: $L$ large - *Good disturbance rejection*: $L$ large -- *Limitation of measurement noise on plant output*: $L$ small -- *Small magnitude of input signal*: $K$ and $L$ small +- *Attenuation of measurement noise on plant output*: $L$ small +- *Small magnitude of input signal*: $L$ small - *Nominal stability*: $L$ small (RHP zeros and time delays) - *Robust stability*: $L$ small (neglected dynamics) -The Open Loop shape is usually done manually has the loop gain $L(s)$ depends linearly on $K(s)$ eqref:eq:loop_gain. - -$K(s)$ then consists of a combination of leads, lags, notches, etc. such that $L(s)$ has the wanted shape (an example is shown in Figure [[fig:open_loop_shaping_shape]]). +The shaping of the Loop Gain is done manually by combining several leads, lags, notches... +This process is very much simplified by the fact that the loop gain $L(s)$ depends *linearly* on $K(s)$ eqref:eq:loop_gain. +A typical wanted Loop Shape is shown in Figure [[fig:open_loop_shaping_shape]]. +Another interesting Loop shape called "Bode Step" is described in cite:lurie02_system_archit_trades_using_bode. #+begin_src latex :file open_loop_shaping_shape.pdf \begin{tikzpicture} @@ -530,12 +537,12 @@ $K(s)$ then consists of a combination of leads, lags, notches, etc. such that $L \path[shift={(0,1.8)}, fill=red!50!white] (0.5, 1.25) -- (2, 0.5) -| coordinate[near start](lfshaping) cycle; \path[shift={(0,2.2)}, fill=red!50!white] (6, -0.5) -- (7.5, -1.25) |- coordinate[near end](hfshaping) cycle; - \draw[<-] (lfshaping) -- ++(0, -0.8) node[below, align=center]{Reference\\Tracking}; - \draw[<-] (hfshaping) -- ++(0, 0.8) node[above, align=center]{Noise\\Rejection}; + \draw[<-] (lfshaping) -- ++(0, -0.8) node[below, align=center]{{\scriptsize Ref. tracking}\\{\scriptsize Dist. rejection}}; + \draw[<-] (hfshaping) -- ++(0, 0.8) node[above, align=center]{{\scriptsize Noise attenuation}}; % Crossover frequency \node[below] (wc) at (4,2){$\omega_c$}; - \draw[<-] (wc.south) -- ++(0, -0.4) node[below, align=center]{Bandwidth}; + \draw[<-] (wc.south) -- ++(0, -0.4) node[below, align=center]{{\scriptsize Bandwidth}}; % Phase \draw[] (0.5, -2) -- (2, -2)[out=0, in=-180] to (4, -1.25)[out=0, in=-180] to @@ -543,7 +550,7 @@ $K(s)$ then consists of a combination of leads, lags, notches, etc. such that $L -1.25)[out=0, in=-180] to (6, -2) -- (7.5, -2); % Phase Margin - \draw[->, dashed] (4, -2) -- (4, -1.25) node[above]{Phase Margin}; + \draw[->, dashed] (4, -2) -- (4, -1.25) node[above]{{\scriptsize Phase Margin}}; \draw[dashed] (0, -2) node[left]{$-\pi$} -- (7.5, -2); \end{tikzpicture} #+end_src @@ -553,34 +560,65 @@ $K(s)$ then consists of a combination of leads, lags, notches, etc. such that $L #+RESULTS: [[file:figs/open_loop_shaping_shape.png]] -** Example of Open Loop Shaping +The shaping of *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 [[sec:modern_interpretation_specification]] and [[sec:closed-loop-shaping]]. + +** Example of Manual Open Loop Shaping <> #+begin_exampl -Let's take our example system and try to apply the Open-Loop shaping strategy to design a controller that fulfils the following specifications: -- *Performance*: Bandwidth of approximately 10Hz -- *Noise Attenuation*: Roll-off of -40dB/decade past 30Hz -- *Robustness*: Gain margin > 3dB and Phase margin > 30 deg +Let's take our example system described in Section [[sec:example_system]] and design a controller using the Open-Loop shaping synthesis approach. +The specifications are: +1. *Disturbance rejection*: Highest possible rejection below 1Hz +2. *Positioning speed*: Bandwidth of approximately 10Hz +3. *Noise attenuation*: Roll-off of -40dB/decade past 30Hz +4. *Robustness*: Gain margin > 3dB and Phase margin > 30 deg #+end_exampl #+begin_exercice -Using =SISOTOOL=, design a controller that fulfill the specifications. +Using =SISOTOOL=, design a controller that fulfills the specifications. #+begin_src matlab :eval no :tangle no sisotool(G) #+end_src + +#+HTML:
    Hint +You can follow this procedure: +1. In order to have good disturbance rejection at low frequency, add a simple or double *integrator* +2. In terms of the loop gain, the *bandwidth* can be defined at the frequency $\omega_c$ where $|l(j\omega_c)|$ first crosses 1 from above. + Therefore, adjust the *gain* such that $L(j\omega)$ crosses 1 at around 10Hz +3. The roll-off at high frequency for noise attenuation should already be good enough. + If not, add a *low pass filter* +4. Add a *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. +#+HTML:
    #+end_exercice -In order to have the wanted Roll-off, two integrators are used, a lead is also added to have sufficient phase margin. - -The obtained controller is shown below, and the bode plot of the Loop Gain is shown in Figure [[fig:loop_gain_manual_afm]]. +Let's say we came up with the following controller. #+begin_src matlab - K = 14e8 * ... % Gain - 1/(s^2) * ... % Double Integrator + 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_src +The bode plot of the Loop Gain is shown in Figure [[fig:loop_gain_manual_afm]] and we can verify that we have the wanted stability margins using the =margin= command: +#+begin_src matlab + [Gm, Pm, ~, Wc] = margin(G*K) +#+end_src + +#+begin_src matlab :exports results :results value table replace :tangle no :post addhdr(*this*) + data2orgtable([Gm; Pm; Wc/2/pi], {'Gain Margin $> 3$ [dB]', 'Phase Margin $> 30$ [deg]', 'Crossover $\approx 10$ [Hz]'}, {'Requirements', 'Manual Method'}, ' %.1f '); +#+end_src + +#+RESULTS: +| Requirements | Manual Method | +|-----------------------------+---------------| +| Gain Margin $> 3$ [dB] | 3.1 | +| Phase Margin $> 30$ [deg] | 35.4 | +| Crossover $\approx 10$ [Hz] | 10.1 | + #+begin_src matlab :exports none freqs = logspace(0, 3, 1000); @@ -617,106 +655,62 @@ The obtained controller is shown below, and the bode plot of the Loop Gain is sh #+RESULTS: [[file:figs/loop_gain_manual_afm.png]] -And we can verify that we have the wanted stability margins: -#+begin_src matlab - [Gm, Pm, ~, Wc] = margin(G*K) -#+end_src - -#+begin_src matlab :exports results :results value table replace :tangle no :post addhdr(*this*) - data2orgtable([Gm; Pm; Wc/2/pi], {'Gain Margin $> 3$ [dB]', 'Phase Margin $> 30$ [deg]', 'Crossover $\approx 10$ [Hz]'}, {'Requirements', 'Manual Method'}, ' %.1f '); -#+end_src - -#+RESULTS: -| Requirements | Manual Method | -|-----------------------------+---------------| -| Gain Margin $> 3$ [dB] | 3.1 | -| Phase Margin $> 30$ [deg] | 35.4 | -| Crossover $\approx 10$ [Hz] | 10.1 | - ** $\mathcal{H}_\infty$ Loop Shaping Synthesis <> -The Open Loop Shaping synthesis can be performed using the $\mathcal{H}_\infty$ Synthesis. +The synthesis of controllers based on the Loop Shaping method can be automated using the $\mathcal{H}_\infty$ Synthesis. -Even though we will not go into details, we will provide one example. - -Using Matlab, the $\mathcal{H}_\infty$ Loop Shaping Synthesis can be performed using the =loopsyn= command: +Using Matlab, it can be easily performed using the =loopsyn= command: #+begin_src matlab :eval no :tangle no - K = loopsyn(G, Gd); + K = loopsyn(G, Lw); #+end_src where: - =G= is the (LTI) plant -- =Gd= is the wanted loop shape +- =Lw= is the wanted loop shape - =K= is the synthesize controller #+begin_seealso Matlab documentation of =loopsyn= ([[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 /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. + ** Example of the $\mathcal{H}_\infty$ Loop Shaping Synthesis <> -Let's reuse the previous plant. +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 [[tab:open_loop_shaping_specifications]]. -Translate the specification into the wanted shape of the open loop gain. -- *Performance*: Bandwidth of approximately 10Hz: $|L_w(j2 \pi 10)| = 1$ -- *Noise Attenuation*: Roll-off of -40dB/decade past 30Hz -- *Robustness*: Gain margin > 3dB and Phase margin > 30 deg +Such shape corresponds to the typical wanted Loop gain Shape shown in Figure [[fig:open_loop_shaping_shape]]. +#+name: tab:open_loop_shaping_specifications +#+caption: Wanted Loop Shape corresponding to each specification +| | Specification | Corresponding Loop Shape | +|-------------------------+---------------------------------------------+-----------------------------------------------------------------| +| *Disturbance Rejection* | Highest possible rejection below 1Hz | Slope of -40dB/decade at low frequency to have a high loop gain | +| *Positioning Speed* | Bandwidth of approximately 10Hz | $L$ crosses 1 at 10Hz: $\vert L_w(j2 \pi 10)\vert = 1$ | +| *Noise Attenuation* | Roll-off of -40dB/decade past 30Hz | Roll-off of -40dB/decade past 30Hz | +| *Robustness* | Gain margin > 3dB and Phase margin > 30 deg | Slope of -20dB/decade near the crossover | + +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_src 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_src -The $\mathcal{H}_\infty$ optimal open loop shaping synthesis is performed using the =loopsyn= command: +The $\mathcal{H}_\infty$ open loop shaping synthesis is then performed using the =loopsyn= command: #+begin_src matlab [K, ~, GAM] = loopsyn(G, Lw); #+end_src -#+begin_important -It is always important to analyze the controller after the synthesis is performed. - -In the end, a synthesize controller is just a combination of 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 [[fig:open_loop_shaping_hinf_K]]: -- two integrators are used at low frequency to have the wanted low frequency high gain -- a lead is added centered with the crossover frequency to increase the phase margin -- 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) - -#+begin_src matlab :exports none - freqs = logspace(0, 3, 1000); - - figure; - tiledlayout(3, 1, 'TileSpacing', 'None', 'Padding', 'None'); - - ax1 = nexttile([2,1]); - plot(freqs, abs(squeeze(freqresp(K, freqs, 'Hz')))); - set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); - ylabel('Magnitude'); set(gca, 'XTickLabel',[]); - hold off; - - ax2 = nexttile; - plot(freqs, 180/pi*angle(squeeze(freqresp(K, freqs, 'Hz')))); - set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); - yticks(-360:90:360); ylim([-180, 90]); - xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); - - linkaxes([ax1,ax2],'x'); - xlim([freqs(1), freqs(end)]); -#+end_src - -#+begin_src matlab :tangle no :exports results :results file replace - exportFig('figs/open_loop_shaping_hinf_K.pdf', 'width', 'wide', 'height', 'normal'); -#+end_src - -#+name: fig:open_loop_shaping_hinf_K -#+caption: Obtained controller $K$ using the open-loop $\mathcal{H}_\infty$ shaping -#+RESULTS: -[[file:figs/open_loop_shaping_hinf_K.png]] - -The obtained Loop Gain is shown in Figure [[fig:open_loop_shaping_hinf_L]] and matches the specified one by a factor $\gamma$. +The obtained Loop Gain is shown in Figure [[fig:open_loop_shaping_hinf_L]] and matches the specified one by a factor $\gamma \approx 2$. #+begin_src matlab :exports none freqs = logspace(0, 3, 1000); @@ -758,7 +752,51 @@ The obtained Loop Gain is shown in Figure [[fig:open_loop_shaping_hinf_L]] and m #+RESULTS: [[file:figs/open_loop_shaping_hinf_L.png]] -Let's now compare the obtained stability margins of the $\mathcal{H}_\infty$ controller and of the manually developed controller in Table [[tab:open_loop_shaping_compare]]. + +#+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 [[fig:open_loop_shaping_hinf_K]]: +- two integrators are used at low frequency to have the wanted low frequency high gain +- a lead is added centered with the crossover frequency to increase the phase margin +- 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) + +#+begin_src matlab :exports none + freqs = logspace(0, 3, 1000); + + figure; + tiledlayout(3, 1, 'TileSpacing', 'None', 'Padding', 'None'); + + ax1 = nexttile([2,1]); + plot(freqs, abs(squeeze(freqresp(K, freqs, 'Hz')))); + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); + ylabel('Magnitude'); set(gca, 'XTickLabel',[]); + hold off; + + ax2 = nexttile; + plot(freqs, 180/pi*angle(squeeze(freqresp(K, freqs, 'Hz')))); + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); + yticks(-360:90:360); ylim([-180, 90]); + xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); + + linkaxes([ax1,ax2],'x'); + xlim([freqs(1), freqs(end)]); +#+end_src + +#+begin_src matlab :tangle no :exports results :results file replace + exportFig('figs/open_loop_shaping_hinf_K.pdf', 'width', 'wide', 'height', 'normal'); +#+end_src + +#+name: fig:open_loop_shaping_hinf_K +#+caption: Obtained controller $K$ using the open-loop $\mathcal{H}_\infty$ shaping +#+RESULTS: +[[file:figs/open_loop_shaping_hinf_K.png]] + + +Let's finally compare the obtained stability margins of the $\mathcal{H}_\infty$ controller and of the manually developed controller in Table [[tab:open_loop_shaping_compare]]. #+begin_src matlab :exports none [Gm_2, Pm_2, ~, Wc_2] = margin(G*K)