diff --git a/content/research/2020-h-infinity-lecture/_index.md b/content/research/2020-h-infinity-lecture/_index.md index 4f5d721..9211267 100644 --- a/content/research/2020-h-infinity-lecture/_index.md +++ b/content/research/2020-h-infinity-lecture/_index.md @@ -24,26 +24,22 @@ 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 -- Classical _open_ loop shaping method is presented in Section . +- A short introduction to _model based control_ is given in Section [Introduction to Model Based Control](#sec:model_based_control) +- Classical _open_ loop shaping method is presented in Section [Classical Open Loop Shaping](#sec:open_loop_shaping). 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 -- 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 +- Important concepts indispensable for \\(\mathcal{H}\_\infty\\) control such as the \\(\mathcal{H}\_\infty\\) norm and the generalized plant are introduced in Section [A first Step into the \\(\mathcal{H}\_\infty\\) world](#sec:h_infinity_introduction) +- 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 [Modern Interpretation of Control Specifications](#sec:modern_interpretation_specification) - 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 -- Finally, complete examples of the use of \\(\mathcal{H}\_\infty\\) Control for practical problems are provided in Section + Such technique is presented in Section [\\(\mathcal{H}\_\infty\\) Shaping of closed-loop transfer functions](#sec:closed-loop-shaping) +- Finally, complete examples of the use of \\(\mathcal{H}\_\infty\\) Control for practical problems are provided in Section [Mixed-Sensitivity \\(\mathcal{H}\_\infty\\) Control - Example](#sec:h_infinity_mixed_sensitivity) -## Introduction to Model Based Control {#introduction-to-model-based-control} - - +## Introduction to Model Based Control {#sec:model_based_control} -### Model Based Control - Methodology {#model-based-control-methodology} +### Model Based Control - Methodology {#sec:model_based_control_methodology} - - -The typical methodology for **Model Based Control** techniques is schematically shown in Figure [Figure 1](#figure--fig:control-procedure). +The typical methodology for **Model Based Control** techniques is schematically shown in [Figure 1](#figure--fig:control-procedure). It consists of three steps: @@ -55,18 +51,16 @@ It consists of three steps: -{{< figure src="figs/control-procedure.png" caption="Figure 1: Typical Methodoly for Model Based Control" >}} +{{< figure src="figs/control-procedure.png" caption="Figure 1: Typical Methodoly for Model Based Control" >}} 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 , steps 2 and 3 will be described for a control techniques called **classical (open-)loop shaping**. +In Section [Classical Open Loop Shaping](#sec:open_loop_shaping), 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 , and . +Then, steps 2 and 3 for the **\\(\mathcal{H}\_\infty\\) Loop Shaping** of closed-loop transfer functions will be discussed in Sections [Modern Interpretation of Control Specifications](#sec:modern_interpretation_specification), [\\(\mathcal{H}\_\infty\\) Shaping of closed-loop transfer functions](#sec:closed-loop-shaping) and [Mixed-Sensitivity \\(\mathcal{H}\_\infty\\) Control - Example](#sec:h_infinity_mixed_sensitivity). -### From Classical Control to Robust Control {#from-classical-control-to-robust-control} - - +### From Classical Control to Robust Control {#sec:comp_classical_modern_robust_control} Many different model based control techniques have been developed since the birth of _classical control theory_ in the '30s. @@ -84,7 +78,7 @@ By the 1980's, modern control theory was shown to have some robustness issues an 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 [Table 1](#table--tab:comparison-control-methods). +The three presented control methods are compared in [Table 1](#table--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. @@ -113,23 +107,21 @@ Note that in parallel, there have been numerous other developments, including no | | No input usage lim. | | | -### Example System {#example-system} - - +### Example System {#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 [Figure 2](#figure--fig:mech-sys-1dof-inertial-contr). +This system is shown in [Figure 2](#figure--fig:mech-sys-1dof-inertial-contr). 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 [Figure 2](#figure--fig:mech-sys-1dof-inertial-contr) are listed and described in Table [Table 2](#table--tab:example-notations). +The notations used on [Figure 2](#figure--fig:mech-sys-1dof-inertial-contr) are listed and described in [Table 2](#table--tab:example-notations). -{{< figure src="figs/mech_sys_1dof_inertial_contr.png" caption="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." >}} +{{< figure src="figs/mech_sys_1dof_inertial_contr.png" caption="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." >}}
@@ -182,11 +174,11 @@ You can follow this generic procedure:
-Having obtained \\(G(s)\\) and \\(G\_d(s)\\), we can transform the system shown in Figure [Figure 2](#figure--fig:mech-sys-1dof-inertial-contr) into a classical feedback architecture as shown in Figure [Figure 6](#figure--fig:open-loop-shaping). +Having obtained \\(G(s)\\) and \\(G\_d(s)\\), we can transform the system shown in [Figure 2](#figure--fig:mech-sys-1dof-inertial-contr) into a classical feedback architecture as shown in [Figure 6](#figure--fig:open-loop-shaping). -{{< figure src="figs/classical_feedback_test_system.png" caption="Figure 3: Block diagram corresponding to the example system of Figure [Figure 2](#figure--fig:mech-sys-1dof-inertial-contr)" >}} +{{< figure src="figs/classical_feedback_test_system.png" caption="Figure 3: Block diagram corresponding to the example system of [Figure 2](#figure--fig:mech-sys-1dof-inertial-contr)" >}} Let's define the system parameters on Matlab. @@ -207,27 +199,23 @@ The Bode plots of \\(G(s)\\) and \\(G\_d(s)\\) are shown in Figures [Figure 4](# -{{< figure src="figs/bode_plot_example_afm.png" caption="Figure 4: Bode plot of the plant \\(G(s)\\)" >}} +{{< figure src="figs/bode_plot_example_afm.png" caption="Figure 4: Bode plot of the plant \\(G(s)\\)" >}} -{{< figure src="figs/bode_plot_example_Gd.png" caption="Figure 5: Magnitude of the disturbance transfer function \\(G\_d(s)\\)" >}} +{{< figure src="figs/bode_plot_example_Gd.png" caption="Figure 5: Magnitude of the disturbance transfer function \\(G\_d(s)\\)" >}} -## Classical Open Loop Shaping {#classical-open-loop-shaping} +## Classical Open Loop Shaping {#sec:open_loop_shaping} - - -After an introduction to classical Loop Shaping in Section , a practical example is given in Section . +After an introduction to classical Loop Shaping in Section [Introduction to Loop Shaping](#sec:open_loop_shaping_introduction), a practical example is given in Section [Example of Manual Open Loop Shaping](#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 and applied on the same example in Section . +This is presented in Section [\\(\mathcal{H}\_\infty\\) Loop Shaping Synthesis](#sec:h_infinity_open_loop_shaping) and applied on the same example in Section [Example of the \\(\mathcal{H}\_\infty\\) Loop Shaping Synthesis](#sec:h_infinity_open_loop_shaping_example). -### Introduction to Loop Shaping {#introduction-to-loop-shaping} - - +### Introduction to Loop Shaping {#sec:open_loop_shaping_introduction}
@@ -237,7 +225,7 @@ This is presented in Section and applied on the same example in Section .
-The **Loop Gain** (or Loop transfer function) \\(L(s)\\) usually refers to as the product of the controller and the plant (see Figure [Figure 6](#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 6](#figure--fig:open-loop-shaping)): \begin{equation} L(s) = G(s) \cdot K(s) @@ -247,7 +235,7 @@ Its name comes from the fact that this is actually the "gain around the loop". -{{< figure src="figs/open_loop_shaping.png" caption="Figure 6: Classical Feedback Architecture" >}} +{{< figure src="figs/open_loop_shaping.png" caption="Figure 6: Classical Feedback Architecture" >}}
@@ -263,25 +251,23 @@ It is widely used and generally successful as many characteristics of the closed 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)\\) . -A typical wanted Loop Shape is shown in Figure [Figure 7](#figure--fig:open-loop-shaping-shape). +A typical wanted Loop Shape is shown in [Figure 7](#figure--fig:open-loop-shaping-shape). Another interesting Loop shape called "Bode Step" is described in (Lurie et al. 2002). -{{< figure src="figs/open_loop_shaping_shape.png" caption="Figure 7: Typical Wanted Shape for the Loop Gain \\(L(s)\\)" >}} +{{< figure src="figs/open_loop_shaping_shape.png" caption="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 and . +More details on that in Sections [Modern Interpretation of Control Specifications](#sec:modern_interpretation_specification) and [\\(\mathcal{H}\_\infty\\) Shaping of closed-loop transfer functions](#sec:closed-loop-shaping). -### Example of Manual Open Loop Shaping {#example-of-manual-open-loop-shaping} - - +### Example of Manual Open Loop Shaping {#sec:loop_shaping_example}
-Let's take our example system described in Section and design a controller using the Open-Loop shaping synthesis approach. +Let's take our example system described in Section [Example System](#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 @@ -324,7 +310,7 @@ K = 14e8 * ... % Gain (1 + s/(2*pi*10/sqrt(8)))/(1 + s/(2*pi*10*sqrt(8))); % Lead ``` -The bode plot of the Loop Gain is shown in Figure [Figure 8](#figure--fig:loop-gain-manual-afm) and we can verify that we have the wanted stability margins using the `margin` command: +The bode plot of the Loop Gain is shown in [Figure 8](#figure--fig:loop-gain-manual-afm) and we can verify that we have the wanted stability margins using the `margin` command: ```matlab [Gm, Pm, ~, Wc] = margin(G*K); @@ -338,12 +324,10 @@ The bode plot of the Loop Gain is shown in Figure [Figure 8](#figure--fig:loop-g -{{< figure src="figs/loop_gain_manual_afm.png" caption="Figure 8: Bode Plot of the obtained Loop Gain \\(L(s) = G(s) K(s)\\)" >}} +{{< figure src="figs/loop_gain_manual_afm.png" caption="Figure 8: Bode Plot of the obtained Loop Gain \\(L(s) = G(s) K(s)\\)" >}} -### \\(\mathcal{H}\_\infty\\) Loop Shaping Synthesis {#mathcal-h-infty-loop-shaping-synthesis} - - +### \\(\mathcal{H}\_\infty\\) Loop Shaping Synthesis {#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. @@ -370,14 +354,12 @@ Therefore, by just providing the wanted loop shape and the plant model, the \\(\ 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 {#example-of-the-mathcal-h-infty-loop-shaping-synthesis} - - +### Example of the \\(\mathcal{H}\_\infty\\) Loop Shaping Synthesis {#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 [Table 3](#table--tab:open-loop-shaping-specifications). +This is summarized in [Table 3](#table--tab:open-loop-shaping-specifications). -Such shape corresponds to the typical wanted Loop gain Shape shown in Figure [Figure 7](#figure--fig:open-loop-shaping-shape). +Such shape corresponds to the typical wanted Loop gain Shape shown in [Figure 7](#figure--fig:open-loop-shaping-shape).
@@ -410,11 +392,11 @@ The \\(\mathcal{H}\_\infty\\) open loop shaping synthesis is then performed usin [K, ~, GAM] = loopsyn(G, Lw); ``` -The obtained Loop Gain is shown in Figure [Figure 9](#figure--fig:open-loop-shaping-hinf-L) and matches the specified one by a factor \\(\gamma \approx 2\\). +The obtained Loop Gain is shown in [Figure 9](#figure--fig:open-loop-shaping-hinf-L) and matches the specified one by a factor \\(\gamma \approx 2\\). -{{< figure src="figs/open_loop_shaping_hinf_L.png" caption="Figure 9: Obtained Open Loop Gain \\(L(s) = G(s) K(s)\\) and comparison with the wanted Loop gain \\(L\_w\\)" >}} +{{< figure src="figs/open_loop_shaping_hinf_L.png" caption="Figure 9: Obtained Open Loop Gain \\(L(s) = G(s) K(s)\\) and comparison with the wanted Loop gain \\(L\_w\\)" >}}
@@ -424,7 +406,7 @@ This is usually done by breaking down the controller into simple elements such a
-Let's briefly analyze the obtained controller which bode plot is shown in Figure [Figure 10](#figure--fig:open-loop-shaping-hinf-K): +Let's briefly analyze the obtained controller which bode plot is shown in [Figure 10](#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 @@ -432,9 +414,9 @@ Let's briefly analyze the obtained controller which bode plot is shown in Figure -{{< figure src="figs/open_loop_shaping_hinf_K.png" caption="Figure 10: Obtained controller \\(K\\) using the open-loop \\(\mathcal{H}\_\infty\\) shaping" >}} +{{< figure src="figs/open_loop_shaping_hinf_K.png" caption="Figure 10: Obtained controller \\(K\\) using the open-loop \\(\mathcal{H}\_\infty\\) shaping" >}} -Let's finally compare the obtained stability margins of the \\(\mathcal{H}\_\infty\\) controller and of the manually developed controller in Table [Table 4](#table--tab:open-loop-shaping-compare). +Let's finally compare the obtained stability margins of the \\(\mathcal{H}\_\infty\\) controller and of the manually developed controller in [Table 4](#table--tab:open-loop-shaping-compare).
@@ -449,23 +431,19 @@ Let's finally compare the obtained stability margins of the \\(\mathcal{H}\_\inf | Crossover \\(\approx 10\\) [Hz] | 10.1 | 9.9 | -## A first Step into the \\(\mathcal{H}\_\infty\\) world {#a-first-step-into-the-mathcal-h-infty-world} - - +## A first Step into the \\(\mathcal{H}\_\infty\\) world {#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 , the \\(\mathcal{H}\_\infty\\) synthesis procedure is described in Section . +After the \\(\mathcal{H}\_\infty\\) norm is defined in Section [The \\(\mathcal{H}\_\infty\\) Norm](#sec:h_infinity_norm), the \\(\mathcal{H}\_\infty\\) synthesis procedure is described in Section [\\(\mathcal{H}\_\infty\\) Synthesis](#sec:h_infinity_synthesis) . -The generalized plant, a very useful tool to describe a control problem, is presented in Section . -The \\(\mathcal{H}\_\infty\\) is then applied to this generalized plant in Section . +The generalized plant, a very useful tool to describe a control problem, is presented in Section [The Generalized Plant](#sec:generalized_plant). +The \\(\mathcal{H}\_\infty\\) is then applied to this generalized plant in Section [The \\(\mathcal{H}\_\infty\\) Synthesis applied on the Generalized plant](#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 . +Finally, an example showing how to convert a typical feedback control architecture into a generalized plant is given in Section [From a Classical Feedback Architecture to a Generalized Plant](#sec:generalized_plant_derivation). -### The \\(\mathcal{H}\_\infty\\) Norm {#the-mathcal-h-infty-norm} - - +### The \\(\mathcal{H}\_\infty\\) Norm {#sec:h_infinity_norm}
@@ -495,18 +473,16 @@ hinfnorm(G) 7.9216e-06 ``` -We can see in Figure [Figure 11](#figure--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)|\\). +We can see in [Figure 11](#figure--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)|\\). -{{< figure src="figs/hinfinity_norm_siso_bode.png" caption="Figure 11: Example of the \\(\mathcal{H}\_\infty\\) norm of a SISO system" >}} +{{< figure src="figs/hinfinity_norm_siso_bode.png" caption="Figure 11: Example of the \\(\mathcal{H}\_\infty\\) norm of a SISO system" >}}
-### \\(\mathcal{H}\_\infty\\) Synthesis {#mathcal-h-infty-synthesis} - - +### \\(\mathcal{H}\_\infty\\) Synthesis {#sec:h_infinity_synthesis}
@@ -514,14 +490,14 @@ The \\(\mathcal{H}\_\infty\\) synthesis is a method that uses an **algorithm** (
-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 . +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 [Modern Interpretation of Control Specifications](#sec:modern_interpretation_specification).
Then applying the \\(\mathcal{H}\_\infty\\) synthesis to a plant, the engineer work usually consists of the following steps: 1. Write the problem as standard \\(\mathcal{H}\_\infty\\) problem using the generalized plant (described in the next section) -2. Translate the specifications as \\(\mathcal{H}\_\infty\\) norms of transfer functions (Section ) +2. Translate the specifications as \\(\mathcal{H}\_\infty\\) norms of transfer functions (Section [Modern Interpretation of Control Specifications](#sec:modern_interpretation_specification)) 3. Make the synthesis and analyze the obtained controller 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. @@ -537,29 +513,27 @@ Note that there are many ways to use the \\(\mathcal{H}\_\infty\\) Synthesis: - Signal Based \\(\mathcal{H}\_\infty\\) Synthesis, and many more... -### The Generalized Plant {#the-generalized-plant} - - +### The Generalized Plant {#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 **Generalized Plant** for the current problem. -The generalized plant, usually noted \\(P(s)\\), is shown in Figure [Figure 12](#figure--fig:general-plant). +The generalized plant, usually noted \\(P(s)\\), is shown in [Figure 12](#figure--fig:general-plant). It has two _sets_ of inputs \\([w,\\,u]\\) and two _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 [Table 5](#table--tab:notation-general). +The meaning of these inputs and outputs are summarized in [Table 5](#table--tab:notation-general). -A practical example about how to derive the generalized plant for a classical control problem is given in Section . +A practical example about how to derive the generalized plant for a classical control problem is given in Section [From a Classical Feedback Architecture to a Generalized Plant](#sec:generalized_plant_derivation).
-{{< figure src="figs/general_plant.png" caption="Figure 12: Inputs and Outputs of the generalized Plant" >}} +{{< figure src="figs/general_plant.png" caption="Figure 12: Inputs and Outputs of the generalized Plant" >}}
@@ -578,9 +552,7 @@ A practical example about how to derive the generalized plant for a classical co
-### The \\(\mathcal{H}\_\infty\\) Synthesis applied on the Generalized plant {#the-mathcal-h-infty-synthesis-applied-on-the-generalized-plant} - - +### The \\(\mathcal{H}\_\infty\\) Synthesis applied on the Generalized plant {#sec:h_infinity_general_synthesis} Once the generalized plant is obtained, the \\(\mathcal{H}\_\infty\\) synthesis problem can be stated as follows: @@ -593,11 +565,11 @@ Find a stabilizing controller \\(K\\) that, using the sensed outputs \\(v\\), ge After \\(K\\) is found, the system is _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 [Figure 13](#figure--fig:general-control-names). +The obtained controller \\(K\\) and the generalized plant are connected as shown in [Figure 13](#figure--fig:general-control-names). -{{< figure src="figs/general_control_names.png" caption="Figure 13: General Control Configuration" >}} +{{< figure src="figs/general_control_names.png" caption="Figure 13: General Control Configuration" >}}
@@ -614,21 +586,19 @@ where: - `ncont` is the number of control signals (size of \\(u\\)) - `K` obtained controller (of size `ncont x nmeas`) that minimizes the \\(\mathcal{H}\_\infty\\) norm from \\(w\\) to \\(z\\). -Note that the general control configure of Figure [Figure 13](#figure--fig:general-control-names), as its name implies, is quite _general_ and can represent feedback control as well as feedforward control architectures. +Note that the general control configure of [Figure 13](#figure--fig:general-control-names), as its name implies, is quite _general_ and can represent feedback control as well as feedforward control architectures. -### From a Classical Feedback Architecture to a Generalized Plant {#from-a-classical-feedback-architecture-to-a-generalized-plant} +### From a Classical Feedback Architecture to a Generalized Plant {#sec:generalized_plant_derivation} - - -The procedure to convert a typical control architecture as the one shown in Figure [Figure 14](#figure--fig:classical-feedback-tracking) to a generalized Plant is as follows: +The procedure to convert a typical control architecture as the one shown in [Figure 14](#figure--fig:classical-feedback-tracking) to a generalized Plant is as follows: 1. Define signals of the generalized plant: \\(w\\), \\(z\\), \\(u\\) and \\(v\\) -2. Remove \\(K\\) and rearrange the inputs and outputs to match the generalized configuration shown in Figure [Figure 12](#figure--fig:general-plant) +2. Remove \\(K\\) and rearrange the inputs and outputs to match the generalized configuration shown in [Figure 12](#figure--fig:general-plant)
-Consider the feedback control architecture shown in Figure [Figure 14](#figure--fig:classical-feedback-tracking). +Consider the feedback control architecture shown in [Figure 14](#figure--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\\). 1. Convert the control architecture to a generalized configuration @@ -636,7 +606,7 @@ Suppose we want to design \\(K\\) using the general \\(\mathcal{H}\_\infty\\) sy -{{< figure src="figs/classical_feedback_tracking.png" caption="Figure 14: Classical Feedback Control Architecture (Tracking)" >}} +{{< figure src="figs/classical_feedback_tracking.png" caption="Figure 14: Classical Feedback Control Architecture (Tracking)" >}}
Hint @@ -648,17 +618,17 @@ First, define the signals of the generalized plant: - Controller inputs: this is the signal at the input of the controller: \\(v = \epsilon\\) - Controller outputs: signal generated by the controller: \\(u\\) -Then, Remove \\(K\\) and rearrange the inputs and outputs as in Figure [Figure 12](#figure--fig:general-plant). +Then, Remove \\(K\\) and rearrange the inputs and outputs as in [Figure 12](#figure--fig:general-plant).
Answer -The obtained generalized plant shown in Figure [Figure 15](#figure--fig:mixed-sensitivity-ref-tracking). +The obtained generalized plant shown in [Figure 15](#figure--fig:mixed-sensitivity-ref-tracking). -{{< figure src="figs/mixed_sensitivity_ref_tracking.png" caption="Figure 15: Generalized plant of the Classical Feedback Control Architecture (Tracking)" >}} +{{< figure src="figs/mixed_sensitivity_ref_tracking.png" caption="Figure 15: Generalized plant of the Classical Feedback Control Architecture (Tracking)" >}} Using Matlab, the generalized plant can be defined as follows: @@ -675,44 +645,40 @@ P.OutputName = {'e', 'u', 'v'};
-## Modern Interpretation of Control Specifications {#modern-interpretation-of-control-specifications} +## Modern Interpretation of Control Specifications {#sec:modern_interpretation_specification} - - -As shown in Section , the loop gain \\(L(s) = G(s) K(s)\\) is a useful and easy tool when manually designing controllers. +As shown in Section [Classical Open Loop Shaping](#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 _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 **not** directly give the performances of the closed-loop system. As a matter of fact, the behavior of the closed-loop system by the **closed-loop** transfer functions. -These are derived of a typical feedback architecture functions in Section . +These are derived of a typical feedback architecture functions in Section [Closed Loop Transfer Functions and the Gang of Four](#sec:closed_loop_tf). The modern interpretation of control specifications then consists of determining the **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 **shape** the closed-loop transfer function as specified.. -This method is presented in Section . +This method is presented in Section [\\(\mathcal{H}\_\infty\\) Shaping of closed-loop transfer functions](#sec:closed-loop-shaping). One of the most important closed-loop transfer function is called the **sensitivity function**. -Its link with the closed-loop behavior of the feedback system is studied in Section . +Its link with the closed-loop behavior of the feedback system is studied in Section [The Sensitivity Function](#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 **module margin** (Section ). +The robustness (stability margins) of the system can also be linked to the shape of the sensitivity function with the use of the **module margin** (Section [Robustness: Module Margin](#sec:module_margin)). -Links between typical control specifications and shapes of the closed-loop transfer functions are summarized in Section . +Links between typical control specifications and shapes of the closed-loop transfer functions are summarized in Section [Summary of typical specification and associated wanted shaping](#sec:other_requirements). -### Closed Loop Transfer Functions and the Gang of Four {#closed-loop-transfer-functions-and-the-gang-of-four} +### Closed Loop Transfer Functions and the Gang of Four {#sec:closed_loop_tf} - - -Consider the typical feedback system shown in Figure [Figure 16](#figure--fig:gang-of-four-feedback). +Consider the typical feedback system shown in [Figure 16](#figure--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 [Table 6](#table--tab:spec-closed-loop-tf). +These are summarized in [Table 6](#table--tab:spec-closed-loop-tf). -{{< figure src="figs/gang_of_four_feedback.png" caption="Figure 16: 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" >}} +{{< figure src="figs/gang_of_four_feedback.png" caption="Figure 16: 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" >}}
@@ -720,18 +686,18 @@ These are summarized in Table [Table 6](#table--tab:spec-closed-loop-tf). Typical Specification and associated closed-loop transfer function
-| **Specification** | **CL Transfer Function** | -|--------------------------------|--------------------------------| -| 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 ) | +| **Specification** | **CL Transfer Function** | +|--------------------------------|-----------------------------------------------------------------------------| +| 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 [Robustness: Module Margin](#sec:module_margin)) |
-For the feedback system in Figure [Figure 16](#figure--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]\\). +For the feedback system in [Figure 16](#figure--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]\\).
Hint @@ -767,7 +733,7 @@ The following equations should be obtained:
-We can see that they are 4 different closed-loop transfer functions describing the behavior of the feedback system in Figure [Figure 16](#figure--fig:gang-of-four-feedback). +We can see that they are 4 different closed-loop transfer functions describing the behavior of the feedback system in [Figure 16](#figure--fig:gang-of-four-feedback). These called the **Gang of Four**: \begin{align} @@ -786,7 +752,7 @@ More on that in this [short video](https://www.youtube.com/watch?v=b_8v8scghh8).
-The behavior of the feedback system in Figure [Figure 16](#figure--fig:gang-of-four-feedback) is fully described by the following set of equations: +The behavior of the feedback system in [Figure 16](#figure--fig:gang-of-four-feedback) is fully described by the following set of equations: \begin{align} \epsilon &= S r - GS d - GS n \\\\ @@ -798,17 +764,15 @@ Thus, for reference tracking, we have to shape the _closed-loop_ transfer functi Similarly, to reduce the effect of measurement noise \\(n\\) on the output \\(y\\), we have to act on the complementary sensitivity function \\(T(s)\\). -### The Sensitivity Function {#the-sensitivity-function} - - +### The Sensitivity Function {#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 "_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 [Figure 17](#figure--fig:sensitivity-shape-effect) and the corresponding step responses are shown in Figure [Figure 18](#figure--fig:sensitivity-shape-effect-step). +The obtained sensitivity functions for these four controllers are shown in [Figure 17](#figure--fig:sensitivity-shape-effect) and the corresponding step responses are shown in [Figure 18](#figure--fig:sensitivity-shape-effect-step). -The comparison of the sensitivity functions shapes and their effect on the step response is summarized in Table [Table 7](#table--tab:compare-sensitivity-shapes). +The comparison of the sensitivity functions shapes and their effect on the step response is summarized in [Table 7](#table--tab:compare-sensitivity-shapes).
@@ -824,11 +788,11 @@ The comparison of the sensitivity functions shapes and their effect on the step -{{< figure src="figs/sensitivity_shape_effect.png" caption="Figure 17: Sensitivity function magnitude \\(|S(j\omega)|\\) corresponding to the reference controller \\(K\_r(s)\\) and the three modified controllers \\(K\_i(s)\\)" >}} +{{< figure src="figs/sensitivity_shape_effect.png" caption="Figure 17: Sensitivity function magnitude \\(|S(j\omega)|\\) corresponding to the reference controller \\(K\_r(s)\\) and the three modified controllers \\(K\_i(s)\\)" >}} -{{< figure src="figs/sensitivity_shape_effect_step.png" caption="Figure 18: Step response (response from \\(r\\) to \\(y\\)) for the different controllers" >}} +{{< figure src="figs/sensitivity_shape_effect_step.png" caption="Figure 18: Step response (response from \\(r\\) to \\(y\\)) for the different controllers" >}}
@@ -841,7 +805,7 @@ Closed-Loop Bandwidth
-From the simple analysis above, we can draw a first estimation of the wanted shape for the sensitivity function (Figure [Figure 19](#figure--fig:h-infinity-spec-S)): +From the simple analysis above, we can draw a first estimation of the wanted shape for the sensitivity function ([Figure 19](#figure--fig:h-infinity-spec-S)): - A small magnitude at low frequency to make the static errors small - A wanted minimum closed-loop bandwidth in order to have fast rise time and good rejection of perturbations @@ -851,14 +815,12 @@ From the simple analysis above, we can draw a first estimation of the wanted sha -{{< figure src="figs/h-infinity-spec-S.png" caption="Figure 19: Typical wanted shape of the Sensitivity transfer function" >}} +{{< figure src="figs/h-infinity-spec-S.png" caption="Figure 19: Typical wanted shape of the Sensitivity transfer function" >}}
-### Robustness: Module Margin {#robustness-module-margin} - - +### Robustness: Module Margin {#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. @@ -875,13 +837,13 @@ k = 1e7; Gt = 1/k*(s/w0/4 + 1)/(s^2/w0^2 + 2*xi*s/w0 + 1); ``` -Let's say we have designed a controller \\(K\_t(s)\\) that gives the loop gain shown in Figure [Figure 20](#figure--fig:phase-gain-margin-model-plant). +Let's say we have designed a controller \\(K\_t(s)\\) that gives the loop gain shown in [Figure 20](#figure--fig:phase-gain-margin-model-plant). ```matlab Kt = 1.2e6*(s + w0)/s; ``` -The following characteristics can be determined from the Loop gain in Figure [Figure 20](#figure--fig:phase-gain-margin-model-plant): +The following characteristics can be determined from the Loop gain in [Figure 20](#figure--fig:phase-gain-margin-model-plant): - Control bandwidth of \\(\approx 10\\, \text{Hz}\\) - Infinite gain margin (the phase of the loop-gain never reaches \\(-180^o\\)) @@ -892,7 +854,7 @@ Or does it? Let's find out. -{{< figure src="figs/phase_gain_margin_model_plant.png" caption="Figure 20: Bode plot of the obtained Loop Gain \\(L(s)\\)" >}} +{{< figure src="figs/phase_gain_margin_model_plant.png" caption="Figure 20: Bode plot of the obtained Loop Gain \\(L(s)\\)" >}} 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: @@ -900,7 +862,7 @@ Now let's suppose the controller is implemented in practice, and the "real" plan xi = 0.03; ``` -The obtained "real" loop gain is shown in Figure [Figure 21](#figure--fig:phase-gain-margin-real-plant). +The obtained "real" loop gain is shown in [Figure 21](#figure--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: @@ -915,7 +877,7 @@ isstable(feedback(Gr,Kt)) -{{< figure src="figs/phase_gain_margin_real_plant.png" caption="Figure 21: Bode plots of \\(L(s)\\) (loop gain corresponding the nominal plant) and \\(L\_r(s)\\) (loop gain corresponding to the real plant)" >}} +{{< figure src="figs/phase_gain_margin_real_plant.png" caption="Figure 21: Bode plots of \\(L(s)\\) (loop gain corresponding the nominal plant) and \\(L\_r(s)\\) (loop gain corresponding to the real plant)" >}} 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. @@ -954,16 +916,16 @@ Module Margin
-A typical Nyquist plot is shown in Figure [Figure 22](#figure--fig:module-margin-example). +A typical Nyquist plot is shown in [Figure 22](#figure--fig:module-margin-example). The gain, phase and module margins are graphically shown to have an idea of what they represent. -{{< figure src="figs/module_margin_example.png" caption="Figure 22: Nyquist plot with visual indication of the Gain margin \\(\Delta G\\), Phase margin \\(\Delta \phi\\) and Module margin \\(\Delta M\\)" >}} +{{< figure src="figs/module_margin_example.png" caption="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 [Figure 22](#figure--fig:module-margin-example), there is a close relationship between the module margin and the gain and phase margins. +As expected from [Figure 22](#figure--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} @@ -1015,9 +977,7 @@ To learn more about module/disk margin, you can check out [this](https://www.you
-### Summary of typical specification and associated wanted shaping {#summary-of-typical-specification-and-associated-wanted-shaping} - - +### Summary of typical specification and associated wanted shaping {#sec:other_requirements}
@@ -1034,9 +994,7 @@ To learn more about module/disk margin, you can check out [this](https://www.you | Robustness | Phase/Gain margins | Module margin: \\(\Vert S\Vert\_\infty\\) small | -## \\(\mathcal{H}\_\infty\\) Shaping of closed-loop transfer functions {#mathcal-h-infty-shaping-of-closed-loop-transfer-functions} - - +## \\(\mathcal{H}\_\infty\\) Shaping of closed-loop transfer functions {#sec:closed-loop-shaping} In the previous sections, we have seen that the performances of the system depends on the **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. @@ -1044,22 +1002,20 @@ This is clearly not simple as these closed-loop transfer functions does not depe But don't worry, the \\(\mathcal{H}\_\infty\\) synthesis will do this job for us! To do so, **weighting functions** are included in the generalized plant and the \\(\mathcal{H}\_\infty\\) synthesis applied on the **weighted** generalized plant. -Such procedure is presented in Section . +Such procedure is presented in Section [How to Shape closed-loop transfer function? Using Weighting Functions!](#sec:weighting_functions). -Some advice on the design of weighting functions are given in Section . +Some advice on the design of weighting functions are given in Section [Design of Weighting Functions](#sec:weighting_functions_design). -An example of the \\(\mathcal{H}\_\infty\\) shaping of the sensitivity function is studied in Section . +An example of the \\(\mathcal{H}\_\infty\\) shaping of the sensitivity function is studied in Section [Shaping the Sensitivity Function](#sec:sensitivity_shaping_example). Multiple closed-loop transfer functions can be shaped at the same time. Such synthesis is usually called **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 . +Some insight on the use and limitations of such techniques are given in Section [Shaping multiple closed-loop transfer functions - Limitations](#sec:shaping_multiple_tf). -### How to Shape closed-loop transfer function? Using Weighting Functions! {#how-to-shape-closed-loop-transfer-function-using-weighting-functions} +### How to Shape closed-loop transfer function? Using Weighting Functions! {#sec:weighting_functions} - - -Suppose we apply the \\(\mathcal{H}\_\infty\\) synthesis on the generalized plant \\(P(s)\\) shown in Figure [Figure 23](#figure--fig:loop-shaping-S-without-W). +Suppose we apply the \\(\mathcal{H}\_\infty\\) synthesis on the generalized plant \\(P(s)\\) shown in [Figure 23](#figure--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\\). @@ -1068,11 +1024,11 @@ Clearly this does not allow to **shape** the norm of \\(S(j\omega)\\) over all f -{{< figure src="figs/loop_shaping_S_without_W.png" caption="Figure 23: Generalized Plant" >}} +{{< figure src="figs/loop_shaping_S_without_W.png" caption="Figure 23: Generalized Plant" >}}
-The _trick_ is to include a **weighting function** \\(W\_S(s)\\) in the generalized plant as shown in Figure [Figure 24](#figure--fig:loop-shaping-S-with-W). +The _trick_ is to include a **weighting function** \\(W\_S(s)\\) in the generalized plant as shown in [Figure 24](#figure--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 _weighted_ generalized plant \\(\tilde{P}(s)\\) will generate a controller \\(K(s)\\) such that \\(\\|W\_s(s)S(s)\\|\_\infty\\) is minimized. @@ -1096,11 +1052,11 @@ Therefore, the choice of the weighting function \\(W\_s(s)\\) is very important: -{{< figure src="figs/loop_shaping_S_with_W.png" caption="Figure 24: Weighted Generalized Plant" >}} +{{< figure src="figs/loop_shaping_S_with_W.png" caption="Figure 24: Weighted Generalized Plant" >}}
-Using matlab, compute the weighted generalized plant shown in Figure [Figure 25](#figure--fig:first-order-weight) as a function of \\(G(s)\\) and \\(W\_S(s)\\). +Using matlab, compute the weighted generalized plant shown in [Figure 25](#figure--fig:first-order-weight) as a function of \\(G(s)\\) and \\(W\_S(s)\\).
Hint @@ -1133,9 +1089,7 @@ Pw = blkdiag(Ws, 1)*P;
-### Design of Weighting Functions {#design-of-weighting-functions} - - +### Design of Weighting Functions {#sec:weighting_functions_design} Weighting function included in the generalized plant must be **proper**, **stable** and **minimum phase** transfer functions. @@ -1168,7 +1122,7 @@ with:
-The Matlab code below produces a weighting function with the following characteristics (Figure [Figure 25](#figure--fig:first-order-weight)): +The Matlab code below produces a weighting function with the following characteristics ([Figure 25](#figure--fig:first-order-weight)): - Low frequency gain of 100 - Gain of 1 at 10Hz @@ -1182,7 +1136,7 @@ Ws = makeweight(1e2, [2*pi*10, 1], 1/2); -{{< figure src="figs/first_order_weight.png" caption="Figure 25: Obtained Magnitude of the Weighting Function" >}} +{{< figure src="figs/first_order_weight.png" caption="Figure 25: Obtained Magnitude of the Weighting Function" >}}
@@ -1240,18 +1194,16 @@ 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); ``` -The obtained shapes are shown in Figure [Figure 26](#figure--fig:high-order-weight). +The obtained shapes are shown in [Figure 26](#figure--fig:high-order-weight). -{{< figure src="figs/high_order_weight.png" caption="Figure 26: Higher order weights using Equation " >}} +{{< figure src="figs/high_order_weight.png" caption="Figure 26: Higher order weights using Equation " >}}
-### Shaping the Sensitivity Function {#shaping-the-sensitivity-function} - - +### Shaping the Sensitivity Function {#sec:sensitivity_shaping_example} Let's design a controller using the \\(\mathcal{H}\_\infty\\) shaping of the sensitivity function that fulfils the following requirements: @@ -1259,7 +1211,7 @@ Let's design a controller using the \\(\mathcal{H}\_\infty\\) shaping of the sen 2. Small static errors for step responses 3. Robustness: Large module margin \\(\Delta M > 0.5\\) (\\(\Rightarrow \Delta G > 2\\) and \\(\Delta \phi > 29^o\\)) -As usual, the plant used is the one presented in Section . +As usual, the plant used is the one presented in Section [Example System](#sec:example_system).
@@ -1267,7 +1219,7 @@ Translate the requirements as upper bounds on the Sensitivity function and desig
Hint -The typical wanted upper bound of the sensitivity function is shown in Figure [Figure 27](#figure--fig:h-infinity-spec-S-bis). +The typical wanted upper bound of the sensitivity function is shown in [Figure 27](#figure--fig:h-infinity-spec-S-bis). More precisely: @@ -1280,7 +1232,7 @@ Remember that the wanted upper bound of the sensitivity function is defined by t -{{< figure src="figs/h-infinity-spec-S.png" caption="Figure 27: Typical wanted shape of the Sensitivity transfer function" >}} +{{< figure src="figs/h-infinity-spec-S.png" caption="Figure 27: Typical wanted shape of the Sensitivity transfer function" >}}
@@ -1335,15 +1287,15 @@ K = hinfsyn(Pw, 1, 1, 'Display', 'on'); ``` ```text - Test bounds: 0.5 <= gamma <= 0.51 +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 + 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 +Best performance (actual): 0.503 ``` \\(\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\\): @@ -1353,7 +1305,7 @@ K = hinfsyn(Pw, 1, 1, 'Display', 'on'); & \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 [Figure 28](#figure--fig:results-sensitivity-hinf). +This is indeed what we can see by comparing \\(|S|\\) and \\(|W\_S|\\) in [Figure 28](#figure--fig:results-sensitivity-hinf).
@@ -1366,19 +1318,17 @@ It just means that at some frequency, one of the closed-loop transfer functions -{{< figure src="figs/results_sensitivity_hinf.png" caption="Figure 28: Weighting function and obtained closed-loop sensitivity" >}} +{{< figure src="figs/results_sensitivity_hinf.png" caption="Figure 28: Weighting function and obtained closed-loop sensitivity" >}} -### Shaping multiple closed-loop transfer functions - Limitations {#shaping-multiple-closed-loop-transfer-functions-limitations} +### Shaping multiple closed-loop transfer functions - Limitations {#sec:shaping_multiple_tf} - - -As was shown in Section , each of the four main closed-loop transfer functions (called the _gang of four_) will impact different characteristics of the closed-loop system. -This is summarized in Table [Table 9](#table--tab:usual-shaping-gang-four). +As was shown in Section [Modern Interpretation of Control Specifications](#sec:modern_interpretation_specification), each of the four main closed-loop transfer functions (called the _gang of four_) will impact different characteristics of the closed-loop system. +This is summarized in [Table 9](#table--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 **Mixed-Sensitivity \\(\mathcal{H}\_\infty\\) Control** and is the subject of Section . +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 [Mixed-Sensitivity \\(\mathcal{H}\_\infty\\) Control - Example](#sec:h_infinity_mixed_sensitivity).
@@ -1409,7 +1359,7 @@ Some of them are described below for reference, it is a good exercise to try to -{{< figure src="figs/general_conf_shaping_S_KS.png" caption="Figure 29: Generalized Plant to shape \\(S\\) and \\(KS\\)" >}} +{{< figure src="figs/general_conf_shaping_S_KS.png" caption="Figure 29: Generalized Plant to shape \\(S\\) and \\(KS\\)" >}} Weighting functions: @@ -1431,7 +1381,7 @@ Pw = blkdiag(W1, W2, 1)*P; -{{< figure src="figs/general_conf_shaping_S_T.png" caption="Figure 30: Generalized Plant to shape \\(S\\) and \\(T\\)" >}} +{{< figure src="figs/general_conf_shaping_S_T.png" caption="Figure 30: Generalized Plant to shape \\(S\\) and \\(T\\)" >}} Weighting functions: @@ -1453,7 +1403,7 @@ Pw = blkdiag(W1, W2, 1)*P; -{{< figure src="figs/general_conf_shaping_S_GS.png" caption="Figure 31: Generalized Plant to shape \\(S\\) and \\(GS\\)" >}} +{{< figure src="figs/general_conf_shaping_S_GS.png" caption="Figure 31: Generalized Plant to shape \\(S\\) and \\(GS\\)" >}} Weighting functions: @@ -1475,7 +1425,7 @@ Pw = blkdiag(W1, W2, 1)*P; -{{< figure src="figs/general_conf_shaping_S_T_KS.png" caption="Figure 32: Generalized Plant to shape \\(S\\), \\(T\\) and \\(KS\\)" >}} +{{< figure src="figs/general_conf_shaping_S_T_KS.png" caption="Figure 32: Generalized Plant to shape \\(S\\), \\(T\\) and \\(KS\\)" >}} Weighting functions: @@ -1499,7 +1449,7 @@ Pw = blkdiag(W1, W2, W3, 1)*P; -{{< figure src="figs/general_conf_shaping_S_T_GS.png" caption="Figure 33: Generalized Plant to shape \\(S\\), \\(T\\) and \\(GS\\)" >}} +{{< figure src="figs/general_conf_shaping_S_T_GS.png" caption="Figure 33: Generalized Plant to shape \\(S\\), \\(T\\) and \\(GS\\)" >}} Weighting functions: @@ -1523,7 +1473,7 @@ Pw = blkdiag(W1, W2, W3, 1)*P; -{{< figure src="figs/general_conf_shaping_S_T_KS_GS.png" caption="Figure 34: Generalized Plant to shape \\(S\\), \\(T\\), \\(KS\\) and \\(GS\\)" >}} +{{< figure src="figs/general_conf_shaping_S_T_KS_GS.png" caption="Figure 34: Generalized Plant to shape \\(S\\), \\(T\\), \\(KS\\) and \\(GS\\)" >}} Weighting functions: @@ -1599,7 +1549,7 @@ You can follows this procedure for \\(T\\), \\(KS\\) and \\(GS\\):
Answer -The obtained constrains are shown in Figure [Figure 35](#figure--fig:h-infinity-4-blocs-constrains). +The obtained constrains are shown in [Figure 35](#figure--fig:h-infinity-4-blocs-constrains).
@@ -1609,11 +1559,11 @@ Depending on the frequency band, the norms of the closed-loop transfer functions However, in some frequency band, the norms do not depend on the controller and therefore **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 [Figure 35](#figure--fig:h-infinity-4-blocs-constrains). +These regions are summarized in [Figure 35](#figure--fig:h-infinity-4-blocs-constrains). -{{< figure src="figs/h-infinity-4-blocs-constrains.png" caption="Figure 35: 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" >}} +{{< figure src="figs/h-infinity-4-blocs-constrains.png" caption="Figure 35: 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" >}}
@@ -1629,29 +1579,25 @@ Two approaches can be used to obtain controllers with reasonable order:
-## Mixed-Sensitivity \\(\mathcal{H}\_\infty\\) Control - Example {#mixed-sensitivity-mathcal-h-infty-control-example} - - +## Mixed-Sensitivity \\(\mathcal{H}\_\infty\\) Control - Example {#sec:h_infinity_mixed_sensitivity} Let's now apply the \\(\mathcal{H}\_\infty\\) Shaping control procedure on a practical example. -In Section the control problem is presented. -The design procedure used to apply the \\(\mathcal{H}\_\infty\\) Mixed Sensitivity synthesis is described in Section . +In Section [Control Problem](#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 [Control Design Procedure](#sec:ex_control_procedure). -The important step of interpreting the specifications as wanted shape of closed-loop transfer functions is performed in Section . +The important step of interpreting the specifications as wanted shape of closed-loop transfer functions is performed in Section [Modern Interpretation of control specifications](#sec:ex_specification_interpretation). -Finally, the shaping of closed-loop transfer functions is performed in Sections , and . +Finally, the shaping of closed-loop transfer functions is performed in Sections [Step 1 - Shaping of \\(S\\)](#sec:ex_shaping_S), [Step 2 - Shaping of \\(GS\\)](#sec:ex_shaping_GS) and [Step 3 - Shaping of \\(T\\)](#sec:ex_shaping_T). -### Control Problem {#control-problem} +### Control Problem {#sec:ex_control_problem} - - -Let's consider our usual _test system_ shown in Figure [Figure 36](#figure--fig:ex-test-system). +Let's consider our usual _test system_ shown in [Figure 36](#figure--fig:ex-test-system). -{{< figure src="figs/ex_test_system.png" caption="Figure 36: 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 src="figs/ex_test_system.png" caption="Figure 36: 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." >}}
@@ -1671,9 +1617,7 @@ The considered inputs are: - measurement noise \\(n\\) with a large spectral density at high frequency (increasing starting from 100Hz) -### Control Design Procedure {#control-design-procedure} - - +### Control Design Procedure {#sec:ex_control_procedure} Here is the general design procedure that will be followed: @@ -1683,11 +1627,11 @@ Here is the general design procedure that will be followed: 4. Chose the suitable weighted general plant to shape the wanted quantities 5. Shape sequentially the chosen closed-loop transfer functions -Let's first convert the system of Figure [Figure 36](#figure--fig:ex-test-system) into the classical feedback architecture of Figure [Figure 37](#figure--fig:classical-feedback-test-system-bis). +Let's first convert the system of [Figure 36](#figure--fig:ex-test-system) into the classical feedback architecture of [Figure 37](#figure--fig:classical-feedback-test-system-bis). -{{< figure src="figs/ex_test_system_feedback.png" caption="Figure 37: Block diagram corresponding to the example system" >}} +{{< figure src="figs/ex_test_system_feedback.png" caption="Figure 37: Block diagram corresponding to the example system" >}} The two transfer functions present in the system are derived and defined below: @@ -1703,7 +1647,7 @@ Gd = (c*s + k)/(m*s^2 + c*s + k); ``` We also define the inputs signals that will be used for time domain simulations. -They are graphically shown in Figure [Figure 38](#figure--fig:ex-inputs-signals). +They are graphically shown in [Figure 38](#figure--fig:ex-inputs-signals). ```matlab { linenos=true, linenostart=9 } % Time Vector @@ -1727,15 +1671,15 @@ d(t>0.3) = 5e-6; -{{< figure src="figs/ex_inputs_signals.png" caption="Figure 38: Time domain inputs signals" >}} +{{< figure src="figs/ex_inputs_signals.png" caption="Figure 38: Time domain inputs signals" >}} -We also define the generalized plant corresponding to the system and that will be used for time domain simulations (Figure [Figure 39](#figure--fig:ex-general-plant-sim)). +We also define the generalized plant corresponding to the system and that will be used for time domain simulations ([Figure 39](#figure--fig:ex-general-plant-sim)). -{{< figure src="figs/ex_general_plant_sim.png" caption="Figure 39: Generalized plant that will be used for simulations" >}} +{{< figure src="figs/ex_general_plant_sim.png" caption="Figure 39: Generalized plant that will be used for simulations" >}} -The Generalized plant of Figure [Figure 39](#figure--fig:ex-general-plant-sim) is defined on Matlab as follows: +The Generalized plant of [Figure 39](#figure--fig:ex-general-plant-sim) is defined on Matlab as follows: ```matlab { linenos=true, linenostart=26 } Psim = [0 0 Gd G @@ -1760,9 +1704,7 @@ u = z(:,2); % Input usage [N] ``` -### Modern Interpretation of control specifications {#modern-interpretation-of-control-specifications} - - +### Modern Interpretation of control specifications {#sec:ex_specification_interpretation}
@@ -1773,16 +1715,16 @@ u = z(:,2); % Input usage [N]
Hint -1. Make use of Table [Table 9](#table--tab:usual-shaping-gang-four) -2. Make use of Table [Table 9](#table--tab:usual-shaping-gang-four) -3. See Section -4. See Section +1. Make use of [Table 9](#table--tab:usual-shaping-gang-four) +2. Make use of [Table 9](#table--tab:usual-shaping-gang-four) +3. See Section [Shaping multiple closed-loop transfer functions - Limitations](#sec:shaping_multiple_tf) +4. See Section [Shaping multiple closed-loop transfer functions - Limitations](#sec:shaping_multiple_tf)
-After converting the control specifications into wanted shape of closed-loop transfer functions, we might come up with the Table [Table 10](#table--tab:ex-specification-shapes). +After converting the control specifications into wanted shape of closed-loop transfer functions, we might come up with the [Table 10](#table--tab:ex-specification-shapes). In such case, we want to shape \\(S\\), \\(GS\\) and \\(T\\). @@ -1799,7 +1741,7 @@ In such case, we want to shape \\(S\\), \\(GS\\) and \\(T\\). | Reject measurement noise | \\(T\\) | Small high frequency (>100Hz) gain | | Robust System | \\(S\\) | Small \\(\Vert S \Vert\_\infty\\) | -To do so, we use to generalized plant shown in Figure [Figure 40](#figure--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\\). +To do so, we use to generalized plant shown in [Figure 40](#figure--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: @@ -1812,10 +1754,10 @@ P = [1 -1 -{{< figure src="figs/ex_general_plant.png" caption="Figure 40: Generalized plant chosen for the shaping of \\(S\\), \\(GS\\) \\(T\\)" >}} +{{< figure src="figs/ex_general_plant.png" caption="Figure 40: Generalized plant chosen for the shaping of \\(S\\), \\(GS\\) \\(T\\)" >}} However, to performed the \\(\mathcal{H}\_\infty\\) loop shaping, we have to include **weighting function** to the Generalized plant. -We obtain the **weighted generalized plant** in Figure [Figure 41](#figure--fig:ex-general-weighted-plant), and that is computed using Matlab as follows: +We obtain the **weighted generalized plant** in [Figure 41](#figure--fig:ex-general-weighted-plant), and that is computed using Matlab as follows: ```matlab { linenos=true, linenostart=44 } Pw = blkdiag(W1, W2, W3, 1)*P; @@ -1823,7 +1765,7 @@ Pw = blkdiag(W1, W2, W3, 1)*P; -{{< figure src="figs/ex_general_weighted_plant.png" caption="Figure 41: Generalized weighted plant used for the \\(\mathcal{H}\_\infty\\) Synthesis" >}} +{{< figure src="figs/ex_general_weighted_plant.png" caption="Figure 41: Generalized weighted plant used for the \\(\mathcal{H}\_\infty\\) Synthesis" >}} Finlay, performing the \\(\mathcal{H}\_\infty\\) Shaping of \\(S\\), \\(GS\\) and \\(T\\) is as simple as ruining the `hinfsyn` command: @@ -1833,14 +1775,12 @@ K = hinfsyn(Pw, 1, 1); Now let's shape the three closed-loop transfer functions sequentially: -- \\(S\\) is shaped in Section -- \\(GS\\) is shaped in Section -- \\(T\\) is shaped in Section +- \\(S\\) is shaped in Section [Step 1 - Shaping of \\(S\\)](#sec:ex_shaping_S) +- \\(GS\\) is shaped in Section [Step 2 - Shaping of \\(GS\\)](#sec:ex_shaping_GS) +- \\(T\\) is shaped in Section [Step 3 - Shaping of \\(T\\)](#sec:ex_shaping_T) -### Step 1 - Shaping of \\(S\\) {#step-1-shaping-of-s} - - +### Step 1 - Shaping of \\(S\\) {#sec:ex_shaping_S} Let's first shape the Sensitivity function as it is usually the most important of the _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)|\\): @@ -1865,7 +1805,7 @@ W2 = tf(1e-8); W3 = tf(1e-8); ``` -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 [Figure 42](#figure--fig:ex-results-1). +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 42](#figure--fig:ex-results-1). ```matlab { linenos=true, linenostart=52 } Pw = blkdiag(W1, W2, W3, 1)*P; @@ -1873,33 +1813,33 @@ K1 = hinfsyn(Pw, 1, 1, 'Display', 'on'); ``` ```text - Test bounds: 0.5 <= gamma <= 0.51 +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 + 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 +Best performance (actual): 0.502 ``` -{{< figure src="figs/ex_results_1.png" caption="Figure 42: Obtained Shape Closed-Loop transfer functions (dashed black lines indicate inverse magnitude of the weighting functions)" >}} +{{< figure src="figs/ex_results_1.png" caption="Figure 42: Obtained Shape Closed-Loop transfer functions (dashed black lines indicate inverse magnitude of the weighting functions)" >}} -Time domain simulation is then performed and the obtained output displacement and control inputs are shown in Figure [Figure 43](#figure--fig:ex-time-domain-1). +Time domain simulation is then performed and the obtained output displacement and control inputs are shown in [Figure 43](#figure--fig:ex-time-domain-1). We can see: - we are not able to follow the ramp input. This have to be solved by modifying the weighting function \\(W\_1(s)\\) -- we have poor rejection of disturbances. This we be solve by shaping \\(GS\\) in Section -- we have quite large effect of the measurement noise. This will be solved by shaping \\(T\\) in Section +- we have poor rejection of disturbances. This we be solve by shaping \\(GS\\) in Section [Step 2 - Shaping of \\(GS\\)](#sec:ex_shaping_GS) +- we have quite large effect of the measurement noise. This will be solved by shaping \\(T\\) in Section [Step 3 - Shaping of \\(T\\)](#sec:ex_shaping_T) -{{< figure src="figs/ex_time_domain_1.png" caption="Figure 43: Time domain simulation results" >}} +{{< figure src="figs/ex_time_domain_1.png" caption="Figure 43: Time domain simulation results" >}} -Remember that in order to follow ramp inputs, the sensitivity function should have a slope of +40dB/dec at low frequency (Table [Table 9](#table--tab:usual-shaping-gang-four)). +Remember that in order to follow ramp inputs, the sensitivity function should have a slope of +40dB/dec at low frequency ([Table 9](#table--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: @@ -1911,25 +1851,23 @@ W1 = generateWeight('G0', 1e3, ... 'n', 2); ``` -The \\(\mathcal{H}\_\infty\\) synthesis is performed using the new weights and the obtained closed-loop shaped are shown in figure [Figure 44](#figure--fig:ex-results-1b). +The \\(\mathcal{H}\_\infty\\) synthesis is performed using the new weights and the obtained closed-loop shaped are shown in [Figure 44](#figure--fig:ex-results-1b). -The time domain signals are shown in Figure [Figure 45](#figure--fig:ex-time-domain-1b) and it is confirmed that the ramps are now follows without static errors. +The time domain signals are shown in [Figure 45](#figure--fig:ex-time-domain-1b) and it is confirmed that the ramps are now follows without static errors. -{{< figure src="figs/ex_results_1b.png" caption="Figure 44: Obtained Shape Closed-Loop transfer functions" >}} +{{< figure src="figs/ex_results_1b.png" caption="Figure 44: Obtained Shape Closed-Loop transfer functions" >}} -{{< figure src="figs/ex_time_domain_1b.png" caption="Figure 45: Time domain simulation results" >}} +{{< figure src="figs/ex_time_domain_1b.png" caption="Figure 45: Time domain simulation results" >}} -### Step 2 - Shaping of \\(GS\\) {#step-2-shaping-of-gs} +### Step 2 - Shaping of \\(GS\\) {#sec:ex_shaping_GS} - - -Looking at Figure [Figure 46](#figure--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 [Figure 44](#figure--fig:ex-results-1b). +Looking at [Figure 46](#figure--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 44](#figure--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. @@ -1940,23 +1878,21 @@ Let's take \\(W\_2\\) as a simple constant gain: W2 = tf(4e5); ``` -The \\(\mathcal{H}\_\infty\\) Synthesis is performed and the obtained closed-loop transfer functions are shown in Figure [Figure 46](#figure--fig:ex-results-2). +The \\(\mathcal{H}\_\infty\\) Synthesis is performed and the obtained closed-loop transfer functions are shown in [Figure 46](#figure--fig:ex-results-2). -{{< figure src="figs/ex_results_2.png" caption="Figure 46: Obtained Shape Closed-Loop transfer functions" >}} +{{< figure src="figs/ex_results_2.png" caption="Figure 46: Obtained Shape Closed-Loop transfer functions" >}} -Time domain simulation results are shown in Figure [Figure 47](#figure--fig:ex-time-domain-2). +Time domain simulation results are shown in [Figure 47](#figure--fig:ex-time-domain-2). If is shown that indeed, the disturbance rejection performance are much better and only very small oscillation is obtained. -{{< figure src="figs/ex_time_domain_2.png" caption="Figure 47: Time domain simulation results" >}} +{{< figure src="figs/ex_time_domain_2.png" caption="Figure 47: Time domain simulation results" >}} -### Step 3 - Shaping of \\(T\\) {#step-3-shaping-of-t} - - +### Step 3 - Shaping of \\(T\\) {#sec:ex_shaping_T} Finally, we want to limit the effect of the noise on the displacement output. @@ -1974,7 +1910,7 @@ W3 = generateWeight('G0', 1e-1, ... ``` The \\(\mathcal{H}\_\infty\\) synthesis is performed and \\(\gamma\\) is closed to one. -The obtained closed-loop transfer functions are shown in Figure [Figure 48](#figure--fig:ex-results-3) and we can obverse that: +The obtained closed-loop transfer functions are shown in [Figure 48](#figure--fig:ex-results-3) and we can obverse that: - The high frequency gain of \\(T\\) is indeed reduced - This comes as the expense of a large magnitude both \\(GS\\) and \\(S\\). @@ -1982,20 +1918,20 @@ The obtained closed-loop transfer functions are shown in Figure [Figure 48](#fig -{{< figure src="figs/ex_results_3.png" caption="Figure 48: Obtained Shape Closed-Loop transfer functions" >}} +{{< figure src="figs/ex_results_3.png" caption="Figure 48: Obtained Shape Closed-Loop transfer functions" >}} -The time domain simulation signals are shown in Figure [Figure 49](#figure--fig:ex-time-domain-3). +The time domain simulation signals are shown in [Figure 49](#figure--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 [Figure 50](#figure--fig:ex-time-domaim-3-zoom). +This can be seen when zooming on the output signal in [Figure 50](#figure--fig:ex-time-domaim-3-zoom). -{{< figure src="figs/ex_time_domain_3.png" caption="Figure 49: Time domain simulation results" >}} +{{< figure src="figs/ex_time_domain_3.png" caption="Figure 49: Time domain simulation results" >}} -{{< figure src="figs/ex_time_domaim_3_zoom.png" caption="Figure 50: Zoom on the output signal" >}} +{{< figure src="figs/ex_time_domaim_3_zoom.png" caption="Figure 50: Zoom on the output signal" >}} ### Conclusion and Discussion {#conclusion-and-discussion} @@ -2007,9 +1943,7 @@ As an exercise, plot and analyze the evolution of the controller and loop gain t If the large input usage is considered to be not acceptable, the shaping of \\(KS\\) could be included in the synthesis and all the _Gang of four_ closed-loop transfer function shapes. -## Conclusion {#conclusion} - - +## Conclusion {#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! diff --git a/content/research/2026-closed-loop-control-hands-on/_index.md b/content/research/2026-closed-loop-control-hands-on/_index.md new file mode 100644 index 0000000..70ac4ef --- /dev/null +++ b/content/research/2026-closed-loop-control-hands-on/_index.md @@ -0,0 +1,1363 @@ ++++ +title = "Closed-Loop Control - Hands-On" +author = ["Dehaeze Thomas"] +draft = false +venue = "MOCRAF 2026" +year = 2026 +pubtype = "lecture" +pdf = "https://gitlab.esrf.fr/dehaeze/xy-piezo-stage-hands-on/-/raw/main/closed-loop-hands-on.pdf" +code = "https://gitlab.esrf.fr/dehaeze/xy-piezo-stage-hands-on" ++++ + +## Introduction {#introduction} + +For many Synchrotron experiments, the sample has to be positioned with nanometer accuracy over strokes of several hundred micrometers, and to be either scanned continuously or using step-be-step motion. +To address this need, a 3 axis piezoelectric stage is being developed at the ESRF. +The system used during this hands-on ([Figure 1](#figure--fig:picture-xy-stage)) is a two axis prototype, offering \\(\approx 300\\,\mu m\\) of stroke with a target accuracy of \\(10\\,nm\\). + + + +{{< figure src="figs/picture_xy_stage.jpg" caption="Figure 1: Picture of XY piezo stage including the two amplified piezoelectric actuators" >}} + +This stage is an excellent system to learn feedback and feedforward control. +A full cycle "measure, design, test" can be performed in a couple of minutes. +The tools used here (system identification, loop shaping, ..) are quite general and therefore can be reused for the control of other systems such as air bearing spindles, stepper motor stages or active vibration isolation platforms. + +Tuning a controller only makes sense against a specification. +Two typical use cases are considered throughout this document: + +- **Step motion**: perform a \\(1\\,\mu m\\) step and settle within \\(\pm 10\\,nm\\) as fast as possible +- **Constant velocity scan**: scan at \\(100\\,\mu m/s\\) with a tracking error below \\(10\\,nm\\) + +These two cases do not call for the same controller, and this is the interesting part: the first one is a matter of speed, the second one a matter of steady state error. +Several control strategies will be applied and compared against these two numbers, and the reason why each one succeeds or fails will be analyzed. + +It is suggested to fill [Table 1](#table--tab:results-summary) as the hands-on progresses, in order to compare the different controllers at the end. + + +
+ Table 1: + Results sheet to be filled during the hands-on +
+ +| Controller | \\(f\_b\\) [Hz] | \\(\Delta M\\) | Step perf [ms] | Scan perf [nm] | Comments | +|--------------|-----------------|----------------|----------------|----------------|----------| +| FF | | | | | | +| cst gain | - | - | | | | +| | | | | | | +| FF | | | | | | +| notch | - | - | | | | +| | | | | | | +| FB | | | | | | +| Int | | 0.5 | | | | +| | | | | | | +| FB | | | | | | +| Int | | 0.1 | | | | +| | | | | | | +| FB | | | | | | +| Int | | | | | | +| Notch | | | | | | +| FB | | | | | | +| 2 Int | | | | | | +| Lead + Notch | | | | | | +| | | | | | | +| FB + FF | | | | | | +| | | | | | | + +The document follows the order in which a system is actually commissioned: + +- Section [Hardware and Real-Time Software](#sec:hardware) describes the mechanics, the control electronics and the real-time software used to control the stage. +- Section [System Identification](#sec:system_identification) shows how the dynamics of the stage is **measured**, and not modeled. + This measured frequency response function is the only ingredient needed for the rest of the document. +- Section [Feedforward Control](#sec:feedforward_control) uses this measurement to build a feedforward controller, which improves the tracking without any risk of instability. +- Section [Feedback Control](#sec:feedback_control) closes the loop, introduces the few theoretical tools required to tune a feedback controller (loop gain, sensitivity functions, stability margins), and applies them step by step. +- Section [Conclusion](#sec:conclusion) summarizes the method and discusses its limits. + + +## Hardware and Real-Time Software {#sec:hardware} + +Before diving into the control of this piezoelectric stage, the hardware and the real-time control software are briefly described. +The complete chain, from the control signal computed by the real-time controller to the measured position, is shown in [Figure 2](#figure--fig:hardware-signal-chain). +For the rest of this document, what has to be retained from each element is its **gain** (it will be part of the plant to be controlled) and its **limitation** (resolution, noise, range, delay). + + + +{{< figure src="figs/hardware_signal_chain.png" caption="Figure 2: Signal chain of one axis, from the control signal \\(u\\) to the measured position \\(y\_m\\)" >}} + + +### Mechanical Design {#mechanical-design} + +As was shown in [Figure 1](#figure--fig:picture-xy-stage), the flexure stage is designed in such a way that the X and Y directions may be controlled independently. +Each actuator pushes along its own axis, and the flexible guiding is compliant in that direction while being stiff in the others. +Consequently, moving the X actuator produces almost no motion on the Y encoder: this will be verified experimentally in Section [System Identification](#sec:system_identification), and is what allows two independent SISO controllers to be used instead of a single MIMO one. + +Each axis is composed of an amplified piezoelectric actuator (the APA300ML from Cedrat Technologies[^fn:1]) and an optical encoder (Renishaw Vionic), both shown in [Figure 3](#figure--fig:apa300ml): + +- The APA300ML has an axial stiffness of \\(1.8\\,N/\mu m\\) and a stroke of \\(\approx 300\\,\mu m\\) for a voltage between \\(-20\\) and \\(150\\,V\\). +- The Vionic encoder has a resolution of \\(2.5\\,nm\\), and outputs the motion with a quadrature signal at maximum \\(10\\,MHz\\). + +Note that the actuator does not push against free space: it is loaded by the stiffness of the flexible guiding (\\(0.6\\,N/\mu m\\)) and by the mass to be moved (\\(\approx 0.7\\,kg\\)). +This is what determines both the stroke actually available and the resonance frequency of the stage, as will be estimated in Section [System Identification](#sec:system_identification). + +
+ + + +{{< figure src="figs/APA300ML.jpg" caption="Figure 3: Amplified Piezoelectric Actuator - APA300ML" >}} + + + +{{< figure src="figs/renishaw_vionic.jpg" caption="Figure 4: Renishaw Vionic optical encoder" >}} + +
+ +
+ +The actuator and the sensor used in the XY piezoelectric stage + +
+ + +### Control Electronics {#control-electronics} + +The control electronics is composed of two parts: + +- The "Control Box" (see [Figure 5](#figure--fig:speedgoat-unit)) with: + - A "Unit Real-Time Target Machine"[^fn:2], which is programmed from Simulink + - EtherCAT modules (EL2124 and EL1124) for digital inputs/output. + These are used for triggering purposes and interfacing with detectors and other electronics +- The "Driver box" (see [Figure 7](#figure--fig:pdm200)) with: + - 3x DAC, +/-10V, 18 bits: IOLITE-1XAO from Dewesoft + - 3x voltage amplifiers: PDm200[^fn:3]: gain: 20V/V, max output: -30 to 200V + - 3x EtherCAT modules for quadrature inputs[^fn:4] + +Everything (DAC, encoder counters, digital I/O) is connected to the real-time machine through EtherCAT, which guarantees a deterministic exchange of all the signals once per cycle. +With the amplifier gain of \\(20\\,V/V\\), the \\(\pm 10\\,V\\) of the DAC more than cover the \\(-20\\) to \\(150\\,V\\) range of the APA300ML, the amplifier itself being limited to \\(-30\\) to \\(200\\,V\\). +This is why, when the stage is turned on, a DAC offset of \\(3\\,V\\) is applied: the actuator is then biased at \\(60\\,V\\), roughly in the middle of its range, so that it can move in both directions. + +
+ +Two numbers are worth keeping in mind for the \\(\pm 10\\,nm\\) specification: + +- the encoder resolution is \\(2.5\\,nm\\); +- the DAC resolution is \\(20\\,V/2^{18} \approx 76\\,\mu V\\), that is \\(1.5\\,mV\\) after the amplifier, which represents less than \\(3\\,nm\\) of stroke. + +The \\(18\\) bits of the DAC are therefore not a luxury: a \\(16\\) bit DAC would give steps of \\(\approx 10\\,nm\\), i.e. the specification itself. +The hardware sets a floor to what any controller can achieve, and this floor should always be estimated **before** designing the control. + +
+ +
+ + + +{{< figure src="figs/speedgoat_unit.jpg" caption="Figure 5: Speedgoat Unit" >}} + + + +{{< figure src="figs/beckhoff_ethercat.png" caption="Figure 6: EtherCAT modules from Beckhoff" >}} + +
+ +
+ +The components inside the "Control box" + +
+ +
+ + + +{{< figure src="figs/pdm200.jpg" caption="Figure 7: PDm200 voltage amplifier" >}} + + + +{{< figure src="figs/iolite1xao.png" caption="Figure 8: IOLite 1xAO DAC" >}} + +
+ +
+ +The components inside the "Driver box" + +
+ + +### Real-Time Software {#real-time-software} + +All the control is implemented in the Speedgoat real-time "target", which is programmed from Simulink and runs at a fixed rate of \\(5\\,kHz\\) (\\(T\_s = 200\\,\mu s\\), which is also the EtherCAT cycle time). +The Simulink model[^fn:5] is shown in [Figure 9](#figure--fig:xy-piezo-stage). +The different blocs are: + +- Red block: hardware interfaces. + The two inputs are the voltages to be generated by the DAC, in \\(V\\), and the two outputs are the encoder positions, in \\(\mu m\\). +- Yellow blocks: generation of setpoints, 2nd order profiles (constant acceleration, constant velocity, deceleration) +- Blue blocks: feedback and feedforward controllers, made of simple biquad and/or PID filters +- Green blocks: "safety" blocks to make sure signals are within defined boundaries. + They are also used to activate and deactivate the feedback and feedforward controllers +- Purple blocks: signal generators used for system identification + +
+ +Everything is **discrete**: the controllers designed in this document are defined as continuous filters, and are discretized by the software before being written to the target. +Sampling is not free: the zero-order hold, the computation time and the EtherCAT transfers add up to a delay of one to two sampling periods. +This delay is a pure phase lag, growing linearly with frequency, and it is one of the reasons why the achievable bandwidth stays far below \\(F\_s/2\\). +It will be directly visible on the measured FRF in Section [System Identification](#sec:system_identification). + +
+ +A specific Simulink library[^fn:6] has been developed for the control of instruments at the ESRF. +It implements the fundamental functions needed by most instruments: filters, trajectory generation, safety blocks, signal generators for system identification, lookup tables, ... + + + +{{< figure src="figs/xy_piezo_stage.png" caption="Figure 9: Overview of the Simulink model" >}} + +The feedback controller is composed by a series of standard "biquad" filters and a standard PID controller (see [Figure 10](#figure--fig:xy-piezo-stage-Kfb-x)). +The feedforward controller only contains one "biquad" filter. + + + +{{< figure src="figs/xy_piezo_stage_Kfb_x.png" caption="Figure 10: Simulink implementation of the Feedback controller" >}} + +"Regulation" blocks are also added in the model to deal with the "safety". +These blocks continuously check that certain signals stay within defined boundaries, and deactivate the feedback or feedforward controller when they do not. +This way, the risk of damaging the system by generating too large control signals is mitigated. +This is also the mechanism used throughout this hands-on to switch the controllers on and off: enabling the `feedback` or `feedforward` regulator closes the corresponding path in the model. + + +### Graphical User Interface {#graphical-user-interface} + +A graphical user interface[^fn:7] has been developed to ease the use of the Speedgoat machine, and it is the only tool that will be used during this hands-on. +It connects to the real-time target and gives access to its counters, generators, filters, motors and parameters, without having to open Simulink. +The pages used in this document are summarized in [Table 2](#table--tab:gui-pages). + + +
+ Table 2: + The pages of the graphical user interface used during this hands-on +
+ +| Page | Use | +|------------------------------|----------------------------------------------------------------------------------| +| `Custom` | Dashboard: turn the stage on, reset the encoders, enable the regulators | +| `Motors` | Configure and perform motions (velocity, acceleration time, setpoint), save them | +| `Generators` | Configure and visualize the excitation signals | +| `Signal Analysis` | Acquire time traces and compute their spectral content (PSD/ASD) | +| `Dynamical Identification` | Excite the plant and compute the FRF, the coherence and the RGA-number | +| `Transfer Function Analysis` | Overlay measured FRFs with the response of the filters running on the target | +| `Feedback Control Design` | Loop shaping: \\(L\\), Nyquist plot, \\(S\\) and \\(T\\), stability margins | + +All the data saved from these pages (time traces, spectra, FRFs) are written as `.mat` files in the program data directory, which is where the figures of this document are generated from. + + +## System Identification {#sec:system_identification} + +Before controlling the stage, we need to know how it behaves: how much does it move per volt applied? +At which frequencies does it resonate? + +Instead of deriving a physical model (mass-spring-damper model for instance), we **measure** the dynamics directly. +This is done by "exciting" the stage with a known signal \\(u(t)\\) and recording its motion \\(y(t)\\). +The ratio between the two in the frequency domain gives the **frequency response function** (FRF) \\(G(j\omega)\\). + +
+ +An FRF is a complex function of frequency. +At each frequency \\(\omega\\), the magnitude \\(|G(j\omega)|\\) tells the amplification (here in \\(\mu m/V\\)), and the phase \\(\angle G(j\omega)\\) the delay/lag between voltage and motion. + +
+ +All the controllers of this hands-on (feedforward and feedback) will be designed from this measured FRF only — no physical model is required. + +
+ +**Turning on the Piezo stage**: + +1. Go the `Custom` page, and click on `Turn On` button. + This has the effect of outputting a DAC offset of 3V +2. Click on the `Fire` button to reset the encoder position to zero volt +3. Turn On the `safety` regulator, which allows some voltage variation on the DAC + +
+ + +### Step 1 - What do we expect? {#step-1-what-do-we-expect} + +
+ +Before measuring anything, sketch by hand (in [Figure 11](#figure--fig:empty-bode-plot-expected-plant)) the Bode plot you expect for the transfer function from the DAC voltage to the encoder position: + +- Low frequency: what is the static gain? +- High frequency: how should the magnitude roll off? +- Where do you expect a resonance? +- What about the phase at low and high frequency? + +Hint + +The stroke of the APA300ML is \\(\approx 300\\,\mu m\\) for a \\(-20\text{--}150\\,V\\) range, and the PDm200 amplifier has a gain of \\(20\\,V/V\\). +The stiffness of the APA is \\(1.8\\,N/\mu m\\), and the stiffness of the flexible guiding is \\(0.6\\,N/\mu m\\). +The mobile mass is \\(\approx 0.7\\,\text{kg}\\). + +
+ + + +{{< figure src="figs/empty_bode_plot_expected_plant.png" caption="Figure 11: Expected bode plot of the transfer function from DAC voltage to Encoder displacement" >}} + + +### The FRF estimation in a nutshell {#the-frf-estimation-in-a-nutshell} + +Consider a system with dynamics represented by a transfer function \\(G\\) with inputs \\(u\\) and output \\(y\_m\\) which is affected by noise and disturbances, represented by \\(d\\) (see [Figure 12](#figure--fig:siso-identification-schematic-simplier)). +The goal is to estimate the frequency response function (FRF) of \\(G\\) by exciting the system by a wisely chosen \\(u\\) and by measuring \\(y\_m\\) at the same time. + + + +{{< figure src="figs/siso_identification_schematic_simplier.png" caption="Figure 12: Block diagram of the system identification scheme" >}} + +The FRF of \\(G\\) can be estimated from the recorded signals using \eqref{eq:frf\_est} where \\(S\_{yu}\\) is the cross-spectrum between output and input, and \\(S\_{uu}\\) the auto-spectrum of the input. + +\begin{equation}\label{eq:frf\_est} +\hat{G}(f) = \frac{S\_{yu}(f)}{S\_{uu}(f)} +\end{equation} + +The quality of the estimate is quantified by the **coherence** \eqref{eq:coherence} : + +- \\(\gamma^2 \approx 1\\): the output is fully explained by the excitation: good data. +- \\(\gamma^2 \ll 1\\): noise, nonlinearities or unmeasured disturbances dominate at that frequency: the FRF should not be trusted at that frequency + +\begin{equation}\label{eq:coherence} +\gamma^2(f) = \frac{|S\_{yu}(f)|^2}{S\_{uu}(f)\\, S\_{yy}(f)}, \quad 0 \le \gamma^2 \le 1 +\end{equation} + +Since the stage has two axes excited one at a time, a \\(2\times2\\) FRF matrix is obtained. + +Concretely, the spectra of \eqref{eq:frf\_est} are estimated by splitting the recording into \\(N\\) segments of duration \\(T\_\text{win}\\), and by averaging the cross- and auto-spectra computed on each segment \eqref{eq:frf\_spectra} where \\(U\_k(f)\\) and \\(Y\_k(f)\\) are the DFTs of the \\(k^\text{th}\\) segment of \\(u(t)\\) and \\(y\_m(t)\\). + +\begin{equation}\label{eq:frf\_spectra} +\hat{S}\_{yu}(f) = \frac{1}{N T\_\text{win}} \sum\_{k=1}^{N} Y\_k(f)\\, U\_k^\*(f), \qquad +\hat{S}\_{uu}(f) = \frac{1}{N T\_\text{win}} \sum\_{k=1}^{N} U\_k(f)\\, U\_k^\*(f) +\end{equation} + +Averaging over segments reduces the random error of the estimate (by a factor \\(\sqrt{N}\\)), while the segment length \\(T\_\text{win}\\) sets the frequency resolution. + +The coupling between the two axes is quantified using the **Relative Gain Array** \eqref{eq:rga} where \\(\circ\\) denotes the element-wise product. + +\begin{equation}\label{eq:rga} +\Lambda(j\omega) = G(j\omega) \circ \left( G(j\omega)^{-1} \right)^T +\end{equation} + +The RGA is summarized into a single positive number as a function of frequency, the **RGA-number** \eqref{eq:rga\_number}. +In the frequency band of interest (say up to the wanted closed-loop bandwidth): + +- RGA-number \\(\ll 0\\): the axes are decoupled, and two independent SISO loops can be implemented +- RGA-number \\(\gg 1\\): strong coupling; should decouple the system or implement MIMO control + +\begin{equation}\label{eq:rga\_number} +\text{RGA-number}(\omega) = \left\\| \Lambda(j\omega) - I \right\\|\_{\text{sum}} +\end{equation} + + +### Step 2 - Choosing the excitation signal {#sec:excitation_signal} + +The art of system identification is to choose the correct excitation signal. + +The effect of the excitation on the plant output must be well above the measured displacement in the absence of excitation, for all the frequency band of interest. +We want the measured output to be dominated by our excitation, not by disturbances or encoder noise. +But we don't want to excitation signal to be too high to have some non-linear behavior or to damage the system. + +There are many options for the choice of the excitation signal, such as an impulse, a step, a sweep sine... +Here two options are proposed: + +- A white noise signal, which is very simple to generate and to tune (only one parameter) +- A multi-sine, which gives more control on its frequency content. + It is also periodic, which will allow window-free spectral estimation later. + +
+ +**Goal:** Estimate an adequate excitation signal for the XY piezoelectric stage. + +First, we want to estimate the required frequency content of the excitation signal to have a good identification: + +1. In the `Signal Analysis` page, record the `enc_x` and `enc_y` counters for 10 seconds, and display their ASD. +2. Based on the recorded ASD, estimate the required excitation voltage ASD so that the generated motion is 100 times higher than the previously measured sensor output at "rest". + +Hint + +The ASD of the measured encoder at "rest" should be around \\(10^{-4}\\,\mu m/\sqrt{Hz}\\). +The plant DC gain being estimated to be \\(\approx 25\\,\mu m/V\\), the excitation voltage spectrum must therefore be well above \\(\frac{10^{-4}}{25} \approx 4\\,\mu V/\sqrt{Hz}\\). +Therefore, we can aim at a excitation voltage ASD of \\(\approx 400\\, \mu V/\sqrt{Hz}\\). + +Choice of the excitation signal + +Here, we choose to use a normal white noise for the excitation signal as it has a flat frequency spectrum and it is easy to tune: + +1. Go to the `Generators` page +2. Select the `id_plant` generator +3. Set the generator's type to `Normal White Noise` +4. Choose a `pattern duration` of \\(1\\,s\\), and adjust the amplitude to have the wanted voltage ASD + +Hint + +A normal white noise with RMS value \\(A\\) has its ASD flat from \\(0\\) to \\(F\_s/2\\) with \\(\text{ASD} = \sqrt{\frac{2}{F\_s}} \cdot \text{RMS}\\). +Therefore, the RMS value of the normal white noise should be \\(\approx 0.02\\,V\\). + +
+ + +### Step 3 - Choosing the frequency analysis parameters {#step-3-choosing-the-frequency-analysis-parameters} + +The FRF is estimated using \eqref{eq:frf\_est}, with the spectra of \eqref{eq:frf\_spectra} computed on each segment. +Two phenomena have to be dealt with by a proper choice of the analysis parameters: + +**Leakage.** +The DFT implicitly assumes each segment repeats periodically. +A segment whose beginning and end do not match creates a discontinuity that spreads energy over all frequencies ("leakage"), which biases the estimated FRF. +To mitigate this, a "taper" (`Hanning` window for instance) is usually applied on each segment before the estimator is computed, which forces the segment to start and end at zero. +If the excitation is periodic and whole periods are analyzed, the signals match naturally and no window is needed (that is the case with the multi-sine). + +**Noise.** +FRF estimate are usually impact by noise present in the system. +To reduce this random error, the recorded signals are split into many segments whose estimates are averaged (\eqref{eq:frf\_spectra}); with \\(N\\) segments, the random error decreases as \\(1/\sqrt{N}\\). +For a given recording duration, more segments means shorter ones, i.e. a coarser frequency resolution: this is a trade-off between averaging and frequency resolution. + +The main knobs and their effects are summarized in [Table 3](#table--tab:freq-analysis-parameters). + +Typical values used in this hands-on are: + +- Sampling frequency: \\(5\\,kHz\\), meaning a maximum measured frequency of \\(2.5\\,kHz\\) (above the \\(\sim 1\\,kHz\\) band of interest) +- Window size: \\(1\\,s\\) meaning \\(1\\,\text{Hz}\\) of resolution frequency +- for the White noise excitation signal: Hanning window, detrend `mean`, overlap \\(0.5\\), total duration \\(10\\,s\\) for some averaging +- Multi-sine: window size should match one period, no window, no overlap, skip the first period (transient), total duration \\(10\\,s\\) + + +
+ Table 3: + Main parameters for a frequency analysis +
+ +| Parameter | Role | Comment | +|----------------|----------------------------------------------------|-----------------------------------------------------------| +| Window size | Frequency resolution \\(\approx 1/T\_\text{win}\\) | Small: poor low-frequency resolution / Large: noisier FRF | +| Window (taper) | Reduces leakage for **non-periodic** signals | Can affect the estimated FRF | +| Sampling rate | Sets the maximum frequency (\\(F\_s/2\\), Nyquist) | Must be at least twice the highest frequency of interest | + + +### Step 4 - Identification with white noise {#step-4-identification-with-white-noise} + +**Goal:** obtain the FRF of the plant from voltage to encoder position, for both axes. + +
+ +To identify the plant dynamics: + +1. Open the `Dynamical Identification` page of the GUI. +2. Set **Identification Type:** `Classical identification`. +3. Select **Generator:** `id_plant` and set **Input counter:** `id_plant`. +4. Select the **Output index**: `MIMO` (both piezo will be excited, one at a time) +5. Configure the generator waveform: + - **Type:** `Normal white noise` + - **Amplitude:** `0.02` V + - **Pattern duration:** `1` s, **Repeat:** yes + - **Duration:** `10` s +6. Click `Load`. +7. In **Signals**, tick the output counters `enc_x` and `enc_y`. +8. Set the **Frequency Analysis Parameters**: + - **Window size:** `1` s, **Window:** `hanning`, **Detrend:** `mean`, **Overlap:** `0.5` +9. Click `Acquire`. + The Bode plot, coherence and RGA-number are displayed automatically. + +Checkpoints + +- Is the measured FRF close to your sketch from Step 1? +- Read the low-frequency (DC) gain: \\(\mu\text{m/V}\\) +- Read the first resonance frequency: Hz +- Is the coherence \\(> 0.9\\) up to 1 kHz? +- What about the phase ? Any time-delay ? +- Look at the off-diagonal FRF terms: how much coupling between \\(x\\) and \\(y\\)? + Is it confirmed by the RGA-number? + +
+ +The Bode plot should look like the one in [Figure 13](#figure--fig:id-white-noise). +Save the result with `Save TF...` as `G_id_plant_white_noise.mat` for later use. + + + +{{< figure src="figs/id_white_noise.png" caption="Figure 13: Plant FRF identified with white noise excitation" >}} + + +### Step 5 - Identification with a multi-sine (bonus) {#step-5-identification-with-a-multi-sine--bonus} + +**Goal:** improve the FRF quality using a multi-sine excitation. + +
+ +**Procedure**: + +1. Similar to what was done in Section [Step 2 - Choosing the excitation signal](#sec:excitation_signal), generate a multi-sine signal with the wanted ASD amplitude. + Limit the excited frequency from 1Hz to 1kHz. +2. In the `Dynamical Identification` page, set the **Frequency Analysis Parameters**: + - **Window size:** `1` s (one period of the excitation) + - **Window:** `none` (periodic signal means no leakage) + - **Overlap:** `0` + - **Skip transient:** `1` s (discard the first period: the plant has not reached its periodic steady state yet) +3. Click `Acquire`. + It the result seems good, save the result with `Save TF...` as `G_id_plant_multisine.mat` for later use. + +Hint + +For the multi-sine excitation, you should get something like: + +- **Type:** `multisine` +- **Amplitude:** `0.02` V +- **Pattern duration:** `1` s +- **Lower frequency:** `1` Hz, **Upper frequency:** `1000` Hz +- **Repeat:** yes, **Duration:** `10` s +- **Phase type:** `schroeder` + +
+ +**Expected result:** compared to the white noise identification, the FRF should be smoother in the 1-1000 Hz band, and the coherence close to 1 over the whole multi-sine band. + + +### Summary {#summary} + +
+ +The main difficulty of system identification is the choice of the **excitation signal**: it must dominate noise and disturbances over the whole frequency band of interest (coherence \\(\gamma^2 \approx 1\\)), while staying small enough to avoid non-linearities and to respect the hardware limits. + +- A **white noise** signal is flat in frequency and easy to tune (one parameter): usually a good first choice. +- A **multi-sine** gives full control of the excited band, is periodic (no leakage, no window), and typically yields a smoother FRF for the same excitation amplitude. + +The quality of the identification is judged from the **coherence** (is the output explained by the excitation?). + +The measured FRF is all we need: the feedforward (Section [Feedforward Control](#sec:feedforward_control)) and feedback (Section [Feedback Control](#sec:feedback_control)) controllers will be designed directly from it. + +
+ + +## Feedforward Control {#sec:feedforward_control} + +The goal of the feedforward controller (schematically shown in [Figure 14](#figure--fig:feedforward-schematic-simplier)) is to generate a control signal \\(u\_{ff}\\) from the reference \\(r\\) such that the plant output \\(y\\) follows \\(r\\) as precisely as possible. +Basically, we want the transfer function from \\(r\\) to \\(y\\) to be close to unity, or more realistically to a low pass filter with a high enough cut-off frequency: + +\begin{equation}\label{eq:feedforward\_tf} + G(j\omega) \cdot K\_{ff}(j\omega) \approx 1 +\end{equation} + + + +{{< figure src="figs/feedforward_schematic_simplier.png" caption="Figure 14: Schematic of a basic feedforward controller" >}} + +
+ +Based on the goal expressd by \eqref{eq:feedforward\_tf}, what should be the shape of the ideal feedforward controller \\(K\_{ff}\\)? + +
Answer + +Ideally, the feedforward controller is the inverse of the plant: \\(K\_{ff} = 1/G\\) such that \eqref{eq:feedforward\_tf} is verified. +Such an inverse is however not realizable in practice as its gain would grow indefinitely at high frequency. +So we will approximate it with simple filters: first a constant gain, then a notch filter. + +
+ +The feedforward controller should typically be tuned as **before** implementing the feedback controller (unless the system is open-loop unstable). +A well-tuned feedforward means the feedback loop only has to deal with residual errors: disturbances, drift and model uncertainty. + + +### Step 1 - Static Feedforward {#step-1-static-feedforward} + +We start with the simplest feedforward controller: a constant gain \\(K\_{ff}(s) = K\_\text{ff}\\). +As the setpoint is in \\(\mu m\\) and the DAC input in \\(V\\), the feedforward gain \\(K\_{ff}\\) is expressed in \\(V/\mu m\\). + +
+ +Based on the system identification done in Section [System Identification](#sec:system_identification), what should be the \\(K\_{ff}\\) value? + +Hint + +It should be the inverse of the plant DC gain identified. + +Visual Tuning of the Feedforward Controller + +To visualize the FRF of \\(G(j\omega) \cdot K\_{ff}(j\omega)\\) and tune the feedforward controller: + +1. Go to the `Transfer Function Analysis` page and load the previously identified plant (e.g. `G_id_plant_white_noise.mat`) +2. Start with the transfer function from `u_x` to `enc_x` +3. Activate (tick) the `Kff_x` feedforward controller (a Biquad filter) in the list of filters. +4. Set the `Kff_x` filter to be a `pass-through` filter (i.e. a constant gain). +5. In the `Display` section, tick `Loaded FRF x Individual Filters`. +6. Click on `Visual Tuning` for the `Kff_x` filter and adjust the filter's gain to have the DC gain of the feedforward path equal to one. + Alternatively, directly set the numerical value of the gain that you computed previously. + +Checkpoints + +- What is the shape of the FRF of \\(G \cdot K\_{ff}\\) (the product of the plant and the feedforward controller)? +- Is the low frequency gain now close to 1? +- What kind of time response do we expect from such a 2nd order resonant low pass filter with a DC gain of 1? + +
+ +Once the feedforward controller is tuned, let us test its performance with an open-loop motion. + +
+ +To perform some motion and test the performance of the feedforward controller: + +1. In the `Custom` page: + - Make sure the `pz_x` motor's position is `0` + - Activate the `feedforward` regulation + - Reset the encoder using the `Fire` button +2. Go to the `Motors` page: + - Configure the motor's parameters: + - `Velocity`: \\(100\\,\mu m/s\\) + - `Acceleration time`: \\(0.001\\,s\\) + - Make a \\(5\\,\mu m\\) motion by configuring the `Setpoint` and clicking on `Start` + +Checkpoints + +The typical result is shown in [Figure 15](#figure--fig:constant-gain-feedforward-motion). +Which of the following imperfections do you observe? + +- Drifts due to piezoelectric creep +- Static error due to hysteresis (i.e. non-linearity of the piezoelectric stack) +- Vibrations due to the resonance of the system: does the frequency match the identified resonance? +- Time delay: does it match the delay observed in the FRF? + +
+ + + +{{< figure src="figs/constant_gain_feedforward_motion.png" caption="Figure 15: Obtained motion result with the constant gain feedforward" >}} + + +### Step 2 - Dynamic Feedforward {#step-2-dynamic-feedforward} + +The constant gain feedforward makes the low frequency gain of \\(G \cdot K\_{ff}\\) equal to one, but the resonance of the plant is still present. +During fast motions, the setpoint excites the resonance which results in oscillations at the stage resonance frequency. +To tackle this issue, we can add a **notch filter** in the feedforward path to "virtually damp" the system resonance. + +A notch filter suppresses a narrow frequency band around \\(\omega\_n\\): + +\begin{equation} +N(s) = \frac{s^2 + 2\zeta\_1\omega\_n s + \omega\_n^2}{s^2 + 2\zeta\_2\omega\_n s + \omega\_n^2} +\end{equation} + +
+ +Here \\(\omega\_n\\) is tuned to the plant resonance frequency, \\(\zeta\_1\\) sets the notch depth, and \\(\zeta\_2\\) the notch width. +After tuning, the product \\(G \cdot K\_{ff}\\) should look like a well damped low pass filter with a DC gain of 1. + +
+ +
+ +Let's first tune the feedforward filter: + +1. Move the `pz_x` motor's to `0` +2. Deactivate the `feedforward` regulation in the `Custom` page +3. Go to the `Transfer Function Analysis` page +4. In the `Display` section, tick `Loaded FRF x Individual Filters` +5. Set the `Kff_x` filter to be a `notch` filter, and click on `Apply` +6. Click on `Visual Tuning` for the `Kff_x` filter, and adjust the filter's parameters (\\(\omega\_n\\), notch depth and width) so that the overall "feedforward FRF" looks like a well damped low pass filter with a DC gain of 1 + +Performance estimation + +1. Activate the `feedforward` regulation in the `Custom` page +2. Reset the encoder using the `Fire` button +3. Go to the `Motors` page +4. Configure the motor's parameters: + - `Velocity`: \\(100\\,\mu m/s\\) + - `Acceleration time`: \\(0.001\\,s\\) +5. Make a \\(5\\,\mu m\\) motion by configuring the `Setpoint` and clicking on `Start` + +Checkpoints + +The typical result is shown in [Figure 16](#figure--fig:notch-feedforward-motion). + +- Is the resonance issue solved? +- What about the robustness to a change of payload? + +
+ + + +{{< figure src="figs/notch_feedforward_motion.png" caption="Figure 16: Obtained motion result with the notch feedforward" >}} + + +### Summary {#summary} + +
+ +Feedforward control is very effective to follow trajectories, but it is **open-loop**: it cannot handle model uncertainty, external disturbances, creep and hysteresis. +This is why feedback control is still required, and is the subject of Section [Feedback Control](#sec:feedback_control). + +Closely related to feedforward is the shaping of the trajectory itself. +Here the setpoint is generated as a 2nd order profile (constant acceleration, constant velocity, deceleration), and its acceleration time directly sets the frequency content that excites the plant. +**Input shaping** techniques go one step further and adapts the trajectory so that it contains little energy at the plant resonance . +Fast motion with low vibration is thus a joint design of the **trajectory profile** and of the **feedforward controller**. + +
+ + +## Feedback Control {#sec:feedback_control} + +Feedforward control can only be as good as our knowledge of the plant: creep, hysteresis, external disturbances and payload changes are invisible to it. +Feedback uses the **measured** position to correct whatever the feedforward did not anticipate. +The price to pay is a risk of instability, the injection of sensor noise into the system, and a tuning effort that requires to understand few points that will be described in this section. + +A schematic of a classical feedback/feedforward controller is shown in [Figure 17](#figure--fig:feedback-schematic-simplier), with the following signals: + +- \\(r\\) is the trajectory to be followed +- \\(\epsilon\\) the tracking error +- \\(u\\) the controller output +- \\(d\\) some disturbances affecting the plant output +- \\(y\\) the displacement to be controlled +- \\(n\\) the measurement noise +- \\(y\_m\\) the measured displacement + + + +{{< figure src="figs/feedback_schematic_simplier.png" caption="Figure 17: Block diagram of a classical feedback controller" >}} + +For this system, the feedback controller \\(K\_{fb}\\) is a combination of second order filters ("biquads") followed by a PID filter ([Figure 10](#figure--fig:xy-piezo-stage-Kfb-x)). +As for the feedforward controller, it will be tuned directly from the FRF measured in Section [System Identification](#sec:system_identification): no model of the stage is required. + +
+ +Many other control strategies exist: state space control, model predictive control, non-linear control... +For nano-positioning systems, which are usually quite linear and well described by their measured FRF, a series of second order LTI filters tuned by loop shaping gives excellent results for a fraction of the effort of the other more advanced methods. + +
+ + +### Building blocks of the controller {#building-blocks-of-the-controller} + +Any LTI transfer function can be factored into a series of first and second order terms. +This is what makes the **biquad** structure universal: a transfer function with numerator/denominator polynomials in \\(z^{-1}\\) can be decomposed into second order sections, each implemented numerically with only 5 coefficients \eqref{eq:biquad\_formula}. +Cascading such sections is both numerically robust (poorly conditioned high-order polynomials are avoided) and flexible (a controller is simply a list of biquads in series). + +\begin{equation}\label{eq:biquad\_formula} +H(z) = \frac{b\_0 + b\_1 z^{-1} + b\_2 z^{-2}}{1 + a\_1 z^{-1} + a\_2 z^{-2}} +\end{equation} + +These coefficients are never entered by hand but automatically computed for a number of "standard" filters, such as: + +- **Pass-through** (`gain`): \\(H(s) = g\\). + A pure gain, used to scale the loop. +- **Integrator** (`gain`): \\(H(s) = g/s\\). + Infinite gain at DC, hence no steady state error, at the cost of a constant \\(-90^\circ\\) phase lag. +- **Lead** (`wn`, `a`): \\(H(s) = \sqrt{a}\\,\frac{s + \omega\_n/\sqrt{a}}{s + \omega\_n\sqrt{a}}\\). + Adds phase around \\(\omega\_n\\), up to \\(\arcsin\frac{a-1}{a+1}\\) exactly at \\(\omega\_n\\) where its gain is unity. + This is what makes a loop stable again when integrators have eaten all the available phase. +- **Lag** (`wn`, `a`): \\(H(s) = \frac{s + \sqrt{a}\\,\omega\_n}{s + \omega\_n/\sqrt{a}}\\). + Multiplies the low frequency gain by \\(a\\) while leaving the gain unchanged above \\(\omega\_n\\): a "soft" integrator that costs less phase. +- **Notch** (`wn`, `xi`, `gc`): \\(H(s) = \frac{s^2 + 2 \xi g\_c \omega\_n s + \omega\_n^2}{s^2 + 2 \xi \omega\_n s + \omega\_n^2}\\). + \\(g\_c\\) is the gain at \\(\omega\_n\\) (the depth of the notch) and \\(\xi\\) sets its width. + Used to take a resonance out of the loop gain. +- **Low pass** (`wn`, `xi`): \\(H(s) = \frac{\omega\_n^2}{s^2 + 2\xi\omega\_n s + \omega\_n^2}\\). + Rolls off the loop gain at high frequency: less measurement noise is injected, and the loop is made more robust to poorly known high frequency modes. + +The Bode plots of these filters are compared in [Figure 18](#figure--fig:basic-filters-bode). + + + +{{< figure src="figs/basic_filters_bode.png" caption="Figure 18: Bode plots of the standard second order filters, all centered on \\(100\\,Hz\\)" >}} + +Even though these Biquad filters are sufficient to represent any linear controller, a specific controller usually has its separate implementation: the PID filter. + +The PID filter can be written in different ways, here we choose the formula of equation \eqref{eq:pid\_formula}, with the following parameters: + +- \\(k\\): overall gain, which mostly sets the cross-over frequency +- \\(f\_i\\): integral corner frequency, below which the gain rises with a \\(-20\\,dB/dec\\) slope +- \\(f\_d\\): derivative corner frequency, above which phase lead is generated +- \\(f\_t\\): roll-off of the derivative action, mandatory to keep the high frequency gain bounded + +\begin{equation}\label{eq:pid\_formula} +K\_{pid}(s) = k \underbrace{\left(1 + \frac{2\pi f\_i}{s}\right)}\_{\text{lag}} \underbrace{\left(1 + \frac{s}{2\pi f\_d}\right) \frac{1}{1 + \frac{s}{2\pi f\_t}}}\_{\text{lead}} +\end{equation} + +Its Bode plot is shown in [Figure 19](#figure--fig:pid-bode) where we can see that a PID controller is nothing more than a **lag** filter (integral action) in series with a **lead** filter (derivative action and its roll-off). +This is why it is also called a lead-lag controller, and why the biquad filters alone would be enough to build the same controller. +PID controllers remain popular for historical reasons: meaningful parameters, many tuning recipes (Ziegler-Nichols, ...), and an explicit integrator block that makes anti-windup easy to implement. + + + +{{< figure src="figs/pid_bode.png" caption="Figure 19: Bode plot of the PID controller (\\(k = 1\\), \\(f\_i = 10\\,Hz\\), \\(f\_d = 100\\,Hz\\), \\(f\_t = 500\\,Hz\\))" >}} + + +### Loop shaping in a nutshell {#loop-shaping-in-a-nutshell} + +The **loop gain** is the product of every transfer function a signal encounters when travelling once around the loop: + +\begin{equation} +L(s) = G(s) K\_{fb}(s) +\end{equation} + +This single quantity is at the heart of feedback design because four properties make it a nice quantity to work with: + +- it is tightly linked to the closed-loop transfer functions, which describe the actual behavior of the system +- it depends **linearly** on the controller, so it is easy to shape \\(L\\) by tuning the controller \\(K\_{fb}\\) +- performance and robustness can both be estimated at a glance from the shape of \\(|L(j\omega)|\\) +- the loop gain \\(|L(j\omega)|\\) can be computed from the **measured** plant FRF, so no model of the plant is required + + +##### Loop gain and closed-loop transfer functions {#loop-gain-and-closed-loop-transfer-functions} + +What we ultimately care about is the closed-loop behavior of the system. +From the block diagram of [Figure 17](#figure--fig:feedback-schematic-simplier) (feedforward off), the output and the tracking error are: + +\begin{equation} +y = T\\, r - T\\, n + S\\, d, \quad \epsilon = S\\, (r - d - n) +\end{equation} + +with the **sensitivity** \\(S\\) and **complementary sensitivity** \\(T\\) functions: + +\begin{equation} +S = \frac{1}{1 + L}, \quad T = \frac{L}{1 + L}, \quad S + T = 1 +\end{equation} + +Almost everything is contained in these two functions: + +- \\(S\\) governs the tracking error and the rejection of disturbances +- \\(T\\) governs the transmission of the reference and of the sensor noise + +We would like to shape \\(S\\) and \\(T\\) directly, but they depend non-linearly on \\(K\_{fb}\\), which makes the problem difficult. +Fortunately, where the loop gain is large or small, they simplify and depend **linearly** on \\(L\\): + +\begin{equation} +|L| \gg 1: \quad S \approx \frac{1}{L}, \\; T \approx 1 \qquad\qquad |L| \ll 1: \quad S \approx 1, \\; T \approx L +\end{equation} + +Shaping \\(|L|\\) is therefore enough: a high loop gain gives a small \\(|S|\\) (good tracking and disturbance rejection), and a low loop gain gives a small \\(|T|\\) (good measurement-noise attenuation). + + +##### Stability and module margin {#stability-and-module-margin} + +For a SISO loop, instability occurs when \\(L\\) reaches a phase of \\(-180^\circ\\) with a magnitude still above one: the correction then comes back in phase with the error and the system diverges. +How far the loop is from this condition is classically measured by the **gain margin** and **phase margin**, both read directly on the Bode plot of \\(L\\) ([Figure 20](#figure--fig:loop-gain-phase-gain-margins)). +Keeping some margin ensures that the loop remains stable even if the plant response changes slightly. + + + +{{< figure src="figs/loop_gain_phase_gain_margins.png" caption="Figure 20: Typical Loop Gain with indicated phase and gain margin" >}} + +These two margins are convenient but only defined for SISO systems. +A more general view plots the response \\(L(j\omega)\\) in the complex plane, giving the **Nyquist plot** ([Figure 21](#figure--fig:nyquist-module-margin)). +For a stable plant, the closed-loop is stable if this curve does not encircle the critical point \\(-1\\). +The shortest distance to that point is called the **module margin**: + +\begin{equation}\label{eq:module\_margin} +\Delta M = \min\_\omega |1 + L(j\omega)| = \frac{1}{\max\_\omega |S(j\omega)|} +\end{equation} + +It combines gain and phase margin into a single number: \\(\Delta M = 0.5\\) guarantees a gain margin \\(\ge 6\\,dB\\) and a phase margin \\(\ge 29^\circ\\), and corresponds to \\(\max|S| = 2\\). +Therefore, from \eqref{eq:module\_margin} we can see that a large peak of \\(|S|\\) is a direct symptom of poor stability margins. +Most importantly, the module margin generalizes naturally to MIMO systems through the characteristic loci, which is why it is the criterion reported in the GUI. + + + +{{< figure src="figs/nyquist_module_margin.png" caption="Figure 21: Nyquist plot of the loop gain, and module margin defined as the distance to the \\(-1\\) point" >}} + + +##### From the frequency domain to the time domain {#from-the-frequency-domain-to-the-time-domain} + +The shapes designed in the frequency domain have direct time-domain counterparts, and being able to read one from the other is what makes loop shaping intuitive. + +Consider first a loop gain containing a single integrator (Step 1 in the next section). +The closed-loop transfer functions, the step response and the "ramp" response (i.e. constant velocity scans) are shown in [Figure 22](#figure--fig:S-T-one-int). +Thanks to the integrator, there is no steady state error on the step response ([Figure 23](#figure--fig:step-resp-one-int)). +The time response is set by the closed-loop bandwidth \\(f\_b\\) seen on \\(|S|\\) ([Figure 22](#figure--fig:S-T-one-int)): the smaller \\(f\_b\\), the slower the error decays, with a time constant of \\(1/(2\pi f\_b)\\). +Two consequences for the specifications: + +- **Step motion**: The time it takes for the output to reach a step amplitude \\(A\\) within \\(\pm \delta\\) can be estimated using \eqref{eq:one\_int\_step\_time}. + + \begin{equation}\label{eq:one\_int\_step\_time} + t\_s \approx \frac{1}{2\pi f\_b} \ln\left(\frac{A}{\delta}\right) + \end{equation} +- **Constant velocity scan**: tracking a ramp leaves a constant error \\(v/(2\pi f\_b)\\) ([Figure 24](#figure--fig:ramp-resp-one-int)). + One integrator is therefore not sufficient to meet the \\(10\\,nm\\) scan specification unless the bandwidth is unreasonably high. + +
+ +Estimate the required closed-loop bandwidth \\(f\_b\\) to that the time it takes to reach \\(\pm 10\\,nm\\) of error for a \\(1\\,\mu m\\) step is less than \\(20\\,\text{ms}\\). + +
Answer + +Using \eqref{eq:one\_int\_step\_time}, with \\(A = 1\\,\mu m\\) and \\(\delta = 10\\,nm\\), we get \\(t\_s \approx 0.73/f\_c\\): a \\(20\\,ms\\) settling time requires \\(f\_c \approx 37\\,Hz\\). + +
+ +
+ + + +{{< figure src="figs/S_T_one_int.png" caption="Figure 22: Filter's response" >}} + + + +{{< figure src="figs/step_resp_one_int.png" caption="Figure 23: Step Response" >}} + + + +{{< figure src="figs/ramp_resp_one_int.png" caption="Figure 24: Ramp Response" >}} + +
+ +
+ +Relationship between frequency domain and time domain response for a control system with one integrator + +
+ +Then, consider a closed-loop system with two integrators in the loop. +The closed-loop transfer functions, the step response and the ramp response are shown in [Figure 25](#figure--fig:S-T-two-int). + +The peak magnitude of \\(|T|\\) ([Figure 25](#figure--fig:S-T-two-int)) is translated in some overshoot in the step response ([Figure 26](#figure--fig:step-resp-two-int)). +Having a second integrator allows to have no steady state error for a constant velocity scan ([Figure 27](#figure--fig:ramp-resp-two-int)). + +
+ + + +{{< figure src="figs/S_T_two_int.png" caption="Figure 25: Filter's response" >}} + + + +{{< figure src="figs/step_resp_two_int.png" caption="Figure 26: Step Response" >}} + + + +{{< figure src="figs/ramp_resp_two_int.png" caption="Figure 27: Ramp Response" >}} + +
+ +
+ +Relationship between frequency domain and time domain response for a control system with two integrators + +
+ +The steady state errors for different conditions are summarized in [Table 4](#table--tab:steady-state-errors). +This table drives the rest of this section: one integrator is enough for step motions (Step 1 and Step 2), but a constant velocity scan then leaves a steady state error proportional to the velocity, which is why a second integrator is added in Step 3. + + +
+ Table 4: + Steady state tracking error as a function of the number of integrators in the loop gain +
+ +| Integrators in \\(L\\) | Step | Constant velocity \\(v\\) | Constant acceleration \\(a\\) | +|------------------------|---------|---------------------------|-------------------------------| +| 1 | \\(0\\) | \\(v/(2\pi f\_c)\\) | \\(\infty\\) | +| 2 | \\(0\\) | \\(0\\) | \\(a/(2\pi f\_c)^2\\) | + + +##### The wanted shape of the loop gain {#the-wanted-shape-of-the-loop-gain} + +All of this can be summarized by one picture ([Figure 28](#figure--fig:open-loop-shaping-shape)): the shape we are trying to give to \\(|L(j\omega)|\\): + +- **At low frequency**, the gain must be as high as possible to have good rejection of disturbances +- **Around the cross-over frequency**, the slope must be close to \\(-1\\) (\\(-20\\,dB/dec\\)) to have some stability margins. +- **At high frequency**, the gain must roll off quickly to attenuate the measurement noise and to stay insensitive to the badly known high frequency dynamics. + +Loop shaping is nothing more than picking the filters listed above so that the measured plant FRF is bent into this shape. +This is what is done step by step in the rest of this section. + + + +{{< figure src="figs/open_loop_shaping_shape.png" caption="Figure 28: Typical Wanted Shape for the Loop Gain \\(L(s)\\)" >}} + +When using loop shaping to control a plant, several thing are worth keeping in mind during the process. + +The sensitivity and complementary sensitivity transfer functions are linked with \\(S + T = 1\\). +This means that \\(S\\) and \\(T\\) cannot both be made small at the same frequency. +Below \\(f\_c\\) the loop follows the reference but also injects the sensor noise (\\(|T| \approx 1\\)), and above \\(f\_c\\) the loop does essentially nothing (\\(|S| \approx 1\\)). + +Then, Bode's sensitivity integral (the "waterbed" theorem) states that reducing \\(|S|\\) over one frequency band unavoidably increases it somewhere else ([Figure 29](#figure--fig:bode-integral), from (Stein 2003)). +There is always a trade-off between low frequency performance and magnification of errors at another frequency. + + + +{{< figure src="figs/bode_integral.png" caption="Figure 29: Sensitivity reduction at low frequency unavoidably leads to sensitivity increase at higher frequencies." >}} + +Finally, we should keep in mind that **gain and phase are not independent**. +For a minimum phase system, a slope of \\(-20\\,dB/dec\\) on the magnitude comes with \\(-90^\circ\\) of phase (Bode's gain-phase relationship). +This is the whole difficulty of loop shaping: added gain brought at low frequency is paid by phase lag near the cross-over frequency, that is by stability margins. + + +### Step 1 - Integral controller {#step-1-integral-controller} + +**Goal:** obtain the fastest possible loop with a single integrator, while keeping a module margin of \\(0.5\\). + +The simplest useful controller is a pure integrator that gives a very large gain at low frequency, hence no steady state error on a step. +Only one parameter has to be tuned: the gain, which directly sets the cross-over frequency. + +
+ +**Procedure**: + +1. In the `Feedback Control Design` page, click on `Load plant...` and load the identified plant (e.g. `G_id_plant_white_noise.mat`) +2. In `Filters in the loop`, tick `pid_x` for `u_1` and `pid_y` for `u_2` +3. Make sure that all the biquad filters in the loop are configured as `pass-through` +4. Set the PID type to `I` (we only want an integrator for now) +5. Set `P (RHP poles)` to `0`: the plant is stable, as verified during the identification +6. Increase the gain of the integrator until the module margin reaches \\(0.5\\) +7. Look at how \\(|S|\\) and \\(|T|\\) change as a function of the gain + +Checkpoints + +- What is the achieved closed-loop bandwidth \\(f\_b\\)? Hz +- What is limiting it? + Look at the Nyquist plot: which part of the curve comes close to the \\(-1\\) point? +- What is the shape of \\(T\\) (transfer function from \\(r\\) to \\(y\\))? + Using \\(t\_s \approx 0.73/f\_c\\), what settling time within \\(\pm 10\\,nm\\) do you predict for a \\(1\\,\mu m\\) step? + +
+ +Let's now check these predictions on the real system. + +
+ +**Procedure**: + +1. In the `Custom` page, move the motors to zero with the `Move to Zero` button, then enable the `feedback` regulator +2. Go to the `Motors` page +3. Configure the motor's parameters: + - `Velocity`: \\(100\\,\mu m/s\\) + - `Acceleration time`: \\(0.001\\,s\\) +4. Perform a \\(1\\,\mu m\\) motion + +Checkpoints + +The typical result is shown in [Figure 30](#figure--fig:step-response-I-controller). + +- Verify that there is no steady state error, contrary to the feedforward-only case +- Measure the settling time within \\(\pm 10\\,nm\\): ms +- How could the settling time be reduced? + What cross-over frequency would be required for a \\(20\\,ms\\) settling time? + +
+ + + +{{< figure src="figs/step_response_I_controller.png" caption="Figure 30: Step response with the integral controller (Module margin of 0.5)" >}} + + +##### A more aggressive controller {#a-more-aggressive-controller} + +Let's try to increase the gain to have faster response time, and see what it actually costs. + +
+ +**Procedure**: + +1. In the `Custom` page, disable the `feedback` regulator +2. Go back to the `Feedback Control Design` page +3. Increase the gain of the integral controller until the module margin drops to \\(0.1\\) +4. In the `Custom` page, move the motors to zero and enable the `feedback` regulator again +5. In the `Motors` page, perform the same \\(1\\,\mu m\\) motion + +Checkpoints + +- By how much has the closed-loop bandwidth been increased? +- How has the time response changed? + Is the settling time within \\(\pm 10\\,nm\\) really shorter? +- What are the new peak values of \\(|S|\\) and \\(|T|\\), and at which frequency do they occur? +- What is the frequency of the oscillation, and could it have been predicted from \\(T\\)? + +
+ +The typical result is shown in [Figure 31](#figure--fig:step-response-I-controller-bad-margin). + + + +{{< figure src="figs/step_response_I_controller_bad_margin.png" caption="Figure 31: Step response with the integral controller (Module margin of 0.1)" >}} + +
+ +A poor module margin means a large peak of \\(|S|\\) and \\(|T|\\), which in the time domain translates into overshoot, ringing at the peak frequency and, in the end, a longer settling time. +Pushing the gain is therefore not a way to go faster: beyond a certain point, performance and robustness degrade together. +When tuning a feedback controller, always look at the module margin and at the shape of the closed-loop transfer functions, not only at the cross-over frequency. + +
+ + +### Step 2 - Adding a notch filter {#step-2-adding-a-notch-filter} + +**Goal:** remove the limitation caused by the resonance, and reach a \\(20\\,ms\\) settling time. + +The gain could not be increased further because of the lightly damped resonance of the stage, which brings the Nyquist plot close to the \\(-1\\) point. +One way to overcome this limitation is to add a notch filter that cancels the plant resonance. + +
+ +**Procedure**: + +1. Make sure that the `feedback` regulation is `off` +2. Tune the notch: + - Go to the `Transfer Function Analysis` or the `Feedback Control Design` page + - Make sure the plant is loaded + - Configure the `biquad_1_x` and `biquad_1_y` filters as a `notch`, and click on `Visual Tuning` + - Tune the notch frequency, depth and width until the resonance of the loop gain is nicely canceled +3. Back on the loop gain, increase the gain `k` of the integral controller until the module margin is \\(0.5\\) again + +Checkpoints + +- What is the new closed-loop bandwidth \\(f\_b\\)? +- What is the estimated settling time? +- Perform the \\(1\\,\mu m\\) step again ([Figure 32](#figure--fig:step-response-I-controller-notch)) and verify this prediction +- What limits the bandwidth now? + +
+ + + +{{< figure src="figs/step_response_I_controller_notch.png" caption="Figure 32: Step response with the integral controller and the added notch filter (Module margin of 0.5)" >}} + + +##### Performances during a constant velocity scan {#performances-during-a-constant-velocity-scan} + +Step motions are only half of the story: most experiments are performed as "fly scans", at constant velocity. +Let's see how this controller behaves in that case. + +
+ +**Procedure**: + +1. Configure the motor's parameters in the `Motors` page: + - `Velocity`: \\(100\\,\mu m/s\\) + - `Acceleration time`: \\(0.1\\,s\\) + - `Setpoint`: \\(100\\,\mu m\\) +2. Perform the motion by clicking on `Start` +3. Save the motion data + +Checkpoints + +The typical result is shown in [Figure 33](#figure--fig:cst-velocity-int-notch). + +- Zoom on the error: what do you observe during the constant velocity phase? +- Measure this steady state error: nm. + Compare it with \\(v/(2\pi f\_c)\\) predicted in [Table 4](#table--tab:steady-state-errors). +- Would increasing the gain be enough to make this error below \\(\pm 10\\,nm\\)? + +
+ + + +{{< figure src="figs/cst_velocity_int_notch.png" caption="Figure 33: Constant velocity scan with the Integral + Notch controller" >}} + + +### Step 3 - Optimizing the controller for constant velocity scans {#step-3-optimizing-the-controller-for-constant-velocity-scans} + +**Goal:** Have no steady state error during the constant velocity phase of a scan. + +[Table 4](#table--tab:steady-state-errors) tells us what is needed: a **second** integrator in the loop gain. +As the plant has none (it is a static gain at low frequency), both have to be put in the controller. +The difficulty is that each integrator adds \\(-90^\circ\\) of phase: with two of them the phase drop reaches \\(180^\circ\\) and the feedback system becomes unstable, so phase must be given back around the cross-over frequency with a **lead filter**. + +
+ +**Procedure**: + +1. Turn off the `feedback` regulation +2. In the `Feedback Control Design` page, configure `biquad_2_x` and `biquad_2_y` as an `integrator` +3. Observe that the loop is now announced as unstable, and look at the phase of \\(L\\) to understand why +4. Configure `biquad_3_x` and `biquad_3_y` as a `lead`, and click on `Visual Tuning` +5. Tune the lead and the gain to obtain a cross-over frequency around \\(40\\,Hz\\) with a module margin of \\(0.5\\) + +Hint + +Put the central frequency `wn` of the lead at the wanted cross-over frequency (\\(40\\,Hz\\)), where it provides its maximum phase and a unity gain. +Then adjust the overall gain so that the cross-over frequency is indeed at \\(40\\,Hz\\), and finally increase the amount of phase lead (`a`) until the module margin reaches \\(0.5\\). + +
+ +Let's now check the performances of this controller with two integrators. + +
+ +**Procedure**: + +1. Configure the motor's parameters in the `Motors` page: + - `Velocity`: \\(100\\,\mu m/s\\) + - `Acceleration time`: \\(0.1\\,s\\) + - `Setpoint`: \\(100\\,\mu m\\) +2. Perform the motion by clicking on `Start` +3. Save the motion data + +Checkpoints + +The typical result is shown in [Figure 34](#figure--fig:cst-velocity-double-int-notch). + +- Is there still a steady state error during the constant velocity phase? +- What happens during the acceleration and deceleration phases? + With \\(a = 1000\\,\mu m/s^2\\) and \\(f\_c = 40\\,Hz\\), does the measured error match \\(a/(2\pi f\_c)^2\\)? +- How could the performances be improved during the acceleration phases? + +
+ + + +{{< figure src="figs/cst_velocity_double_int_notch.png" caption="Figure 34: Constant velocity scan with a Double Integral + Notch controller" >}} + + +### Step 4 - Combined Feedback/Feedforward controller {#step-4-combined-feedback-feedforward-controller} + +**Goal:** use the feedforward controller to take care of the known part of the trajectory, and the feedback controller for everything else. + +
+ +**Procedure**: + +1. In the `Custom` page, click on `Move to Zero` +2. Activate the `feedforward` regulation, keeping the feedback one enabled +3. Go to the `Motors` page and click on `Overlay` to keep the last scan data (performed without feedforward) +4. Perform the same \\(100\\,\mu m\\) constant velocity scan + +Checkpoints + +The typical result is shown in [Figure 35](#figure--fig:cst-velocity-double-int-notch-feedforward). + +- Is the error during the acceleration phases reduced? +- Conclude on the benefits of feedforward control, even when a feedback controller is implemented + +
+ +
+ +Adding a feedforward path changes neither \\(L\\), nor \\(S\\), nor the stability margins: it only modifies the transfer function from \\(r\\) to \\(y\\). +It is therefore "free" in terms of robustness, which is why feedback and feedforward are almost always used together. + +
+ + + +{{< figure src="figs/cst_velocity_double_int_notch_feedforward.png" caption="Figure 35: Constant velocity scan with the combined feedback/feedforward controller" >}} + + +### Step 5 - Robust Control (bonus) {#step-5-robust-control--bonus} + +A very important problematic in the field of control is the **robustness** to the change of plant dynamics. +In our case, the change of the plant dynamics is most of the time due to a change of payload. + +
+ +- How do you expect the plant dynamics to change when the payload mass is increased? +- What about the static gain? +- What about the resonance? +- What is the implications on the feedforward and the feedback controllers? + Should they be re-tuned? + +
+ +
+ +**Performance is usually traded against robustness.** +Every time some knowledge of the plant is injected into the controller (a notch tuned on the resonance, an inverse model in the feedforward path, ...), the loop becomes sensitive to the accuracy of that knowledge. +The notch of Step 2 bought us bandwidth, but it only works as long as the resonance stays where it was measured. +Simple controllers are usually the robust ones: would the integral controller of Step 1 survive a change of payload mass? + +
+ +Let's put a payload with mass \\(\approx 1\\,\text{kg}\\) on the stage ([Figure 36](#figure--fig:picture-xy-stage-mass)) and identify the plant dynamics again. + + + +{{< figure src="figs/picture_xy_stage_mass.jpg" caption="Figure 36: XY stage with an added payload of \\(\approx 1\\,kg\\)" >}} + +
+ +**Procedure**: + +- Turn off the feedback and feedforward controllers in the `Custom` page +- Go to the `Dynamical Identification` page, configure the `id_plant` generator as before, and click on `Acquire` +- Click on `Load TF...` to load the previously computed transfer function (without any payload) + +Checkpoints + +- How has the transfer function changed? +- Keeping the controller tuned without payload, what happened to the module margin and to the notch? + +
+ +The last exercise is to design controllers that work for both configurations. + + + +{{< figure src="figs/id_comp_low_high_mass.png" caption="Figure 37: Measured FRF of the system with 1kg payload. Comparison with the case without any payload." >}} + +
+ +**Procedure**: + +1. Go to the `Feedback Control Design` page, and load the two FRF (with and without payload) +2. Switch between the two plants: stability, margins and closed-loop transfer functions are computed for each of them +3. Tune the feedback controller to obtain good stability margins for **both** plants, with a bandwidth as high as possible +4. For the feedforward controller, use a constant gain or a low pass filter rather than a notch + +Checkpoints + +- How much bandwidth did you have to give up compared to the controller tuned for a single payload? +- Which "knowledge" of the plant is now used in the feedforward and feedback controllers? + Is this "knowledge" a function of the payload mass? + +
+ +
+ +Several strategies exist to deal with a change of dynamics: + +- **Robust control** (\\(\mathcal{H}\_\infty\\), \\(\mu\text{-synthesis}\\)): the uncertainty is modeled explicitly and a controller is synthesized to guarantee stability and performance for the whole uncertainty set. + Parametric uncertainty (a resonance that moves for instance) is difficult to model this way, the procedure is heavy, and the result is often conservative. + Interestingly, the resulting "robust" controllers are again combinations of second order filters, which could have been tuned by hand. + Have a look at this (Skogestad and Postlethwaite 2007) reference book. +- **Adaptive control**: the idea is to re-tune the notch and the feedforward automatically, for instance by performing a new system identification each time the payload has changed. +- **Specific architectures**: for instance, using collocated actuator/sensor pairs can guarantee the stability of the feedback system. + But these techniques usually requires additional sensors. + +
+ + +### Summary {#summary} + +
+ +- The feedback controller is tuned by shaping the loop gain \\(L = G K\_{fb}\\) measured on the real system: high gain at low frequency for performance, a \\(-20\\,dB/dec\\) slope at the cross-over, a fast roll-off above. +- The module margin (\\(\ge 0.5\\)) and the shape of \\(S\\) and \\(T\\) are the tuning criteria. +- Integrators remove the steady state errors (one for steps, two for constant velocity scans), notch filters remove resonances, and lead filters pay back the phase that integrators and notches consumed. +- Feedback handles what is unknown (disturbances, creep, hysteresis, drift), feedforward handles what is known (the trajectory, the plant dynamics): the two are usually combined. +- Every bit of plant knowledge injected into the controller is bought with robustness, and has to be re-checked when the payload changes. + +
+ + +## Conclusion {#sec:conclusion} + +The hands-on followed the order in which a positioning system is typically commissioned: + +- **System identification** (Section [System Identification](#sec:system_identification)): excite the plant with an adequate signal and **measure** its FRF \\(\hat{G}(j\omega)\\) — the coherence tells if the measurement can be trusted, the RGA-number if the axes are decoupled. +- **Feedforward control** (Section [Feedforward Control](#sec:feedforward_control)): approximate the inverse of the plant with simple filters (a gain, then a notch) so that \\(G K\_{ff} \approx 1\\). + Being open-loop, it carries no risk of instability, but it can only correct what is known in advance: the trajectory and the nominal plant. +- **Feedback control** (Section [Feedback Control](#sec:feedback_control)): shape the loop gain \\(L = G K\_{fb}\\) with a handful of standard filters — integrators to remove steady state errors, a notch to remove the resonance, a lead to recover the phase, a low pass for noise and robustness — while keeping the module margin large enough. + +None of this required a physical model: one measured FRF was enough to design and validate all the controllers. + +The tools presented in this document are generic — identification, loop shaping, sensitivity functions — and the same workflow can be reused for other positioning systems such as air bearing spindles, stepper motor stages or active vibration isolation platforms. + + +## Bibliography {#bibliography} + +
+
Skogestad, S., and I. Postlethwaite. 2007. Multivariable Feedback Control: Analysis and Design - Second Edition. John Wiley.
+
Stein, Gunter. 2003. “Respect the Unstable.” IEEE Control Systems Magazine 23 (4). IEEE: 12–25.
+
+ +[^fn:1]: +[^fn:2]: Make by Speedgoat: +[^fn:3]: Made by Piezodrive: +[^fn:4]: EL5112 from Beckhoff +[^fn:5]: Accessible here: +[^fn:6]: Accessible here: +[^fn:7]: Accessible here: diff --git a/content/research/2026-closed-loop-control-hands-on/figs/APA300ML.jpg b/content/research/2026-closed-loop-control-hands-on/figs/APA300ML.jpg new file mode 100644 index 0000000..fb20bd4 Binary files /dev/null and b/content/research/2026-closed-loop-control-hands-on/figs/APA300ML.jpg differ diff --git a/content/research/2026-closed-loop-control-hands-on/figs/S_T_one_int.png b/content/research/2026-closed-loop-control-hands-on/figs/S_T_one_int.png new file mode 100644 index 0000000..024609d Binary files /dev/null and b/content/research/2026-closed-loop-control-hands-on/figs/S_T_one_int.png differ diff --git a/content/research/2026-closed-loop-control-hands-on/figs/S_T_two_int.png b/content/research/2026-closed-loop-control-hands-on/figs/S_T_two_int.png new file mode 100644 index 0000000..5a616e2 Binary files /dev/null and b/content/research/2026-closed-loop-control-hands-on/figs/S_T_two_int.png differ diff --git a/content/research/2026-closed-loop-control-hands-on/figs/basic_filters_bode.png b/content/research/2026-closed-loop-control-hands-on/figs/basic_filters_bode.png new file mode 100644 index 0000000..09ec222 Binary files /dev/null and b/content/research/2026-closed-loop-control-hands-on/figs/basic_filters_bode.png differ diff --git a/content/research/2026-closed-loop-control-hands-on/figs/beckhoff_ethercat.png b/content/research/2026-closed-loop-control-hands-on/figs/beckhoff_ethercat.png new file mode 100644 index 0000000..9e258e5 Binary files /dev/null and b/content/research/2026-closed-loop-control-hands-on/figs/beckhoff_ethercat.png differ diff --git a/content/research/2026-closed-loop-control-hands-on/figs/bode_integral.png b/content/research/2026-closed-loop-control-hands-on/figs/bode_integral.png new file mode 100644 index 0000000..c215841 Binary files /dev/null and b/content/research/2026-closed-loop-control-hands-on/figs/bode_integral.png differ diff --git a/content/research/2026-closed-loop-control-hands-on/figs/constant_gain_feedforward_motion.png b/content/research/2026-closed-loop-control-hands-on/figs/constant_gain_feedforward_motion.png new file mode 100644 index 0000000..0efc95e Binary files /dev/null and b/content/research/2026-closed-loop-control-hands-on/figs/constant_gain_feedforward_motion.png differ diff --git a/content/research/2026-closed-loop-control-hands-on/figs/cst_velocity_double_int_notch.png b/content/research/2026-closed-loop-control-hands-on/figs/cst_velocity_double_int_notch.png new file mode 100644 index 0000000..17f121c Binary files /dev/null and b/content/research/2026-closed-loop-control-hands-on/figs/cst_velocity_double_int_notch.png differ diff --git a/content/research/2026-closed-loop-control-hands-on/figs/cst_velocity_double_int_notch_feedforward.png b/content/research/2026-closed-loop-control-hands-on/figs/cst_velocity_double_int_notch_feedforward.png new file mode 100644 index 0000000..a42b71c Binary files /dev/null and b/content/research/2026-closed-loop-control-hands-on/figs/cst_velocity_double_int_notch_feedforward.png differ diff --git a/content/research/2026-closed-loop-control-hands-on/figs/cst_velocity_int_notch.png b/content/research/2026-closed-loop-control-hands-on/figs/cst_velocity_int_notch.png new file mode 100644 index 0000000..07dcb1d Binary files /dev/null and b/content/research/2026-closed-loop-control-hands-on/figs/cst_velocity_int_notch.png differ diff --git a/content/research/2026-closed-loop-control-hands-on/figs/empty_bode_plot_expected_plant.png b/content/research/2026-closed-loop-control-hands-on/figs/empty_bode_plot_expected_plant.png new file mode 100644 index 0000000..cfea9c9 Binary files /dev/null and b/content/research/2026-closed-loop-control-hands-on/figs/empty_bode_plot_expected_plant.png differ diff --git a/content/research/2026-closed-loop-control-hands-on/figs/feedback_schematic_simplier.png b/content/research/2026-closed-loop-control-hands-on/figs/feedback_schematic_simplier.png new file mode 100644 index 0000000..b975e1c Binary files /dev/null and b/content/research/2026-closed-loop-control-hands-on/figs/feedback_schematic_simplier.png differ diff --git a/content/research/2026-closed-loop-control-hands-on/figs/feedforward_schematic_simplier.png b/content/research/2026-closed-loop-control-hands-on/figs/feedforward_schematic_simplier.png new file mode 100644 index 0000000..813f3f1 Binary files /dev/null and b/content/research/2026-closed-loop-control-hands-on/figs/feedforward_schematic_simplier.png differ diff --git a/content/research/2026-closed-loop-control-hands-on/figs/hardware_signal_chain.png b/content/research/2026-closed-loop-control-hands-on/figs/hardware_signal_chain.png new file mode 100644 index 0000000..29c868f Binary files /dev/null and b/content/research/2026-closed-loop-control-hands-on/figs/hardware_signal_chain.png differ diff --git a/content/research/2026-closed-loop-control-hands-on/figs/id_comp_low_high_mass.png b/content/research/2026-closed-loop-control-hands-on/figs/id_comp_low_high_mass.png new file mode 100644 index 0000000..6808ba3 Binary files /dev/null and b/content/research/2026-closed-loop-control-hands-on/figs/id_comp_low_high_mass.png differ diff --git a/content/research/2026-closed-loop-control-hands-on/figs/id_white_noise.png b/content/research/2026-closed-loop-control-hands-on/figs/id_white_noise.png new file mode 100644 index 0000000..5b6f241 Binary files /dev/null and b/content/research/2026-closed-loop-control-hands-on/figs/id_white_noise.png differ diff --git a/content/research/2026-closed-loop-control-hands-on/figs/iolite1xao.png b/content/research/2026-closed-loop-control-hands-on/figs/iolite1xao.png new file mode 100644 index 0000000..7f4fa31 Binary files /dev/null and b/content/research/2026-closed-loop-control-hands-on/figs/iolite1xao.png differ diff --git a/content/research/2026-closed-loop-control-hands-on/figs/loop_gain_phase_gain_margins.png b/content/research/2026-closed-loop-control-hands-on/figs/loop_gain_phase_gain_margins.png new file mode 100644 index 0000000..ccd39d2 Binary files /dev/null and b/content/research/2026-closed-loop-control-hands-on/figs/loop_gain_phase_gain_margins.png differ diff --git a/content/research/2026-closed-loop-control-hands-on/figs/notch_feedforward_motion.png b/content/research/2026-closed-loop-control-hands-on/figs/notch_feedforward_motion.png new file mode 100644 index 0000000..48c6b22 Binary files /dev/null and b/content/research/2026-closed-loop-control-hands-on/figs/notch_feedforward_motion.png differ diff --git a/content/research/2026-closed-loop-control-hands-on/figs/nyquist_module_margin.png b/content/research/2026-closed-loop-control-hands-on/figs/nyquist_module_margin.png new file mode 100644 index 0000000..bf24ddb Binary files /dev/null and b/content/research/2026-closed-loop-control-hands-on/figs/nyquist_module_margin.png differ diff --git a/content/research/2026-closed-loop-control-hands-on/figs/open_loop_shaping_shape.png b/content/research/2026-closed-loop-control-hands-on/figs/open_loop_shaping_shape.png new file mode 100644 index 0000000..54a7b8e Binary files /dev/null and b/content/research/2026-closed-loop-control-hands-on/figs/open_loop_shaping_shape.png differ diff --git a/content/research/2026-closed-loop-control-hands-on/figs/pdm200.jpg b/content/research/2026-closed-loop-control-hands-on/figs/pdm200.jpg new file mode 100644 index 0000000..0779d5d Binary files /dev/null and b/content/research/2026-closed-loop-control-hands-on/figs/pdm200.jpg differ diff --git a/content/research/2026-closed-loop-control-hands-on/figs/picture_xy_stage.jpg b/content/research/2026-closed-loop-control-hands-on/figs/picture_xy_stage.jpg new file mode 100644 index 0000000..3fddcf1 Binary files /dev/null and b/content/research/2026-closed-loop-control-hands-on/figs/picture_xy_stage.jpg differ diff --git a/content/research/2026-closed-loop-control-hands-on/figs/picture_xy_stage_mass.jpg b/content/research/2026-closed-loop-control-hands-on/figs/picture_xy_stage_mass.jpg new file mode 100644 index 0000000..a7b6d75 Binary files /dev/null and b/content/research/2026-closed-loop-control-hands-on/figs/picture_xy_stage_mass.jpg differ diff --git a/content/research/2026-closed-loop-control-hands-on/figs/pid_bode.png b/content/research/2026-closed-loop-control-hands-on/figs/pid_bode.png new file mode 100644 index 0000000..5ae998e Binary files /dev/null and b/content/research/2026-closed-loop-control-hands-on/figs/pid_bode.png differ diff --git a/content/research/2026-closed-loop-control-hands-on/figs/ramp_resp_one_int.png b/content/research/2026-closed-loop-control-hands-on/figs/ramp_resp_one_int.png new file mode 100644 index 0000000..38cb44f Binary files /dev/null and b/content/research/2026-closed-loop-control-hands-on/figs/ramp_resp_one_int.png differ diff --git a/content/research/2026-closed-loop-control-hands-on/figs/ramp_resp_two_int.png b/content/research/2026-closed-loop-control-hands-on/figs/ramp_resp_two_int.png new file mode 100644 index 0000000..e11156f Binary files /dev/null and b/content/research/2026-closed-loop-control-hands-on/figs/ramp_resp_two_int.png differ diff --git a/content/research/2026-closed-loop-control-hands-on/figs/renishaw_vionic.jpg b/content/research/2026-closed-loop-control-hands-on/figs/renishaw_vionic.jpg new file mode 100644 index 0000000..f9b3c4c Binary files /dev/null and b/content/research/2026-closed-loop-control-hands-on/figs/renishaw_vionic.jpg differ diff --git a/content/research/2026-closed-loop-control-hands-on/figs/siso_identification_schematic_simplier.png b/content/research/2026-closed-loop-control-hands-on/figs/siso_identification_schematic_simplier.png new file mode 100644 index 0000000..d53a699 Binary files /dev/null and b/content/research/2026-closed-loop-control-hands-on/figs/siso_identification_schematic_simplier.png differ diff --git a/content/research/2026-closed-loop-control-hands-on/figs/speedgoat_unit.jpg b/content/research/2026-closed-loop-control-hands-on/figs/speedgoat_unit.jpg new file mode 100644 index 0000000..de2ed60 Binary files /dev/null and b/content/research/2026-closed-loop-control-hands-on/figs/speedgoat_unit.jpg differ diff --git a/content/research/2026-closed-loop-control-hands-on/figs/step_resp_one_int.png b/content/research/2026-closed-loop-control-hands-on/figs/step_resp_one_int.png new file mode 100644 index 0000000..2adab92 Binary files /dev/null and b/content/research/2026-closed-loop-control-hands-on/figs/step_resp_one_int.png differ diff --git a/content/research/2026-closed-loop-control-hands-on/figs/step_resp_two_int.png b/content/research/2026-closed-loop-control-hands-on/figs/step_resp_two_int.png new file mode 100644 index 0000000..2443430 Binary files /dev/null and b/content/research/2026-closed-loop-control-hands-on/figs/step_resp_two_int.png differ diff --git a/content/research/2026-closed-loop-control-hands-on/figs/step_response_I_controller.png b/content/research/2026-closed-loop-control-hands-on/figs/step_response_I_controller.png new file mode 100644 index 0000000..1f4b39e Binary files /dev/null and b/content/research/2026-closed-loop-control-hands-on/figs/step_response_I_controller.png differ diff --git a/content/research/2026-closed-loop-control-hands-on/figs/step_response_I_controller_bad_margin.png b/content/research/2026-closed-loop-control-hands-on/figs/step_response_I_controller_bad_margin.png new file mode 100644 index 0000000..ed3333e Binary files /dev/null and b/content/research/2026-closed-loop-control-hands-on/figs/step_response_I_controller_bad_margin.png differ diff --git a/content/research/2026-closed-loop-control-hands-on/figs/step_response_I_controller_notch.png b/content/research/2026-closed-loop-control-hands-on/figs/step_response_I_controller_notch.png new file mode 100644 index 0000000..248f1da Binary files /dev/null and b/content/research/2026-closed-loop-control-hands-on/figs/step_response_I_controller_notch.png differ diff --git a/content/research/2026-closed-loop-control-hands-on/figs/xy_piezo_stage.png b/content/research/2026-closed-loop-control-hands-on/figs/xy_piezo_stage.png new file mode 100644 index 0000000..d6b7a3a Binary files /dev/null and b/content/research/2026-closed-loop-control-hands-on/figs/xy_piezo_stage.png differ diff --git a/content/research/2026-closed-loop-control-hands-on/figs/xy_piezo_stage_Kfb_x.png b/content/research/2026-closed-loop-control-hands-on/figs/xy_piezo_stage_Kfb_x.png new file mode 100644 index 0000000..9628c07 Binary files /dev/null and b/content/research/2026-closed-loop-control-hands-on/figs/xy_piezo_stage_Kfb_x.png differ diff --git a/data/publications.toml b/data/publications.toml index 3d22121..7ca1dd8 100644 --- a/data/publications.toml +++ b/data/publications.toml @@ -151,3 +151,14 @@ page = "2020-h-infinity-lecture" pdf = "https://git.tdehaeze.xyz/tdehaeze/lecture-h-infinity/raw/branch/master/index.pdf" code = "https://git.tdehaeze.xyz/tdehaeze/lecture-h-infinity" video = "https://www.youtube.com/watch?v=KdJsm_X8uks" + +[[publications]] +key = "dehaeze26_closed_loop_hands_on" +type = "lecture" +authors = ["T. Dehaeze"] +title = "Closed-Loop Control - Hands-On" +venue = "MOCRAF 2026" +year = 2026 +page = "2026-closed-loop-control-hands-on" +pdf = "https://gitlab.esrf.fr/dehaeze/xy-piezo-stage-hands-on/-/raw/main/closed-loop-hands-on.pdf" +code = "https://gitlab.esrf.fr/dehaeze/xy-piezo-stage-hands-on"