nass-simscape/docs/control_voice_coil.html

1298 lines
44 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>Control of the NASS with Voice coil actuators</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>
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">Control of the NASS with Voice coil actuators</h1>
<div id="table-of-contents">
<h2>Table of Contents</h2>
<div id="text-table-of-contents">
<ul>
2020-04-01 16:17:26 +02:00
<li><a href="#orge379987">1. HAC-LAC + Cascade Control Topology</a>
<ul>
<li><a href="#orgcaec167">1.1. Initialization</a></li>
2020-04-01 16:17:26 +02:00
<li><a href="#orgf95b045">1.2. Low Authority Control - Integral Force Feedback \(\bm{K}_\text{IFF}\)</a>
<ul>
<li><a href="#org63f831b">1.2.1. Identification</a></li>
2020-04-01 16:17:26 +02:00
<li><a href="#org203d651">1.2.2. Plant</a></li>
<li><a href="#orgccc21d2">1.2.3. Root Locus</a></li>
<li><a href="#org1a8ee8a">1.2.4. Controller and Loop Gain</a></li>
</ul>
</li>
<li><a href="#org2a44e66">1.3. High Authority Control in the joint space - \(\bm{K}_\mathcal{L}\)</a>
<ul>
<li><a href="#org989c2e9">1.3.1. Identification of the damped plant</a></li>
<li><a href="#orgc3f6788">1.3.2. Obtained Plant</a></li>
2020-04-01 16:17:26 +02:00
<li><a href="#orgd1632cf">1.3.3. Controller Design and Loop Gain</a></li>
</ul>
</li>
<li><a href="#org0cd0c63">1.4. Primary Controller in the task space - \(\bm{K}_\mathcal{X}\)</a>
<ul>
<li><a href="#orga960106">1.4.1. Identification of the linearized plant</a></li>
<li><a href="#orgce4f796">1.4.2. Obtained Plant</a></li>
2020-04-01 16:17:26 +02:00
<li><a href="#org16f56fa">1.4.3. Controller Design</a></li>
</ul>
</li>
<li><a href="#org9406388">1.5. Simulation</a></li>
2020-04-01 16:17:26 +02:00
<li><a href="#org16024e0">1.6. Results</a>
<ul>
<li><a href="#org8e90e5a">1.6.1. Load the simulation results</a></li>
2020-04-01 16:17:26 +02:00
<li><a href="#org0f974ff">1.6.2. Control effort</a></li>
<li><a href="#org36679a6">1.6.3. Load the simulation results</a></li>
2020-04-01 16:17:26 +02:00
</ul>
</li>
<li><a href="#org74d9dc7">1.7. Compliance of the nano-hexapod</a>
<ul>
<li><a href="#orgd768713">1.7.1. Identification</a></li>
2020-04-01 16:17:26 +02:00
<li><a href="#org1a1ad20">1.7.2. Obtained Compliance</a></li>
<li><a href="#org5b81db9">1.7.3. Comparison with Piezo</a></li>
</ul>
</li>
<li><a href="#org3c7ca09">1.8. Robustness to Payload Variability</a>
<ul>
<li><a href="#orgf34ee18">1.8.1. Initialization</a></li>
2020-04-01 16:17:26 +02:00
<li><a href="#org0d97c55">1.8.2. Low Authority Control</a></li>
<li><a href="#orgab3ab98">1.8.3. High Authority Control</a></li>
<li><a href="#org176695a">1.8.4. Primary Plant</a></li>
<li><a href="#org678ff20">1.8.5. Simulation</a></li>
2020-04-01 16:17:26 +02:00
</ul>
</li>
</ul>
</li>
2020-04-01 16:17:26 +02:00
<li><a href="#orgd649256">2. Other analysis</a>
<ul>
<li><a href="#org6cee30e">2.1. Robustness to Payload Variability</a></li>
2020-04-01 16:17:26 +02:00
<li><a href="#org18b00fa">2.2. Direct HAC control in the task space - \(\bm{K}_\mathcal{X}\)</a>
<ul>
<li><a href="#org625b500">2.2.1. Identification</a></li>
2020-04-01 16:17:26 +02:00
<li><a href="#org1387536">2.2.2. Obtained Plant in the Task Space</a></li>
<li><a href="#org50b9f75">2.2.3. Obtained Plant in the Joint Space</a></li>
<li><a href="#org19db2cd">2.2.4. Controller Design in the Joint Space</a></li>
</ul>
</li>
2020-04-01 16:17:26 +02:00
<li><a href="#org5e26e70">2.3. On the usefulness of the High Authority Control loop / Linearization loop</a>
<ul>
<li><a href="#org7366662">2.3.1. Identification</a></li>
2020-04-01 16:17:26 +02:00
<li><a href="#orgfab8847">2.3.2. Plant in the Task space</a></li>
<li><a href="#org18aeea5">2.3.3. Plant in the Leg&rsquo;s space</a></li>
</ul>
</li>
2020-04-01 16:17:26 +02:00
<li><a href="#org015f992">2.4. DVF instead of IFF?</a>
<ul>
2020-04-01 16:17:26 +02:00
<li><a href="#org17cfb9d">2.4.1. Initialization and Identification</a></li>
<li><a href="#orgd7117f7">2.4.2. Obtained Plant</a></li>
2020-04-01 16:17:26 +02:00
<li><a href="#org51c8027">2.4.3. Controller</a></li>
<li><a href="#org33637f1">2.4.4. HAC Identification</a></li>
<li><a href="#orgec66083">2.4.5. Conclusion</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
</div>
2020-04-01 16:17:26 +02:00
<div id="outline-container-orge379987" class="outline-2">
<h2 id="orge379987"><span class="section-number-2">1</span> HAC-LAC + Cascade Control Topology</h2>
<div class="outline-text-2" id="text-1">
<div id="org757d77b" class="figure">
<p><img src="figs/cascade_control_architecture.png" alt="cascade_control_architecture.png" />
</p>
<p><span class="figure-number">Figure 1: </span>Cascaded Control consisting of (from inner to outer loop): IFF, Linearization Loop, Tracking Control in the frame of the Legs</p>
</div>
2020-04-01 16:17:26 +02:00
</div>
<div id="outline-container-orgcaec167" class="outline-3">
<h3 id="orgcaec167"><span class="section-number-3">1.1</span> Initialization</h3>
2020-04-01 16:17:26 +02:00
<div class="outline-text-3" id="text-1-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 voice coil based hexapod and the sample has a mass of 1kg.
</p>
<div class="org-src-container">
<pre class="src src-matlab">initializeNanoHexapod('actuator', 'lorentz');
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>
<div class="org-src-container">
<pre class="src src-matlab">initializeController('type', 'cascade-hac-lac');
</pre>
</div>
<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 class="org-src-container">
2020-04-01 16:17:26 +02:00
<pre class="src src-matlab">Kp = tf(zeros(6));
Kl = tf(zeros(6));
Kiff = tf(zeros(6));
</pre>
</div>
</div>
</div>
2020-04-01 16:17:26 +02:00
<div id="outline-container-orgf95b045" class="outline-3">
<h3 id="orgf95b045"><span class="section-number-3">1.2</span> Low Authority Control - Integral Force Feedback \(\bm{K}_\text{IFF}\)</h3>
<div class="outline-text-3" id="text-1-2">
<p>
<a id="org224edef"></a>
</p>
</div>
<div id="outline-container-org63f831b" class="outline-4">
<h4 id="org63f831b"><span class="section-number-4">1.2.1</span> Identification</h4>
2020-04-01 16:17:26 +02:00
<div class="outline-text-4" id="text-1-2-1">
<p>
Let&rsquo;s first identify the plant for the IFF controller.
</p>
<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', [], 'Fnlm'); io_i = io_i + 1; % Force Sensors
%% Run the linearization
G_iff = linearize(mdl, io, 0);
G_iff.InputName = {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'};
G_iff.OutputName = {'Fnlm1', 'Fnlm2', 'Fnlm3', 'Fnlm4', 'Fnlm5', 'Fnlm6'};
</pre>
</div>
</div>
</div>
2020-04-01 16:17:26 +02:00
<div id="outline-container-org203d651" class="outline-4">
<h4 id="org203d651"><span class="section-number-4">1.2.2</span> Plant</h4>
<div class="outline-text-4" id="text-1-2-2">
<p>
The obtained plant for IFF is shown in Figure <a href="#orga39f9fa">2</a>.
</p>
<div id="orga39f9fa" class="figure">
<p><img src="figs/cascade_vc_iff_plant.png" alt="cascade_vc_iff_plant.png" />
</p>
<p><span class="figure-number">Figure 2: </span>IFF Plant (<a href="./figs/cascade_vc_iff_plant.png">png</a>, <a href="./figs/cascade_vc_iff_plant.pdf">pdf</a>)</p>
</div>
</div>
</div>
2020-04-01 16:17:26 +02:00
<div id="outline-container-orgccc21d2" class="outline-4">
<h4 id="orgccc21d2"><span class="section-number-4">1.2.3</span> Root Locus</h4>
<div class="outline-text-4" id="text-1-2-3">
<p>
As seen in the root locus (Figure <a href="#org528b5f0">3</a>, no damping can be added to modes corresponding to the resonance of the micro-station.
</p>
<p>
However, critical damping can be achieve for the resonances of the nano-hexapod as shown in the zoomed part of the root (Figure <a href="#org528b5f0">3</a>, left part).
The maximum damping is obtained for a control gain of \(\approx 70\).
</p>
<div id="org528b5f0" class="figure">
<p><img src="figs/cascade_vc_iff_root_locus.png" alt="cascade_vc_iff_root_locus.png" />
</p>
<p><span class="figure-number">Figure 3: </span>Root Locus for the IFF control (<a href="./figs/cascade_vc_iff_root_locus.png">png</a>, <a href="./figs/cascade_vc_iff_root_locus.pdf">pdf</a>)</p>
</div>
</div>
</div>
2020-04-01 16:17:26 +02:00
<div id="outline-container-org1a8ee8a" class="outline-4">
<h4 id="org1a8ee8a"><span class="section-number-4">1.2.4</span> Controller and Loop Gain</h4>
<div class="outline-text-4" id="text-1-2-4">
<p>
We create the \(6 \times 6\) diagonal Integral Force Feedback controller.
The obtained loop gain is shown in Figure <a href="#orgc890275">4</a>.
</p>
<div class="org-src-container">
<pre class="src src-matlab">Kiff = -70/s*eye(6);
</pre>
</div>
<div id="orgc890275" class="figure">
<p><img src="figs/cascade_vc_iff_loop_gain.png" alt="cascade_vc_iff_loop_gain.png" />
</p>
<p><span class="figure-number">Figure 4: </span>Obtained Loop gain the IFF Control (<a href="./figs/cascade_vc_iff_loop_gain.png">png</a>, <a href="./figs/cascade_vc_iff_loop_gain.pdf">pdf</a>)</p>
</div>
</div>
</div>
</div>
2020-04-01 16:17:26 +02:00
<div id="outline-container-org2a44e66" class="outline-3">
<h3 id="org2a44e66"><span class="section-number-3">1.3</span> High Authority Control in the joint space - \(\bm{K}_\mathcal{L}\)</h3>
<div class="outline-text-3" id="text-1-3">
<p>
<a id="org1d54e1b"></a>
</p>
</div>
2020-04-01 16:17:26 +02:00
<div id="outline-container-org989c2e9" class="outline-4">
<h4 id="org989c2e9"><span class="section-number-4">1.3.1</span> Identification of the damped plant</h4>
<div class="outline-text-4" id="text-1-3-1">
<p>
Let&rsquo;s identify the dynamics from \(\bm{\tau}^\prime\) to \(d\bm{\mathcal{L}}\) as shown in Figure <a href="#org757d77b">1</a>.
</p>
<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, '/Micro-Station'], 3, 'output', [], 'Dnlm'); io_i = io_i + 1; % Leg Displacement
%% Run the linearization
Gl = linearize(mdl, io, 0);
Gl.InputName = {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'};
Gl.OutputName = {'Dnlm1', 'Dnlm2', 'Dnlm3', 'Dnlm4', 'Dnlm5', 'Dnlm6'};
</pre>
</div>
<p>
There are some unstable poles in the Plant with very small imaginary parts.
These unstable poles are probably not physical, and they disappear when taking the minimum realization of the plant.
</p>
<div class="org-src-container">
<pre class="src src-matlab">isstable(Gl)
Gl = minreal(Gl);
isstable(Gl)
</pre>
</div>
</div>
</div>
<div id="outline-container-orgc3f6788" class="outline-4">
<h4 id="orgc3f6788"><span class="section-number-4">1.3.2</span> Obtained Plant</h4>
2020-04-01 16:17:26 +02:00
<div class="outline-text-4" id="text-1-3-2">
<p>
The obtained dynamics is shown in Figure <a href="#orgd1818fd">5</a>.
</p>
<p>
Few things can be said on the dynamics:
</p>
<ul class="org-ul">
<li>the dynamics of the diagonal elements are almost all the same</li>
<li>the system is well decoupled below the resonances of the nano-hexapod (1Hz)</li>
<li>the dynamics of the diagonal elements are almost equivalent to a critically damped mass-spring-system with some spurious resonances above 50Hz corresponding to the resonances of the micro-station</li>
</ul>
<div id="orgd1818fd" class="figure">
<p><img src="figs/cascade_vc_hac_joint_plant.png" alt="cascade_vc_hac_joint_plant.png" />
</p>
<p><span class="figure-number">Figure 5: </span>Plant for the High Authority Control in the Joint Space (<a href="./figs/cascade_vc_hac_joint_plant.png">png</a>, <a href="./figs/cascade_vc_hac_joint_plant.pdf">pdf</a>)</p>
</div>
</div>
</div>
2020-04-01 16:17:26 +02:00
<div id="outline-container-orgd1632cf" class="outline-4">
<h4 id="orgd1632cf"><span class="section-number-4">1.3.3</span> Controller Design and Loop Gain</h4>
<div class="outline-text-4" id="text-1-3-3">
<p>
As the plant is well decoupled, a diagonal plant is designed.
</p>
<div class="org-src-container">
<pre class="src src-matlab">wc = 2*pi*10; % Bandwidth Bandwidth [rad/s]
h = 2; % Lead parameter
Kl = (s + 2*pi*1)/s;
% Normalization of the gain of have a loop gain of 1 at frequency wc
Kl = Kl.*diag(1./diag(abs(freqresp(Gl*Kl, wc))));
</pre>
</div>
</div>
</div>
</div>
2020-04-01 16:17:26 +02:00
<div id="outline-container-org0cd0c63" class="outline-3">
<h3 id="org0cd0c63"><span class="section-number-3">1.4</span> Primary Controller in the task space - \(\bm{K}_\mathcal{X}\)</h3>
<div class="outline-text-3" id="text-1-4">
<p>
2020-04-01 16:17:26 +02:00
<a id="orga738520"></a>
</p>
</div>
<div id="outline-container-orga960106" class="outline-4">
<h4 id="orga960106"><span class="section-number-4">1.4.1</span> Identification of the linearized plant</h4>
<div class="outline-text-4" id="text-1-4-1">
<p>
We know identify the dynamics between \(\bm{r}_{\mathcal{X}_n}\) and \(\bm{r}_\mathcal{X}\).
</p>
2020-04-01 16:17:26 +02:00
<div class="org-src-container">
<pre class="src src-matlab">%% Name of the Simulink File
mdl = 'nass_model';
2020-04-01 16:17:26 +02:00
%% Input/Output definition
2020-04-01 16:17:26 +02:00
clear io; io_i = 1;
io(io_i) = linio([mdl, '/Controller/Cascade-HAC-LAC/Kp'], 1, 'input'); io_i = io_i + 1;
io(io_i) = linio([mdl, '/Tracking Error'], 1, 'output', [], 'En'); io_i = io_i + 1; % Position Errror
2020-04-01 16:17:26 +02:00
%% Run the linearization
2020-04-01 16:17:26 +02:00
Gp = linearize(mdl, io, 0);
Gp.InputName = {'rl1', 'rl2', 'rl3', 'rl4', 'rl5', 'rl6'};
Gp.OutputName = {'Ex', 'Ey', 'Ez', 'Erx', 'Ery', 'Erz'};
2020-04-01 16:17:26 +02:00
</pre>
</div>
<p>
2020-04-01 16:17:26 +02:00
A minus sign is added because the minus sign is already included in the plant identification.
</p>
2020-04-01 16:17:26 +02:00
<div class="org-src-container">
<pre class="src src-matlab">isstable(Gp)
Gp = -minreal(Gp);
2020-04-01 16:17:26 +02:00
isstable(Gp)
</pre>
</div>
2020-04-01 16:17:26 +02:00
<div class="org-src-container">
<pre class="src src-matlab">load('mat/stages.mat', 'nano_hexapod');
Gpx = Gp*inv(nano_hexapod.kinematics.J');
Gpx.InputName = {'Fx', 'Fy', 'Fz', 'Mx', 'My', 'Mz'};
Gpl = nano_hexapod.kinematics.J*Gp;
Gpl.OutputName = {'El1', 'El2', 'El3', 'El4', 'El5', 'El6'};
2020-04-01 16:17:26 +02:00
</pre>
</div>
</div>
</div>
<div id="outline-container-orgce4f796" class="outline-4">
<h4 id="orgce4f796"><span class="section-number-4">1.4.2</span> Obtained Plant</h4>
2020-04-01 16:17:26 +02:00
<div class="outline-text-4" id="text-1-4-2">
<div id="org8e042d5" class="figure">
<p><img src="figs/primary_plant_voice_coil_X.png" alt="primary_plant_voice_coil_X.png" />
</p>
2020-04-01 16:17:26 +02:00
<p><span class="figure-number">Figure 6: </span>Obtained Primary plant in the Task space (<a href="./figs/primary_plant_voice_coil_X.png">png</a>, <a href="./figs/primary_plant_voice_coil_X.pdf">pdf</a>)</p>
</div>
2020-04-01 16:17:26 +02:00
<div id="org2cb4d6f" class="figure">
<p><img src="figs/primary_plant_voice_coil_L.png" alt="primary_plant_voice_coil_L.png" />
</p>
2020-04-01 16:17:26 +02:00
<p><span class="figure-number">Figure 7: </span>Obtained Primary plant in the frame of the legs (<a href="./figs/primary_plant_voice_coil_L.png">png</a>, <a href="./figs/primary_plant_voice_coil_L.pdf">pdf</a>)</p>
</div>
</div>
2020-04-01 16:17:26 +02:00
</div>
2020-04-01 16:17:26 +02:00
<div id="outline-container-org16f56fa" class="outline-4">
<h4 id="org16f56fa"><span class="section-number-4">1.4.3</span> Controller Design</h4>
<div class="outline-text-4" id="text-1-4-3">
<div class="org-src-container">
<pre class="src src-matlab">wc = 2*pi*200; % Bandwidth Bandwidth [rad/s]
2020-04-01 16:17:26 +02:00
h = 2; % Lead parameter
2020-04-01 16:17:26 +02:00
Kp = (1/h) * (1 + s/wc*h)/(1 + s/wc/h) * ...
(1/h) * (1 + s/wc*h)/(1 + s/wc/h); % For Piezo
% Kp = (1/h) * (1 + s/wc*h)/(1 + s/wc/h) * (s + 2*pi*10)/s * (s + 2*pi*1)/s ; % For voice coil
2020-04-01 16:17:26 +02:00
% Normalization of the gain of have a loop gain of 1 at frequency wc
Kp = Kp.*diag(1./diag(abs(freqresp(Gpx*Kp, wc))));
</pre>
</div>
2020-04-01 16:17:26 +02:00
<div id="org6d0ebe2" class="figure">
<p><img src="figs/loop_gain_primary_voice_coil_X.png" alt="loop_gain_primary_voice_coil_X.png" />
</p>
<p><span class="figure-number">Figure 8: </span>Obtained Loop gain for the primary controller in the Task space (<a href="./figs/loop_gain_primary_voice_coil_X.png">png</a>, <a href="./figs/loop_gain_primary_voice_coil_X.pdf">pdf</a>)</p>
</div>
2020-04-01 16:17:26 +02:00
<p>
And now we include the Jacobian inside the controller.
</p>
<div class="org-src-container">
<pre class="src src-matlab">Kp = inv(nano_hexapod.kinematics.J')*Kp;
</pre>
</div>
2020-04-01 16:17:26 +02:00
</div>
</div>
</div>
<div id="outline-container-org9406388" class="outline-3">
<h3 id="org9406388"><span class="section-number-3">1.5</span> Simulation</h3>
2020-04-01 16:17:26 +02:00
<div class="outline-text-3" id="text-1-5">
<p>
Let&rsquo;s first save the 3 controllers for further analysis:
</p>
<div class="org-src-container">
<pre class="src src-matlab">save('mat/hac_lac_cascade_vc_controllers.mat', 'Kiff', 'Kl', 'Kp')
</pre>
</div>
2020-04-01 16:17:26 +02:00
<div class="org-src-container">
<pre class="src src-matlab">load('mat/conf_simulink.mat');
set_param(conf_simulink, 'StopTime', '2');
2020-04-01 16:17:26 +02:00
</pre>
</div>
<p>
2020-04-01 16:17:26 +02:00
And we simulate the system.
</p>
2020-04-01 16:17:26 +02:00
<div class="org-src-container">
<pre class="src src-matlab">sim('nass_model');
2020-04-01 16:17:26 +02:00
</pre>
</div>
<div class="org-src-container">
2020-04-01 16:17:26 +02:00
<pre class="src src-matlab">cascade_hac_lac_lorentz = simout;
save('./mat/cascade_hac_lac.mat', 'cascade_hac_lac_lorentz', '-append');
</pre>
</div>
</div>
</div>
2020-04-01 16:17:26 +02:00
<div id="outline-container-org16024e0" class="outline-3">
<h3 id="org16024e0"><span class="section-number-3">1.6</span> Results</h3>
<div class="outline-text-3" id="text-1-6">
</div>
<div id="outline-container-org8e90e5a" class="outline-4">
<h4 id="org8e90e5a"><span class="section-number-4">1.6.1</span> Load the simulation results</h4>
2020-04-01 16:17:26 +02:00
<div class="outline-text-4" id="text-1-6-1">
<div class="org-src-container">
<pre class="src src-matlab">load('./mat/experiment_tomography.mat', 'tomo_align_dist');
load('./mat/cascade_hac_lac.mat', 'cascade_hac_lac', 'cascade_hac_lac_lorentz');
</pre>
</div>
</div>
</div>
2020-04-01 16:17:26 +02:00
<div id="outline-container-org0f974ff" class="outline-4">
<h4 id="org0f974ff"><span class="section-number-4">1.6.2</span> Control effort</h4>
<div class="outline-text-4" id="text-1-6-2">
<div id="org8301604" class="figure">
<p><img src="figs/actuator_force_torques_tomography_voice_coil.png" alt="actuator_force_torques_tomography_voice_coil.png" />
</p>
<p><span class="figure-number">Figure 9: </span>Actuator Action during a tomography experiment when using Voice Coil actuators (<a href="./figs/actuator_force_torques_tomography_voice_coil.png">png</a>, <a href="./figs/actuator_force_torques_tomography_voice_coil.pdf">pdf</a>)</p>
</div>
</div>
</div>
<div id="outline-container-org36679a6" class="outline-4">
<h4 id="org36679a6"><span class="section-number-4">1.6.3</span> Load the simulation results</h4>
2020-04-01 16:17:26 +02:00
<div class="outline-text-4" id="text-1-6-3">
<div class="org-src-container">
<pre class="src src-matlab">n_av = 4;
han_win = hanning(ceil(length(cascade_hac_lac.Em.En.Data(:,1))/n_av));
2020-04-01 16:17:26 +02:00
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">t = cascade_hac_lac.Em.En.Time;
Ts = t(2)-t(1);
2020-04-01 16:17:26 +02:00
[pxx_ol, f] = pwelch(tomo_align_dist.Em.En.Data, han_win, [], [], 1/Ts);
[pxx_ca, ~] = pwelch(cascade_hac_lac.Em.En.Data, han_win, [], [], 1/Ts);
[pxx_vc, ~] = pwelch(cascade_hac_lac_lorentz.Em.En.Data, han_win, [], [], 1/Ts);
2020-04-01 16:17:26 +02:00
</pre>
</div>
<div id="org9a33ea7" class="figure">
<p><img src="figs/exp_tomography_voice_coil_psd_pos_error.png" alt="exp_tomography_voice_coil_psd_pos_error.png" />
</p>
<p><span class="figure-number">Figure 10: </span>Power Spectral Density of the position error during a tomography experiment when using Voice Coil based nano-hexapod (<a href="./figs/exp_tomography_voice_coil_psd_pos_error.png">png</a>, <a href="./figs/exp_tomography_voice_coil_psd_pos_error.pdf">pdf</a>)</p>
</div>
<div id="orga0c2483" class="figure">
<p><img src="figs/exp_tomography_voice_coil_cap_pos_error.png" alt="exp_tomography_voice_coil_cap_pos_error.png" />
</p>
<p><span class="figure-number">Figure 11: </span>Cumulative Amplitude Spectrum of the position error during a tomography experiment when using Voice Coil based nano-hexapod (<a href="./figs/exp_tomography_voice_coil_cap_pos_error.png">png</a>, <a href="./figs/exp_tomography_voice_coil_cap_pos_error.pdf">pdf</a>)</p>
</div>
<div id="org56aac09" class="figure">
<p><img src="figs/exp_tomography_voice_coil_time_domain.png" alt="exp_tomography_voice_coil_time_domain.png" />
</p>
2020-04-01 16:17:26 +02:00
<p><span class="figure-number">Figure 12: </span>Position error during a tomography experiment when using Voice Coil based nano-hexapod (<a href="./figs/exp_tomography_voice_coil_time_domain.png">png</a>, <a href="./figs/exp_tomography_voice_coil_time_domain.pdf">pdf</a>)</p>
</div>
</div>
2020-04-01 16:17:26 +02:00
</div>
</div>
<div id="outline-container-org74d9dc7" class="outline-3">
<h3 id="org74d9dc7"><span class="section-number-3">1.7</span> Compliance of the nano-hexapod</h3>
<div class="outline-text-3" id="text-1-7">
</div>
<div id="outline-container-orgd768713" class="outline-4">
<h4 id="orgd768713"><span class="section-number-4">1.7.1</span> Identification</h4>
2020-04-01 16:17:26 +02:00
<div class="outline-text-4" id="text-1-7-1">
<p>
2020-04-01 16:17:26 +02:00
Let&rsquo;s identify the Compliance of the NASS:
</p>
<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, '/Disturbances/Fd'], 1, 'openinput'); io_i = io_i + 1; % Direct Forces/Torques applied on the sample
io(io_i) = linio([mdl, '/Tracking Error'], 1, 'output', [], 'En'); io_i = io_i + 1; % Position Errror
</pre>
</div>
<p>
2020-04-01 16:17:26 +02:00
First in open-loop:
</p>
<div class="org-src-container">
2020-04-01 16:17:26 +02:00
<pre class="src src-matlab">Kp = tf(zeros(6));
Kl = tf(zeros(6));
Kiff = tf(zeros(6));
</pre>
</div>
2020-04-01 16:17:26 +02:00
<div class="org-src-container">
<pre class="src src-matlab">%% Run the linearization
2020-04-01 16:17:26 +02:00
Gc_ol = linearize(mdl, io, 0);
Gc_ol.InputName = {'Fdx', 'Fdy', 'Fdz', 'Mdx', 'Mdy', 'Mdz'};
Gc_ol.OutputName = {'Ex', 'Ey', 'Ez', 'Erx', 'Ery', 'Erz'};
2020-04-01 16:17:26 +02:00
</pre>
</div>
2020-04-01 16:17:26 +02:00
<p>
Then with the IFF control.
</p>
<div class="org-src-container">
<pre class="src src-matlab">load('mat/hac_lac_cascade_vc_controllers.mat', 'Kiff')
2020-04-01 16:17:26 +02:00
</pre>
</div>
2020-04-01 16:17:26 +02:00
<div class="org-src-container">
<pre class="src src-matlab">%% Run the linearization
2020-04-01 16:17:26 +02:00
Gc_iff = linearize(mdl, io, 0);
Gc_iff.InputName = {'Fdx', 'Fdy', 'Fdz', 'Mdx', 'Mdy', 'Mdz'};
Gc_iff.OutputName = {'Ex', 'Ey', 'Ez', 'Erx', 'Ery', 'Erz'};
2020-04-01 16:17:26 +02:00
</pre>
</div>
2020-04-01 16:17:26 +02:00
<p>
With the HAC control added
</p>
<div class="org-src-container">
<pre class="src src-matlab">load('mat/hac_lac_cascade_vc_controllers.mat', 'Kl')
2020-04-01 16:17:26 +02:00
</pre>
</div>
2020-04-01 16:17:26 +02:00
<div class="org-src-container">
<pre class="src src-matlab">%% Run the linearization
2020-04-01 16:17:26 +02:00
Gc_hac = linearize(mdl, io, 0);
Gc_hac.InputName = {'Fdx', 'Fdy', 'Fdz', 'Mdx', 'Mdy', 'Mdz'};
Gc_hac.OutputName = {'Ex', 'Ey', 'Ez', 'Erx', 'Ery', 'Erz'};
2020-04-01 16:17:26 +02:00
</pre>
</div>
2020-04-01 16:17:26 +02:00
<p>
Finally with the primary controller
</p>
<div class="org-src-container">
<pre class="src src-matlab">load('mat/hac_lac_cascade_vc_controllers.mat', 'Kp')
2020-04-01 16:17:26 +02:00
</pre>
</div>
2020-04-01 16:17:26 +02:00
<div class="org-src-container">
<pre class="src src-matlab">%% Run the linearization
2020-04-01 16:17:26 +02:00
Gc_pri = linearize(mdl, io, 0);
Gc_pri.InputName = {'Fdx', 'Fdy', 'Fdz', 'Mdx', 'Mdy', 'Mdz'};
Gc_pri.OutputName = {'Ex', 'Ey', 'Ez', 'Erx', 'Ery', 'Erz'};
</pre>
</div>
</div>
</div>
2020-04-01 16:17:26 +02:00
<div id="outline-container-org1a1ad20" class="outline-4">
<h4 id="org1a1ad20"><span class="section-number-4">1.7.2</span> Obtained Compliance</h4>
<div class="outline-text-4" id="text-1-7-2">
<div id="org3444b1d" class="figure">
<p><img src="figs/compliance_evolution_vc_cascade_control.png" alt="compliance_evolution_vc_cascade_control.png" />
</p>
<p><span class="figure-number">Figure 13: </span>Evolution of the NASS compliance with each control loop added (<a href="./figs/compliance_evolution_vc_cascade_control.png">png</a>, <a href="./figs/compliance_evolution_vc_cascade_control.pdf">pdf</a>)</p>
</div>
</div>
</div>
2020-04-01 16:17:26 +02:00
<div id="outline-container-org5b81db9" class="outline-4">
<h4 id="org5b81db9"><span class="section-number-4">1.7.3</span> Comparison with Piezo</h4>
<div class="outline-text-4" id="text-1-7-3">
<p>
Let&rsquo;s initialize a nano-hexapod with piezoelectric actuators.
</p>
<div class="org-src-container">
<pre class="src src-matlab">initializeNanoHexapod('actuator', 'piezo');
</pre>
</div>
<p>
2020-04-01 16:17:26 +02:00
We don&rsquo;t use any controller.
</p>
<div class="org-src-container">
2020-04-01 16:17:26 +02:00
<pre class="src src-matlab">Kp = tf(zeros(6));
Kl = tf(zeros(6));
Kiff = tf(zeros(6));
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">%% Run the linearization
2020-04-01 16:17:26 +02:00
Gc_pz = linearize(mdl, io, 0);
Gc_pz.InputName = {'Fdx', 'Fdy', 'Fdz', 'Mdx', 'Mdy', 'Mdz'};
Gc_pz.OutputName = {'Ex', 'Ey', 'Ez', 'Erx', 'Ery', 'Erz'};
</pre>
</div>
2020-04-01 16:17:26 +02:00
<div id="orgc7cba59" class="figure">
<p><img src="figs/compliance_comp_pz_vc_cascade.png" alt="compliance_comp_pz_vc_cascade.png" />
</p>
<p><span class="figure-number">Figure 14: </span>Comparison of the compliance using the open-loop piezo-nano hexapod and the voice coil nano-hexapod with the cascade control topology (<a href="./figs/compliance_comp_pz_vc_cascade.png">png</a>, <a href="./figs/compliance_comp_pz_vc_cascade.pdf">pdf</a>)</p>
</div>
</div>
</div>
</div>
2020-04-01 16:17:26 +02:00
<div id="outline-container-org3c7ca09" class="outline-3">
<h3 id="org3c7ca09"><span class="section-number-3">1.8</span> Robustness to Payload Variability</h3>
2020-04-01 16:17:26 +02:00
<div class="outline-text-3" id="text-1-8">
</div>
<div id="outline-container-orgf34ee18" class="outline-4">
<h4 id="orgf34ee18"><span class="section-number-4">1.8.1</span> Initialization</h4>
2020-04-01 16:17:26 +02:00
<div class="outline-text-4" id="text-1-8-1">
<p>
Let&rsquo;s change the payload mass, and see if the controller design for a payload mass of 1 still gives good performance.
</p>
<div class="org-src-container">
<pre class="src src-matlab">initializeSample('mass', 50);
2020-04-01 16:17:26 +02:00
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">Kp = tf(zeros(6));
Kl = tf(zeros(6));
Kiff = tf(zeros(6));
</pre>
</div>
</div>
</div>
2020-04-01 16:17:26 +02:00
<div id="outline-container-org0d97c55" class="outline-4">
<h4 id="org0d97c55"><span class="section-number-4">1.8.2</span> Low Authority Control</h4>
<div class="outline-text-4" id="text-1-8-2">
<p>
Let&rsquo;s first identify the transfer function for the Low Authority control.
</p>
<div class="org-src-container">
<pre class="src src-matlab">%% Name of the Simulink File
mdl = 'nass_model';
2020-04-01 16:17:26 +02:00
%% Input/Output definition
2020-04-01 16:17:26 +02: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', [], 'Fnlm'); io_i = io_i + 1; % Force Sensors
2020-04-01 16:17:26 +02:00
%% Run the linearization
2020-04-01 16:17:26 +02:00
G_iff_m = linearize(mdl, io, 0);
G_iff_m.InputName = {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'};
G_iff_m.OutputName = {'Fnlm1', 'Fnlm2', 'Fnlm3', 'Fnlm4', 'Fnlm5', 'Fnlm6'};
</pre>
</div>
2020-04-01 16:17:26 +02:00
<p>
The obtained dynamics is compared when using a payload of 1Kg in Figure <a href="#orgda72d72">15</a>.
</p>
2020-04-01 16:17:26 +02:00
<div id="orgda72d72" class="figure">
<p><img src="figs/voice_coil_variability_mass_iff.png" alt="voice_coil_variability_mass_iff.png" />
</p>
<p><span class="figure-number">Figure 15: </span>Dynamics of the LAC plant when using a 50Kg payload (dashed) and when using a 1Kg payload (solid) (<a href="./figs/voice_coil_variability_mass_iff.png">png</a>, <a href="./figs/voice_coil_variability_mass_iff.pdf">pdf</a>)</p>
</div>
<p>
A gain of 50 will here suffice to obtain critical damping of the nano-hexapod modes.
</p>
<p>
Let&rsquo;s load the IFF controller designed when the payload has a mass of 1Kg.
</p>
<div class="org-src-container">
<pre class="src src-matlab">load('mat/hac_lac_cascade_vc_controllers.mat', 'Kiff')
</pre>
</div>
2020-04-01 16:17:26 +02:00
<div id="org2d34f99" class="figure">
<p><img src="figs/voice_coil_variability_mass_iff_loop_gain.png" alt="voice_coil_variability_mass_iff_loop_gain.png" />
</p>
<p><span class="figure-number">Figure 16: </span>Loop gain for the IFF Control when using a 50Kg payload (dashed) and when using a 1Kg payload (solid) (<a href="./figs/voice_coil_variability_mass_iff_loop_gain.png">png</a>, <a href="./figs/voice_coil_variability_mass_iff_loop_gain.pdf">pdf</a>)</p>
</div>
</div>
</div>
<div id="outline-container-orgab3ab98" class="outline-4">
<h4 id="orgab3ab98"><span class="section-number-4">1.8.3</span> High Authority Control</h4>
<div class="outline-text-4" id="text-1-8-3">
<p>
We use the Integral Force Feedback developed with a mass of 1Kg and we identify the dynamics for the High Authority Controller in the case of the 50Kg payload
</p>
<div class="org-src-container">
<pre class="src src-matlab">%% Name of the Simulink File
mdl = 'nass_model';
2020-04-01 16:17:26 +02:00
%% Input/Output definition
2020-04-01 16:17:26 +02: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, '/Micro-Station'], 3, 'output', [], 'Dnlm'); io_i = io_i + 1; % Leg Displacement
2020-04-01 16:17:26 +02:00
%% Run the linearization
2020-04-01 16:17:26 +02:00
Gl_m = linearize(mdl, io, 0);
Gl_m.InputName = {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'};
Gl_m.OutputName = {'Dnlm1', 'Dnlm2', 'Dnlm3', 'Dnlm4', 'Dnlm5', 'Dnlm6'};
2020-04-01 16:17:26 +02:00
isstable(Gl_m)
Gl_m = minreal(Gl_m);
isstable(Gl_m)
</pre>
</div>
<div id="org4a13006" class="figure">
<p><img src="figs/voice_coil_variability_mass_hac_plant.png" alt="voice_coil_variability_mass_hac_plant.png" />
</p>
<p><span class="figure-number">Figure 17: </span>Dynamics of the HAC plant when using a 50Kg payload (dashed) and when using a 1Kg payload (solid) (<a href="./figs/voice_coil_variability_mass_hac_plant.png">png</a>, <a href="./figs/voice_coil_variability_mass_hac_plant.pdf">pdf</a>)</p>
</div>
<p>
We load the HAC controller design when the payload has a mass of 1Kg.
</p>
<div class="org-src-container">
<pre class="src src-matlab">load('mat/hac_lac_cascade_vc_controllers.mat', 'Kl')
2020-04-01 16:17:26 +02:00
</pre>
</div>
<div id="orgbc6b4d5" class="figure">
<p><img src="figs/voice_coil_variability_mass_hac_lool_gain.png" alt="voice_coil_variability_mass_hac_lool_gain.png" />
</p>
<p><span class="figure-number">Figure 18: </span>Loop Gain of the HAC when using a 50Kg payload (dashed) and when using a 1Kg payload (solid) (<a href="./figs/voice_coil_variability_mass_hac_lool_gain.png">png</a>, <a href="./figs/voice_coil_variability_mass_hac_lool_gain.pdf">pdf</a>)</p>
</div>
</div>
</div>
<div id="outline-container-org176695a" class="outline-4">
<h4 id="org176695a"><span class="section-number-4">1.8.4</span> Primary Plant</h4>
<div class="outline-text-4" id="text-1-8-4">
<p>
We use the Low Authority Controller developed with a mass of 1Kg and we identify the dynamics for the Primary controller in the case of the 50Kg payload.
</p>
<div class="org-src-container">
<pre class="src src-matlab">%% Name of the Simulink File
mdl = 'nass_model';
2020-04-01 16:17:26 +02:00
%% Input/Output definition
2020-04-01 16:17:26 +02:00
clear io; io_i = 1;
io(io_i) = linio([mdl, '/Controller/Cascade-HAC-LAC/Kp'], 1, 'input'); io_i = io_i + 1;
io(io_i) = linio([mdl, '/Tracking Error'], 1, 'output', [], 'En'); io_i = io_i + 1; % Position Errror
2020-04-01 16:17:26 +02:00
%% Run the linearization
2020-04-01 16:17:26 +02:00
Gp_m = linearize(mdl, io, 0);
Gp_m.InputName = {'rl1', 'rl2', 'rl3', 'rl4', 'rl5', 'rl6'};
Gp_m.OutputName = {'Ex', 'Ey', 'Ez', 'Erx', 'Ery', 'Erz'};
2020-04-01 16:17:26 +02:00
</pre>
</div>
<p>
A minus sign is added to cancel the minus sign already included in the identified plant.
</p>
<div class="org-src-container">
<pre class="src src-matlab">isstable(Gp_m)
Gp_m = -minreal(Gp_m);
2020-04-01 16:17:26 +02:00
isstable(Gp_m)
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">load('mat/stages.mat', 'nano_hexapod');
Gpx_m = Gp_m*inv(nano_hexapod.kinematics.J');
Gpx_m.InputName = {'Fx', 'Fy', 'Fz', 'Mx', 'My', 'Mz'};
2020-04-01 16:17:26 +02:00
Gpl_m = nano_hexapod.kinematics.J*Gp_m;
Gpl_m.OutputName = {'El1', 'El2', 'El3', 'El4', 'El5', 'El6'};
2020-04-01 16:17:26 +02:00
</pre>
</div>
<div class="important">
<p>
There are two zeros with positive real part for the plant in the y direction at about 100Hz.
This is problematic as it limits the bandwidth to be less than \(\approx 50\ \text{Hz}\).
</p>
<p>
It is important here to physically understand why such &ldquo;positive&rdquo; zero appears.
</p>
<p>
If we make a &ldquo;rigid&rdquo; 50kg paylaod, the positive zero disappears.
</p>
</div>
<div id="orgef87d4d" class="figure">
<p><img src="figs/voice_coil_variability_mass_primary_plant.png" alt="voice_coil_variability_mass_primary_plant.png" />
</p>
<p><span class="figure-number">Figure 19: </span>Dynamics of the Primary plant when using a 50Kg payload (dashed) and when using a 1Kg payload (solid) (<a href="./figs/voice_coil_variability_mass_primary_plant.png">png</a>, <a href="./figs/voice_coil_variability_mass_primary_plant.pdf">pdf</a>)</p>
</div>
<p>
We load the primary controller that was design when the payload has a mass of 1Kg.
</p>
<p>
We load the HAC controller design when the payload has a mass of 1Kg.
</p>
<div class="org-src-container">
<pre class="src src-matlab">load('mat/hac_lac_cascade_vc_controllers.mat', 'Kp')
Kp_x = nano_hexapod.kinematics.J'*Kp;
2020-04-01 16:17:26 +02:00
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">wc = 2*pi*50; % Bandwidth Bandwidth [rad/s]
2020-04-01 16:17:26 +02:00
h = 2; % Lead parameter
2020-04-01 16:17:26 +02:00
Kp = (1/h) * (1 + s/wc*h)/(1 + s/wc/h) * ...
(1/h) * (1 + s/wc*h)/(1 + s/wc/h) * ...
(s + 2*pi*1)/s * ...
1/(1+s/2/wc); % For Piezo
2020-04-01 16:17:26 +02:00
% Normalization of the gain of have a loop gain of 1 at frequency wc
Kp = Kp.*diag(1./diag(abs(freqresp(Gpx_m*Kp, wc))));
2020-04-01 16:17:26 +02:00
</pre>
</div>
<div id="orga08b4d8" class="figure">
<p><img src="figs/voice_coil_variability_mass_primary_lool_gain.png" alt="voice_coil_variability_mass_primary_lool_gain.png" />
</p>
<p><span class="figure-number">Figure 20: </span>Loop Gain of the Primary loop when using a 50Kg payload (dashed) and when using a 1Kg payload (solid) (<a href="./figs/voice_coil_variability_mass_primary_lool_gain.png">png</a>, <a href="./figs/voice_coil_variability_mass_primary_lool_gain.pdf">pdf</a>)</p>
</div>
</div>
</div>
<div id="outline-container-org678ff20" class="outline-4">
<h4 id="org678ff20"><span class="section-number-4">1.8.5</span> Simulation</h4>
2020-04-01 16:17:26 +02:00
<div class="outline-text-4" id="text-1-8-5">
<div class="org-src-container">
<pre class="src src-matlab">load('mat/conf_simulink.mat');
set_param(conf_simulink, 'StopTime', '2');
2020-04-01 16:17:26 +02:00
</pre>
</div>
<p>
And we simulate the system.
</p>
<div class="org-src-container">
<pre class="src src-matlab">sim('nass_model');
2020-04-01 16:17:26 +02:00
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">cascade_hac_lac_lorentz_high_mass = simout;
save('./mat/cascade_hac_lac.mat', 'cascade_hac_lac_lorentz_high_mass', '-append');
2020-04-01 16:17:26 +02:00
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">load('./mat/experiment_tomography.mat', 'tomo_align_dist');
2020-04-01 16:17:26 +02:00
</pre>
</div>
</div>
</div>
</div>
</div>
<div id="outline-container-orgd649256" class="outline-2">
<h2 id="orgd649256"><span class="section-number-2">2</span> Other analysis</h2>
<div class="outline-text-2" id="text-2">
</div>
<div id="outline-container-org6cee30e" class="outline-3">
<h3 id="org6cee30e"><span class="section-number-3">2.1</span> Robustness to Payload Variability</h3>
2020-04-01 16:17:26 +02:00
<div class="outline-text-3" id="text-2-1">
<ul class="org-ul">
<li class="off"><code>[&#xa0;]</code> For 3/masses (1kg, 10kg, 50kg), plot each of the 3 plants</li>
</ul>
</div>
</div>
<div id="outline-container-org18b00fa" class="outline-3">
<h3 id="org18b00fa"><span class="section-number-3">2.2</span> Direct HAC control in the task space - \(\bm{K}_\mathcal{X}\)</h3>
<div class="outline-text-3" id="text-2-2">
<div id="org5ded988" class="figure">
<p><img src="figs/control_architecture_hac_iff_pos_X.png" alt="control_architecture_hac_iff_pos_X.png" />
</p>
<p><span class="figure-number">Figure 21: </span>Control Architecture containing an IFF controller and a Controller in the task space</p>
</div>
</div>
<div id="outline-container-org625b500" class="outline-4">
<h4 id="org625b500"><span class="section-number-4">2.2.1</span> Identification</h4>
2020-04-01 16:17:26 +02:00
<div class="outline-text-4" id="text-2-2-1">
<div class="org-src-container">
<pre class="src src-matlab">initializeController('type', 'hac-iff');
2020-04-01 16:17:26 +02:00
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">%% Name of the Simulink File
mdl = 'nass_model';
2020-04-01 16:17:26 +02:00
%% Input/Output definition
2020-04-01 16:17:26 +02:00
clear io; io_i = 1;
io(io_i) = linio([mdl, '/Controller/HAC-IFF/Kx'], 1, 'input'); io_i = io_i + 1; % Control input
io(io_i) = linio([mdl, '/Tracking Error'], 1, 'output', [], 'En'); io_i = io_i + 1; % Position Errror
2020-04-01 16:17:26 +02:00
%% Run the linearization
2020-04-01 16:17:26 +02:00
G = linearize(mdl, io, 0);
G.InputName = {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'};
G.OutputName = {'Ex', 'Ey', 'Ez', 'Erx', 'Ery', 'Erz'};
2020-04-01 16:17:26 +02:00
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">isstable(G)
G = -minreal(G);
2020-04-01 16:17:26 +02:00
isstable(G)
</pre>
</div>
<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'};
2020-04-01 16:17:26 +02:00
Gl = nano_hexapod.kinematics.J*G;
Gl.OutputName = {'El1', 'El2', 'El3', 'El4', 'El5', 'El6'};
2020-04-01 16:17:26 +02:00
</pre>
</div>
</div>
</div>
<div id="outline-container-org1387536" class="outline-4">
<h4 id="org1387536"><span class="section-number-4">2.2.2</span> Obtained Plant in the Task Space</h4>
</div>
<div id="outline-container-org50b9f75" class="outline-4">
<h4 id="org50b9f75"><span class="section-number-4">2.2.3</span> Obtained Plant in the Joint Space</h4>
</div>
<div id="outline-container-org19db2cd" class="outline-4">
<h4 id="org19db2cd"><span class="section-number-4">2.2.4</span> Controller Design in the Joint Space</h4>
<div class="outline-text-4" id="text-2-2-4">
<div class="org-src-container">
<pre class="src src-matlab">wc = 2*pi*200; % Bandwidth Bandwidth [rad/s]
2020-04-01 16:17:26 +02:00
h = 2; % Lead parameter
2020-04-01 16:17:26 +02:00
Kx = (1/h) * (1 + s/wc*h)/(1 + s/wc/h) * ... % Lead
(1/h) * (1 + s/wc*h)/(1 + s/wc/h) * ... % Lead
(s + 2*pi*10)/s * ... % Pseudo Integrator
1/(1+s/2/pi/500); % Low pass Filter
2020-04-01 16:17:26 +02: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-04-01 16:17:26 +02:00
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">wc = 2*pi*200; % Bandwidth Bandwidth [rad/s]
2020-04-01 16:17:26 +02:00
h = 2; % Lead parameter
2020-04-01 16:17:26 +02:00
Kl = (1/h) * (1 + s/wc*h)/(1 + s/wc/h) * ... % Lead
(1/h) * (1 + s/wc*h)/(1 + s/wc/h) * ... % Lead
(s + 2*pi*1)/s * ... % Pseudo Integrator
(s + 2*pi*10)/s * ... % Pseudo Integrator
1/(1+s/2/pi/500); % Low pass Filter
2020-04-01 16:17:26 +02:00
% Normalization of the gain of have a loop gain of 1 at frequency wc
Kl = Kl.*diag(1./diag(abs(freqresp(Gl*Kl, wc))));
2020-04-01 16:17:26 +02:00
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-org5e26e70" class="outline-3">
<h3 id="org5e26e70"><span class="section-number-3">2.3</span> On the usefulness of the High Authority Control loop / Linearization loop</h3>
<div class="outline-text-3" id="text-2-3">
<p>
Let&rsquo;s see what happens is we omit the HAC loop and we directly try to control the damped plant using the measurement of the sample with respect to the granite \(\bm{\mathcal{X}}\).
</p>
<p>
We can do that in two different ways:
</p>
<ul class="org-ul">
<li>in the task space as shown in Figure <a href="#orge366d0b">22</a></li>
<li>in the space of the legs as shown in Figure <a href="#orgd23329e">23</a></li>
</ul>
<div id="orge366d0b" class="figure">
<p><img src="figs/control_architecture_iff_X.png" alt="control_architecture_iff_X.png" />
</p>
<p><span class="figure-number">Figure 22: </span>IFF control + primary controller in the task space</p>
</div>
<div id="orgd23329e" class="figure">
<p><img src="figs/control_architecture_iff_L.png" alt="control_architecture_iff_L.png" />
</p>
<p><span class="figure-number">Figure 23: </span>HAC-LAC control architecture in the frame of the legs</p>
</div>
</div>
<div id="outline-container-org7366662" class="outline-4">
<h4 id="org7366662"><span class="section-number-4">2.3.1</span> Identification</h4>
2020-04-01 16:17:26 +02:00
<div class="outline-text-4" id="text-2-3-1">
<div class="org-src-container">
<pre class="src src-matlab">initializeController('type', 'hac-iff');
2020-04-01 16:17:26 +02:00
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">%% Name of the Simulink File
mdl = 'nass_model';
2020-04-01 16:17:26 +02:00
%% Input/Output definition
2020-04-01 16:17:26 +02:00
clear io; io_i = 1;
io(io_i) = linio([mdl, '/Controller/HAC-IFF/Kx'], 1, 'input'); io_i = io_i + 1;
io(io_i) = linio([mdl, '/Tracking Error'], 1, 'output', [], 'En'); io_i = io_i + 1; % Position Errror
2020-04-01 16:17:26 +02:00
%% Run the linearization
2020-04-01 16:17:26 +02:00
G = linearize(mdl, io, 0);
G.InputName = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
G.OutputName = {'Ex', 'Ey', 'Ez', 'Erx', 'Ery', 'Erz'};
2020-04-01 16:17:26 +02:00
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">isstable(G)
G = -minreal(G);
2020-04-01 16:17:26 +02:00
isstable(G)
</pre>
</div>
</div>
</div>
<div id="outline-container-orgfab8847" class="outline-4">
<h4 id="orgfab8847"><span class="section-number-4">2.3.2</span> Plant in the Task space</h4>
<div class="outline-text-4" id="text-2-3-2">
<p>
The obtained plant is shown in Figure
</p>
<div class="org-src-container">
<pre class="src src-matlab">Gx = G*inv(nano_hexapod.kinematics.J');
2020-04-01 16:17:26 +02:00
</pre>
</div>
</div>
</div>
<div id="outline-container-org18aeea5" class="outline-4">
<h4 id="org18aeea5"><span class="section-number-4">2.3.3</span> Plant in the Leg&rsquo;s space</h4>
<div class="outline-text-4" id="text-2-3-3">
<div class="org-src-container">
<pre class="src src-matlab">Gl = nano_hexapod.kinematics.J*G;
2020-04-01 16:17:26 +02:00
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-org015f992" class="outline-3">
<h3 id="org015f992"><span class="section-number-3">2.4</span> DVF instead of IFF?</h3>
<div class="outline-text-3" id="text-2-4">
</div>
<div id="outline-container-org17cfb9d" class="outline-4">
<h4 id="org17cfb9d"><span class="section-number-4">2.4.1</span> Initialization and Identification</h4>
<div class="outline-text-4" id="text-2-4-1">
<div class="org-src-container">
<pre class="src src-matlab">initializeController('type', 'hac-dvf');
2020-04-01 16:17:26 +02:00
Kdvf = tf(zeros(6));
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">%% Name of the Simulink File
mdl = 'nass_model';
2020-04-01 16:17:26 +02:00
%% Input/Output definition
2020-04-01 16:17:26 +02: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; % Displacement Sensors
2020-04-01 16:17:26 +02:00
%% Run the linearization
2020-04-01 16:17:26 +02:00
G_dvf = linearize(mdl, io, 0);
G_dvf.InputName = {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'};
G_dvf.OutputName = {'Dlm1', 'Dlm2', 'Dlm3', 'Dlm4', 'Dlm5', 'Dlm6'};
2020-04-01 16:17:26 +02:00
</pre>
</div>
</div>
</div>
<div id="outline-container-orgd7117f7" class="outline-4">
<h4 id="orgd7117f7"><span class="section-number-4">2.4.2</span> Obtained Plant</h4>
2020-04-01 16:17:26 +02:00
</div>
<div id="outline-container-org51c8027" class="outline-4">
<h4 id="org51c8027"><span class="section-number-4">2.4.3</span> Controller</h4>
<div class="outline-text-4" id="text-2-4-3">
<div class="org-src-container">
<pre class="src src-matlab">Kdvf = -850*s/(1+s/2/pi/1000)*eye(6);
2020-04-01 16:17:26 +02:00
</pre>
</div>
</div>
</div>
<div id="outline-container-org33637f1" class="outline-4">
<h4 id="org33637f1"><span class="section-number-4">2.4.4</span> HAC Identification</h4>
<div class="outline-text-4" id="text-2-4-4">
<div class="org-src-container">
<pre class="src src-matlab">%% Name of the Simulink File
mdl = 'nass_model';
2020-04-01 16:17:26 +02:00
%% Input/Output definition
2020-04-01 16:17:26 +02:00
clear io; io_i = 1;
io(io_i) = linio([mdl, '/Controller/HAC-DVF/Kx'], 1, 'input'); io_i = io_i + 1; % Control input
io(io_i) = linio([mdl, '/Tracking Error'], 1, 'output', [], 'En'); io_i = io_i + 1; % Position Errror
2020-04-01 16:17:26 +02:00
%% Run the linearization
2020-04-01 16:17:26 +02:00
G = linearize(mdl, io, 0);
G.InputName = {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'};
G.OutputName = {'Ex', 'Ey', 'Ez', 'Erx', 'Ery', 'Erz'};
2020-04-01 16:17:26 +02:00
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">isstable(G)
G = -minreal(G);
2020-04-01 16:17:26 +02:00
isstable(G)
</pre>
</div>
<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'};
2020-04-01 16:17:26 +02:00
Gl = nano_hexapod.kinematics.J*G;
Gl.OutputName = {'El1', 'El2', 'El3', 'El4', 'El5', 'El6'};
2020-04-01 16:17:26 +02:00
</pre>
</div>
</div>
</div>
<div id="outline-container-orgec66083" class="outline-4">
<h4 id="orgec66083"><span class="section-number-4">2.4.5</span> Conclusion</h4>
<div class="outline-text-4" id="text-2-4-5">
<div class="important">
<p>
DVF can be used instead of IFF.
</p>
</div>
</div>
</div>
</div>
</div>
2020-03-23 10:05:32 +01:00
</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>