<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> <head> <!-- 2020-05-05 mar. 10:34 --> <meta http-equiv="Content-Type" content="text/html;charset=utf-8" /> <title>HAC-LAC applied on the Simscape Model</title> <meta name="generator" content="Org mode" /> <meta name="author" content="Dehaeze Thomas" /> <link rel="stylesheet" type="text/css" href="./css/htmlize.css"/> <link rel="stylesheet" type="text/css" href="./css/readtheorg.css"/> <script src="./js/jquery.min.js"></script> <script src="./js/bootstrap.min.js"></script> <script src="./js/jquery.stickytableheaders.min.js"></script> <script src="./js/readtheorg.js"></script> <script>MathJax = { tex: { tags: 'ams', macros: {bm: ["\\boldsymbol{#1}",1],} } }; </script> <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script> </head> <body> <div id="org-div-home-and-up"> <a accesskey="h" href="./index.html"> UP </a> | <a accesskey="H" href="./index.html"> HOME </a> </div><div id="content"> <h1 class="title">HAC-LAC applied on the Simscape Model</h1> <div id="table-of-contents"> <h2>Table of Contents</h2> <div id="text-table-of-contents"> <ul> <li><a href="#org1fe8594">1. Initialization</a></li> <li><a href="#orgfd54447">2. Low Authority Control - Direct Velocity Feedback \(\bm{K}_\mathcal{L}\)</a> <ul> <li><a href="#orga860160">2.1. Identification</a></li> <li><a href="#org7a2c131">2.2. Plant</a></li> <li><a href="#org46eb79b">2.3. Root Locus</a></li> <li><a href="#orgafbd7d0">2.4. Controller and Loop Gain</a></li> </ul> </li> <li><a href="#org73445c2">3. Uncertainty Improvements thanks to the LAC control</a></li> <li><a href="#orged12a17">4. High Authority Control - \(\bm{K}_\mathcal{X}\)</a> <ul> <li><a href="#orgc22e2f2">4.1. Identification of the damped plant</a></li> <li><a href="#org6bca8e2">4.2. Controller Design</a></li> </ul> </li> <li><a href="#orgb7ffa65">5. Simulation</a></li> <li><a href="#org448f335">6. Results</a></li> </ul> </div> </div> <p> The position \(\bm{\mathcal{X}}\) of the Sample with respect to the granite is measured. </p> <p> It is then compare to the wanted position of the Sample \(\bm{r}_\mathcal{X}\) in order to obtain the position error \(\bm{\epsilon}_\mathcal{X}\) of the Sample with respect to a frame attached to the Stewart top platform. </p> <div id="orgb987aa6" class="figure"> <p><img src="figs/hac_lac_control_schematic.png" alt="hac_lac_control_schematic.png" /> </p> <p><span class="figure-number">Figure 1: </span>HAC-LAC Control Architecture used for the Control of the NASS</p> </div> <div id="outline-container-org1fe8594" class="outline-2"> <h2 id="org1fe8594"><span class="section-number-2">1</span> Initialization</h2> <div class="outline-text-2" id="text-1"> <p> We initialize all the stages with the default parameters. </p> <div class="org-src-container"> <pre class="src src-matlab">initializeGround(); initializeGranite(); initializeTy(); initializeRy(); initializeRz(); initializeMicroHexapod(); initializeAxisc(); initializeMirror(); </pre> </div> <p> The nano-hexapod is a piezoelectric hexapod and the sample has a mass of 50kg. </p> <div class="org-src-container"> <pre class="src src-matlab">initializeNanoHexapod('actuator', 'piezo'); initializeSample('mass', 1); </pre> </div> <p> We set the references that corresponds to a tomography experiment. </p> <div class="org-src-container"> <pre class="src src-matlab">initializeReferences('Rz_type', 'rotating', 'Rz_period', 1); </pre> </div> <div class="org-src-container"> <pre class="src src-matlab">initializeDisturbances(); </pre> </div> <p> Open Loop. </p> <div class="org-src-container"> <pre class="src src-matlab">initializeController('type', 'open-loop'); </pre> </div> <p> And we put some gravity. </p> <div class="org-src-container"> <pre class="src src-matlab">initializeSimscapeConfiguration('gravity', true); </pre> </div> <p> We log the signals. </p> <div class="org-src-container"> <pre class="src src-matlab">initializeLoggingConfiguration('log', 'all'); </pre> </div> </div> </div> <div id="outline-container-orgfd54447" class="outline-2"> <h2 id="orgfd54447"><span class="section-number-2">2</span> Low Authority Control - Direct Velocity Feedback \(\bm{K}_\mathcal{L}\)</h2> <div class="outline-text-2" id="text-2"> <p> The first loop closed corresponds to a direct velocity feedback loop. </p> <p> The design of the associated decentralized controller is explained in <a href="control_active_damping.html">this</a> file. </p> </div> <div id="outline-container-orga860160" class="outline-3"> <h3 id="orga860160"><span class="section-number-3">2.1</span> Identification</h3> <div class="outline-text-3" id="text-2-1"> <div class="org-src-container"> <pre class="src src-matlab">%% Name of the Simulink File mdl = 'nass_model'; %% Input/Output definition clear io; io_i = 1; io(io_i) = linio([mdl, '/Controller'], 1, 'openinput'); io_i = io_i + 1; % Actuator Inputs io(io_i) = linio([mdl, '/Micro-Station'], 3, 'openoutput', [], 'Dnlm'); io_i = io_i + 1; % Relative Motion Outputs %% Run the linearization G_dvf = linearize(mdl, io, 0); G_dvf.InputName = {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'}; G_dvf.OutputName = {'Dnlm1', 'Dnlm2', 'Dnlm3', 'Dnlm4', 'Dnlm5', 'Dnlm6'}; </pre> </div> </div> </div> <div id="outline-container-org7a2c131" class="outline-3"> <h3 id="org7a2c131"><span class="section-number-3">2.2</span> Plant</h3> </div> <div id="outline-container-org46eb79b" class="outline-3"> <h3 id="org46eb79b"><span class="section-number-3">2.3</span> Root Locus</h3> </div> <div id="outline-container-orgafbd7d0" class="outline-3"> <h3 id="orgafbd7d0"><span class="section-number-3">2.4</span> Controller and Loop Gain</h3> <div class="outline-text-3" id="text-2-4"> <div class="org-src-container"> <pre class="src src-matlab">K_dvf = s*15000/(1 + s/2/pi/10000); </pre> </div> <div class="org-src-container"> <pre class="src src-matlab">K_dvf = -K_dvf*eye(6); </pre> </div> </div> </div> </div> <div id="outline-container-org73445c2" class="outline-2"> <h2 id="org73445c2"><span class="section-number-2">3</span> Uncertainty Improvements thanks to the LAC control</h2> <div class="outline-text-2" id="text-3"> <div class="org-src-container"> <pre class="src src-matlab">K_dvf_backup = K_dvf; initializeController('type', 'hac-dvf'); </pre> </div> <div class="org-src-container"> <pre class="src src-matlab">masses = [1, 10, 50]; % [kg] </pre> </div> <div class="org-src-container"> <pre class="src src-matlab">%% Name of the Simulink File mdl = 'nass_model'; %% Input/Output definition clear io; io_i = 1; io(io_i) = linio([mdl, '/Controller'], 1, 'input'); io_i = io_i + 1; % Actuator Inputs io(io_i) = linio([mdl, '/Tracking Error'], 1, 'output', [], 'En'); io_i = io_i + 1; % Position Errror </pre> </div> </div> </div> <div id="outline-container-orged12a17" class="outline-2"> <h2 id="orged12a17"><span class="section-number-2">4</span> High Authority Control - \(\bm{K}_\mathcal{X}\)</h2> <div class="outline-text-2" id="text-4"> </div> <div id="outline-container-orgc22e2f2" class="outline-3"> <h3 id="orgc22e2f2"><span class="section-number-3">4.1</span> Identification of the damped plant</h3> <div class="outline-text-3" id="text-4-1"> <div class="org-src-container"> <pre class="src src-matlab">Kx = tf(zeros(6)); </pre> </div> <div class="org-src-container"> <pre class="src src-matlab">initializeController('type', 'hac-dvf'); </pre> </div> <div class="org-src-container"> <pre class="src src-matlab">%% Name of the Simulink File mdl = 'nass_model'; %% Input/Output definition clear io; io_i = 1; io(io_i) = linio([mdl, '/Controller'], 1, 'input'); io_i = io_i + 1; % Actuator Inputs io(io_i) = linio([mdl, '/Tracking Error'], 1, 'output', [], 'En'); io_i = io_i + 1; % Position Errror %% Run the linearization G = linearize(mdl, io, 0); G.InputName = {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'}; G.OutputName = {'Ex', 'Ey', 'Ez', 'Erx', 'Ery', 'Erz'}; </pre> </div> <p> The minus sine is put here because there is already a minus sign included due to the computation of the position error. </p> <div class="org-src-container"> <pre class="src src-matlab">load('mat/stages.mat', 'nano_hexapod'); Gx = -G*inv(nano_hexapod.kinematics.J'); Gx.InputName = {'Fx', 'Fy', 'Fz', 'Mx', 'My', 'Mz'}; </pre> </div> </div> </div> <div id="outline-container-org6bca8e2" class="outline-3"> <h3 id="org6bca8e2"><span class="section-number-3">4.2</span> Controller Design</h3> <div class="outline-text-3" id="text-4-2"> <p> The controller consists of: </p> <ul class="org-ul"> <li>A pure integrator</li> <li>A Second integrator up to half the wanted bandwidth</li> <li>A Lead around the cross-over frequency</li> <li>A low pass filter with a cut-off equal to two times the wanted bandwidth</li> </ul> <div class="org-src-container"> <pre class="src src-matlab">wc = 2*pi*15; % Bandwidth Bandwidth [rad/s] h = 1.5; % Lead parameter Kx = (1/h) * (1 + s/wc*h)/(1 + s/wc/h) * wc/s * ((s/wc*2 + 1)/(s/wc*2)) * (1/(1 + s/wc/2)); % Normalization of the gain of have a loop gain of 1 at frequency wc Kx = Kx.*diag(1./diag(abs(freqresp(Gx*Kx, wc)))); </pre> </div> <div class="org-src-container"> <pre class="src src-matlab">isstable(feedback(Gx*Kx, eye(6), -1)) </pre> </div> <div class="org-src-container"> <pre class="src src-matlab">Kx = inv(nano_hexapod.kinematics.J')*Kx; </pre> </div> <div class="org-src-container"> <pre class="src src-matlab">isstable(feedback(G*Kx, eye(6), 1)) </pre> </div> </div> </div> </div> <div id="outline-container-orgb7ffa65" class="outline-2"> <h2 id="orgb7ffa65"><span class="section-number-2">5</span> Simulation</h2> <div class="outline-text-2" id="text-5"> <div class="org-src-container"> <pre class="src src-matlab">load('mat/conf_simulink.mat'); set_param(conf_simulink, 'StopTime', '2'); </pre> </div> <p> And we simulate the system. </p> <div class="org-src-container"> <pre class="src src-matlab">sim('nass_model'); </pre> </div> <div class="org-src-container"> <pre class="src src-matlab">hac_dvf = simout; save('./mat/tomo_exp_hac_lac.mat', 'hac_dvf'); </pre> </div> </div> </div> <div id="outline-container-org448f335" class="outline-2"> <h2 id="org448f335"><span class="section-number-2">6</span> Results</h2> <div class="outline-text-2" id="text-6"> <p> Let’s load the simulation when no control is applied. </p> <div class="org-src-container"> <pre class="src src-matlab">load('./mat/experiment_tomography.mat', 'tomo_align_dist'); load('./mat/tomo_exp_hac_lac.mat', 'hac_dvf'); </pre> </div> </div> </div> </div> <div id="postamble" class="status"> <p class="author">Author: Dehaeze Thomas</p> <p class="date">Created: 2020-05-05 mar. 10:34</p> </div> </body> </html>