357 lines
11 KiB
HTML
357 lines
11 KiB
HTML
<?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>
|