nass-simscape/docs/control_hac_lac.html

357 lines
11 KiB
HTML
Raw Normal View History

2020-03-23 10:05:32 +01:00
<?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 -->
2020-03-23 10:05:32 +01:00
<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],}
}
2020-03-23 10:05:32 +01:00
};
</script>
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
2020-03-23 10:05:32 +01:00
</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>
2020-03-23 10:05:32 +01:00
<ul>
<li><a href="#orgc22e2f2">4.1. Identification of the damped plant</a></li>
<li><a href="#org6bca8e2">4.2. Controller Design</a></li>
2020-03-23 10:05:32 +01:00
</ul>
</li>
<li><a href="#orgb7ffa65">5. Simulation</a></li>
<li><a href="#org448f335">6. Results</a></li>
2020-03-23 10:05:32 +01:00
</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);
2020-03-23 10:05:32 +01:00
</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);
2020-03-23 10:05:32 +01:00
</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');
2020-03-23 10:05:32 +01:00
</pre>
</div>
<p>
And we put some gravity.
</p>
<div class="org-src-container">
<pre class="src src-matlab">initializeSimscapeConfiguration('gravity', true);
2020-03-23 10:05:32 +01:00
</pre>
</div>
<p>
We log the signals.
</p>
<div class="org-src-container">
<pre class="src src-matlab">initializeLoggingConfiguration('log', 'all');
2020-03-23 10:05:32 +01:00
</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';
2020-03-23 10:05:32 +01:00
%% Input/Output definition
2020-03-23 10:05:32 +01:00
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
2020-03-23 10:05:32 +01:00
%% Run the linearization
2020-03-23 10:05:32 +01:00
G_dvf = linearize(mdl, io, 0);
G_dvf.InputName = {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'};
G_dvf.OutputName = {'Dnlm1', 'Dnlm2', 'Dnlm3', 'Dnlm4', 'Dnlm5', 'Dnlm6'};
2020-03-23 10:05:32 +01:00
</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);
2020-03-23 10:05:32 +01:00
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">K_dvf = -K_dvf*eye(6);
2020-03-23 10:05:32 +01:00
</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>
2020-03-23 10:05:32 +01:00
<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">
2020-03-23 10:05:32 +01:00
</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">
2020-03-23 10:05:32 +01:00
<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');
2020-03-23 10:05:32 +01:00
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">%% Name of the Simulink File
mdl = 'nass_model';
2020-03-23 10:05:32 +01:00
%% Input/Output definition
2020-03-23 10:05:32 +01:00
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
2020-03-23 10:05:32 +01:00
%% Run the linearization
2020-03-23 10:05:32 +01:00
G = linearize(mdl, io, 0);
G.InputName = {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'};
G.OutputName = {'Ex', 'Ey', 'Ez', 'Erx', 'Ery', 'Erz'};
2020-03-23 10:05:32 +01:00
</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');
2020-03-23 10:05:32 +01:00
Gx = -G*inv(nano_hexapod.kinematics.J');
Gx.InputName = {'Fx', 'Fy', 'Fz', 'Mx', 'My', 'Mz'};
2020-03-23 10:05:32 +01:00
</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">
2020-03-23 10:05:32 +01:00
<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]
2020-03-23 10:05:32 +01:00
h = 1.5; % Lead parameter
2020-03-23 10:05:32 +01:00
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));
2020-03-23 10:05:32 +01:00
% Normalization of the gain of have a loop gain of 1 at frequency wc
Kx = Kx.*diag(1./diag(abs(freqresp(Gx*Kx, wc))));
2020-03-23 10:05:32 +01:00
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">isstable(feedback(Gx*Kx, eye(6), -1))
2020-03-23 10:05:32 +01:00
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">Kx = inv(nano_hexapod.kinematics.J')*Kx;
2020-03-23 10:05:32 +01:00
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">isstable(feedback(G*Kx, eye(6), 1))
2020-03-23 10:05:32 +01:00
</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">
2020-03-23 10:05:32 +01:00
<div class="org-src-container">
<pre class="src src-matlab">load('mat/conf_simulink.mat');
set_param(conf_simulink, 'StopTime', '2');
2020-03-23 10:05:32 +01:00
</pre>
</div>
<p>
And we simulate the system.
</p>
<div class="org-src-container">
<pre class="src src-matlab">sim('nass_model');
2020-03-23 10:05:32 +01:00
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">hac_dvf = simout;
save('./mat/tomo_exp_hac_lac.mat', 'hac_dvf');
2020-03-23 10:05:32 +01:00
</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">
2020-03-23 10:05:32 +01:00
<p>
Let&rsquo;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');
2020-03-23 10:05:32 +01:00
</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>
2020-03-23 10:05:32 +01:00
</div>
</body>
</html>