First open/close noise budgeting

This commit is contained in:
Thomas Dehaeze 2021-11-30 17:54:19 +01:00
parent f4b7e25320
commit 37e98a9f40
20 changed files with 2564 additions and 186 deletions

View File

@ -3,7 +3,7 @@
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<!-- 2021-11-30 mar. 15:17 -->
<!-- 2021-11-30 mar. 17:54 -->
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<title>ESRF Double Crystal Monochromator - Dynamical Multi-Body Model</title>
<meta name="author" content="Dehaeze Thomas" />
@ -39,44 +39,51 @@
<h2>Table of Contents</h2>
<div id="text-table-of-contents" role="doc-toc">
<ul>
<li><a href="#org3fb7374">1. System Kinematics</a>
<li><a href="#orgbeabbac">1. System Kinematics</a>
<ul>
<li><a href="#org1ef1423">1.1. Bragg Angle</a></li>
<li><a href="#orgcd8fbe6">1.2. Kinematics (111 Crystal)</a>
<li><a href="#org72840a7">1.1. Bragg Angle</a></li>
<li><a href="#org330c2ee">1.2. Kinematics (111 Crystal)</a>
<ul>
<li><a href="#org542b06e">1.2.1. Interferometers - 111 Crystal</a></li>
<li><a href="#org52f68f7">1.2.2. Piezo - 111 Crystal</a></li>
<li><a href="#orgcf6be49">1.2.1. Interferometers - 111 Crystal</a></li>
<li><a href="#org729d4fd">1.2.2. Piezo - 111 Crystal</a></li>
</ul>
</li>
<li><a href="#org616bb45">1.3. Save Kinematics</a></li>
<li><a href="#orgd9564bd">1.3. Save Kinematics</a></li>
</ul>
</li>
<li><a href="#org0000e6d">2. Open Loop System Identification</a>
<li><a href="#org94165e4">2. Open Loop System Identification</a>
<ul>
<li><a href="#org16c8552">2.1. Identification</a></li>
<li><a href="#orgc2236c5">2.2. Plant in the frame of the fastjacks</a></li>
<li><a href="#orgb0e1668">2.3. Plant in the frame of the crystal</a></li>
<li><a href="#org49f773d">2.1. Identification</a></li>
<li><a href="#orga27ac31">2.2. Plant in the frame of the fastjacks</a></li>
<li><a href="#org1d08b17">2.3. Plant in the frame of the crystal</a></li>
</ul>
</li>
<li><a href="#org4bda37c">3. Active Damping Plant (Strain gauges)</a>
<li><a href="#orge94151e">3. Open-Loop Noise Budgeting</a>
<ul>
<li><a href="#orga8033f0">3.1. Identification</a></li>
<li><a href="#org78fe7a9">3.2. Relative Active Damping</a></li>
<li><a href="#org760bce8">3.3. Damped Plant</a></li>
<li><a href="#org20060df">3.1. Power Spectral Density of signals</a></li>
<li><a href="#orgea5b4ad">3.2. Open Loop disturbance and measurement noise</a></li>
</ul>
</li>
<li><a href="#org09dff16">4. Active Damping Plant (Force Sensors)</a>
<li><a href="#org987b6b1">4. Active Damping Plant (Strain gauges)</a>
<ul>
<li><a href="#orgeb8c92e">4.1. Identification</a></li>
<li><a href="#orgae5e7fb">4.2. Controller - Root Locus</a></li>
<li><a href="#orgde5a8cd">4.3. Damped Plant</a></li>
<li><a href="#orge45c4d8">4.1. Identification</a></li>
<li><a href="#org65bc5e9">4.2. Relative Active Damping</a></li>
<li><a href="#orgc83a897">4.3. Damped Plant</a></li>
</ul>
</li>
<li><a href="#org27e3538">5. HAC-LAC (IFF) architecture</a>
<li><a href="#orgf9782ba">5. Active Damping Plant (Force Sensors)</a>
<ul>
<li><a href="#org72519d4">5.1. System Identification</a></li>
<li><a href="#org6919788">5.2. High Authority Controller</a></li>
<li><a href="#orgc5ddfb6">5.3. Performances</a></li>
<li><a href="#orge8c03e7">5.1. Identification</a></li>
<li><a href="#org135d9f2">5.2. Controller - Root Locus</a></li>
<li><a href="#org4072236">5.3. Damped Plant</a></li>
</ul>
</li>
<li><a href="#org5b57c31">6. HAC-LAC (IFF) architecture</a>
<ul>
<li><a href="#orgb4b8d52">6.1. System Identification</a></li>
<li><a href="#org714ec0f">6.2. High Authority Controller</a></li>
<li><a href="#org9c9ea48">6.3. Performances</a></li>
<li><a href="#orgbdf7b28">6.4. Close Loop noise budget</a></li>
</ul>
</li>
</ul>
@ -94,44 +101,53 @@ In this document, a Simscape (.e.g. multi-body) model of the ESRF Double Crystal
It is structured as follow:
</p>
<ul class="org-ul">
<li>Section <a href="#org14dc352">1</a>: the kinematics of the DCM is presented, and Jacobian matrices which are used to solve the inverse and forward kinematics are computed.</li>
<li>Section <a href="#orgc1f64db">2</a>: the system dynamics is identified in the absence of control.</li>
<li>Section <a href="#org80ca2a0">3</a>: it is studied whether if the strain gauges fixed to the piezoelectric actuators can be used to actively damp the plant.</li>
<li>Section <a href="#orgb029a8b">4</a>: piezoelectric force sensors are added in series with the piezoelectric actuators and are used to actively damp the plant using the Integral Force Feedback (IFF) control strategy.</li>
<li>Section <a href="#orgee34a4d">5</a>: the High Authority Control - Low Authority Control (HAC-LAC) strategy is tested on the Simscape model.</li>
<li>Section <a href="#org02dd8b0">1</a>: the kinematics of the DCM is presented, and Jacobian matrices which are used to solve the inverse and forward kinematics are computed.</li>
<li>Section <a href="#orgf62c035">2</a>: the system dynamics is identified in the absence of control.</li>
<li>Section <a href="#org47df825">3</a>: an open-loop noise budget is performed.</li>
<li>Section <a href="#org64d9ba7">4</a>: it is studied whether if the strain gauges fixed to the piezoelectric actuators can be used to actively damp the plant.</li>
<li>Section <a href="#org7fbe16a">5</a>: piezoelectric force sensors are added in series with the piezoelectric actuators and are used to actively damp the plant using the Integral Force Feedback (IFF) control strategy.</li>
<li>Section <a href="#org226a3fc">6</a>: the High Authority Control - Low Authority Control (HAC-LAC) strategy is tested on the Simscape model.</li>
</ul>
<div id="outline-container-org3fb7374" class="outline-2">
<h2 id="org3fb7374"><span class="section-number-2">1.</span> System Kinematics</h2>
<div id="outline-container-orgbeabbac" class="outline-2">
<h2 id="orgbeabbac"><span class="section-number-2">1.</span> System Kinematics</h2>
<div class="outline-text-2" id="text-1">
<p>
<a id="org14dc352"></a>
<a id="org02dd8b0"></a>
</p>
</div>
<div id="outline-container-org1ef1423" class="outline-3">
<h3 id="org1ef1423"><span class="section-number-3">1.1.</span> Bragg Angle</h3>
<div id="outline-container-org72840a7" class="outline-3">
<h3 id="org72840a7"><span class="section-number-3">1.1.</span> Bragg Angle</h3>
<div class="outline-text-3" id="text-1-1">
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak">%% Tested bragg angles</span>
bragg = linspace(5, 80, 1000); <span class="org-comment-delimiter">% </span><span class="org-comment">Bragg angle [deg]</span>
d_off = 10.5e<span class="org-builtin">-</span>3; <span class="org-comment-delimiter">% </span><span class="org-comment">Wanted offset between x-rays [m]</span>
</pre>
</div>
<p>
There is a simple relation <a href="eq:bragg_angle_formula">eq:bragg_angle_formula</a> between:
</p>
<ul class="org-ul">
<li>\(d_{\text{off}}\) is the wanted offset between the incident x-ray and the output x-ray</li>
<li>\(\theta_b\) is the bragg angle</li>
<li>\(d_z\) is the corresponding distance between the first and second crystals</li>
</ul>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak">%% Vertical Jack motion as a function of Bragg angle</span>
dz = d_off<span class="org-builtin">./</span>(2<span class="org-builtin">*</span>cos(bragg<span class="org-builtin">*</span><span class="org-matlab-math">pi</span><span class="org-builtin">/</span>180));
</pre>
</div>
\begin{equation} \label{eq:bragg_angle_formula}
d_z = \frac{d_{\text{off}}}{2 \cos \theta_b}
\end{equation}
<p>
This relation is shown in Figure <a href="#orgd56c0ff">1</a>.
</p>
<div id="org6064b2d" class="figure">
<div id="orgd56c0ff" class="figure">
<p><img src="figs/jack_motion_bragg_angle.png" alt="jack_motion_bragg_angle.png" />
</p>
<p><span class="figure-number">Figure 1: </span>Jack motion as a function of Bragg angle</p>
</div>
<p>
The required jack stroke is approximately 25mm.
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak">%% Required Jack stroke</span>
<span class="org-matlab-math">ans</span> = 1e3<span class="org-builtin">*</span>(dz(end) <span class="org-builtin">-</span> dz(1))
@ -144,34 +160,34 @@ dz = d_off<span class="org-builtin">./</span>(2<span class="org-builtin">*</span
</div>
</div>
<div id="outline-container-orgcd8fbe6" class="outline-3">
<h3 id="orgcd8fbe6"><span class="section-number-3">1.2.</span> Kinematics (111 Crystal)</h3>
<div id="outline-container-org330c2ee" class="outline-3">
<h3 id="org330c2ee"><span class="section-number-3">1.2.</span> Kinematics (111 Crystal)</h3>
<div class="outline-text-3" id="text-1-2">
<p>
The reference frame is taken at the center of the 111 second crystal.
</p>
</div>
<div id="outline-container-org542b06e" class="outline-4">
<h4 id="org542b06e"><span class="section-number-4">1.2.1.</span> Interferometers - 111 Crystal</h4>
<div id="outline-container-orgcf6be49" class="outline-4">
<h4 id="orgcf6be49"><span class="section-number-4">1.2.1.</span> Interferometers - 111 Crystal</h4>
<div class="outline-text-4" id="text-1-2-1">
<p>
Three interferometers are pointed to the bottom surface of the 111 crystal.
</p>
<p>
The position of the measurement points are shown in Figure <a href="#org8f69a58">2</a> as well as the origin where the motion of the crystal is computed.
The position of the measurement points are shown in Figure <a href="#org7cdbbab">2</a> as well as the origin where the motion of the crystal is computed.
</p>
<div id="org8f69a58" class="figure">
<div id="org7cdbbab" class="figure">
<p><img src="figs/sensor_111_crystal_points.png" alt="sensor_111_crystal_points.png" />
</p>
<p><span class="figure-number">Figure 2: </span>Bottom view of the second crystal 111. Position of the measurement points.</p>
</div>
<p>
The inverse kinematics consisting of deriving the interferometer measurements from the motion of the crystal (see Figure <a href="#org6470cc1">3</a>):
The inverse kinematics consisting of deriving the interferometer measurements from the motion of the crystal (see Figure <a href="#orgea687e1">3</a>):
</p>
\begin{equation}
\begin{bmatrix}
@ -185,7 +201,7 @@ d_z \\ r_y \\ r_x
\end{equation}
<div id="org6470cc1" class="figure">
<div id="orgea687e1" class="figure">
<p><img src="figs/schematic_sensor_jacobian_inverse_kinematics.png" alt="schematic_sensor_jacobian_inverse_kinematics.png" />
</p>
<p><span class="figure-number">Figure 3: </span>Inverse Kinematics - Interferometers</p>
@ -193,7 +209,7 @@ d_z \\ r_y \\ r_x
<p>
From the Figure <a href="#org8f69a58">2</a>, the inverse kinematics can be solved as follow (for small motion):
From the Figure <a href="#org7cdbbab">2</a>, the inverse kinematics can be solved as follow (for small motion):
</p>
\begin{equation}
\bm{J}_{s,111}
@ -213,7 +229,7 @@ J_s_111 = [1, 0.07, <span class="org-builtin">-</span>0.015
</pre>
</div>
<table id="org9ac8ea9" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<table id="org31f833a" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<caption class="t-above"><span class="table-number">Table 1:</span> Sensor Jacobian \(\bm{J}_{s,111}\)</caption>
<colgroup>
@ -245,7 +261,7 @@ J_s_111 = [1, 0.07, <span class="org-builtin">-</span>0.015
</table>
<p>
The forward kinematics is solved by inverting the Jacobian matrix (see Figure <a href="#orgacd4853">4</a>).
The forward kinematics is solved by inverting the Jacobian matrix (see Figure <a href="#org220e3fd">4</a>).
</p>
\begin{equation}
\begin{bmatrix}
@ -259,13 +275,13 @@ x_1 \\ x_2 \\ x_3
\end{equation}
<div id="orgacd4853" class="figure">
<div id="org220e3fd" class="figure">
<p><img src="figs/schematic_sensor_jacobian_forward_kinematics.png" alt="schematic_sensor_jacobian_forward_kinematics.png" />
</p>
<p><span class="figure-number">Figure 4: </span>Forward Kinematics - Interferometers</p>
</div>
<table id="org1305abc" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<table id="orga06a454" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<caption class="t-above"><span class="table-number">Table 2:</span> Inverse of the sensor Jacobian \(\bm{J}_{s,111}^{-1}\)</caption>
<colgroup>
@ -298,15 +314,15 @@ x_1 \\ x_2 \\ x_3
</div>
</div>
<div id="outline-container-org52f68f7" class="outline-4">
<h4 id="org52f68f7"><span class="section-number-4">1.2.2.</span> Piezo - 111 Crystal</h4>
<div id="outline-container-org729d4fd" class="outline-4">
<h4 id="org729d4fd"><span class="section-number-4">1.2.2.</span> Piezo - 111 Crystal</h4>
<div class="outline-text-4" id="text-1-2-2">
<p>
The location of the actuators with respect with the center of the 111 second crystal are shown in Figure <a href="#org6ddaa8b">5</a>.
The location of the actuators with respect with the center of the 111 second crystal are shown in Figure <a href="#org92f0f11">5</a>.
</p>
<div id="org6ddaa8b" class="figure">
<div id="org92f0f11" class="figure">
<p><img src="figs/actuator_jacobian_111_points.png" alt="actuator_jacobian_111_points.png" />
</p>
<p><span class="figure-number">Figure 5: </span>Location of actuators with respect to the center of the 111 second crystal (bottom view)</p>
@ -327,14 +343,14 @@ d_z \\ r_y \\ r_x
\end{equation}
<div id="orgd947fd1" class="figure">
<div id="org87ec19c" class="figure">
<p><img src="figs/schematic_actuator_jacobian_inverse_kinematics.png" alt="schematic_actuator_jacobian_inverse_kinematics.png" />
</p>
<p><span class="figure-number">Figure 6: </span>Inverse Kinematics - Actuators</p>
</div>
<p>
Based on the geometry in Figure <a href="#org6ddaa8b">5</a>, we obtain:
Based on the geometry in Figure <a href="#org92f0f11">5</a>, we obtain:
</p>
\begin{equation}
\bm{J}_{a,111}
@ -354,7 +370,7 @@ J_a_111 = [1, 0.14, <span class="org-builtin">-</span>0.1525
</pre>
</div>
<table id="org96d1229" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<table id="orga19c158" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<caption class="t-above"><span class="table-number">Table 3:</span> Actuator Jacobian \(\bm{J}_{a,111}\)</caption>
<colgroup>
@ -400,13 +416,13 @@ d_{u_r} \\ d_{u_h} \\ d_{d}
\end{equation}
<div id="orgbdeca35" class="figure">
<div id="orga0d447c" class="figure">
<p><img src="figs/schematic_actuator_jacobian_forward_kinematics.png" alt="schematic_actuator_jacobian_forward_kinematics.png" />
</p>
<p><span class="figure-number">Figure 7: </span>Forward Kinematics - Actuators for 111 crystal</p>
</div>
<table id="orgb28ebac" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<table id="orga2ec14c" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<caption class="t-above"><span class="table-number">Table 4:</span> Inverse of the actuator Jacobian \(\bm{J}_{a,111}^{-1}\)</caption>
<colgroup>
@ -440,8 +456,8 @@ d_{u_r} \\ d_{u_h} \\ d_{d}
</div>
</div>
<div id="outline-container-org616bb45" class="outline-3">
<h3 id="org616bb45"><span class="section-number-3">1.3.</span> Save Kinematics</h3>
<div id="outline-container-orgd9564bd" class="outline-3">
<h3 id="orgd9564bd"><span class="section-number-3">1.3.</span> Save Kinematics</h3>
<div class="outline-text-3" id="text-1-3">
<div class="org-src-container">
<pre class="src src-matlab">save(<span class="org-string">'mat/dcm_kinematics.mat'</span>, <span class="org-string">'J_a_111'</span>, <span class="org-string">'J_s_111'</span>)
@ -451,15 +467,15 @@ d_{u_r} \\ d_{u_h} \\ d_{d}
</div>
</div>
<div id="outline-container-org0000e6d" class="outline-2">
<h2 id="org0000e6d"><span class="section-number-2">2.</span> Open Loop System Identification</h2>
<div id="outline-container-org94165e4" class="outline-2">
<h2 id="org94165e4"><span class="section-number-2">2.</span> Open Loop System Identification</h2>
<div class="outline-text-2" id="text-2">
<p>
<a id="orgc1f64db"></a>
<a id="orgf62c035"></a>
</p>
</div>
<div id="outline-container-org16c8552" class="outline-3">
<h3 id="org16c8552"><span class="section-number-3">2.1.</span> Identification</h3>
<div id="outline-container-org49f773d" class="outline-3">
<h3 id="org49f773d"><span class="section-number-3">2.1.</span> Identification</h3>
<div class="outline-text-3" id="text-2-1">
<p>
Let&rsquo;s considered the system \(\bm{G}(s)\) with:
@ -470,11 +486,11 @@ Let&rsquo;s considered the system \(\bm{G}(s)\) with:
</ul>
<p>
It is schematically shown in Figure <a href="#orga1c2462">8</a>.
It is schematically shown in Figure <a href="#org03d9ffb">8</a>.
</p>
<div id="orga1c2462" class="figure">
<div id="org03d9ffb" class="figure">
<p><img src="figs/schematic_system_inputs_outputs.png" alt="schematic_system_inputs_outputs.png" />
</p>
<p><span class="figure-number">Figure 8: </span>Dynamical system with inputs and outputs</p>
@ -516,8 +532,8 @@ State-space model with 3 outputs, 3 inputs, and 24 states.
</div>
</div>
<div id="outline-container-orgc2236c5" class="outline-3">
<h3 id="orgc2236c5"><span class="section-number-3">2.2.</span> Plant in the frame of the fastjacks</h3>
<div id="outline-container-orga27ac31" class="outline-3">
<h3 id="orga27ac31"><span class="section-number-3">2.2.</span> Plant in the frame of the fastjacks</h3>
<div class="outline-text-3" id="text-2-2">
<div class="org-src-container">
<pre class="src src-matlab">load(<span class="org-string">'dcm_kinematics.mat'</span>);
@ -525,11 +541,11 @@ State-space model with 3 outputs, 3 inputs, and 24 states.
</div>
<p>
Using the forward and inverse kinematics, we can computed the dynamics from piezo forces to axial motion of the 3 fastjacks (see Figure <a href="#org015dc10">9</a>).
Using the forward and inverse kinematics, we can computed the dynamics from piezo forces to axial motion of the 3 fastjacks (see Figure <a href="#org5f538a8">9</a>).
</p>
<div id="org015dc10" class="figure">
<div id="org5f538a8" class="figure">
<p><img src="figs/schematic_jacobian_frame_fastjack.png" alt="schematic_jacobian_frame_fastjack.png" />
</p>
<p><span class="figure-number">Figure 9: </span>Use of Jacobian matrices to obtain the system in the frame of the fastjacks</p>
@ -550,7 +566,7 @@ The DC gain of the new system shows that the system is well decoupled at low fre
</pre>
</div>
<table id="orgb47db5c" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<table id="orgdc8a086" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<caption class="t-above"><span class="table-number">Table 5:</span> DC gain of the plant in the frame of the fast jacks \(\bm{G}_{\text{fj}}\)</caption>
<colgroup>
@ -582,17 +598,17 @@ The DC gain of the new system shows that the system is well decoupled at low fre
</table>
<p>
The bode plot of \(\bm{G}_{\text{fj}}(s)\) is shown in Figure <a href="#org3a99582">10</a>.
The bode plot of \(\bm{G}_{\text{fj}}(s)\) is shown in Figure <a href="#org4618cac">10</a>.
</p>
<div id="org3a99582" class="figure">
<div id="org4618cac" class="figure">
<p><img src="figs/bode_plot_plant_fj.png" alt="bode_plot_plant_fj.png" />
</p>
<p><span class="figure-number">Figure 10: </span>Bode plot of the diagonal and off-diagonal elements of the plant in the frame of the fast jacks</p>
</div>
<div class="important" id="orge3e331d">
<div class="important" id="org834d546">
<p>
Computing the system in the frame of the fastjack gives good decoupling at low frequency (until the first resonance of the system).
</p>
@ -601,11 +617,11 @@ Computing the system in the frame of the fastjack gives good decoupling at low f
</div>
</div>
<div id="outline-container-orgb0e1668" class="outline-3">
<h3 id="orgb0e1668"><span class="section-number-3">2.3.</span> Plant in the frame of the crystal</h3>
<div id="outline-container-org1d08b17" class="outline-3">
<h3 id="org1d08b17"><span class="section-number-3">2.3.</span> Plant in the frame of the crystal</h3>
<div class="outline-text-3" id="text-2-3">
<div id="orge8c1108" class="figure">
<div id="orgd94c3c6" class="figure">
<p><img src="figs/schematic_jacobian_frame_crystal.png" alt="schematic_jacobian_frame_crystal.png" />
</p>
<p><span class="figure-number">Figure 11: </span>Use of Jacobian matrices to obtain the system in the frame of the crystal</p>
@ -660,19 +676,102 @@ The main reason is that, as we map forces to the center of the 111 crystal and n
</div>
</div>
<div id="outline-container-org4bda37c" class="outline-2">
<h2 id="org4bda37c"><span class="section-number-2">3.</span> Active Damping Plant (Strain gauges)</h2>
<div id="outline-container-orge94151e" class="outline-2">
<h2 id="orge94151e"><span class="section-number-2">3.</span> Open-Loop Noise Budgeting</h2>
<div class="outline-text-2" id="text-3">
<p>
<a id="org80ca2a0"></a>
<a id="org47df825"></a>
</p>
<div id="org2ed8210" class="figure">
<p><img src="figs/noise_budget_dcm_schematic_fast_jack_frame.png" alt="noise_budget_dcm_schematic_fast_jack_frame.png" />
</p>
<p><span class="figure-number">Figure 12: </span>Schematic representation of the control loop in the frame of one fast jack</p>
</div>
</div>
<div id="outline-container-org20060df" class="outline-3">
<h3 id="org20060df"><span class="section-number-3">3.1.</span> Power Spectral Density of signals</h3>
<div class="outline-text-3" id="text-3-1">
<p>
Interferometer noise:
</p>
<div class="org-src-container">
<pre class="src src-matlab">Wn = 6e<span class="org-builtin">-</span>11<span class="org-builtin">*</span>(1 <span class="org-builtin">+</span> s<span class="org-builtin">/</span>2<span class="org-builtin">/</span><span class="org-matlab-math">pi</span><span class="org-builtin">/</span>200)<span class="org-builtin">/</span>(1 <span class="org-builtin">+</span> s<span class="org-builtin">/</span>2<span class="org-builtin">/</span><span class="org-matlab-math">pi</span><span class="org-builtin">/</span>60); <span class="org-comment-delimiter">% </span><span class="org-comment">m/sqrt(Hz)</span>
</pre>
</div>
<pre class="example">
Measurement noise: 0.79 [nm,rms]
</pre>
<p>
DAC noise (amplified by the PI voltage amplifier, and converted to newtons):
</p>
<div class="org-src-container">
<pre class="src src-matlab">Wdac = tf(3e<span class="org-builtin">-</span>8); <span class="org-comment-delimiter">% </span><span class="org-comment">V/sqrt(Hz)</span>
Wu = Wdac<span class="org-builtin">*</span>22.5<span class="org-builtin">*</span>10; <span class="org-comment-delimiter">% </span><span class="org-comment">N/sqrt(Hz)</span>
</pre>
</div>
<pre class="example">
DAC noise: 0.95 [uV,rms]
</pre>
<p>
Disturbances:
</p>
<div class="org-src-container">
<pre class="src src-matlab">Wd = 5e<span class="org-builtin">-</span>7<span class="org-builtin">/</span>(1 <span class="org-builtin">+</span> s<span class="org-builtin">/</span>2<span class="org-builtin">/</span><span class="org-matlab-math">pi</span>); <span class="org-comment-delimiter">% </span><span class="org-comment">m/sqrt(Hz)</span>
</pre>
</div>
<pre class="example">
Disturbance motion: 0.61 [um,rms]
</pre>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak">%% Save ASD of noise and disturbances</span>
save(<span class="org-string">'mat/asd_noises_disturbances.mat'</span>, <span class="org-string">'Wn'</span>, <span class="org-string">'Wu'</span>, <span class="org-string">'Wd'</span>);
</pre>
</div>
</div>
</div>
<div id="outline-container-orgea5b4ad" class="outline-3">
<h3 id="orgea5b4ad"><span class="section-number-3">3.2.</span> Open Loop disturbance and measurement noise</h3>
<div class="outline-text-3" id="text-3-2">
<p>
The comparison of the amplitude spectral density of the measurement noise and of the jack parasitic motion is performed in Figure <a href="#orge20b337">13</a>.
It confirms that the sensor noise is low enough to measure the motion errors of the crystal.
</p>
<div id="orge20b337" class="figure">
<p><img src="figs/open_loop_noise_budget_fast_jack.png" alt="open_loop_noise_budget_fast_jack.png" />
</p>
<p><span class="figure-number">Figure 13: </span>Open Loop noise budgeting</p>
</div>
</div>
</div>
</div>
<div id="outline-container-org987b6b1" class="outline-2">
<h2 id="org987b6b1"><span class="section-number-2">4.</span> Active Damping Plant (Strain gauges)</h2>
<div class="outline-text-2" id="text-4">
<p>
<a id="org64d9ba7"></a>
</p>
<p>
In this section, we wish to see whether if strain gauges fixed to the piezoelectric actuator can be used for active damping.
</p>
</div>
<div id="outline-container-orga8033f0" class="outline-3">
<h3 id="orga8033f0"><span class="section-number-3">3.1.</span> Identification</h3>
<div class="outline-text-3" id="text-3-1">
<div id="outline-container-orge45c4d8" class="outline-3">
<h3 id="orge45c4d8"><span class="section-number-3">4.1.</span> Identification</h3>
<div class="outline-text-3" id="text-4-1">
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak">%% Input/Output definition</span>
clear io; io_i = 1;
@ -730,15 +829,15 @@ G_sg = linearize(mdl, io);
</table>
<div id="org8f04d26" class="figure">
<div id="org782b33f" class="figure">
<p><img src="figs/strain_gauge_plant_bode_plot.png" alt="strain_gauge_plant_bode_plot.png" />
</p>
<p><span class="figure-number">Figure 12: </span>Bode Plot of the transfer functions from piezoelectric forces to strain gauges measuremed displacements</p>
<p><span class="figure-number">Figure 14: </span>Bode Plot of the transfer functions from piezoelectric forces to strain gauges measuremed displacements</p>
</div>
<div class="important" id="orgd585bf5">
<div class="important" id="org9ec0d6c">
<p>
As the distance between the poles and zeros in Figure <a href="#org11a1e17">15</a> is very small, little damping can be actively added using the strain gauges.
As the distance between the poles and zeros in Figure <a href="#org0e9b8f2">17</a> is very small, little damping can be actively added using the strain gauges.
This will be confirmed using a Root Locus plot.
</p>
@ -746,23 +845,23 @@ This will be confirmed using a Root Locus plot.
</div>
</div>
<div id="outline-container-org78fe7a9" class="outline-3">
<h3 id="org78fe7a9"><span class="section-number-3">3.2.</span> Relative Active Damping</h3>
<div class="outline-text-3" id="text-3-2">
<div id="outline-container-org65bc5e9" class="outline-3">
<h3 id="org65bc5e9"><span class="section-number-3">4.2.</span> Relative Active Damping</h3>
<div class="outline-text-3" id="text-4-2">
<div class="org-src-container">
<pre class="src src-matlab">Krad_g1 = eye(3)<span class="org-builtin">*</span>s<span class="org-builtin">/</span>(s<span class="org-builtin">^</span>2<span class="org-builtin">/</span>(2<span class="org-builtin">*</span><span class="org-matlab-math">pi</span><span class="org-builtin">*</span>500)<span class="org-builtin">^</span>2 <span class="org-builtin">+</span> 2<span class="org-builtin">*</span>s<span class="org-builtin">/</span>(2<span class="org-builtin">*</span><span class="org-matlab-math">pi</span><span class="org-builtin">*</span>500) <span class="org-builtin">+</span> 1);
</pre>
</div>
<p>
As can be seen in Figure <a href="#orgec235bb">13</a>, very little damping can be added using relative damping strategy using strain gauges.
As can be seen in Figure <a href="#orgc3707d5">15</a>, very little damping can be added using relative damping strategy using strain gauges.
</p>
<div id="orgec235bb" class="figure">
<div id="orgc3707d5" class="figure">
<p><img src="figs/relative_damping_root_locus.png" alt="relative_damping_root_locus.png" />
</p>
<p><span class="figure-number">Figure 13: </span>Root Locus for the relative damping control</p>
<p><span class="figure-number">Figure 15: </span>Root Locus for the relative damping control</p>
</div>
<div class="org-src-container">
@ -772,9 +871,9 @@ As can be seen in Figure <a href="#orgec235bb">13</a>, very little damping can b
</div>
</div>
<div id="outline-container-org760bce8" class="outline-3">
<h3 id="org760bce8"><span class="section-number-3">3.3.</span> Damped Plant</h3>
<div class="outline-text-3" id="text-3-3">
<div id="outline-container-orgc83a897" class="outline-3">
<h3 id="orgc83a897"><span class="section-number-3">4.3.</span> Damped Plant</h3>
<div class="outline-text-3" id="text-4-3">
<p>
The controller is implemented on Simscape, and the damped plant is identified.
</p>
@ -818,20 +917,20 @@ G_dp.OutputName = {<span class="org-string">'d_ur'</span>, <span class="org-str
</div>
<div id="orgca0b154" class="figure">
<div id="org5d6f27c" class="figure">
<p><img src="figs/comp_damp_undamped_plant_rad_bode_plot.png" alt="comp_damp_undamped_plant_rad_bode_plot.png" />
</p>
<p><span class="figure-number">Figure 14: </span>Bode plot of both the open-loop plant and the damped plant using relative active damping</p>
<p><span class="figure-number">Figure 16: </span>Bode plot of both the open-loop plant and the damped plant using relative active damping</p>
</div>
</div>
</div>
</div>
<div id="outline-container-org09dff16" class="outline-2">
<h2 id="org09dff16"><span class="section-number-2">4.</span> Active Damping Plant (Force Sensors)</h2>
<div class="outline-text-2" id="text-4">
<div id="outline-container-orgf9782ba" class="outline-2">
<h2 id="orgf9782ba"><span class="section-number-2">5.</span> Active Damping Plant (Force Sensors)</h2>
<div class="outline-text-2" id="text-5">
<p>
<a id="orgb029a8b"></a>
<a id="org7fbe16a"></a>
</p>
<p>
Force sensors are added above the piezoelectric actuators.
@ -839,9 +938,9 @@ They can consists of a simple piezoelectric ceramic stack.
See for instance <a href="fleming10_integ_strain_force_feedb_high">fleming10_integ_strain_force_feedb_high</a>.
</p>
</div>
<div id="outline-container-orgeb8c92e" class="outline-3">
<h3 id="orgeb8c92e"><span class="section-number-3">4.1.</span> Identification</h3>
<div class="outline-text-3" id="text-4-1">
<div id="outline-container-orge8c03e7" class="outline-3">
<h3 id="orge8c03e7"><span class="section-number-3">5.1.</span> Identification</h3>
<div class="outline-text-3" id="text-5-1">
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak">%% Input/Output definition</span>
clear io; io_i = 1;
@ -863,22 +962,22 @@ G_fs = linearize(mdl, io);
</div>
<p>
The Bode plot of the identified dynamics is shown in Figure <a href="#org11a1e17">15</a>.
The Bode plot of the identified dynamics is shown in Figure <a href="#org0e9b8f2">17</a>.
At high frequency, the diagonal terms are constants while the off-diagonal terms have some roll-off.
</p>
<div id="org11a1e17" class="figure">
<div id="org0e9b8f2" class="figure">
<p><img src="figs/iff_plant_bode_plot.png" alt="iff_plant_bode_plot.png" />
</p>
<p><span class="figure-number">Figure 15: </span>Bode plot of IFF Plant</p>
<p><span class="figure-number">Figure 17: </span>Bode plot of IFF Plant</p>
</div>
</div>
</div>
<div id="outline-container-orgae5e7fb" class="outline-3">
<h3 id="orgae5e7fb"><span class="section-number-3">4.2.</span> Controller - Root Locus</h3>
<div class="outline-text-3" id="text-4-2">
<div id="outline-container-org135d9f2" class="outline-3">
<h3 id="org135d9f2"><span class="section-number-3">5.2.</span> Controller - Root Locus</h3>
<div class="outline-text-3" id="text-5-2">
<p>
We want to have integral action around the resonances of the system, but we do not want to integrate at low frequency.
Therefore, we can use a low pass filter.
@ -891,10 +990,10 @@ Kiff_g1 = eye(3)<span class="org-builtin">*</span>1<span class="org-builtin">/</
</div>
<div id="org5b2bab0" class="figure">
<div id="org14798b7" class="figure">
<p><img src="figs/iff_root_locus.png" alt="iff_root_locus.png" />
</p>
<p><span class="figure-number">Figure 16: </span>Root Locus plot for the IFF Control strategy</p>
<p><span class="figure-number">Figure 18: </span>Root Locus plot for the IFF Control strategy</p>
</div>
<div class="org-src-container">
@ -911,38 +1010,38 @@ save(<span class="org-string">'mat/Kiff.mat'</span>, <span class="org-string">'K
</div>
</div>
<div id="outline-container-orgde5a8cd" class="outline-3">
<h3 id="orgde5a8cd"><span class="section-number-3">4.3.</span> Damped Plant</h3>
<div class="outline-text-3" id="text-4-3">
<div id="outline-container-org4072236" class="outline-3">
<h3 id="org4072236"><span class="section-number-3">5.3.</span> Damped Plant</h3>
<div class="outline-text-3" id="text-5-3">
<p>
Both the Open Loop dynamics (see Figure <a href="#org015dc10">9</a>) and the dynamics with IFF (see Figure <a href="#org7a880a7">17</a>) are identified.
Both the Open Loop dynamics (see Figure <a href="#org5f538a8">9</a>) and the dynamics with IFF (see Figure <a href="#org8cbe7f9">19</a>) are identified.
</p>
<p>
We are here interested in the dynamics from \(\bm{u}^\prime = [u_{u_r}^\prime,\ u_{u_h}^\prime,\ u_d^\prime]\) (input of the damped plant) to \(\bm{d}_{\text{fj}} = [d_{u_r},\ d_{u_h},\ d_d]\) (motion of the crystal expressed in the frame of the fast-jacks).
This is schematically represented in Figure <a href="#org7a880a7">17</a>.
This is schematically represented in Figure <a href="#org8cbe7f9">19</a>.
</p>
<div id="org7a880a7" class="figure">
<div id="org8cbe7f9" class="figure">
<p><img src="figs/schematic_jacobian_frame_fastjack_iff.png" alt="schematic_jacobian_frame_fastjack_iff.png" />
</p>
<p><span class="figure-number">Figure 17: </span>Use of Jacobian matrices to obtain the system in the frame of the fastjacks</p>
<p><span class="figure-number">Figure 19: </span>Use of Jacobian matrices to obtain the system in the frame of the fastjacks</p>
</div>
<p>
The dynamics from \(\bm{u}\) to \(\bm{d}_{\text{fj}}\) (open-loop dynamics) and from \(\bm{u}^\prime\) to \(\bm{d}_{\text{fs}}\) are compared in Figure <a href="#org9f5d048">18</a>.
The dynamics from \(\bm{u}\) to \(\bm{d}_{\text{fj}}\) (open-loop dynamics) and from \(\bm{u}^\prime\) to \(\bm{d}_{\text{fs}}\) are compared in Figure <a href="#org73485e9">20</a>.
It is clear that the Integral Force Feedback control strategy is very effective in damping the resonances of the plant.
</p>
<div id="org9f5d048" class="figure">
<div id="org73485e9" class="figure">
<p><img src="figs/comp_damped_undamped_plant_iff_bode_plot.png" alt="comp_damped_undamped_plant_iff_bode_plot.png" />
</p>
<p><span class="figure-number">Figure 18: </span>Bode plot of both the open-loop plant and the damped plant using IFF</p>
<p><span class="figure-number">Figure 20: </span>Bode plot of both the open-loop plant and the damped plant using IFF</p>
</div>
<div class="important" id="org8586fa6">
<div class="important" id="org91bfa66">
<p>
The Integral Force Feedback control strategy is very effective in damping the modes present in the plant.
</p>
@ -952,42 +1051,42 @@ The Integral Force Feedback control strategy is very effective in damping the mo
</div>
</div>
<div id="outline-container-org27e3538" class="outline-2">
<h2 id="org27e3538"><span class="section-number-2">5.</span> HAC-LAC (IFF) architecture</h2>
<div class="outline-text-2" id="text-5">
<div id="outline-container-org5b57c31" class="outline-2">
<h2 id="org5b57c31"><span class="section-number-2">6.</span> HAC-LAC (IFF) architecture</h2>
<div class="outline-text-2" id="text-6">
<p>
<a id="orgee34a4d"></a>
<a id="org226a3fc"></a>
</p>
<p>
The HAC-LAC architecture is shown in Figure <a href="#orgb03e1da">19</a>.
The HAC-LAC architecture is shown in Figure <a href="#org604ef36">21</a>.
</p>
<div id="orgb03e1da" class="figure">
<div id="org604ef36" class="figure">
<p><img src="figs/schematic_jacobian_frame_fastjack_hac_iff.png" alt="schematic_jacobian_frame_fastjack_hac_iff.png" />
</p>
<p><span class="figure-number">Figure 19: </span>HAC-LAC architecture</p>
<p><span class="figure-number">Figure 21: </span>HAC-LAC architecture</p>
</div>
</div>
<div id="outline-container-org72519d4" class="outline-3">
<h3 id="org72519d4"><span class="section-number-3">5.1.</span> System Identification</h3>
<div class="outline-text-3" id="text-5-1">
<div id="outline-container-orgb4b8d52" class="outline-3">
<h3 id="orgb4b8d52"><span class="section-number-3">6.1.</span> System Identification</h3>
<div class="outline-text-3" id="text-6-1">
<p>
Let&rsquo;s identify the damped plant.
</p>
<div id="org022508f" class="figure">
<div id="orgb9d93cb" class="figure">
<p><img src="figs/bode_plot_hac_iff_plant.png" alt="bode_plot_hac_iff_plant.png" />
</p>
<p><span class="figure-number">Figure 20: </span>Bode Plot of the plant for the High Authority Controller (transfer function from \(\bm{u}^\prime\) to \(\bm{\epsilon}_d\))</p>
<p><span class="figure-number">Figure 22: </span>Bode Plot of the plant for the High Authority Controller (transfer function from \(\bm{u}^\prime\) to \(\bm{\epsilon}_d\))</p>
</div>
</div>
</div>
<div id="outline-container-org6919788" class="outline-3">
<h3 id="org6919788"><span class="section-number-3">5.2.</span> High Authority Controller</h3>
<div class="outline-text-3" id="text-5-2">
<div id="outline-container-org714ec0f" class="outline-3">
<h3 id="org714ec0f"><span class="section-number-3">6.2.</span> High Authority Controller</h3>
<div class="outline-text-3" id="text-6-2">
<p>
Let&rsquo;s design a controller with a bandwidth of 100Hz.
As the plant is well decoupled and well approximated by a constant at low frequency, the high authority controller can easily be designed with SISO loop shaping.
@ -1018,28 +1117,28 @@ L_hac_lac = G_dp <span class="org-builtin">*</span> Khac;
</div>
<div id="org1eefea2" class="figure">
<div id="orgc55c5d0" class="figure">
<p><img src="figs/hac_iff_loop_gain_bode_plot.png" alt="hac_iff_loop_gain_bode_plot.png" />
</p>
<p><span class="figure-number">Figure 21: </span>Bode Plot of the Loop gain for the High Authority Controller</p>
<p><span class="figure-number">Figure 23: </span>Bode Plot of the Loop gain for the High Authority Controller</p>
</div>
<p>
As shown in the Root Locus plot in Figure <a href="#orgc90ee63">22</a>, the closed loop system should be stable.
As shown in the Root Locus plot in Figure <a href="#org54bbcb8">24</a>, the closed loop system should be stable.
</p>
<div id="orgc90ee63" class="figure">
<div id="org54bbcb8" class="figure">
<p><img src="figs/loci_hac_iff_fast_jack.png" alt="loci_hac_iff_fast_jack.png" />
</p>
<p><span class="figure-number">Figure 22: </span>Root Locus for the High Authority Controller</p>
<p><span class="figure-number">Figure 24: </span>Root Locus for the High Authority Controller</p>
</div>
</div>
</div>
<div id="outline-container-orgc5ddfb6" class="outline-3">
<h3 id="orgc5ddfb6"><span class="section-number-3">5.3.</span> Performances</h3>
<div class="outline-text-3" id="text-5-3">
<div id="outline-container-org9c9ea48" class="outline-3">
<h3 id="org9c9ea48"><span class="section-number-3">6.3.</span> Performances</h3>
<div class="outline-text-3" id="text-6-3">
<p>
In order to estimate the performances of the HAC-IFF control strategy, the transfer function from motion errors of the stepper motors to the motion error of the crystal is identified both in open loop and with the HAC-IFF strategy.
</p>
@ -1059,22 +1158,72 @@ It is first verified that the closed-loop system is stable:
<p>
And both transmissibilities are compared in Figure <a href="#org152d7e8">23</a>.
And both transmissibilities are compared in Figure <a href="#org948d6ba">25</a>.
</p>
<div id="org152d7e8" class="figure">
<div id="org948d6ba" class="figure">
<p><img src="figs/stepper_transmissibility_comp_ol_hac_iff.png" alt="stepper_transmissibility_comp_ol_hac_iff.png" />
</p>
<p><span class="figure-number">Figure 23: </span>Comparison of the transmissibility of errors from vibrations of the stepper motor between the open-loop case and the hac-iff case.</p>
<p><span class="figure-number">Figure 25: </span>Comparison of the transmissibility of errors from vibrations of the stepper motor between the open-loop case and the hac-iff case.</p>
</div>
<div class="important" id="org755e221">
<div class="important" id="orgc81cfdd">
<p>
The HAC-IFF control strategy can effectively reduce the transmissibility of the motion errors of the stepper motors.
This reduction is effective inside the bandwidth of the controller.
</p>
</div>
</div>
</div>
<div id="outline-container-orgbdf7b28" class="outline-3">
<h3 id="orgbdf7b28"><span class="section-number-3">6.4.</span> Close Loop noise budget</h3>
<div class="outline-text-3" id="text-6-4">
<p>
Let&rsquo;s compute the amplitude spectral density of the jack motion errors due to the sensor noise, the actuator noise and disturbances.
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak">%% Computation of ASD of contribution of inputs to the closed-loop motion</span>
<span class="org-comment-delimiter">% </span><span class="org-comment">Error due to disturbances</span>
asd_d = abs(squeeze(freqresp(Wd<span class="org-builtin">*</span>(1<span class="org-builtin">/</span>(1 <span class="org-builtin">+</span> G_dp(1,1)<span class="org-builtin">*</span>Khac(1,1))), f, <span class="org-string">'Hz'</span>)));
<span class="org-comment-delimiter">% </span><span class="org-comment">Error due to actuator noise</span>
asd_u = abs(squeeze(freqresp(Wu<span class="org-builtin">*</span>(G_dp(1,1)<span class="org-builtin">/</span>(1 <span class="org-builtin">+</span> G_dp(1,1)<span class="org-builtin">*</span>Khac(1,1))), f, <span class="org-string">'Hz'</span>)));
<span class="org-comment-delimiter">% </span><span class="org-comment">Error due to sensor noise</span>
asd_n = abs(squeeze(freqresp(Wn<span class="org-builtin">*</span>(G_dp(1,1)<span class="org-builtin">*</span>Khac(1,1)<span class="org-builtin">/</span>(1 <span class="org-builtin">+</span> G_dp(1,1)<span class="org-builtin">*</span>Khac(1,1))), f, <span class="org-string">'Hz'</span>)));
</pre>
</div>
<p>
The closed-loop ASD is then:
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak">%% ASD of the closed-loop motion</span>
asd_cl = sqrt(asd_d<span class="org-builtin">.^</span>2 <span class="org-builtin">+</span> asd_u<span class="org-builtin">.^</span>2 <span class="org-builtin">+</span> asd_n<span class="org-builtin">.^</span>2);
</pre>
</div>
<p>
The obtained ASD are shown in Figure <a href="#orgf0027c6">26</a>.
</p>
<div id="orgf0027c6" class="figure">
<p><img src="figs/close_loop_asd_noise_budget_hac_iff.png" alt="close_loop_asd_noise_budget_hac_iff.png" />
</p>
<p><span class="figure-number">Figure 26: </span>Closed Loop noise budget</p>
</div>
<p>
Let&rsquo;s compare the open-loop and close-loop cases (Figure <a href="#org691e64a">27</a>).
</p>
<div id="org691e64a" class="figure">
<p><img src="figs/cps_comp_ol_cl_hac_iff.png" alt="cps_comp_ol_cl_hac_iff.png" />
</p>
<p><span class="figure-number">Figure 27: </span>Cumulative Power Spectrum of the open-loop and closed-loop motion error along one fast-jack</p>
</div>
</div>
</div>
@ -1082,7 +1231,7 @@ This reduction is effective inside the bandwidth of the controller.
</div>
<div id="postamble" class="status">
<p class="author">Author: Dehaeze Thomas</p>
<p class="date">Created: 2021-11-30 mar. 15:17</p>
<p class="date">Created: 2021-11-30 mar. 17:54</p>
</div>
</body>
</html>

View File

@ -56,6 +56,7 @@ In this document, a Simscape (.e.g. multi-body) model of the ESRF Double Crystal
It is structured as follow:
- Section [[sec:dcm_kinematics]]: the kinematics of the DCM is presented, and Jacobian matrices which are used to solve the inverse and forward kinematics are computed.
- Section [[sec:open_loop_identification]]: the system dynamics is identified in the absence of control.
- Section [[sec:dcm_noise_budget]]: an open-loop noise budget is performed.
- Section [[sec:active_damping_strain_gauges]]: it is studied whether if the strain gauges fixed to the piezoelectric actuators can be used to actively damp the plant.
- Section [[sec:active_damping_iff]]: piezoelectric force sensors are added in series with the piezoelectric actuators and are used to actively damp the plant using the Integral Force Feedback (IFF) control strategy.
- Section [[sec:hac_iff]]: the High Authority Control - Low Authority Control (HAC-LAC) strategy is tested on the Simscape model.
@ -95,17 +96,28 @@ It is structured as follow:
#+end_src
** Bragg Angle
#+begin_src matlab
There is a simple relation eqref:eq:bragg_angle_formula between:
- $d_{\text{off}}$ is the wanted offset between the incident x-ray and the output x-ray
- $\theta_b$ is the bragg angle
- $d_z$ is the corresponding distance between the first and second crystals
\begin{equation} \label{eq:bragg_angle_formula}
d_z = \frac{d_{\text{off}}}{2 \cos \theta_b}
\end{equation}
#+begin_src matlab :exports none
%% Tested bragg angles
bragg = linspace(5, 80, 1000); % Bragg angle [deg]
d_off = 10.5e-3; % Wanted offset between x-rays [m]
#+end_src
#+begin_src matlab
#+begin_src matlab :exports none
%% Vertical Jack motion as a function of Bragg angle
dz = d_off./(2*cos(bragg*pi/180));
#+end_src
This relation is shown in Figure [[fig:jack_motion_bragg_angle]].
#+begin_src matlab :exports none
%% Jack motion as a function of Bragg angle
figure;
@ -122,6 +134,8 @@ exportFig('figs/jack_motion_bragg_angle.pdf', 'width', 'wide', 'height', 'normal
#+RESULTS:
[[file:figs/jack_motion_bragg_angle.png]]
The required jack stroke is approximately 25mm.
#+begin_src matlab :results value replace :exports both
%% Required Jack stroke
ans = 1e3*(dz(end) - dz(1))
@ -701,6 +715,148 @@ Here, we map the piezo forces at the center of stiffness.
Let's first compute the Jacobian:
* Open-Loop Noise Budgeting
:PROPERTIES:
:header-args:matlab+: :tangle matlab/dcm_noise_budget.m
:END:
<<sec:dcm_noise_budget>>
** Introduction :ignore:
#+begin_src latex :file noise_budget_dcm_schematic_fast_jack_frame.pdf
\begin{tikzpicture}
% Blocs
\node[block] (G) {$G(s)$};
\node[addb, left= of G] (adddu) {};
\node[block, left= of adddu] (K) {$K(s)$};
\node[addb={+}{}{}{}{-}, left= of K] (subL) {};
\node[addb, right= of G] (addd) {};
\node[addb, below right=0.8 and 0.6 of addd] (adddn) {};
% Connections and labels
\draw[->] (subL.east) -- (K.west);
\draw[->] (K.east) -- (adddu.west);
\draw[->] (adddu.east) -- (G.west);
\draw[->] (G.east) -- (addd.west);
\draw[->] (addd-|adddn)node[branch]{}node[above]{$y_{\text{fj}}$} -- (adddn.north);
\draw[->] (adddn.west) -| (subL.south) node[below right]{$y_{\text{fj},m}$};
\draw[<-] (adddu.north) -- ++(0, 1) node[below right]{$d_u$};
\draw[<-] (addd.north) -- ++(0, 1) node[below right]{$d_{\text{fj}}$};
\draw[<-] (adddn.east) -- ++(1, 0)coordinate(dn) node[above left]{$n_{\text{fj}}$};
\draw[->] (addd.east) -- (addd-|dn);
\end{tikzpicture}
#+end_src
#+name: fig:noise_budget_dcm_schematic_fast_jack_frame
#+caption: Schematic representation of the control loop in the frame of one fast jack
#+RESULTS:
[[file:figs/noise_budget_dcm_schematic_fast_jack_frame.png]]
** Matlab Init :noexport:ignore:
#+begin_src matlab
%% dcm_noise_budget.m
% Basic uniaxial noise budgeting
#+end_src
#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name)
<<matlab-dir>>
#+end_src
#+begin_src matlab :exports none :results silent :noweb yes
<<matlab-init>>
#+end_src
#+begin_src matlab :tangle no :noweb yes
<<m-init-path>>
#+end_src
#+begin_src matlab :eval no :noweb yes
<<m-init-path-tangle>>
#+end_src
#+begin_src matlab :noweb yes
<<m-init-other>>
%% Frequency vector for noise budget [Hz]
f = logspace(-1, 3, 1000);
#+end_src
** Power Spectral Density of signals
Interferometer noise:
#+begin_src matlab
Wn = 6e-11*(1 + s/2/pi/200)/(1 + s/2/pi/60); % m/sqrt(Hz)
#+end_src
#+begin_src matlab :results value replace :exports results :tangle no
sprintf('Measurement noise: %.2f [nm,rms]', 1e9*sqrt(trapz(f, abs(squeeze(freqresp(Wn, f, 'Hz'))).^2)));
#+end_src
#+RESULTS:
: Measurement noise: 0.79 [nm,rms]
DAC noise (amplified by the PI voltage amplifier, and converted to newtons):
#+begin_src matlab
Wdac = tf(3e-8); % V/sqrt(Hz)
Wu = Wdac*22.5*10; % N/sqrt(Hz)
#+end_src
#+begin_src matlab :results value replace :exports results :tangle no
sprintf('DAC noise: %.2f [uV,rms]', 1e6*sqrt(trapz(f, abs(squeeze(freqresp(Wdac, f, 'Hz'))).^2)));
#+end_src
#+RESULTS:
: DAC noise: 0.95 [uV,rms]
Disturbances:
#+begin_src matlab
Wd = 5e-7/(1 + s/2/pi); % m/sqrt(Hz)
#+end_src
#+begin_src matlab :results value replace :exports results :tangle no
sprintf('Disturbance motion: %.2f [um,rms]', 1e6*sqrt(trapz(f, abs(squeeze(freqresp(Wd, f, 'Hz'))).^2)));
#+end_src
#+RESULTS:
: Disturbance motion: 0.61 [um,rms]
#+begin_src matlab :exports none :tangle no
save('matlab/mat/asd_noises_disturbances.mat', 'Wn', 'Wu', 'Wd');
#+end_src
#+begin_src matlab :eval no
%% Save ASD of noise and disturbances
save('mat/asd_noises_disturbances.mat', 'Wn', 'Wu', 'Wd');
#+end_src
** Open Loop disturbance and measurement noise
The comparison of the amplitude spectral density of the measurement noise and of the jack parasitic motion is performed in Figure [[fig:open_loop_noise_budget_fast_jack]].
It confirms that the sensor noise is low enough to measure the motion errors of the crystal.
#+begin_src matlab :exports none
%% Bode plot for the plant (strain gauge output)
figure;
hold on;
plot(f, abs(squeeze(freqresp(Wn, f, 'Hz'))), ...
'DisplayName', 'n');
plot(f, abs(squeeze(freqresp(Wd, f, 'Hz'))), ...
'DisplayName', 'd');
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
xlabel('Frequency [Hz]'); ylabel('ASD [$m/\sqrt{Hz}$]');
legend('location', 'northeast', 'FontSize', 8, 'NumColumns', 2);
xlim([f(1), f(end)]);
#+end_src
#+begin_src matlab :tangle no :exports results :results file replace
exportFig('figs/open_loop_noise_budget_fast_jack.pdf', 'width', 'wide', 'height', 'normal');
#+end_src
#+name: fig:open_loop_noise_budget_fast_jack
#+caption: Open Loop noise budgeting
#+RESULTS:
[[file:figs/open_loop_noise_budget_fast_jack.png]]
* Active Damping Plant (Strain gauges)
:PROPERTIES:
:header-args:matlab+: :tangle matlab/dcm_active_damping_strain_gauges.m
@ -1673,6 +1829,95 @@ The HAC-IFF control strategy can effectively reduce the transmissibility of the
This reduction is effective inside the bandwidth of the controller.
#+end_important
** Close Loop noise budget
#+begin_src matlab :exports none
%% Load disturbances
load('asd_noises_disturbances.mat');
#+end_src
Let's compute the amplitude spectral density of the jack motion errors due to the sensor noise, the actuator noise and disturbances.
#+begin_src matlab
%% Computation of ASD of contribution of inputs to the closed-loop motion
% Error due to disturbances
asd_d = abs(squeeze(freqresp(Wd*(1/(1 + G_dp(1,1)*Khac(1,1))), f, 'Hz')));
% Error due to actuator noise
asd_u = abs(squeeze(freqresp(Wu*(G_dp(1,1)/(1 + G_dp(1,1)*Khac(1,1))), f, 'Hz')));
% Error due to sensor noise
asd_n = abs(squeeze(freqresp(Wn*(G_dp(1,1)*Khac(1,1)/(1 + G_dp(1,1)*Khac(1,1))), f, 'Hz')));
#+end_src
The closed-loop ASD is then:
#+begin_src matlab
%% ASD of the closed-loop motion
asd_cl = sqrt(asd_d.^2 + asd_u.^2 + asd_n.^2);
#+end_src
The obtained ASD are shown in Figure [[fig:close_loop_asd_noise_budget_hac_iff]].
#+begin_src matlab :exports none
%% Noise Budget (ASD)
f = logspace(-1, 3, 1000);
figure;
hold on;
plot(f, asd_n, 'DisplayName', '$n$');
plot(f, asd_u, 'DisplayName', '$d_u$');
plot(f, asd_d, 'DisplayName', '$d$');
plot(f, asd_cl, 'k--', 'DisplayName', '$y$');
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
xlabel('Frequency [Hz]'); ylabel('ASD [$m/\sqrt{Hz}$]');
legend('location', 'southeast', 'FontSize', 8, 'NumColumns', 2);
xlim([f(1), f(end)]);
ylim([1e-16, 1e-8]);
#+end_src
#+begin_src matlab :tangle no :exports results :results file replace
exportFig('figs/close_loop_asd_noise_budget_hac_iff.pdf', 'width', 'wide', 'height', 'tall');
#+end_src
#+name: fig:close_loop_asd_noise_budget_hac_iff
#+caption: Closed Loop noise budget
#+RESULTS:
[[file:figs/close_loop_asd_noise_budget_hac_iff.png]]
Let's compare the open-loop and close-loop cases (Figure [[fig:cps_comp_ol_cl_hac_iff]]).
#+begin_src matlab :exports none
% Amplitude spectral density of the open loop motion errors [m/sqrt(Hz)]
asd_ol = abs(squeeze(freqresp(Wd, f, 'Hz')));
#+end_src
#+begin_src matlab :exports none
% CPS of open-loop motion [m^2]
cps_ol = flip(-cumtrapz(flip(f), flip(asd_ol.^2)));
% CPS of closed-loop motion [m^2]
cps_cl = flip(-cumtrapz(flip(f), flip(asd_cl.^2)));
#+end_src
#+begin_src matlab :exports none
%% Cumulative Power Spectrum - Motion error of fast jack
figure;
hold on;
plot(f, cps_ol, 'DisplayName', sprintf('OL, $\\epsilon_d = %.0f$ [nm,rms]', 1e9*sqrt(cps_ol(1))));
plot(f, cps_cl, 'DisplayName', sprintf('CL, $\\epsilon_d = %.0f$ [nm,rms]', 1e9*sqrt(cps_cl(1))));
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
xlabel('Frequency [Hz]'); ylabel('CPS [$m^2$]');
legend('location', 'southwest', 'FontSize', 8);
xlim([f(1), f(end)]);
% ylim([1e-16, 1e-8]);
#+end_src
#+begin_src matlab :tangle no :exports results :results file replace
exportFig('figs/cps_comp_ol_cl_hac_iff.pdf', 'width', 'wide', 'height', 'normal');
#+end_src
#+name: fig:cps_comp_ol_cl_hac_iff
#+caption: Cumulative Power Spectrum of the open-loop and closed-loop motion error along one fast-jack
#+RESULTS:
[[file:figs/cps_comp_ol_cl_hac_iff.png]]
* Helping Functions :noexport:
** Initialize Path
#+NAME: m-init-path

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 KiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

View File

@ -0,0 +1,211 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="304.626pt" height="87.035pt" viewBox="0 0 304.626 87.035" version="1.2">
<defs>
<g>
<symbol overflow="visible" id="glyph0-0">
<path style="stroke:none;" d=""/>
</symbol>
<symbol overflow="visible" id="glyph0-1">
<path style="stroke:none;" d="M 7.109375 -2.578125 C 7.109375 -2.65625 7.0625 -2.6875 6.984375 -2.6875 C 6.75 -2.6875 6.171875 -2.65625 5.9375 -2.65625 L 4.5625 -2.6875 C 4.46875 -2.6875 4.359375 -2.6875 4.359375 -2.5 C 4.359375 -2.390625 4.4375 -2.390625 4.65625 -2.390625 C 4.65625 -2.390625 4.953125 -2.390625 5.171875 -2.359375 C 5.4375 -2.34375 5.484375 -2.3125 5.484375 -2.171875 C 5.484375 -2.09375 5.375 -1.640625 5.28125 -1.28125 C 5 -0.203125 3.71875 -0.09375 3.375 -0.09375 C 2.421875 -0.09375 1.390625 -0.65625 1.390625 -2.15625 C 1.390625 -2.46875 1.484375 -4.09375 2.53125 -5.375 C 3.0625 -6.046875 4.015625 -6.640625 4.984375 -6.640625 C 6 -6.640625 6.578125 -5.890625 6.578125 -4.75 C 6.578125 -4.34375 6.546875 -4.34375 6.546875 -4.234375 C 6.546875 -4.140625 6.65625 -4.140625 6.6875 -4.140625 C 6.828125 -4.140625 6.828125 -4.15625 6.875 -4.34375 L 7.5 -6.859375 C 7.5 -6.875 7.46875 -6.953125 7.390625 -6.953125 C 7.359375 -6.953125 7.34375 -6.9375 7.234375 -6.828125 L 6.546875 -6.078125 C 6.453125 -6.21875 6 -6.953125 4.90625 -6.953125 C 2.71875 -6.953125 0.5 -4.765625 0.5 -2.484375 C 0.5 -0.921875 1.59375 0.21875 3.1875 0.21875 C 3.625 0.21875 4.0625 0.125 4.421875 -0.015625 C 4.90625 -0.21875 5.09375 -0.421875 5.28125 -0.625 C 5.359375 -0.375 5.625 -0.015625 5.71875 -0.015625 C 5.765625 -0.015625 5.78125 -0.046875 5.78125 -0.046875 C 5.8125 -0.0625 5.90625 -0.4375 5.953125 -0.65625 L 6.140625 -1.40625 C 6.1875 -1.578125 6.234375 -1.75 6.265625 -1.90625 C 6.375 -2.359375 6.390625 -2.375 6.953125 -2.390625 C 7 -2.390625 7.109375 -2.390625 7.109375 -2.578125 Z M 7.109375 -2.578125 "/>
</symbol>
<symbol overflow="visible" id="glyph0-2">
<path style="stroke:none;" d="M 3.90625 -1.53125 C 3.90625 -1.890625 3.71875 -2.125 3.59375 -2.25 C 3.328125 -2.53125 3.046875 -2.578125 2.609375 -2.65625 C 2.25 -2.734375 1.859375 -2.8125 1.859375 -3.25 C 1.859375 -3.546875 2.09375 -4.140625 2.96875 -4.140625 C 3.21875 -4.140625 3.703125 -4.078125 3.859375 -3.6875 C 3.578125 -3.671875 3.375 -3.453125 3.375 -3.25 C 3.375 -3.109375 3.46875 -2.953125 3.6875 -2.953125 C 3.90625 -2.953125 4.140625 -3.125 4.140625 -3.515625 C 4.140625 -3.953125 3.71875 -4.359375 2.96875 -4.359375 C 1.671875 -4.359375 1.296875 -3.359375 1.296875 -2.921875 C 1.296875 -2.15625 2.03125 -2 2.3125 -1.9375 C 2.828125 -1.84375 3.34375 -1.734375 3.34375 -1.1875 C 3.34375 -0.9375 3.109375 -0.109375 1.9375 -0.109375 C 1.796875 -0.109375 1.03125 -0.109375 0.8125 -0.625 C 1.1875 -0.578125 1.421875 -0.875 1.421875 -1.15625 C 1.421875 -1.375 1.265625 -1.5 1.0625 -1.5 C 0.8125 -1.5 0.515625 -1.296875 0.515625 -0.84375 C 0.515625 -0.28125 1.078125 0.109375 1.921875 0.109375 C 3.515625 0.109375 3.90625 -1.078125 3.90625 -1.53125 Z M 3.90625 -1.53125 "/>
</symbol>
<symbol overflow="visible" id="glyph0-3">
<path style="stroke:none;" d="M 7.296875 -0.203125 C 7.296875 -0.3125 7.1875 -0.3125 7.09375 -0.3125 C 6.6875 -0.3125 6.5625 -0.40625 6.421875 -0.75 L 5.015625 -3.984375 C 5.015625 -4.015625 4.96875 -4.09375 4.96875 -4.125 C 4.96875 -4.125 5.140625 -4.265625 5.25 -4.34375 L 6.984375 -5.671875 C 7.90625 -6.359375 8.296875 -6.40625 8.59375 -6.421875 C 8.671875 -6.4375 8.765625 -6.453125 8.765625 -6.625 C 8.765625 -6.671875 8.734375 -6.734375 8.65625 -6.734375 C 8.4375 -6.734375 8.1875 -6.703125 7.953125 -6.703125 C 7.59375 -6.703125 7.21875 -6.734375 6.859375 -6.734375 C 6.796875 -6.734375 6.671875 -6.734375 6.671875 -6.53125 C 6.671875 -6.46875 6.71875 -6.4375 6.796875 -6.421875 C 7.015625 -6.40625 7.09375 -6.359375 7.09375 -6.21875 C 7.09375 -6.046875 6.796875 -5.8125 6.75 -5.765625 L 2.90625 -2.8125 L 3.6875 -5.96875 C 3.78125 -6.328125 3.796875 -6.421875 4.515625 -6.421875 C 4.765625 -6.421875 4.84375 -6.421875 4.84375 -6.625 C 4.84375 -6.71875 4.765625 -6.734375 4.71875 -6.734375 L 3.453125 -6.703125 L 2.171875 -6.734375 C 2.109375 -6.734375 1.984375 -6.734375 1.984375 -6.546875 C 1.984375 -6.421875 2.078125 -6.421875 2.265625 -6.421875 C 2.390625 -6.421875 2.578125 -6.421875 2.6875 -6.40625 C 2.84375 -6.390625 2.90625 -6.359375 2.90625 -6.25 C 2.90625 -6.21875 2.90625 -6.1875 2.875 -6.0625 L 1.546875 -0.765625 C 1.453125 -0.390625 1.421875 -0.3125 0.65625 -0.3125 C 0.484375 -0.3125 0.375 -0.3125 0.375 -0.125 C 0.375 0 0.5 0 0.515625 0 L 1.78125 -0.03125 L 2.40625 -0.015625 C 2.625 -0.015625 2.84375 0 3.046875 0 C 3.109375 0 3.25 0 3.25 -0.203125 C 3.25 -0.3125 3.15625 -0.3125 2.96875 -0.3125 C 2.609375 -0.3125 2.328125 -0.3125 2.328125 -0.484375 C 2.328125 -0.546875 2.390625 -0.765625 2.421875 -0.921875 L 2.8125 -2.46875 L 4.28125 -3.609375 L 5.421875 -0.953125 C 5.546875 -0.6875 5.546875 -0.671875 5.546875 -0.609375 C 5.546875 -0.3125 5.109375 -0.3125 5.03125 -0.3125 C 4.921875 -0.3125 4.8125 -0.3125 4.8125 -0.109375 C 4.8125 0 4.953125 0 4.953125 0 C 5.34375 0 5.765625 -0.03125 6.15625 -0.03125 C 6.375 -0.03125 6.90625 0 7.125 0 C 7.171875 0 7.296875 0 7.296875 -0.203125 Z M 7.296875 -0.203125 "/>
</symbol>
<symbol overflow="visible" id="glyph0-4">
<path style="stroke:none;" d="M 4.796875 -3.75 C 4.828125 -3.890625 4.828125 -3.921875 4.828125 -3.984375 C 4.828125 -4.15625 4.6875 -4.25 4.546875 -4.25 C 4.453125 -4.25 4.28125 -4.1875 4.203125 -4.046875 C 4.1875 -4 4.09375 -3.6875 4.0625 -3.515625 L 3.859375 -2.71875 L 3.421875 -0.953125 C 3.375 -0.796875 2.953125 -0.109375 2.3125 -0.109375 C 1.796875 -0.109375 1.703125 -0.546875 1.703125 -0.90625 C 1.703125 -1.359375 1.859375 -1.96875 2.203125 -2.84375 C 2.359375 -3.25 2.390625 -3.359375 2.390625 -3.546875 C 2.390625 -4 2.078125 -4.359375 1.59375 -4.359375 C 0.65625 -4.359375 0.28125 -2.921875 0.28125 -2.84375 C 0.28125 -2.734375 0.40625 -2.734375 0.40625 -2.734375 C 0.5 -2.734375 0.515625 -2.765625 0.5625 -2.921875 C 0.828125 -3.84375 1.21875 -4.140625 1.5625 -4.140625 C 1.640625 -4.140625 1.796875 -4.140625 1.796875 -3.828125 C 1.796875 -3.578125 1.703125 -3.328125 1.640625 -3.140625 C 1.25 -2.09375 1.0625 -1.53125 1.0625 -1.0625 C 1.0625 -0.1875 1.6875 0.109375 2.265625 0.109375 C 2.65625 0.109375 2.984375 -0.0625 3.265625 -0.328125 C 3.140625 0.171875 3.015625 0.65625 2.625 1.1875 C 2.359375 1.515625 1.984375 1.796875 1.53125 1.796875 C 1.40625 1.796875 0.953125 1.78125 0.78125 1.390625 C 0.953125 1.390625 1.078125 1.390625 1.21875 1.265625 C 1.3125 1.1875 1.40625 1.0625 1.40625 0.875 C 1.40625 0.5625 1.140625 0.515625 1.046875 0.515625 C 0.8125 0.515625 0.5 0.6875 0.5 1.15625 C 0.5 1.65625 0.921875 2.015625 1.53125 2.015625 C 2.546875 2.015625 3.5625 1.125 3.84375 0.015625 Z M 4.796875 -3.75 "/>
</symbol>
<symbol overflow="visible" id="glyph0-5">
<path style="stroke:none;" d="M 4.90625 -1.40625 C 4.90625 -1.515625 4.828125 -1.515625 4.796875 -1.515625 C 4.6875 -1.515625 4.6875 -1.46875 4.65625 -1.328125 C 4.484375 -0.6875 4.3125 -0.109375 3.90625 -0.109375 C 3.640625 -0.109375 3.609375 -0.359375 3.609375 -0.5625 C 3.609375 -0.796875 3.625 -0.875 3.671875 -1.03125 L 5.09375 -6.734375 C 5.09375 -6.734375 5.09375 -6.84375 4.953125 -6.84375 C 4.8125 -6.84375 3.875 -6.75 3.703125 -6.734375 C 3.625 -6.71875 3.5625 -6.671875 3.5625 -6.546875 C 3.5625 -6.421875 3.65625 -6.421875 3.8125 -6.421875 C 4.28125 -6.421875 4.296875 -6.359375 4.296875 -6.265625 L 4.265625 -6.0625 L 3.671875 -3.734375 C 3.5 -4.09375 3.21875 -4.359375 2.765625 -4.359375 C 1.609375 -4.359375 0.390625 -2.90625 0.390625 -1.46875 C 0.390625 -0.546875 0.9375 0.109375 1.703125 0.109375 C 1.90625 0.109375 2.390625 0.0625 2.984375 -0.625 C 3.0625 -0.21875 3.40625 0.109375 3.890625 0.109375 C 4.234375 0.109375 4.453125 -0.125 4.609375 -0.4375 C 4.78125 -0.78125 4.90625 -1.40625 4.90625 -1.40625 Z M 3.53125 -3.109375 L 3.03125 -1.171875 C 2.984375 -1 2.984375 -0.96875 2.84375 -0.8125 C 2.40625 -0.265625 2 -0.109375 1.71875 -0.109375 C 1.234375 -0.109375 1.09375 -0.65625 1.09375 -1.03125 C 1.09375 -1.53125 1.40625 -2.734375 1.640625 -3.1875 C 1.9375 -3.78125 2.390625 -4.140625 2.78125 -4.140625 C 3.421875 -4.140625 3.5625 -3.328125 3.5625 -3.265625 C 3.5625 -3.21875 3.546875 -3.15625 3.53125 -3.109375 Z M 3.53125 -3.109375 "/>
</symbol>
<symbol overflow="visible" id="glyph0-6">
<path style="stroke:none;" d="M 5.625 -1.40625 C 5.625 -1.515625 5.546875 -1.515625 5.515625 -1.515625 C 5.40625 -1.515625 5.40625 -1.484375 5.359375 -1.328125 C 5.171875 -0.65625 4.84375 -0.109375 4.359375 -0.109375 C 4.1875 -0.109375 4.125 -0.203125 4.125 -0.4375 C 4.125 -0.6875 4.203125 -0.921875 4.296875 -1.140625 C 4.484375 -1.65625 4.90625 -2.734375 4.90625 -3.296875 C 4.90625 -3.96875 4.46875 -4.359375 3.765625 -4.359375 C 2.875 -4.359375 2.390625 -3.734375 2.234375 -3.5 C 2.171875 -4.046875 1.78125 -4.359375 1.328125 -4.359375 C 0.875 -4.359375 0.6875 -3.96875 0.578125 -3.796875 C 0.421875 -3.453125 0.28125 -2.875 0.28125 -2.84375 C 0.28125 -2.734375 0.40625 -2.734375 0.40625 -2.734375 C 0.5 -2.734375 0.515625 -2.75 0.578125 -2.96875 C 0.734375 -3.671875 0.9375 -4.140625 1.296875 -4.140625 C 1.484375 -4.140625 1.59375 -4.015625 1.59375 -3.6875 C 1.59375 -3.484375 1.5625 -3.375 1.4375 -2.859375 L 0.875 -0.578125 C 0.84375 -0.4375 0.78125 -0.203125 0.78125 -0.15625 C 0.78125 0.015625 0.921875 0.109375 1.0625 0.109375 C 1.1875 0.109375 1.359375 0.03125 1.421875 -0.171875 C 1.4375 -0.1875 1.5625 -0.65625 1.609375 -0.890625 L 1.828125 -1.78125 C 1.890625 -2 1.953125 -2.21875 2 -2.4375 L 2.125 -2.9375 C 2.28125 -3.25 2.796875 -4.140625 3.734375 -4.140625 C 4.1875 -4.140625 4.265625 -3.78125 4.265625 -3.453125 C 4.265625 -2.84375 3.78125 -1.578125 3.625 -1.15625 C 3.546875 -0.921875 3.53125 -0.8125 3.53125 -0.703125 C 3.53125 -0.234375 3.875 0.109375 4.34375 0.109375 C 5.265625 0.109375 5.625 -1.328125 5.625 -1.40625 Z M 5.625 -1.40625 "/>
</symbol>
<symbol overflow="visible" id="glyph1-0">
<path style="stroke:none;" d=""/>
</symbol>
<symbol overflow="visible" id="glyph1-1">
<path style="stroke:none;" d="M 3.265625 2.359375 C 3.265625 2.34375 3.265625 2.3125 3.09375 2.15625 C 1.859375 0.90625 1.546875 -0.953125 1.546875 -2.46875 C 1.546875 -4.1875 1.921875 -5.890625 3.140625 -7.125 C 3.265625 -7.25 3.265625 -7.265625 3.265625 -7.296875 C 3.265625 -7.359375 3.21875 -7.390625 3.171875 -7.390625 C 3.0625 -7.390625 2.171875 -6.71875 1.59375 -5.46875 C 1.09375 -4.390625 0.96875 -3.296875 0.96875 -2.46875 C 0.96875 -1.703125 1.078125 -0.5 1.625 0.609375 C 2.21875 1.828125 3.0625 2.46875 3.171875 2.46875 C 3.21875 2.46875 3.265625 2.4375 3.265625 2.359375 Z M 3.265625 2.359375 "/>
</symbol>
<symbol overflow="visible" id="glyph1-2">
<path style="stroke:none;" d="M 2.84375 -2.46875 C 2.84375 -3.234375 2.734375 -4.421875 2.203125 -5.546875 C 1.609375 -6.75 0.765625 -7.390625 0.65625 -7.390625 C 0.59375 -7.390625 0.5625 -7.359375 0.5625 -7.296875 C 0.5625 -7.265625 0.5625 -7.25 0.75 -7.0625 C 1.71875 -6.09375 2.28125 -4.53125 2.28125 -2.46875 C 2.28125 -0.78125 1.90625 0.953125 0.6875 2.203125 C 0.5625 2.3125 0.5625 2.34375 0.5625 2.359375 C 0.5625 2.421875 0.59375 2.46875 0.65625 2.46875 C 0.765625 2.46875 1.640625 1.796875 2.234375 0.546875 C 2.734375 -0.546875 2.84375 -1.640625 2.84375 -2.46875 Z M 2.84375 -2.46875 "/>
</symbol>
<symbol overflow="visible" id="glyph2-0">
<path style="stroke:none;" d=""/>
</symbol>
<symbol overflow="visible" id="glyph2-1">
<path style="stroke:none;" d="M 11.46875 -4.234375 C 11.46875 -4.546875 11.1875 -4.546875 10.9375 -4.546875 L 6.421875 -4.546875 L 6.421875 -9.0625 C 6.421875 -9.296875 6.421875 -9.59375 6.125 -9.59375 C 5.828125 -9.59375 5.828125 -9.3125 5.828125 -9.0625 L 5.828125 -4.546875 L 1.3125 -4.546875 C 1.078125 -4.546875 0.78125 -4.546875 0.78125 -4.25 C 0.78125 -3.953125 1.0625 -3.953125 1.3125 -3.953125 L 5.828125 -3.953125 L 5.828125 0.5625 C 5.828125 0.796875 5.828125 1.09375 6.109375 1.09375 C 6.421875 1.09375 6.421875 0.8125 6.421875 0.5625 L 6.421875 -3.953125 L 10.9375 -3.953125 C 11.171875 -3.953125 11.46875 -3.953125 11.46875 -4.234375 Z M 11.46875 -4.234375 "/>
</symbol>
<symbol overflow="visible" id="glyph3-0">
<path style="stroke:none;" d=""/>
</symbol>
<symbol overflow="visible" id="glyph3-1">
<path style="stroke:none;" d="M 6.84375 -2.46875 C 6.84375 -2.65625 6.65625 -2.65625 6.515625 -2.65625 L 1.140625 -2.65625 C 1 -2.65625 0.8125 -2.65625 0.8125 -2.46875 C 0.8125 -2.265625 1 -2.265625 1.140625 -2.265625 L 6.515625 -2.265625 C 6.65625 -2.265625 6.84375 -2.265625 6.84375 -2.46875 Z M 6.84375 -2.46875 "/>
</symbol>
<symbol overflow="visible" id="glyph4-0">
<path style="stroke:none;" d=""/>
</symbol>
<symbol overflow="visible" id="glyph4-1">
<path style="stroke:none;" d="M 2.75 -4.34375 C 2.75 -4.640625 2.453125 -4.84375 2.0625 -4.84375 C 1.515625 -4.84375 0.90625 -4.46875 0.90625 -3.734375 L 0.90625 -2.96875 L 0.3125 -2.96875 L 0.3125 -2.71875 L 0.90625 -2.71875 L 0.90625 -0.546875 C 0.90625 -0.25 0.828125 -0.25 0.390625 -0.25 L 0.390625 0 C 0.421875 0 0.890625 -0.03125 1.171875 -0.03125 L 2.0625 0 L 2.0625 -0.25 L 1.921875 -0.25 C 1.421875 -0.25 1.421875 -0.328125 1.421875 -0.5625 L 1.421875 -2.71875 L 2.28125 -2.71875 L 2.28125 -2.96875 L 1.390625 -2.96875 L 1.390625 -3.734375 C 1.390625 -4.375 1.765625 -4.65625 2.0625 -4.65625 C 2.125 -4.65625 2.1875 -4.640625 2.265625 -4.625 C 2.15625 -4.5625 2.109375 -4.453125 2.109375 -4.34375 C 2.109375 -4.15625 2.234375 -4.03125 2.421875 -4.03125 C 2.609375 -4.03125 2.75 -4.15625 2.75 -4.34375 Z M 2.75 -4.34375 "/>
</symbol>
<symbol overflow="visible" id="glyph4-2">
<path style="stroke:none;" d="M 1.671875 0.3125 L 1.671875 -3.03125 L 0.578125 -2.96875 L 0.578125 -2.71875 C 1.09375 -2.71875 1.15625 -2.671875 1.15625 -2.328125 L 1.15625 0.328125 C 1.15625 0.59375 1.109375 1.21875 0.640625 1.21875 C 0.625 1.21875 0.453125 1.21875 0.296875 1.140625 C 0.3125 1.140625 0.46875 1.046875 0.46875 0.84375 C 0.46875 0.65625 0.328125 0.53125 0.140625 0.53125 C -0.0625 0.53125 -0.1875 0.65625 -0.1875 0.859375 C -0.1875 1.21875 0.234375 1.40625 0.640625 1.40625 C 1.203125 1.40625 1.671875 0.96875 1.671875 0.3125 Z M 1.671875 -4.140625 C 1.671875 -4.375 1.5 -4.546875 1.28125 -4.546875 C 1.046875 -4.546875 0.890625 -4.359375 0.890625 -4.15625 C 0.890625 -3.9375 1.0625 -3.75 1.28125 -3.75 C 1.515625 -3.75 1.671875 -3.953125 1.671875 -4.140625 Z M 1.671875 -4.140625 "/>
</symbol>
<symbol overflow="visible" id="glyph5-0">
<path style="stroke:none;" d=""/>
</symbol>
<symbol overflow="visible" id="glyph5-1">
<path style="stroke:none;" d="M 1.640625 -0.046875 C 1.640625 -0.46875 1.484375 -0.796875 1.171875 -0.796875 C 0.9375 -0.796875 0.765625 -0.609375 0.765625 -0.40625 C 0.765625 -0.171875 0.9375 0 1.171875 0 C 1.34375 0 1.453125 -0.109375 1.453125 -0.109375 C 1.453125 0.265625 1.390625 0.703125 0.921875 1.15625 C 0.890625 1.171875 0.875 1.203125 0.875 1.234375 C 0.875 1.28125 0.921875 1.328125 0.96875 1.328125 C 1.0625 1.328125 1.640625 0.78125 1.640625 -0.046875 Z M 1.640625 -0.046875 "/>
</symbol>
<symbol overflow="visible" id="glyph5-2">
<path style="stroke:none;" d="M 6.65625 -0.984375 C 6.65625 -1.078125 6.5625 -1.078125 6.546875 -1.078125 C 6.4375 -1.078125 6.4375 -1.03125 6.40625 -0.953125 C 6.25 -0.40625 5.953125 -0.125 5.671875 -0.125 C 5.53125 -0.125 5.5 -0.21875 5.5 -0.359375 C 5.5 -0.53125 5.546875 -0.609375 5.65625 -0.921875 C 5.75 -1.140625 6.03125 -1.875 6.03125 -2.25 C 6.03125 -2.359375 6.03125 -2.65625 5.78125 -2.859375 C 5.65625 -2.9375 5.453125 -3.03125 5.140625 -3.03125 C 4.515625 -3.03125 4.140625 -2.625 3.90625 -2.34375 C 3.859375 -2.921875 3.375 -3.03125 3.015625 -3.03125 C 2.453125 -3.03125 2.0625 -2.6875 1.859375 -2.40625 C 1.8125 -2.890625 1.40625 -3.03125 1.109375 -3.03125 C 0.8125 -3.03125 0.65625 -2.828125 0.578125 -2.671875 C 0.421875 -2.40625 0.328125 -2.015625 0.328125 -1.984375 C 0.328125 -1.890625 0.421875 -1.890625 0.4375 -1.890625 C 0.53125 -1.890625 0.546875 -1.921875 0.59375 -2.109375 C 0.703125 -2.515625 0.828125 -2.84375 1.09375 -2.84375 C 1.28125 -2.84375 1.328125 -2.6875 1.328125 -2.515625 C 1.328125 -2.375 1.265625 -2.125 1.21875 -1.9375 L 0.84375 -0.4375 C 0.8125 -0.34375 0.765625 -0.171875 0.765625 -0.15625 C 0.765625 0 0.890625 0.0625 1 0.0625 C 1.125 0.0625 1.234375 -0.015625 1.28125 -0.078125 C 1.3125 -0.140625 1.359375 -0.359375 1.40625 -0.515625 L 1.546875 -1.125 C 1.59375 -1.28125 1.640625 -1.4375 1.671875 -1.59375 C 1.75 -1.875 1.75 -1.921875 1.953125 -2.21875 C 2.15625 -2.484375 2.46875 -2.84375 2.984375 -2.84375 C 3.390625 -2.84375 3.390625 -2.5 3.390625 -2.359375 C 3.390625 -2.1875 3.375 -2.109375 3.28125 -1.71875 L 2.984375 -0.5625 C 2.953125 -0.421875 2.890625 -0.1875 2.890625 -0.15625 C 2.890625 0 3.015625 0.0625 3.125 0.0625 C 3.25 0.0625 3.359375 -0.015625 3.390625 -0.078125 C 3.4375 -0.140625 3.484375 -0.359375 3.515625 -0.515625 L 3.671875 -1.125 C 3.71875 -1.28125 3.75 -1.4375 3.796875 -1.59375 C 3.859375 -1.890625 3.859375 -1.90625 4 -2.109375 C 4.21875 -2.453125 4.5625 -2.84375 5.109375 -2.84375 C 5.484375 -2.84375 5.515625 -2.53125 5.515625 -2.359375 C 5.515625 -1.953125 5.21875 -1.1875 5.109375 -0.890625 C 5.03125 -0.703125 5 -0.640625 5 -0.53125 C 5 -0.15625 5.3125 0.0625 5.65625 0.0625 C 6.34375 0.0625 6.65625 -0.875 6.65625 -0.984375 Z M 6.65625 -0.984375 "/>
</symbol>
<symbol overflow="visible" id="glyph5-3">
<path style="stroke:none;" d="M 4.328125 -0.984375 C 4.328125 -1.078125 4.234375 -1.078125 4.203125 -1.078125 C 4.109375 -1.078125 4.109375 -1.046875 4.0625 -0.859375 C 3.96875 -0.53125 3.84375 -0.125 3.5625 -0.125 C 3.375 -0.125 3.328125 -0.28125 3.328125 -0.46875 C 3.328125 -0.578125 3.390625 -0.828125 3.4375 -1 L 3.578125 -1.625 L 3.734375 -2.234375 C 3.78125 -2.40625 3.859375 -2.71875 3.859375 -2.75 C 3.859375 -2.890625 3.75 -2.96875 3.625 -2.96875 C 3.375 -2.96875 3.328125 -2.765625 3.265625 -2.546875 L 2.921875 -1.109375 C 2.875 -0.984375 2.8125 -0.71875 2.796875 -0.703125 C 2.671875 -0.5 2.390625 -0.125 1.96875 -0.125 C 1.5 -0.125 1.5 -0.578125 1.5 -0.703125 C 1.5 -1.109375 1.6875 -1.59375 1.875 -2.09375 C 1.9375 -2.234375 1.984375 -2.328125 1.984375 -2.453125 C 1.984375 -2.796875 1.671875 -3.03125 1.328125 -3.03125 C 0.640625 -3.03125 0.328125 -2.09375 0.328125 -1.984375 C 0.328125 -1.890625 0.421875 -1.890625 0.4375 -1.890625 C 0.53125 -1.890625 0.546875 -1.921875 0.5625 -2 C 0.734375 -2.5625 1.03125 -2.84375 1.296875 -2.84375 C 1.421875 -2.84375 1.46875 -2.765625 1.46875 -2.609375 C 1.46875 -2.453125 1.421875 -2.296875 1.34375 -2.140625 C 0.984375 -1.1875 0.984375 -1 0.984375 -0.8125 C 0.984375 -0.6875 0.984375 -0.375 1.234375 -0.15625 C 1.4375 0.015625 1.703125 0.0625 1.9375 0.0625 C 2.375 0.0625 2.609375 -0.171875 2.84375 -0.390625 C 2.984375 0.0625 3.453125 0.0625 3.53125 0.0625 C 3.765625 0.0625 3.953125 -0.0625 4.078125 -0.296875 C 4.234375 -0.5625 4.328125 -0.96875 4.328125 -0.984375 Z M 4.328125 -0.984375 "/>
</symbol>
</g>
<clipPath id="clip1">
<path d="M 1.484375 15 L 37 15 L 37 63 L 1.484375 63 Z M 1.484375 15 "/>
</clipPath>
<clipPath id="clip2">
<path d="M 240 51 L 288 51 L 288 86.082031 L 240 86.082031 Z M 240 51 "/>
</clipPath>
<clipPath id="clip3">
<path d="M 1.484375 36 L 28 36 L 28 69 L 1.484375 69 Z M 1.484375 36 "/>
</clipPath>
<clipPath id="clip4">
<path d="M 277 74 L 302.769531 74 L 302.769531 76 L 277 76 Z M 277 74 "/>
</clipPath>
<clipPath id="clip5">
<path d="M 261 59 L 294 59 L 294 86.082031 L 261 86.082031 Z M 261 59 "/>
</clipPath>
<clipPath id="clip6">
<path d="M 282 23 L 302.769531 23 L 302.769531 55 L 282 55 Z M 282 23 "/>
</clipPath>
</defs>
<g id="surface1">
<path style="fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.99628;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -17.008146 -14.172999 L 17.009419 -14.172999 L 17.009419 14.172997 L -17.008146 14.172997 Z M -17.008146 -14.172999 " transform="matrix(0.989034,0,0,-0.989034,177.934917,38.876952)"/>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph0-1" x="167.919958" y="41.339647"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph1-1" x="175.667062" y="41.339647"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph0-2" x="179.49858" y="41.339647"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph1-2" x="184.117369" y="41.339647"/>
</g>
<path style="fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.99628;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -45.851786 0.00197369 C -45.851786 5.503711 -50.31479 9.962765 -55.816527 9.962765 C -61.318265 9.962765 -65.777319 5.503711 -65.777319 0.00197369 C -65.777319 -5.503714 -61.318265 -9.962768 -55.816527 -9.962768 C -50.31479 -9.962768 -45.851786 -5.503714 -45.851786 0.00197369 Z M -45.851786 0.00197369 " transform="matrix(0.989034,0,0,-0.989034,177.934917,38.876952)"/>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph2-1" x="116.603924" y="42.997268"/>
</g>
<path style="fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.99628;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -128.638524 -14.172999 L -94.624909 -14.172999 L -94.624909 14.172997 L -128.638524 14.172997 Z M -128.638524 -14.172999 " transform="matrix(0.989034,0,0,-0.989034,177.934917,38.876952)"/>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph0-3" x="56.850441" y="41.339647"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph1-1" x="65.923839" y="41.339647"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph0-2" x="69.756346" y="41.339647"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph1-2" x="74.375136" y="41.339647"/>
</g>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;" d="M 22.175781 38.875 C 22.175781 33.433594 17.765625 29.023438 12.324219 29.023438 C 6.882812 29.023438 2.46875 33.433594 2.46875 38.875 C 2.46875 44.320312 6.882812 48.730469 12.324219 48.730469 C 17.765625 48.730469 22.175781 44.320312 22.175781 38.875 Z M 22.175781 38.875 "/>
<g clip-path="url(#clip1)" clip-rule="nonzero">
<path style="fill:none;stroke-width:0.99628;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -157.486114 0.00197369 C -157.486114 5.503711 -161.945168 9.962765 -167.446906 9.962765 C -172.948644 9.962765 -177.411647 5.503711 -177.411647 0.00197369 C -177.411647 -5.503714 -172.948644 -9.962768 -167.446906 -9.962768 C -161.945168 -9.962768 -157.486114 -5.503714 -157.486114 0.00197369 Z M -157.486114 0.00197369 " transform="matrix(0.989034,0,0,-0.989034,177.934917,38.876952)"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph2-1" x="6.198049" y="42.997268"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph3-1" x="2.691923" y="56.448132"/>
</g>
<path style="fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.99628;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 65.778592 0.00197369 C 65.778592 5.503711 61.319539 9.962765 55.813851 9.962765 C 50.312113 9.962765 45.85306 5.503711 45.85306 0.00197369 C 45.85306 -5.503714 50.312113 -9.962768 55.813851 -9.962768 C 61.319539 -9.962768 65.778592 -5.503714 65.778592 0.00197369 Z M 65.778592 0.00197369 " transform="matrix(0.989034,0,0,-0.989034,177.934917,38.876952)"/>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph2-1" x="227.0098" y="42.997268"/>
</g>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;" d="M 273.75 75.242188 C 273.75 69.796875 269.335938 65.386719 263.894531 65.386719 C 258.453125 65.386719 254.042969 69.796875 254.042969 75.242188 C 254.042969 80.683594 258.453125 85.09375 263.894531 85.09375 C 269.335938 85.09375 273.75 80.683594 273.75 75.242188 Z M 273.75 75.242188 "/>
<g clip-path="url(#clip2)" clip-rule="nonzero">
<path style="fill:none;stroke-width:0.99628;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 96.877432 -36.768435 C 96.877432 -31.262747 92.414429 -26.803694 86.912691 -26.803694 C 81.410953 -26.803694 76.951899 -31.262747 76.951899 -36.768435 C 76.951899 -42.270173 81.410953 -46.729226 86.912691 -46.729226 C 92.414429 -46.729226 96.877432 -42.270173 96.877432 -36.768435 Z M 96.877432 -36.768435 " transform="matrix(0.989034,0,0,-0.989034,177.934917,38.876952)"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph2-1" x="257.765793" y="79.360095"/>
</g>
<path style="fill:none;stroke-width:0.99628;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -157.486114 0.00197369 L -133.772953 0.00197369 " transform="matrix(0.989034,0,0,-0.989034,177.934917,38.876952)"/>
<path style="fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;stroke-width:0.99628;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 6.051779 0.00197369 L 1.608524 1.684486 L 3.085659 0.00197369 L 1.608524 -1.684489 Z M 6.051779 0.00197369 " transform="matrix(0.989034,0,0,-0.989034,42.823178,38.876952)"/>
<path style="fill:none;stroke-width:0.99628;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -94.127264 0.00197369 L -70.410154 0.00197369 " transform="matrix(0.989034,0,0,-0.989034,177.934917,38.876952)"/>
<path style="fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;stroke-width:0.99628;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 6.051449 0.00197369 L 1.608194 1.684486 L 3.089279 0.00197369 L 1.608194 -1.684489 Z M 6.051449 0.00197369 " transform="matrix(0.989034,0,0,-0.989034,105.487567,38.876952)"/>
<path style="fill:none;stroke-width:0.99628;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -45.851786 0.00197369 L -22.138625 0.00197369 " transform="matrix(0.989034,0,0,-0.989034,177.934917,38.876952)"/>
<path style="fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;stroke-width:0.99628;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 6.054577 0.00197369 L 1.607372 1.684486 L 3.088458 0.00197369 L 1.607372 -1.684489 Z M 6.054577 0.00197369 " transform="matrix(0.989034,0,0,-0.989034,153.230566,38.876952)"/>
<path style="fill:none;stroke-width:0.99628;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 17.507064 0.00197369 L 41.220225 0.00197369 " transform="matrix(0.989034,0,0,-0.989034,177.934917,38.876952)"/>
<path style="fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;stroke-width:0.99628;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 6.054247 0.00197369 L 1.607042 1.684486 L 3.088127 0.00197369 L 1.607042 -1.684489 Z M 6.054247 0.00197369 " transform="matrix(0.989034,0,0,-0.989034,215.894955,38.876952)"/>
<path style="fill:none;stroke-width:0.99628;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 86.912691 0.00197369 L 86.912691 -22.170859 " transform="matrix(0.989034,0,0,-0.989034,177.934917,38.876952)"/>
<path style="fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;stroke-width:0.99628;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 6.053631 -0.000809243 L 1.610376 1.681704 L 3.087511 -0.000809243 L 1.610376 -1.683322 Z M 6.053631 -0.000809243 " transform="matrix(0,0.989034,0.989034,0,263.895332,57.997127)"/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 265.867188 38.875 C 265.867188 37.789062 264.984375 36.90625 263.894531 36.90625 C 262.808594 36.90625 261.925781 37.789062 261.925781 38.875 C 261.925781 39.964844 262.808594 40.847656 263.894531 40.847656 C 264.984375 40.847656 265.867188 39.964844 265.867188 38.875 Z M 265.867188 38.875 "/>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph0-4" x="258.789443" y="32.281084"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph4-1" x="263.620875" y="33.758701"/>
<use xlink:href="#glyph4-2" x="266.063908" y="33.758701"/>
</g>
<path style="fill:none;stroke-width:0.99628;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 76.951899 -36.768435 L -167.446906 -36.768435 L -167.446906 -14.595602 " transform="matrix(0.989034,0,0,-0.989034,177.934917,38.876952)"/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 12.324219 50.132812 L 10.660156 54.53125 L 12.324219 53.066406 L 13.988281 54.53125 Z M 12.324219 50.132812 "/>
<g clip-path="url(#clip3)" clip-rule="nonzero">
<path style="fill:none;stroke-width:0.99628;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 6.05418 -0.000394043 L 1.606975 1.682119 L 3.08806 -0.000394043 L 1.606975 -1.682907 Z M 6.05418 -0.000394043 " transform="matrix(0,-0.989034,-0.989034,0,12.323829,56.120603)"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph0-4" x="16.102236" y="56.748798"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph4-1" x="20.933667" y="58.227404"/>
<use xlink:href="#glyph4-2" x="23.3767" y="58.227404"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph5-1" x="25.819496" y="58.227404"/>
<use xlink:href="#glyph5-2" x="28.159759" y="58.227404"/>
</g>
<path style="fill:none;stroke-width:0.99628;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -55.816527 14.5956 L -55.816527 38.308761 " transform="matrix(0.989034,0,0,-0.989034,177.934917,38.876952)"/>
<path style="fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;stroke-width:0.99628;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 6.054182 -0.000757374 L 1.606977 1.681755 L 3.088062 -0.000757374 L 1.606977 -1.68327 Z M 6.054182 -0.000757374 " transform="matrix(0,0.989034,0.989034,0,122.731218,21.633301)"/>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph0-5" x="126.509101" y="11.607304"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph5-3" x="131.637242" y="13.084921"/>
</g>
<path style="fill:none;stroke-width:0.99628;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 55.813851 14.5956 L 55.813851 38.308761 " transform="matrix(0.989034,0,0,-0.989034,177.934917,38.876952)"/>
<path style="fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;stroke-width:0.99628;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 6.054182 -0.00191879 L 1.606977 1.684544 L 3.088062 -0.00191879 L 1.606977 -1.684432 Z M 6.054182 -0.00191879 " transform="matrix(0,0.989034,0.989034,0,233.138616,21.633301)"/>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph0-5" x="236.914976" y="11.607304"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph4-1" x="242.043118" y="13.084921"/>
<use xlink:href="#glyph4-2" x="244.486151" y="13.084921"/>
</g>
<g clip-path="url(#clip4)" clip-rule="nonzero">
<path style="fill:none;stroke-width:0.99628;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 101.510266 -36.768435 L 125.223428 -36.768435 " transform="matrix(0.989034,0,0,-0.989034,177.934917,38.876952)"/>
</g>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 275.152344 75.242188 L 279.546875 76.90625 L 278.085938 75.242188 L 279.546875 73.578125 Z M 275.152344 75.242188 "/>
<g clip-path="url(#clip5)" clip-rule="nonzero">
<path style="fill:none;stroke-width:0.99628;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 6.053016 0.00142477 L 1.60976 1.683938 L 3.086896 0.00142477 L 1.60976 -1.681088 Z M 6.053016 0.00142477 " transform="matrix(-0.989034,0,0,0.989034,281.138983,75.240778)"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph0-6" x="286.713832" y="68.643911"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph4-1" x="292.628256" y="70.122517"/>
<use xlink:href="#glyph4-2" x="295.071288" y="70.122517"/>
</g>
<path style="fill:none;stroke-width:0.99628;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 65.778592 0.00197369 L 120.590593 0.00197369 " transform="matrix(0.989034,0,0,-0.989034,177.934917,38.876952)"/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 300.382812 38.875 L 295.984375 37.210938 L 297.449219 38.875 L 295.984375 40.542969 Z M 300.382812 38.875 "/>
<g clip-path="url(#clip6)" clip-rule="nonzero">
<path style="fill:none;stroke-width:0.99628;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 6.054536 0.00197369 L 1.60733 1.684486 L 3.088416 0.00197369 L 1.60733 -1.684489 Z M 6.054536 0.00197369 " transform="matrix(0.989034,0,0,-0.989034,294.39467,38.876952)"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

View File

@ -54,10 +54,8 @@ G_fs.OutputName = {'fs_ur', 'fs_uh', 'fs_d'};
% #+RESULTS:
% | -1.4113e-13 | 1.0339e-13 | 3.774e-14 |
% | 1.0339e-13 | -1.4113e-13 | 3.774e-14 |
% | 3.7792e-14 | 3.7792e-14 | -7.5585e-14 |
% The Bode plot of the identified dynamics is shown in Figure [[fig:iff_plant_bode_plot]].
% At high frequency, the diagonal terms are constants while the off-diagonal terms have some roll-off.
%% Bode plot for the plant
@ -82,7 +80,7 @@ for i = 1:2
end
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
ylabel('Amplitude [m/N]'); set(gca, 'XTickLabel',[]);
ylabel('Amplitude'); set(gca, 'XTickLabel',[]);
legend('location', 'northwest', 'FontSize', 8, 'NumColumns', 2);
ylim([1e-13, 1e-7]);
@ -102,7 +100,11 @@ linkaxes([ax1,ax2],'x');
xlim([freqs(1), freqs(end)]);
% Controller - Root Locus
% We want to have integral action around the resonances of the system, but we do not want to integrate at low frequency.
% Therefore, we can use a low pass filter.
%% Integral Force Feedback Controller
Kiff_g1 = eye(3)*1/(1 + s/2/pi/20);
%% Root Locus for IFF
@ -141,10 +143,19 @@ legend('location', 'northwest');
% [[file:figs/iff_root_locus.png]]
%% Integral Force Feedback Controller
%% Integral Force Feedback Controller with optimal gain
Kiff = g*Kiff_g1;
% Damped Plant
%% Save the IFF controller
save('mat/Kiff.mat', 'Kiff');
% #+name: fig:schematic_jacobian_frame_fastjack_iff
% #+caption: Use of Jacobian matrices to obtain the system in the frame of the fastjacks
% #+RESULTS:
% [[file:figs/schematic_jacobian_frame_fastjack_iff.png]]
%% Input/Output definition
clear io; io_i = 1;
@ -157,8 +168,8 @@ io(io_i) = linio([mdl, '/control_system'], 1, 'input'); io_i = io_i + 1;
% Force Sensor {3x1} [m]
io(io_i) = linio([mdl, '/DCM'], 1, 'openoutput'); io_i = io_i + 1;
%% DCM Kinematics
load('mat/dcm_kinematics.mat');
%% Load DCM Kinematics
load('dcm_kinematics.mat');
%% Identification of the Open Loop plant
controller.type = 0; % Open Loop
@ -172,6 +183,12 @@ G_dp = J_a_111*inv(J_s_111)*linearize(mdl, io);
G_dp.InputName = {'u_ur', 'u_uh', 'u_d'};
G_dp.OutputName = {'d_ur', 'd_uh', 'd_d'};
% The dynamics from $\bm{u}$ to $\bm{d}_{\text{fj}}$ (open-loop dynamics) and from $\bm{u}^\prime$ to $\bm{d}_{\text{fs}}$ are compared in Figure [[fig:comp_damped_undamped_plant_iff_bode_plot]].
% It is clear that the Integral Force Feedback control strategy is very effective in damping the resonances of the plant.
%% Comparison of the damped and undamped plant
figure;
tiledlayout(3, 1, 'TileSpacing', 'Compact', 'Padding', 'None');
@ -221,5 +238,3 @@ ylim([-180, 0]);
linkaxes([ax1,ax2],'x');
xlim([freqs(1), freqs(end)]);
save('mat/Kiff.mat', 'Kiff');

View File

@ -40,13 +40,11 @@ clear io; io_i = 1;
%% Inputs
% Control Input {3x1} [N]
io(io_i) = linio([mdl, '/u'], 1, 'openinput'); io_i = io_i + 1;
% % Stepper Displacement {3x1} [m]
% io(io_i) = linio([mdl, '/d'], 1, 'openinput'); io_i = io_i + 1;
io(io_i) = linio([mdl, '/control_system'], 1, 'openinput'); io_i = io_i + 1;
%% Outputs
% Strain Gauges {3x1} [m]
io(io_i) = linio([mdl, '/sg'], 1, 'openoutput'); io_i = io_i + 1;
io(io_i) = linio([mdl, '/DCM'], 2, 'openoutput'); io_i = io_i + 1;
%% Extraction of the dynamics
G_sg = linearize(mdl, io);
@ -57,12 +55,12 @@ G_sg.OutputName = {'sg_ur', 'sg_uh', 'sg_d'};
% #+RESULTS:
% | -1.4113e-13 | 1.0339e-13 | 3.774e-14 |
% | 1.0339e-13 | -1.4113e-13 | 3.774e-14 |
% | 3.7792e-14 | 3.7792e-14 | -7.5585e-14 |
% | 4.4443e-09 | 1.0339e-13 | 3.774e-14 |
% | 1.0339e-13 | 4.4443e-09 | 3.774e-14 |
% | 3.7792e-14 | 3.7792e-14 | 4.4444e-09 |
%% Bode plot for the plant
%% Bode plot for the plant (strain gauge output)
figure;
tiledlayout(3, 1, 'TileSpacing', 'Compact', 'Padding', 'None');
@ -83,7 +81,8 @@ end
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
ylabel('Amplitude [m/N]'); set(gca, 'XTickLabel',[]);
legend('location', 'southwest', 'FontSize', 8, 'NumColumns', 2);
legend('location', 'southeast', 'FontSize', 8, 'NumColumns', 2);
ylim([1e-14, 1e-7]);
ax2 = nexttile;
hold on;
@ -95,7 +94,133 @@ set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
xlabel('Frequency [Hz]'); ylabel('Phase [deg]');
hold off;
yticks(-360:90:360);
ylim([-180, 180]);
ylim([-180, 0]);
linkaxes([ax1,ax2],'x');
xlim([freqs(1), freqs(end)]);
% Relative Active Damping
Krad_g1 = eye(3)*s/(s^2/(2*pi*500)^2 + 2*s/(2*pi*500) + 1);
% As can be seen in Figure [[fig:relative_damping_root_locus]], very little damping can be added using relative damping strategy using strain gauges.
%% Root Locus for IFF
gains = logspace(3, 8, 200);
figure;
hold on;
plot(real(pole(G_sg)), imag(pole(G_sg)), 'x', 'color', colors(1,:), ...
'DisplayName', '$g = 0$');
plot(real(tzero(G_sg)), imag(tzero(G_sg)), 'o', 'color', colors(1,:), ...
'HandleVisibility', 'off');
for g = gains
clpoles = pole(feedback(G_sg, g*Krad_g1, -1));
plot(real(clpoles), imag(clpoles), '.', 'color', colors(1,:), ...
'HandleVisibility', 'off');
end
% Optimal gain
g = 2e5;
clpoles = pole(feedback(G_sg, g*Krad_g1, -1));
plot(real(clpoles), imag(clpoles), 'x', 'color', colors(2,:), ...
'DisplayName', sprintf('$g=%.0e$', g));
hold off;
xlim([-6, 0]); ylim([0, 2700]);
xlabel('Real Part'); ylabel('Imaginary Part');
legend('location', 'northwest');
% #+name: fig:relative_damping_root_locus
% #+caption: Root Locus for the relative damping control
% #+RESULTS:
% [[file:figs/relative_damping_root_locus.png]]
Krad = -g*Krad_g1;
% Damped Plant
% The controller is implemented on Simscape, and the damped plant is identified.
%% Input/Output definition
clear io; io_i = 1;
%% Inputs
% Control Input {3x1} [N]
io(io_i) = linio([mdl, '/control_system'], 1, 'input'); io_i = io_i + 1;
%% Outputs
% Force Sensor {3x1} [m]
io(io_i) = linio([mdl, '/DCM'], 1, 'openoutput'); io_i = io_i + 1;
%% DCM Kinematics
load('dcm_kinematics.mat');
%% Identification of the Open Loop plant
controller.type = 0; % Open Loop
G_ol = J_a_111*inv(J_s_111)*linearize(mdl, io);
G_ol.InputName = {'u_ur', 'u_uh', 'u_d'};
G_ol.OutputName = {'d_ur', 'd_uh', 'd_d'};
%% Identification of the damped plant with Relative Active Damping
controller.type = 2; % RAD
G_dp = J_a_111*inv(J_s_111)*linearize(mdl, io);
G_dp.InputName = {'u_ur', 'u_uh', 'u_d'};
G_dp.OutputName = {'d_ur', 'd_uh', 'd_d'};
%% Comparison of the damped and undamped plant
figure;
tiledlayout(3, 1, 'TileSpacing', 'Compact', 'Padding', 'None');
ax1 = nexttile([2,1]);
hold on;
plot(freqs, abs(squeeze(freqresp(G_ol(1,1), freqs, 'Hz'))), ...
'DisplayName', 'd - OL');
plot(freqs, abs(squeeze(freqresp(G_ol(2,2), freqs, 'Hz'))), ...
'DisplayName', 'uh - OL');
plot(freqs, abs(squeeze(freqresp(G_ol(3,3), freqs, 'Hz'))), ...
'DisplayName', 'ur - OL');
set(gca,'ColorOrderIndex',1)
plot(freqs, abs(squeeze(freqresp(G_dp(1,1), freqs, 'Hz'))), '--', ...
'DisplayName', 'd - IFF');
plot(freqs, abs(squeeze(freqresp(G_dp(2,2), freqs, 'Hz'))), '--', ...
'DisplayName', 'uh - IFF');
plot(freqs, abs(squeeze(freqresp(G_dp(3,3), freqs, 'Hz'))), '--', ...
'DisplayName', 'ur - IFF');
for i = 1:2
for j = i+1:3
plot(freqs, abs(squeeze(freqresp(G_dp(i,j), freqs, 'Hz'))), 'color', [0, 0, 0, 0.2], ...
'HandleVisibility', 'off');
end
end
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
ylabel('Amplitude [m/N]'); set(gca, 'XTickLabel',[]);
legend('location', 'southeast', 'FontSize', 8, 'NumColumns', 2);
ylim([1e-12, 1e-6]);
ax2 = nexttile;
hold on;
plot(freqs, 180/pi*angle(squeeze(freqresp(G_ol(1,1), freqs, 'Hz'))));
plot(freqs, 180/pi*angle(squeeze(freqresp(G_ol(2,2), freqs, 'Hz'))));
plot(freqs, 180/pi*angle(squeeze(freqresp(G_ol(3,3), freqs, 'Hz'))));
set(gca,'ColorOrderIndex',1)
plot(freqs, 180/pi*angle(squeeze(freqresp(G_dp(1,1), freqs, 'Hz'))), '--');
plot(freqs, 180/pi*angle(squeeze(freqresp(G_dp(2,2), freqs, 'Hz'))), '--');
plot(freqs, 180/pi*angle(squeeze(freqresp(G_dp(3,3), freqs, 'Hz'))), '--');
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
xlabel('Frequency [Hz]'); ylabel('Phase [deg]');
hold off;
yticks(-360:90:360);
ylim([-180, 0]);
linkaxes([ax1,ax2],'x');
xlim([freqs(1), freqs(end)]);

View File

@ -32,3 +32,308 @@ colors = colororder;
%% Frequency Vector
freqs = logspace(1, 3, 1000);
% System Identification
% Let's identify the damped plant.
%% Input/Output definition
clear io; io_i = 1;
%% Inputs
% Control Input {3x1} [N]
io(io_i) = linio([mdl, '/control_system'], 1, 'input'); io_i = io_i + 1;
%% Outputs
% Force Sensor {3x1} [m]
io(io_i) = linio([mdl, '/DCM'], 1, 'openoutput'); io_i = io_i + 1;
%% Load DCM Kinematics and IFF controller
load('dcm_kinematics.mat');
load('Kiff.mat');
%% Identification of the damped plant with IFF
controller.type = 1; % IFF
G_dp = J_a_111*inv(J_s_111)*linearize(mdl, io);
G_dp.InputName = {'u_ur', 'u_uh', 'u_d'};
G_dp.OutputName = {'d_ur', 'd_uh', 'd_d'};
%% Comparison of the damped and undamped plant
figure;
tiledlayout(3, 1, 'TileSpacing', 'Compact', 'Padding', 'None');
ax1 = nexttile([2,1]);
hold on;
plot(freqs, abs(squeeze(freqresp(G_dp(1,1), freqs, 'Hz'))), '-', ...
'DisplayName', 'd - IFF');
plot(freqs, abs(squeeze(freqresp(G_dp(2,2), freqs, 'Hz'))), '-', ...
'DisplayName', 'uh - IFF');
plot(freqs, abs(squeeze(freqresp(G_dp(3,3), freqs, 'Hz'))), '-', ...
'DisplayName', 'ur - IFF');
for i = 1:2
for j = i+1:3
plot(freqs, abs(squeeze(freqresp(G_dp(i,j), freqs, 'Hz'))), 'color', [0, 0, 0, 0.2], ...
'HandleVisibility', 'off');
end
end
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
ylabel('Amplitude [m/N]'); set(gca, 'XTickLabel',[]);
legend('location', 'southeast', 'FontSize', 8, 'NumColumns', 2);
ylim([1e-12, 1e-8]);
ax2 = nexttile;
hold on;
plot(freqs, 180/pi*angle(squeeze(freqresp(G_dp(1,1), freqs, 'Hz'))), '-');
plot(freqs, 180/pi*angle(squeeze(freqresp(G_dp(2,2), freqs, 'Hz'))), '-');
plot(freqs, 180/pi*angle(squeeze(freqresp(G_dp(3,3), freqs, 'Hz'))), '-');
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
xlabel('Frequency [Hz]'); ylabel('Phase [deg]');
hold off;
yticks(-360:90:360);
ylim([-180, 0]);
linkaxes([ax1,ax2],'x');
xlim([freqs(1), freqs(end)]);
% High Authority Controller
% Let's design a controller with a bandwidth of 100Hz.
% As the plant is well decoupled and well approximated by a constant at low frequency, the high authority controller can easily be designed with SISO loop shaping.
%% Controller design
wc = 2*pi*100; % Wanted crossover frequency [rad/s]
a = 2; % Lead parameter
Khac = diag(1./diag(abs(evalfr(G_dp, 1j*wc)))) * ... % Diagonal controller
wc/s * ... % Integrator
1/(sqrt(a))*(1 + s/(wc/sqrt(a)))/(1 + s/(wc*sqrt(a))) * ... % Lead
1/(s^2/(4*wc)^2 + 2*s/(4*wc) + 1); % Low pass filter
%% Save the HAC controller
save('mat/Khac_iff.mat', 'Khac');
%% Loop Gain
L_hac_lac = G_dp * Khac;
%% Bode Plot of the Loop Gain
figure;
tiledlayout(3, 1, 'TileSpacing', 'Compact', 'Padding', 'None');
ax1 = nexttile([2,1]);
hold on;
plot(freqs, abs(squeeze(freqresp(L_hac_lac(1,1), freqs, 'Hz'))), '-', ...
'DisplayName', 'd');
plot(freqs, abs(squeeze(freqresp(L_hac_lac(2,2), freqs, 'Hz'))), '-', ...
'DisplayName', 'uh');
plot(freqs, abs(squeeze(freqresp(L_hac_lac(3,3), freqs, 'Hz'))), '-', ...
'DisplayName', 'ur');
for i = 1:2
for j = i+1:3
plot(freqs, abs(squeeze(freqresp(L_hac_lac(i,j), freqs, 'Hz'))), 'color', [0, 0, 0, 0.2], ...
'HandleVisibility', 'off');
end
end
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
ylabel('Loop Gain'); set(gca, 'XTickLabel',[]);
legend('location', 'northeast', 'FontSize', 8, 'NumColumns', 2);
ylim([1e-2, 1e1]);
ax2 = nexttile;
hold on;
plot(freqs, 180/pi*angle(squeeze(freqresp(L_hac_lac(1,1), freqs, 'Hz'))), '-');
plot(freqs, 180/pi*angle(squeeze(freqresp(L_hac_lac(2,2), freqs, 'Hz'))), '-');
plot(freqs, 180/pi*angle(squeeze(freqresp(L_hac_lac(3,3), freqs, 'Hz'))), '-');
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
xlabel('Frequency [Hz]'); ylabel('Phase [deg]');
hold off;
yticks(-360:90:360);
ylim([-180, 0]);
linkaxes([ax1,ax2],'x');
xlim([freqs(1), freqs(end)]);
% #+name: fig:hac_iff_loop_gain_bode_plot
% #+caption: Bode Plot of the Loop gain for the High Authority Controller
% #+RESULTS:
% [[file:figs/hac_iff_loop_gain_bode_plot.png]]
%% Compute the Eigenvalues of the loop gain
Ldet = zeros(3, length(freqs));
Lmimo = squeeze(freqresp(L_hac_lac, freqs, 'Hz'));
for i_f = 1:length(freqs)
Ldet(:, i_f) = eig(squeeze(Lmimo(:,:,i_f)));
end
% As shown in the Root Locus plot in Figure [[fig:loci_hac_iff_fast_jack]], the closed loop system should be stable.
%% Plot of the eigenvalues of L in the complex plane
figure;
hold on;
% Angle used to draw the circles
theta = linspace(0, 2*pi, 100);
% Unit circle
plot(cos(theta), sin(theta), '--');
% Circle for module margin
plot(-1 + min(min(abs(Ldet + 1)))*cos(theta), min(min(abs(Ldet + 1)))*sin(theta), '--');
for i = 1:3
plot(real(squeeze(Ldet(i,:))), imag(squeeze(Ldet(i,:))), 'k.');
plot(real(squeeze(Ldet(i,:))), -imag(squeeze(Ldet(i,:))), 'k.');
end
% Unstable Point
plot(-1, 0, 'kx', 'HandleVisibility', 'off');
hold off;
set(gca, 'XScale', 'lin'); set(gca, 'YScale', 'lin');
xlabel('Real'); ylabel('Imag');
axis square;
xlim([-3, 1]); ylim([-2, 2]);
% Performances
% In order to estimate the performances of the HAC-IFF control strategy, the transfer function from motion errors of the stepper motors to the motion error of the crystal is identified both in open loop and with the HAC-IFF strategy.
%% Input/Output definition
clear io; io_i = 1;
%% Inputs
% Jack Motion Erros {3x1} [m]
io(io_i) = linio([mdl, '/stepper_errors'], 1, 'input'); io_i = io_i + 1;
%% Outputs
% Interferometer Output {3x1} [m]
io(io_i) = linio([mdl, '/DCM'], 1, 'output'); io_i = io_i + 1;
%% Identification of the transmissibility of errors in open-loop
controller.type = 0; % Open Loop
T_ol = inv(J_s_111)*linearize(mdl, io)*J_a_111;
T_ol.InputName = {'e_dz', 'e_ry', 'e_rx'};
T_ol.OutputName = {'dx', 'ry', 'rx'};
%% Load DCM Kinematics and IFF controller
load('dcm_kinematics.mat');
load('Kiff.mat');
%% Identification of the transmissibility of errors with HAC-IFF
controller.type = 3; % IFF
T_hl = inv(J_s_111)*linearize(mdl, io)*J_a_111;
T_hl.InputName = {'e_dz', 'e_ry', 'e_rx'};
T_hl.OutputName = {'dx', 'ry', 'rx'};
% #+RESULTS:
% : 1
% And both transmissibilities are compared in Figure [[fig:stepper_transmissibility_comp_ol_hac_iff]].
%% Transmissibility of stepper errors
f = logspace(0, 3, 1000);
figure;
hold on;
plot(f, abs(squeeze(freqresp(T_ol(1,1), f, 'Hz'))), '-', ...
'DisplayName', '$d_z$ - OL');
plot(f, abs(squeeze(freqresp(T_ol(2,2), f, 'Hz'))), '-', ...
'DisplayName', '$r_y$ - OL');
plot(f, abs(squeeze(freqresp(T_ol(3,3), f, 'Hz'))), '-', ...
'DisplayName', '$r_x$ - OL');
set(gca,'ColorOrderIndex',1)
plot(f, abs(squeeze(freqresp(T_hl(1,1), f, 'Hz'))), '--', ...
'DisplayName', '$d_z$ - HAC-IFF');
plot(f, abs(squeeze(freqresp(T_hl(2,2), f, 'Hz'))), '--', ...
'DisplayName', '$r_y$ - HAC-IFF');
plot(f, abs(squeeze(freqresp(T_hl(3,3), f, 'Hz'))), '--', ...
'DisplayName', '$r_x$ - HAC-IFF');
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
xlabel('Frequency [Hz]'); ylabel('Stepper transmissibility');
legend('location', 'southeast', 'FontSize', 8, 'NumColumns', 2);
ylim([1e-2, 1e2]);
xlim([f(1), f(end)]);
% Close Loop noise budget
%% Load disturbances
load('asd_noises_disturbances.mat');
% Let's compute the amplitude spectral density of the jack motion errors due to the sensor noise, the actuator noise and disturbances.
%% Computation of ASD of contribution of inputs to the closed-loop motion
% Error due to disturbances
asd_d = abs(squeeze(freqresp(Wd*(1/(1 + G_dp(1,1)*Khac(1,1))), f, 'Hz')));
% Error due to actuator noise
asd_u = abs(squeeze(freqresp(Wu*(G_dp(1,1)/(1 + G_dp(1,1)*Khac(1,1))), f, 'Hz')));
% Error due to sensor noise
asd_n = abs(squeeze(freqresp(Wn*(G_dp(1,1)*Khac(1,1)/(1 + G_dp(1,1)*Khac(1,1))), f, 'Hz')));
% The closed-loop ASD is then:
%% ASD of the closed-loop motion
asd_cl = sqrt(asd_d.^2 + asd_u.^2 + asd_n.^2);
% The obtained ASD are shown in Figure [[fig:close_loop_asd_noise_budget_hac_iff]].
%% Noise Budget (ASD)
f = logspace(-1, 3, 1000);
figure;
hold on;
plot(f, asd_n, 'DisplayName', '$n$');
plot(f, asd_u, 'DisplayName', '$d_u$');
plot(f, asd_d, 'DisplayName', '$d$');
plot(f, asd_cl, 'k--', 'DisplayName', '$y$');
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
xlabel('Frequency [Hz]'); ylabel('ASD [$m/\sqrt{Hz}$]');
legend('location', 'southeast', 'FontSize', 8, 'NumColumns', 2);
xlim([f(1), f(end)]);
ylim([1e-16, 1e-8]);
% #+name: fig:close_loop_asd_noise_budget_hac_iff
% #+caption: Closed Loop noise budget
% #+RESULTS:
% [[file:figs/close_loop_asd_noise_budget_hac_iff.png]]
% Let's compare the open-loop and close-loop cases (Figure [[fig:cps_comp_ol_cl_hac_iff]]).
% Amplitude spectral density of the open loop motion errors [m/sqrt(Hz)]
asd_ol = abs(squeeze(freqresp(Wd, f, 'Hz')));
% CPS of open-loop motion [m^2]
cps_ol = flip(-cumtrapz(flip(f), flip(asd_ol.^2)));
% CPS of closed-loop motion [m^2]
cps_cl = flip(-cumtrapz(flip(f), flip(asd_cl.^2)));
%% Cumulative Power Spectrum - Motion error of fast jack
figure;
hold on;
plot(f, cps_ol, 'DisplayName', sprintf('OL, $\\epsilon_d = %.0f$ [nm,rms]', 1e9*sqrt(cps_ol(1))));
plot(f, cps_cl, 'DisplayName', sprintf('CL, $\\epsilon_d = %.0f$ [nm,rms]', 1e9*sqrt(cps_cl(1))));
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
xlabel('Frequency [Hz]'); ylabel('CPS [$m^2$]');
legend('location', 'southwest', 'FontSize', 8);
xlim([f(1), f(end)]);
% ylim([1e-16, 1e-8]);

View File

@ -63,7 +63,7 @@ G.OutputName = {'int_111_1', 'int_111_2', 'int_111_3'};
% Plant in the frame of the fastjacks
load('mat/dcm_kinematics.mat');
load('dcm_kinematics.mat');

View File

@ -22,6 +22,15 @@ colors = colororder;
freqs = logspace(1, 3, 1000);
% Bragg Angle
% There is a simple relation eqref:eq:bragg_angle_formula between:
% - $d_{\text{off}}$ is the wanted offset between the incident x-ray and the output x-ray
% - $\theta_b$ is the bragg angle
% - $d_z$ is the corresponding distance between the first and second crystals
% \begin{equation} \label{eq:bragg_angle_formula}
% d_z = \frac{d_{\text{off}}}{2 \cos \theta_b}
% \end{equation}
%% Tested bragg angles
bragg = linspace(5, 80, 1000); % Bragg angle [deg]
@ -30,6 +39,11 @@ d_off = 10.5e-3; % Wanted offset between x-rays [m]
%% Vertical Jack motion as a function of Bragg angle
dz = d_off./(2*cos(bragg*pi/180));
% This relation is shown in Figure [[fig:jack_motion_bragg_angle]].
%% Jack motion as a function of Bragg angle
figure;
plot(bragg, 1e3*dz)
@ -42,6 +56,8 @@ xlabel('Bragg angle [deg]'); ylabel('Jack Motion [mm]');
% #+RESULTS:
% [[file:figs/jack_motion_bragg_angle.png]]
% The required jack stroke is approximately 25mm.
%% Required Jack stroke
ans = 1e3*(dz(end) - dz(1))

71
matlab/dcm_noise_budget.m Normal file
View File

@ -0,0 +1,71 @@
% Matlab Init :noexport:ignore:
%% dcm_noise_budget.m
% Basic uniaxial noise budgeting
%% Clear Workspace and Close figures
clear; close all; clc;
%% Intialize Laplace variable
s = zpk('s');
%% Path for functions, data and scripts
addpath('./mat/'); % Path for data
%% Simscape Model - Nano Hexapod
addpath('./STEPS/')
%% Colors for the figures
colors = colororder;
%% Frequency Vector
freqs = logspace(1, 3, 1000);
%% Frequency vector for noise budget [Hz]
f = logspace(-1, 3, 1000);
% Power Spectral Density of signals
% Interferometer noise:
Wn = 6e-11*(1 + s/2/pi/200)/(1 + s/2/pi/60); % m/sqrt(Hz)
% #+RESULTS:
% : Measurement noise: 0.79 [nm,rms]
% DAC noise (amplified by the PI voltage amplifier, and converted to newtons):
Wdac = tf(3e-8); % V/sqrt(Hz)
Wu = Wdac*22.5*10; % N/sqrt(Hz)
% #+RESULTS:
% : DAC noise: 0.95 [uV,rms]
% Disturbances:
Wd = 5e-7/(1 + s/2/pi); % m/sqrt(Hz)
%% Save ASD of noise and disturbances
save('mat/asd_noises_disturbances.mat', 'Wn', 'Wu', 'Wd');
% Open Loop disturbance and measurement noise
% The comparison of the amplitude spectral density of the measurement noise and of the jack parasitic motion is performed in Figure [[fig:open_loop_noise_budget_fast_jack]].
% It confirms that the sensor noise is low enough to measure the motion errors of the crystal.
%% Bode plot for the plant (strain gauge output)
figure;
hold on;
plot(f, abs(squeeze(freqresp(Wn, f, 'Hz'))), ...
'DisplayName', 'n');
plot(f, abs(squeeze(freqresp(Wd, f, 'Hz'))), ...
'DisplayName', 'd');
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
xlabel('Frequency [Hz]'); ylabel('ASD [$m/\sqrt{Hz}$]');
legend('location', 'northeast', 'FontSize', 8, 'NumColumns', 2);
xlim([f(1), f(end)]);

BIN
matlab/mat/Khac_iff.mat Normal file

Binary file not shown.

Binary file not shown.