nass-simscape/docs/simscape_subsystems.html

2863 lines
131 KiB
HTML
Raw Normal View History

<?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-04-17 ven. 09:35 -->
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<title>Subsystems used for the Simscape Models</title>
<meta name="generator" content="Org mode" />
<meta name="author" content="Dehaeze Thomas" />
2020-02-25 18:21:17 +01:00
<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>
</head>
<body>
<div id="org-div-home-and-up">
2020-02-25 18:21:17 +01:00
<a accesskey="h" href="./index.html"> UP </a>
|
2020-02-25 18:21:17 +01:00
<a accesskey="H" href="./index.html"> HOME </a>
</div><div id="content">
<h1 class="title">Subsystems used for the Simscape Models</h1>
<div id="table-of-contents">
<h2>Table of Contents</h2>
<div id="text-table-of-contents">
<ul>
<li><a href="#org6171274">1. Simscape Configuration</a>
<ul>
<li><a href="#org7b08f05">Function description</a></li>
<li><a href="#orgad5ce1a">Optional Parameters</a></li>
<li><a href="#orgddf1000">Structure initialization</a></li>
<li><a href="#org0199d4e">Add Type</a></li>
<li><a href="#orgc98a92d">Save the Structure</a></li>
</ul>
</li>
<li><a href="#orgdda6840">2. Logging Configuration</a>
<ul>
<li><a href="#org88f436b">Function description</a></li>
<li><a href="#orgb00b597">Optional Parameters</a></li>
<li><a href="#orga752908">Structure initialization</a></li>
<li><a href="#org33078ef">Add Type</a></li>
<li><a href="#org60d91f1">Sampling Time</a></li>
<li><a href="#org3f0256c">Save the Structure</a></li>
</ul>
</li>
<li><a href="#org1bf1870">3. Ground</a>
<ul>
<li><a href="#orgb8b9e70">Simscape Model</a></li>
<li><a href="#org759d1c4">Function description</a></li>
<li><a href="#org9579bcb">Optional Parameters</a></li>
<li><a href="#orga81bb95">Structure initialization</a></li>
<li><a href="#org0e3fa77">Add Type</a></li>
<li><a href="#org4c31ca5">Ground Solid properties</a></li>
2020-03-13 17:40:22 +01:00
<li><a href="#org542691f">Rotation Point</a></li>
<li><a href="#org5941fcc">Save the Structure</a></li>
</ul>
</li>
<li><a href="#orga045749">4. Granite</a>
<ul>
<li><a href="#org9150597">Simscape Model</a></li>
<li><a href="#org1c23a6e">Function description</a></li>
<li><a href="#orgb2257a0">Optional Parameters</a></li>
<li><a href="#org21fda48">Structure initialization</a></li>
<li><a href="#org413c06d">Add Granite Type</a></li>
<li><a href="#org15040e5">Material and Geometry</a></li>
<li><a href="#org44718ba">Stiffness and Damping properties</a></li>
<li><a href="#orga986884">Equilibrium position of the each joint.</a></li>
<li><a href="#org60c21f1">Save the Structure</a></li>
</ul>
</li>
<li><a href="#org29a05f0">5. Translation Stage</a>
<ul>
<li><a href="#org17e914d">Simscape Model</a></li>
<li><a href="#orgfb87785">Function description</a></li>
<li><a href="#orga630b36">Optional Parameters</a></li>
<li><a href="#orgd6fb42d">Structure initialization</a></li>
<li><a href="#org715e876">Add Translation Stage Type</a></li>
<li><a href="#org720631a">Material and Geometry</a></li>
<li><a href="#orgcb2502a">Stiffness and Damping properties</a></li>
<li><a href="#org535a5a1">Equilibrium position of the each joint.</a></li>
<li><a href="#orge785d7b">Save the Structure</a></li>
</ul>
</li>
<li><a href="#org8c0bf19">6. Tilt Stage</a>
<ul>
<li><a href="#org1f2e14e">Simscape Model</a></li>
<li><a href="#org4fe1ba7">Function description</a></li>
<li><a href="#org7065c72">Optional Parameters</a></li>
<li><a href="#org336536c">Structure initialization</a></li>
<li><a href="#orgea3a7ba">Add Tilt Type</a></li>
<li><a href="#org9b13d95">Material and Geometry</a></li>
<li><a href="#org75361fc">Stiffness and Damping properties</a></li>
<li><a href="#orgf1a8b5a">Equilibrium position of the each joint.</a></li>
<li><a href="#orga391a01">Save the Structure</a></li>
</ul>
</li>
<li><a href="#orgd8e0052">7. Spindle</a>
<ul>
<li><a href="#orgd7c601d">Simscape Model</a></li>
<li><a href="#orgcd4f81e">Function description</a></li>
<li><a href="#orgf5fd210">Optional Parameters</a></li>
<li><a href="#orgae65304">Structure initialization</a></li>
<li><a href="#orge5b17ec">Add Spindle Type</a></li>
<li><a href="#orgdfb44f4">Material and Geometry</a></li>
<li><a href="#org7bc4860">Stiffness and Damping properties</a></li>
<li><a href="#org838243c">Equilibrium position of the each joint.</a></li>
<li><a href="#orga6d1479">Save the Structure</a></li>
</ul>
</li>
<li><a href="#org4ddc1e5">8. Micro Hexapod</a>
<ul>
<li><a href="#org3d24c9f">Simscape Model</a></li>
<li><a href="#org9b1a3cd">Function description</a></li>
<li><a href="#org47c7d02">Optional Parameters</a></li>
<li><a href="#org7aee51e">Function content</a></li>
<li><a href="#org6bc2b55">Add Type</a></li>
<li><a href="#org8213553">Save the Structure</a></li>
</ul>
</li>
<li><a href="#orga55d418">9. Center of gravity compensation</a>
<ul>
<li><a href="#org3941025">Simscape Model</a></li>
<li><a href="#orgb36c81d">Function description</a></li>
<li><a href="#orgaf8fac6">Optional Parameters</a></li>
<li><a href="#org53fd6a5">Structure initialization</a></li>
<li><a href="#org2a78f53">Add Type</a></li>
<li><a href="#orgf24be75">Material and Geometry</a></li>
<li><a href="#org9a0dd75">Save the Structure</a></li>
</ul>
</li>
<li><a href="#org7586ab7">10. Mirror</a>
<ul>
<li><a href="#org32434c0">Simscape Model</a></li>
<li><a href="#org26ab22d">Function description</a></li>
<li><a href="#org800114b">Optional Parameters</a></li>
<li><a href="#org00f76ae">Structure initialization</a></li>
<li><a href="#orgff14824">Add Mirror Type</a></li>
<li><a href="#org4ad73aa">Mass and Inertia</a></li>
<li><a href="#org58eb0d1">Stiffness and Damping properties</a></li>
<li><a href="#org2aad5e8">Equilibrium position of the each joint.</a></li>
<li><a href="#orgc381755">Geometry</a></li>
<li><a href="#orgb8d89d9">Save the Structure</a></li>
</ul>
</li>
<li><a href="#org7906acb">11. Nano Hexapod</a>
<ul>
<li><a href="#orgcd30dc1">Simscape Model</a></li>
<li><a href="#orgd83dd69">Function description</a></li>
<li><a href="#org424ead8">Optional Parameters</a></li>
<li><a href="#org4f2e11d">Function content</a></li>
<li><a href="#org1e0f7f4">Add Type</a></li>
<li><a href="#org30be760">Save the Structure</a></li>
</ul>
</li>
<li><a href="#org3d615a1">12. Sample</a>
<ul>
<li><a href="#org92b9277">Simscape Model</a></li>
<li><a href="#org246ce35">Function description</a></li>
<li><a href="#orga7f047e">Optional Parameters</a></li>
<li><a href="#org55660d5">Structure initialization</a></li>
<li><a href="#org2bb1d24">Add Sample Type</a></li>
<li><a href="#org8f61ce3">Material and Geometry</a></li>
2020-04-01 16:17:26 +02:00
<li><a href="#org228453f">Compute the Inertia</a></li>
<li><a href="#org9976da6">Stiffness and Damping properties</a></li>
<li><a href="#orge84d6de">Equilibrium position of the each joint.</a></li>
<li><a href="#org287465f">Save the Structure</a></li>
</ul>
</li>
<li><a href="#orge9cbdc9">13. Initialize Controller</a>
<ul>
<li><a href="#org0272560">Function Declaration and Documentation</a></li>
<li><a href="#org977a259">Optional Parameters</a></li>
<li><a href="#orgd4f5644">Structure initialization</a></li>
<li><a href="#org4207f98">Controller Type</a></li>
<li><a href="#orgded6aac">Save the Structure</a></li>
</ul>
</li>
<li><a href="#orgae5cb57">14. Generate Reference Signals</a>
<ul>
<li><a href="#org05dcced">Function Declaration and Documentation</a></li>
<li><a href="#orgb9c3029">Optional Parameters</a></li>
<li><a href="#orge94c0c2">Initialize Parameters</a></li>
<li><a href="#org55e59c3">Translation Stage</a></li>
<li><a href="#orga4374f1">Tilt Stage</a></li>
<li><a href="#orgcd779c6">Spindle</a></li>
<li><a href="#orgaac7776">Micro Hexapod</a></li>
<li><a href="#org04d73dc">Axis Compensation</a></li>
<li><a href="#org16c8d40">Nano Hexapod</a></li>
<li><a href="#orga751ae8">Save</a></li>
</ul>
</li>
<li><a href="#org544c9dd">15. Initialize Disturbances</a>
<ul>
<li><a href="#orgbb2d2bb">Function Declaration and Documentation</a></li>
<li><a href="#orgcdc38a6">Optional Parameters</a></li>
<li><a href="#orgf744aeb">Load Data</a></li>
<li><a href="#org6c7d666">Parameters</a></li>
<li><a href="#orgb2108c4">Ground Motion</a></li>
<li><a href="#orgb70c65e">Translation Stage - X direction</a></li>
<li><a href="#org070255a">Translation Stage - Z direction</a></li>
<li><a href="#orgfd5f32b">Spindle - Z direction</a></li>
<li><a href="#orgba4d479">Direct Forces</a></li>
<li><a href="#orgf6d2198">Set initial value to zero</a></li>
<li><a href="#org6c1def3">Save</a></li>
</ul>
</li>
<li><a href="#orgefb8a5e">16. Initialize Position Errors</a>
<ul>
<li><a href="#orgb134e02">Function Declaration and Documentation</a></li>
<li><a href="#org27c3039">Optional Parameters</a></li>
<li><a href="#org4a0049b">Structure initialization</a></li>
<li><a href="#orgc890f7d">Type</a></li>
<li><a href="#org7d50228">Position Errors</a></li>
<li><a href="#org2b550dd">Save</a></li>
</ul>
</li>
<li><a href="#orgc87e890">17. Z-Axis Geophone</a></li>
<li><a href="#orgcbddbd1">18. Z-Axis Accelerometer</a></li>
</ul>
</div>
</div>
<p>
The full Simscape Model is represented in Figure <a href="#org742ece0">1</a>.
</p>
<div id="org742ece0" class="figure">
<p><img src="figs/images/simscape_picture.png" alt="simscape_picture.png" />
</p>
<p><span class="figure-number">Figure 1: </span>Screenshot of the Multi-Body Model representation</p>
</div>
<p>
This model is divided into multiple subsystems that are independent.
These subsystems are saved in separate files and imported in the main file using a block balled &ldquo;subsystem reference&rdquo;.
</p>
<p>
Each stage is configured (geometry, mass properties, dynamic properties &#x2026;) using one function.
</p>
<p>
These functions are defined below.
</p>
<div id="outline-container-org6171274" class="outline-2">
<h2 id="org6171274"><span class="section-number-2">1</span> Simscape Configuration</h2>
<div class="outline-text-2" id="text-1">
<p>
<a id="orgb590dcf"></a>
</p>
</div>
<div id="outline-container-org7b08f05" class="outline-3">
<h3 id="org7b08f05">Function description</h3>
<div class="outline-text-3" id="text-org7b08f05">
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-keyword">function</span> <span class="org-variable-name">[]</span> = <span class="org-function-name">initializeSimscapeConfiguration</span>(<span class="org-variable-name">args</span>)
</pre>
</div>
</div>
</div>
<div id="outline-container-orgad5ce1a" class="outline-3">
<h3 id="orgad5ce1a">Optional Parameters</h3>
<div class="outline-text-3" id="text-orgad5ce1a">
<div class="org-src-container">
<pre class="src src-matlab">arguments
args.gravity logical {mustBeNumericOrLogical} = <span class="org-constant">true</span>
<span class="org-keyword">end</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-orgddf1000" class="outline-3">
<h3 id="orgddf1000">Structure initialization</h3>
<div class="outline-text-3" id="text-orgddf1000">
<div class="org-src-container">
<pre class="src src-matlab">conf_simscape = struct();
</pre>
</div>
</div>
</div>
<div id="outline-container-org0199d4e" class="outline-3">
<h3 id="org0199d4e">Add Type</h3>
<div class="outline-text-3" id="text-org0199d4e">
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-keyword">if</span> args.gravity
conf_simscape.type = 1;
<span class="org-keyword">else</span>
conf_simscape.type = 2;
<span class="org-keyword">end</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-orgc98a92d" class="outline-3">
<h3 id="orgc98a92d">Save the Structure</h3>
<div class="outline-text-3" id="text-orgc98a92d">
<div class="org-src-container">
<pre class="src src-matlab">save(<span class="org-string">'./mat/conf_simscape.mat'</span>, <span class="org-string">'conf_simscape'</span>);
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-orgdda6840" class="outline-2">
<h2 id="orgdda6840"><span class="section-number-2">2</span> Logging Configuration</h2>
<div class="outline-text-2" id="text-2">
<p>
<a id="org1f9c6ac"></a>
</p>
</div>
<div id="outline-container-org88f436b" class="outline-3">
<h3 id="org88f436b">Function description</h3>
<div class="outline-text-3" id="text-org88f436b">
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-keyword">function</span> <span class="org-variable-name">[]</span> = <span class="org-function-name">initializeLoggingConfiguration</span>(<span class="org-variable-name">args</span>)
</pre>
</div>
</div>
</div>
<div id="outline-container-orgb00b597" class="outline-3">
<h3 id="orgb00b597">Optional Parameters</h3>
<div class="outline-text-3" id="text-orgb00b597">
<div class="org-src-container">
<pre class="src src-matlab">arguments
args.log char {mustBeMember(args.log,{<span class="org-string">'none'</span>, <span class="org-string">'all'</span>, <span class="org-string">'forces'</span>})} = <span class="org-string">'none'</span>
args.Ts (1,1) double {mustBeNumeric, mustBePositive} = 1e<span class="org-type">-</span>3
<span class="org-keyword">end</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-orga752908" class="outline-3">
<h3 id="orga752908">Structure initialization</h3>
<div class="outline-text-3" id="text-orga752908">
<div class="org-src-container">
<pre class="src src-matlab">conf_log = struct();
</pre>
</div>
</div>
</div>
<div id="outline-container-org33078ef" class="outline-3">
<h3 id="org33078ef">Add Type</h3>
<div class="outline-text-3" id="text-org33078ef">
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-keyword">switch</span> <span class="org-constant">args.log</span>
<span class="org-keyword">case</span> <span class="org-string">'none'</span>
conf_log.type = 0;
<span class="org-keyword">case</span> <span class="org-string">'all'</span>
conf_log.type = 1;
<span class="org-keyword">case</span> <span class="org-string">'forces'</span>
conf_log.type = 2;
<span class="org-keyword">end</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org60d91f1" class="outline-3">
<h3 id="org60d91f1">Sampling Time</h3>
<div class="outline-text-3" id="text-org60d91f1">
<div class="org-src-container">
<pre class="src src-matlab">conf_log.Ts = args.Ts;
</pre>
</div>
</div>
</div>
<div id="outline-container-org3f0256c" class="outline-3">
<h3 id="org3f0256c">Save the Structure</h3>
<div class="outline-text-3" id="text-org3f0256c">
<div class="org-src-container">
<pre class="src src-matlab">save(<span class="org-string">'./mat/conf_log.mat'</span>, <span class="org-string">'conf_log'</span>);
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-org1bf1870" class="outline-2">
<h2 id="org1bf1870"><span class="section-number-2">3</span> Ground</h2>
<div class="outline-text-2" id="text-3">
<p>
<a id="orgbe1f388"></a>
</p>
</div>
<div id="outline-container-orgb8b9e70" class="outline-3">
<h3 id="orgb8b9e70">Simscape Model</h3>
<div class="outline-text-3" id="text-orgb8b9e70">
<p>
The model of the Ground is composed of:
</p>
<ul class="org-ul">
<li>A <b>Cartesian</b> joint that is used to simulation the ground motion</li>
<li>A solid that represents the ground on which the granite is located</li>
</ul>
<div id="org31eeec1" class="figure">
<p><img src="figs/images/simscape_model_ground.png" alt="simscape_model_ground.png" />
</p>
<p><span class="figure-number">Figure 2: </span>Simscape model for the Ground</p>
</div>
<div id="org342019d" class="figure">
<p><img src="figs/images/simscape_picture_ground.png" alt="simscape_picture_ground.png" />
</p>
<p><span class="figure-number">Figure 3: </span>Simscape picture for the Ground</p>
</div>
</div>
</div>
<div id="outline-container-org759d1c4" class="outline-3">
<h3 id="org759d1c4">Function description</h3>
<div class="outline-text-3" id="text-org759d1c4">
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-keyword">function</span> <span class="org-variable-name">[ground]</span> = <span class="org-function-name">initializeGround</span>(<span class="org-variable-name">args</span>)
</pre>
</div>
</div>
</div>
<div id="outline-container-org9579bcb" class="outline-3">
<h3 id="org9579bcb">Optional Parameters</h3>
<div class="outline-text-3" id="text-org9579bcb">
<div class="org-src-container">
<pre class="src src-matlab">arguments
2020-03-13 17:40:22 +01:00
args.type char {mustBeMember(args.type,{<span class="org-string">'none'</span>, <span class="org-string">'rigid'</span>})} = <span class="org-string">'rigid'</span>
args.rot_point (3,1) double {mustBeNumeric} = zeros(3,1) <span class="org-comment">% Rotation point for the ground motion [m]</span>
<span class="org-keyword">end</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-orga81bb95" class="outline-3">
<h3 id="orga81bb95">Structure initialization</h3>
<div class="outline-text-3" id="text-orga81bb95">
<p>
First, we initialize the <code>granite</code> structure.
</p>
<div class="org-src-container">
<pre class="src src-matlab">ground = struct();
</pre>
</div>
</div>
</div>
<div id="outline-container-org0e3fa77" class="outline-3">
<h3 id="org0e3fa77">Add Type</h3>
<div class="outline-text-3" id="text-org0e3fa77">
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-keyword">switch</span> <span class="org-constant">args.type</span>
<span class="org-keyword">case</span> <span class="org-string">'none'</span>
ground.type = 0;
<span class="org-keyword">case</span> <span class="org-string">'rigid'</span>
ground.type = 1;
<span class="org-keyword">end</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org4c31ca5" class="outline-3">
<h3 id="org4c31ca5">Ground Solid properties</h3>
<div class="outline-text-3" id="text-org4c31ca5">
<p>
We set the shape and density of the ground solid element.
</p>
<div class="org-src-container">
<pre class="src src-matlab">ground.shape = [2, 2, 0.5]; <span class="org-comment">% [m]</span>
ground.density = 2800; <span class="org-comment">% [kg/m3]</span>
</pre>
</div>
</div>
</div>
2020-03-13 17:40:22 +01:00
<div id="outline-container-org542691f" class="outline-3">
<h3 id="org542691f">Rotation Point</h3>
<div class="outline-text-3" id="text-org542691f">
<div class="org-src-container">
<pre class="src src-matlab">ground.rot_point = args.rot_point;
</pre>
</div>
</div>
</div>
<div id="outline-container-org5941fcc" class="outline-3">
<h3 id="org5941fcc">Save the Structure</h3>
<div class="outline-text-3" id="text-org5941fcc">
<p>
The <code>ground</code> structure is saved.
</p>
<div class="org-src-container">
<pre class="src src-matlab">save(<span class="org-string">'./mat/stages.mat'</span>, <span class="org-string">'ground'</span>, <span class="org-string">'-append'</span>);
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-orga045749" class="outline-2">
<h2 id="orga045749"><span class="section-number-2">4</span> Granite</h2>
<div class="outline-text-2" id="text-4">
<p>
<a id="org82dc444"></a>
</p>
</div>
<div id="outline-container-org9150597" class="outline-3">
<h3 id="org9150597">Simscape Model</h3>
<div class="outline-text-3" id="text-org9150597">
<p>
The Simscape model of the granite is composed of:
</p>
<ul class="org-ul">
<li>A cartesian joint such that the granite can vibrations along x, y and z axis</li>
<li>A solid</li>
</ul>
<p>
The output <code>sample_pos</code> corresponds to the impact point of the X-ray.
</p>
<div id="org3072cb3" class="figure">
<p><img src="figs/images/simscape_model_granite.png" alt="simscape_model_granite.png" />
</p>
<p><span class="figure-number">Figure 4: </span>Simscape model for the Granite</p>
</div>
<div id="org089e7b6" class="figure">
<p><img src="figs/images/simscape_picture_granite.png" alt="simscape_picture_granite.png" />
</p>
<p><span class="figure-number">Figure 5: </span>Simscape picture for the Granite</p>
</div>
</div>
</div>
<div id="outline-container-org1c23a6e" class="outline-3">
<h3 id="org1c23a6e">Function description</h3>
<div class="outline-text-3" id="text-org1c23a6e">
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-keyword">function</span> <span class="org-variable-name">[granite]</span> = <span class="org-function-name">initializeGranite</span>(<span class="org-variable-name">args</span>)
</pre>
</div>
</div>
</div>
<div id="outline-container-orgb2257a0" class="outline-3">
<h3 id="orgb2257a0">Optional Parameters</h3>
<div class="outline-text-3" id="text-orgb2257a0">
<div class="org-src-container">
<pre class="src src-matlab">arguments
args.type char {mustBeMember(args.type,{<span class="org-string">'rigid'</span>, <span class="org-string">'flexible'</span>, <span class="org-string">'none'</span>, <span class="org-string">'modal-analysis'</span>, <span class="org-string">'init'</span>})} = <span class="org-string">'flexible'</span>
2020-03-17 11:23:47 +01:00
args.Foffset logical {mustBeNumericOrLogical} = <span class="org-constant">false</span>
args.density (1,1) double {mustBeNumeric, mustBeNonnegative} = 2800 <span class="org-comment">% Density [kg/m3]</span>
args.K (3,1) double {mustBeNumeric, mustBeNonnegative} = [4e9; 3e8; 8e8] <span class="org-comment">% [N/m]</span>
args.C (3,1) double {mustBeNumeric, mustBeNonnegative} = [4.0e5; 1.1e5; 9.0e5] <span class="org-comment">% [N/(m/s)]</span>
args.x0 (1,1) double {mustBeNumeric} = 0 <span class="org-comment">% Rest position of the Joint in the X direction [m]</span>
args.y0 (1,1) double {mustBeNumeric} = 0 <span class="org-comment">% Rest position of the Joint in the Y direction [m]</span>
args.z0 (1,1) double {mustBeNumeric} = 0 <span class="org-comment">% Rest position of the Joint in the Z direction [m]</span>
<span class="org-keyword">end</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org21fda48" class="outline-3">
<h3 id="org21fda48">Structure initialization</h3>
<div class="outline-text-3" id="text-org21fda48">
<p>
First, we initialize the <code>granite</code> structure.
</p>
<div class="org-src-container">
<pre class="src src-matlab">granite = struct();
</pre>
</div>
</div>
</div>
<div id="outline-container-org413c06d" class="outline-3">
<h3 id="org413c06d">Add Granite Type</h3>
<div class="outline-text-3" id="text-org413c06d">
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-keyword">switch</span> <span class="org-constant">args.type</span>
<span class="org-keyword">case</span> <span class="org-string">'none'</span>
granite.type = 0;
<span class="org-keyword">case</span> <span class="org-string">'rigid'</span>
granite.type = 1;
<span class="org-keyword">case</span> <span class="org-string">'flexible'</span>
granite.type = 2;
<span class="org-keyword">case</span> <span class="org-string">'modal-analysis'</span>
granite.type = 3;
<span class="org-keyword">case</span> <span class="org-string">'init'</span>
granite.type = 4;
<span class="org-keyword">end</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org15040e5" class="outline-3">
<h3 id="org15040e5">Material and Geometry</h3>
<div class="outline-text-3" id="text-org15040e5">
<p>
Properties of the Material and link to the geometry of the granite.
</p>
<div class="org-src-container">
<pre class="src src-matlab">granite.density = args.density; <span class="org-comment">% [kg/m3]</span>
granite.STEP = <span class="org-string">'./STEPS/granite/granite.STEP'</span>;
</pre>
</div>
<p>
Z-offset for the initial position of the sample with respect to the granite top surface.
</p>
<div class="org-src-container">
<pre class="src src-matlab">granite.sample_pos = 0.8; <span class="org-comment">% [m]</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org44718ba" class="outline-3">
<h3 id="org44718ba">Stiffness and Damping properties</h3>
<div class="outline-text-3" id="text-org44718ba">
<div class="org-src-container">
<pre class="src src-matlab">granite.K = args.K; <span class="org-comment">% [N/m]</span>
granite.C = args.C; <span class="org-comment">% [N/(m/s)]</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-orga986884" class="outline-3">
<h3 id="orga986884">Equilibrium position of the each joint.</h3>
<div class="outline-text-3" id="text-orga986884">
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-keyword">if</span> args.Foffset <span class="org-type">&amp;&amp;</span> <span class="org-type">~</span>strcmp(args.type, <span class="org-string">'none'</span>) <span class="org-type">&amp;&amp;</span> <span class="org-type">~</span>strcmp(args.type, <span class="org-string">'rigid'</span>) <span class="org-type">&amp;&amp;</span> <span class="org-type">~</span>strcmp(args.type, <span class="org-string">'init'</span>)
load(<span class="org-string">'mat/Foffset.mat'</span>, <span class="org-string">'Fgm'</span>);
granite.Deq = <span class="org-type">-</span>Fgm<span class="org-type">'./</span>granite.K;
<span class="org-keyword">else</span>
granite.Deq = zeros(6,1);
<span class="org-keyword">end</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org60c21f1" class="outline-3">
<h3 id="org60c21f1">Save the Structure</h3>
<div class="outline-text-3" id="text-org60c21f1">
<p>
The <code>granite</code> structure is saved.
</p>
<div class="org-src-container">
<pre class="src src-matlab">save(<span class="org-string">'./mat/stages.mat'</span>, <span class="org-string">'granite'</span>, <span class="org-string">'-append'</span>);
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-org29a05f0" class="outline-2">
<h2 id="org29a05f0"><span class="section-number-2">5</span> Translation Stage</h2>
<div class="outline-text-2" id="text-5">
<p>
<a id="orga6fcdbd"></a>
</p>
</div>
<div id="outline-container-org17e914d" class="outline-3">
<h3 id="org17e914d">Simscape Model</h3>
<div class="outline-text-3" id="text-org17e914d">
<p>
The Simscape model of the Translation stage consist of:
</p>
<ul class="org-ul">
<li>One rigid body for the fixed part of the translation stage</li>
<li>One rigid body for the moving part of the translation stage</li>
<li>Four 6-DOF Joints that only have some rigidity in the X and Z directions.
The rigidity in rotation comes from the fact that we use multiple joints that are located at different points</li>
<li>One 6-DOF joint that represent the Actuator.
It is used to impose the motion in the Y direction</li>
<li>One 6-DOF joint to inject force disturbance in the X and Z directions</li>
</ul>
<div id="orgb5e657d" class="figure">
<p><img src="figs/images/simscape_model_ty.png" alt="simscape_model_ty.png" />
</p>
<p><span class="figure-number">Figure 6: </span>Simscape model for the Translation Stage</p>
</div>
<div id="org55b7d60" class="figure">
<p><img src="figs/images/simscape_picture_ty.png" alt="simscape_picture_ty.png" />
</p>
<p><span class="figure-number">Figure 7: </span>Simscape picture for the Translation Stage</p>
</div>
</div>
</div>
<div id="outline-container-orgfb87785" class="outline-3">
<h3 id="orgfb87785">Function description</h3>
<div class="outline-text-3" id="text-orgfb87785">
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-keyword">function</span> <span class="org-variable-name">[ty]</span> = <span class="org-function-name">initializeTy</span>(<span class="org-variable-name">args</span>)
</pre>
</div>
</div>
</div>
<div id="outline-container-orga630b36" class="outline-3">
<h3 id="orga630b36">Optional Parameters</h3>
<div class="outline-text-3" id="text-orga630b36">
<div class="org-src-container">
<pre class="src src-matlab">arguments
args.type char {mustBeMember(args.type,{<span class="org-string">'none'</span>, <span class="org-string">'rigid'</span>, <span class="org-string">'flexible'</span>, <span class="org-string">'modal-analysis'</span>, <span class="org-string">'init'</span>})} = <span class="org-string">'flexible'</span>
2020-03-17 11:23:47 +01:00
args.Foffset logical {mustBeNumericOrLogical} = <span class="org-constant">false</span>
<span class="org-keyword">end</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-orgd6fb42d" class="outline-3">
<h3 id="orgd6fb42d">Structure initialization</h3>
<div class="outline-text-3" id="text-orgd6fb42d">
<p>
First, we initialize the <code>ty</code> structure.
</p>
<div class="org-src-container">
<pre class="src src-matlab">ty = struct();
</pre>
</div>
</div>
</div>
<div id="outline-container-org715e876" class="outline-3">
<h3 id="org715e876">Add Translation Stage Type</h3>
<div class="outline-text-3" id="text-org715e876">
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-keyword">switch</span> <span class="org-constant">args.type</span>
<span class="org-keyword">case</span> <span class="org-string">'none'</span>
ty.type = 0;
<span class="org-keyword">case</span> <span class="org-string">'rigid'</span>
ty.type = 1;
<span class="org-keyword">case</span> <span class="org-string">'flexible'</span>
ty.type = 2;
<span class="org-keyword">case</span> <span class="org-string">'modal-analysis'</span>
ty.type = 3;
<span class="org-keyword">case</span> <span class="org-string">'init'</span>
ty.type = 4;
<span class="org-keyword">end</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org720631a" class="outline-3">
<h3 id="org720631a">Material and Geometry</h3>
<div class="outline-text-3" id="text-org720631a">
<p>
Define the density of the materials as well as the geometry (STEP files).
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-comment">% Ty Granite frame</span>
ty.granite_frame.density = 7800; <span class="org-comment">% [kg/m3] =&gt; 43kg</span>
ty.granite_frame.STEP = <span class="org-string">'./STEPS/Ty/Ty_Granite_Frame.STEP'</span>;
<span class="org-comment">% Guide Translation Ty</span>
ty.guide.density = 7800; <span class="org-comment">% [kg/m3] =&gt; 76kg</span>
ty.guide.STEP = <span class="org-string">'./STEPS/ty/Ty_Guide.STEP'</span>;
<span class="org-comment">% Ty - Guide_Translation12</span>
ty.guide12.density = 7800; <span class="org-comment">% [kg/m3]</span>
ty.guide12.STEP = <span class="org-string">'./STEPS/Ty/Ty_Guide_12.STEP'</span>;
<span class="org-comment">% Ty - Guide_Translation11</span>
ty.guide11.density = 7800; <span class="org-comment">% [kg/m3]</span>
ty.guide11.STEP = <span class="org-string">'./STEPS/ty/Ty_Guide_11.STEP'</span>;
<span class="org-comment">% Ty - Guide_Translation22</span>
ty.guide22.density = 7800; <span class="org-comment">% [kg/m3]</span>
ty.guide22.STEP = <span class="org-string">'./STEPS/ty/Ty_Guide_22.STEP'</span>;
<span class="org-comment">% Ty - Guide_Translation21</span>
ty.guide21.density = 7800; <span class="org-comment">% [kg/m3]</span>
ty.guide21.STEP = <span class="org-string">'./STEPS/Ty/Ty_Guide_21.STEP'</span>;
<span class="org-comment">% Ty - Plateau translation</span>
ty.frame.density = 7800; <span class="org-comment">% [kg/m3]</span>
ty.frame.STEP = <span class="org-string">'./STEPS/ty/Ty_Stage.STEP'</span>;
<span class="org-comment">% Ty Stator Part</span>
ty.stator.density = 5400; <span class="org-comment">% [kg/m3]</span>
ty.stator.STEP = <span class="org-string">'./STEPS/ty/Ty_Motor_Stator.STEP'</span>;
<span class="org-comment">% Ty Rotor Part</span>
ty.rotor.density = 5400; <span class="org-comment">% [kg/m3]</span>
ty.rotor.STEP = <span class="org-string">'./STEPS/ty/Ty_Motor_Rotor.STEP'</span>;
</pre>
</div>
</div>
</div>
<div id="outline-container-orgcb2502a" class="outline-3">
<h3 id="orgcb2502a">Stiffness and Damping properties</h3>
<div class="outline-text-3" id="text-orgcb2502a">
<div class="org-src-container">
<pre class="src src-matlab">ty.K = [2e8; 1e8; 2e8; 6e7; 9e7; 6e7]; <span class="org-comment">% [N/m, N*m/rad]</span>
ty.C = [8e4; 5e4; 8e4; 2e4; 3e4; 2e4]; <span class="org-comment">% [N/(m/s), N*m/(rad/s)]</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org535a5a1" class="outline-3">
<h3 id="org535a5a1">Equilibrium position of the each joint.</h3>
<div class="outline-text-3" id="text-org535a5a1">
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-keyword">if</span> args.Foffset <span class="org-type">&amp;&amp;</span> <span class="org-type">~</span>strcmp(args.type, <span class="org-string">'none'</span>) <span class="org-type">&amp;&amp;</span> <span class="org-type">~</span>strcmp(args.type, <span class="org-string">'rigid'</span>) <span class="org-type">&amp;&amp;</span> <span class="org-type">~</span>strcmp(args.type, <span class="org-string">'init'</span>)
load(<span class="org-string">'mat/Foffset.mat'</span>, <span class="org-string">'Ftym'</span>);
ty.Deq = <span class="org-type">-</span>Ftym<span class="org-type">'./</span>ty.K;
<span class="org-keyword">else</span>
ty.Deq = zeros(6,1);
<span class="org-keyword">end</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-orge785d7b" class="outline-3">
<h3 id="orge785d7b">Save the Structure</h3>
<div class="outline-text-3" id="text-orge785d7b">
<p>
The <code>ty</code> structure is saved.
</p>
<div class="org-src-container">
<pre class="src src-matlab">save(<span class="org-string">'./mat/stages.mat'</span>, <span class="org-string">'ty'</span>, <span class="org-string">'-append'</span>);
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-org8c0bf19" class="outline-2">
<h2 id="org8c0bf19"><span class="section-number-2">6</span> Tilt Stage</h2>
<div class="outline-text-2" id="text-6">
<p>
<a id="orga630083"></a>
</p>
</div>
<div id="outline-container-org1f2e14e" class="outline-3">
<h3 id="org1f2e14e">Simscape Model</h3>
<div class="outline-text-3" id="text-org1f2e14e">
<p>
The Simscape model of the Tilt stage is composed of:
</p>
<ul class="org-ul">
<li>Two solid bodies for the two part of the stage</li>
<li><b>Four</b> 6-DOF joints to model the flexibility of the stage.
These joints are virtually located along the rotation axis and are connecting the two solid bodies.
These joints have some translation stiffness in the u-v-w directions aligned with the joint.
The stiffness in rotation between the two solids is due to the fact that the 4 joints are connecting the two solids are different locations</li>
<li>A Bushing Joint used for the Actuator.
The Ry motion is imposed by the input.</li>
</ul>
<div id="orgee25bbf" class="figure">
<p><img src="figs/images/simscape_model_ry.png" alt="simscape_model_ry.png" />
</p>
<p><span class="figure-number">Figure 8: </span>Simscape model for the Tilt Stage</p>
</div>
<div id="orgcb39e81" class="figure">
<p><img src="figs/images/simscape_picture_ry.png" alt="simscape_picture_ry.png" />
</p>
<p><span class="figure-number">Figure 9: </span>Simscape picture for the Tilt Stage</p>
</div>
</div>
</div>
<div id="outline-container-org4fe1ba7" class="outline-3">
<h3 id="org4fe1ba7">Function description</h3>
<div class="outline-text-3" id="text-org4fe1ba7">
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-keyword">function</span> <span class="org-variable-name">[ry]</span> = <span class="org-function-name">initializeRy</span>(<span class="org-variable-name">args</span>)
</pre>
</div>
</div>
</div>
<div id="outline-container-org7065c72" class="outline-3">
<h3 id="org7065c72">Optional Parameters</h3>
<div class="outline-text-3" id="text-org7065c72">
<div class="org-src-container">
<pre class="src src-matlab">arguments
args.type char {mustBeMember(args.type,{<span class="org-string">'none'</span>, <span class="org-string">'rigid'</span>, <span class="org-string">'flexible'</span>, <span class="org-string">'modal-analysis'</span>, <span class="org-string">'init'</span>})} = <span class="org-string">'flexible'</span>
2020-03-17 11:23:47 +01:00
args.Foffset logical {mustBeNumericOrLogical} = <span class="org-constant">false</span>
args.Ry_init (1,1) double {mustBeNumeric} = 0
<span class="org-keyword">end</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org336536c" class="outline-3">
<h3 id="org336536c">Structure initialization</h3>
<div class="outline-text-3" id="text-org336536c">
<p>
First, we initialize the <code>ry</code> structure.
</p>
<div class="org-src-container">
<pre class="src src-matlab">ry = struct();
</pre>
</div>
</div>
</div>
<div id="outline-container-orgea3a7ba" class="outline-3">
<h3 id="orgea3a7ba">Add Tilt Type</h3>
<div class="outline-text-3" id="text-orgea3a7ba">
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-keyword">switch</span> <span class="org-constant">args.type</span>
<span class="org-keyword">case</span> <span class="org-string">'none'</span>
ry.type = 0;
<span class="org-keyword">case</span> <span class="org-string">'rigid'</span>
ry.type = 1;
<span class="org-keyword">case</span> <span class="org-string">'flexible'</span>
ry.type = 2;
<span class="org-keyword">case</span> <span class="org-string">'modal-analysis'</span>
ry.type = 3;
<span class="org-keyword">case</span> <span class="org-string">'init'</span>
ry.type = 4;
<span class="org-keyword">end</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org9b13d95" class="outline-3">
<h3 id="org9b13d95">Material and Geometry</h3>
<div class="outline-text-3" id="text-org9b13d95">
<p>
Properties of the Material and link to the geometry of the Tilt stage.
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-comment">% Ry - Guide for the tilt stage</span>
ry.guide.density = 7800; <span class="org-comment">% [kg/m3]</span>
ry.guide.STEP = <span class="org-string">'./STEPS/ry/Tilt_Guide.STEP'</span>;
<span class="org-comment">% Ry - Rotor of the motor</span>
ry.rotor.density = 2400; <span class="org-comment">% [kg/m3]</span>
ry.rotor.STEP = <span class="org-string">'./STEPS/ry/Tilt_Motor_Axis.STEP'</span>;
<span class="org-comment">% Ry - Motor</span>
ry.motor.density = 3200; <span class="org-comment">% [kg/m3]</span>
ry.motor.STEP = <span class="org-string">'./STEPS/ry/Tilt_Motor.STEP'</span>;
<span class="org-comment">% Ry - Plateau Tilt</span>
ry.stage.density = 7800; <span class="org-comment">% [kg/m3]</span>
ry.stage.STEP = <span class="org-string">'./STEPS/ry/Tilt_Stage.STEP'</span>;
</pre>
</div>
<p>
Z-Offset so that the center of rotation matches the sample center;
</p>
<div class="org-src-container">
<pre class="src src-matlab">ry.z_offset = 0.58178; <span class="org-comment">% [m]</span>
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">ry.Ry_init = args.Ry_init; <span class="org-comment">% [rad]</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org75361fc" class="outline-3">
<h3 id="org75361fc">Stiffness and Damping properties</h3>
<div class="outline-text-3" id="text-org75361fc">
<div class="org-src-container">
<pre class="src src-matlab">ry.K = [3.8e8; 4e8; 3.8e8; 1.2e8; 6e4; 1.2e8];
ry.C = [1e5; 1e5; 1e5; 3e4; 1e3; 3e4];
</pre>
</div>
</div>
</div>
<div id="outline-container-orgf1a8b5a" class="outline-3">
<h3 id="orgf1a8b5a">Equilibrium position of the each joint.</h3>
<div class="outline-text-3" id="text-orgf1a8b5a">
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-keyword">if</span> args.Foffset <span class="org-type">&amp;&amp;</span> <span class="org-type">~</span>strcmp(args.type, <span class="org-string">'none'</span>) <span class="org-type">&amp;&amp;</span> <span class="org-type">~</span>strcmp(args.type, <span class="org-string">'rigid'</span>) <span class="org-type">&amp;&amp;</span> <span class="org-type">~</span>strcmp(args.type, <span class="org-string">'init'</span>)
load(<span class="org-string">'mat/Foffset.mat'</span>, <span class="org-string">'Fym'</span>);
ry.Deq = <span class="org-type">-</span>Fym<span class="org-type">'./</span>ry.K;
<span class="org-keyword">else</span>
ry.Deq = zeros(6,1);
<span class="org-keyword">end</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-orga391a01" class="outline-3">
<h3 id="orga391a01">Save the Structure</h3>
<div class="outline-text-3" id="text-orga391a01">
<p>
The <code>ry</code> structure is saved.
</p>
<div class="org-src-container">
<pre class="src src-matlab">save(<span class="org-string">'./mat/stages.mat'</span>, <span class="org-string">'ry'</span>, <span class="org-string">'-append'</span>);
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-orgd8e0052" class="outline-2">
<h2 id="orgd8e0052"><span class="section-number-2">7</span> Spindle</h2>
<div class="outline-text-2" id="text-7">
<p>
<a id="org85f7685"></a>
</p>
</div>
<div id="outline-container-orgd7c601d" class="outline-3">
<h3 id="orgd7c601d">Simscape Model</h3>
<div class="outline-text-3" id="text-orgd7c601d">
<p>
The Simscape model of the Spindle is composed of:
</p>
<ul class="org-ul">
<li>Two rigid bodies: the stator and the rotor</li>
<li>A Bushing Joint that is used both as the actuator (the Rz motion is imposed by the input) and as the force perturbation in the Z direction.</li>
<li>The Bushing joint has some flexibility in the X-Y-Z directions as well as in Rx and Ry rotations</li>
</ul>
<div id="orgf8cd2b8" class="figure">
<p><img src="figs/images/simscape_model_rz.png" alt="simscape_model_rz.png" />
</p>
<p><span class="figure-number">Figure 10: </span>Simscape model for the Spindle</p>
</div>
<div id="org8f17d51" class="figure">
<p><img src="figs/images/simscape_picture_rz.png" alt="simscape_picture_rz.png" />
</p>
<p><span class="figure-number">Figure 11: </span>Simscape picture for the Spindle</p>
</div>
</div>
</div>
<div id="outline-container-orgcd4f81e" class="outline-3">
<h3 id="orgcd4f81e">Function description</h3>
<div class="outline-text-3" id="text-orgcd4f81e">
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-keyword">function</span> <span class="org-variable-name">[rz]</span> = <span class="org-function-name">initializeRz</span>(<span class="org-variable-name">args</span>)
</pre>
</div>
</div>
</div>
<div id="outline-container-orgf5fd210" class="outline-3">
<h3 id="orgf5fd210">Optional Parameters</h3>
<div class="outline-text-3" id="text-orgf5fd210">
<div class="org-src-container">
<pre class="src src-matlab">arguments
args.type char {mustBeMember(args.type,{<span class="org-string">'none'</span>, <span class="org-string">'rigid'</span>, <span class="org-string">'flexible'</span>, <span class="org-string">'modal-analysis'</span>, <span class="org-string">'init'</span>})} = <span class="org-string">'flexible'</span>
2020-03-17 11:23:47 +01:00
args.Foffset logical {mustBeNumericOrLogical} = <span class="org-constant">false</span>
<span class="org-keyword">end</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-orgae65304" class="outline-3">
<h3 id="orgae65304">Structure initialization</h3>
<div class="outline-text-3" id="text-orgae65304">
<p>
First, we initialize the <code>rz</code> structure.
</p>
<div class="org-src-container">
<pre class="src src-matlab">rz = struct();
</pre>
</div>
</div>
</div>
<div id="outline-container-orge5b17ec" class="outline-3">
<h3 id="orge5b17ec">Add Spindle Type</h3>
<div class="outline-text-3" id="text-orge5b17ec">
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-keyword">switch</span> <span class="org-constant">args.type</span>
<span class="org-keyword">case</span> <span class="org-string">'none'</span>
rz.type = 0;
<span class="org-keyword">case</span> <span class="org-string">'rigid'</span>
rz.type = 1;
<span class="org-keyword">case</span> <span class="org-string">'flexible'</span>
rz.type = 2;
<span class="org-keyword">case</span> <span class="org-string">'modal-analysis'</span>
rz.type = 3;
<span class="org-keyword">case</span> <span class="org-string">'init'</span>
rz.type = 4;
<span class="org-keyword">end</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-orgdfb44f4" class="outline-3">
<h3 id="orgdfb44f4">Material and Geometry</h3>
<div class="outline-text-3" id="text-orgdfb44f4">
<p>
Properties of the Material and link to the geometry of the spindle.
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-comment">% Spindle - Slip Ring</span>
rz.slipring.density = 7800; <span class="org-comment">% [kg/m3]</span>
rz.slipring.STEP = <span class="org-string">'./STEPS/rz/Spindle_Slip_Ring.STEP'</span>;
<span class="org-comment">% Spindle - Rotor</span>
rz.rotor.density = 7800; <span class="org-comment">% [kg/m3]</span>
rz.rotor.STEP = <span class="org-string">'./STEPS/rz/Spindle_Rotor.STEP'</span>;
<span class="org-comment">% Spindle - Stator</span>
rz.stator.density = 7800; <span class="org-comment">% [kg/m3]</span>
rz.stator.STEP = <span class="org-string">'./STEPS/rz/Spindle_Stator.STEP'</span>;
</pre>
</div>
</div>
</div>
<div id="outline-container-org7bc4860" class="outline-3">
<h3 id="org7bc4860">Stiffness and Damping properties</h3>
<div class="outline-text-3" id="text-org7bc4860">
<div class="org-src-container">
<pre class="src src-matlab">rz.K = [7e8; 7e8; 2e9; 1e7; 1e7; 1e7];
rz.C = [4e4; 4e4; 7e4; 1e4; 1e4; 1e4];
</pre>
</div>
</div>
</div>
<div id="outline-container-org838243c" class="outline-3">
<h3 id="org838243c">Equilibrium position of the each joint.</h3>
<div class="outline-text-3" id="text-org838243c">
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-keyword">if</span> args.Foffset <span class="org-type">&amp;&amp;</span> <span class="org-type">~</span>strcmp(args.type, <span class="org-string">'none'</span>) <span class="org-type">&amp;&amp;</span> <span class="org-type">~</span>strcmp(args.type, <span class="org-string">'rigid'</span>) <span class="org-type">&amp;&amp;</span> <span class="org-type">~</span>strcmp(args.type, <span class="org-string">'init'</span>)
load(<span class="org-string">'mat/Foffset.mat'</span>, <span class="org-string">'Fzm'</span>);
rz.Deq = <span class="org-type">-</span>Fzm<span class="org-type">'./</span>rz.K;
<span class="org-keyword">else</span>
rz.Deq = zeros(6,1);
<span class="org-keyword">end</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-orga6d1479" class="outline-3">
<h3 id="orga6d1479">Save the Structure</h3>
<div class="outline-text-3" id="text-orga6d1479">
<p>
The <code>rz</code> structure is saved.
</p>
<div class="org-src-container">
<pre class="src src-matlab">save(<span class="org-string">'./mat/stages.mat'</span>, <span class="org-string">'rz'</span>, <span class="org-string">'-append'</span>);
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-org4ddc1e5" class="outline-2">
<h2 id="org4ddc1e5"><span class="section-number-2">8</span> Micro Hexapod</h2>
<div class="outline-text-2" id="text-8">
<p>
<a id="org01254ae"></a>
</p>
</div>
<div id="outline-container-org3d24c9f" class="outline-3">
<h3 id="org3d24c9f">Simscape Model</h3>
<div class="outline-text-3" id="text-org3d24c9f">
<div id="org13345ec" class="figure">
<p><img src="figs/images/simscape_model_micro_hexapod.png" alt="simscape_model_micro_hexapod.png" />
</p>
<p><span class="figure-number">Figure 12: </span>Simscape model for the Micro-Hexapod</p>
</div>
<div id="orga63e01a" class="figure">
<p><img src="figs/images/simscape_picture_micro_hexapod.png" alt="simscape_picture_micro_hexapod.png" />
</p>
<p><span class="figure-number">Figure 13: </span>Simscape picture for the Micro-Hexapod</p>
</div>
</div>
</div>
<div id="outline-container-org9b1a3cd" class="outline-3">
<h3 id="org9b1a3cd">Function description</h3>
<div class="outline-text-3" id="text-org9b1a3cd">
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-keyword">function</span> <span class="org-variable-name">[micro_hexapod]</span> = <span class="org-function-name">initializeMicroHexapod</span>(<span class="org-variable-name">args</span>)
</pre>
</div>
</div>
</div>
<div id="outline-container-org47c7d02" class="outline-3">
<h3 id="org47c7d02">Optional Parameters</h3>
<div class="outline-text-3" id="text-org47c7d02">
<div class="org-src-container">
<pre class="src src-matlab">arguments
2020-04-01 16:17:26 +02:00
args.type char {mustBeMember(args.type,{<span class="org-string">'none'</span>, <span class="org-string">'rigid'</span>, <span class="org-string">'flexible'</span>, <span class="org-string">'modal-analysis'</span>, <span class="org-string">'init'</span>, <span class="org-string">'compliance'</span>})} = <span class="org-string">'flexible'</span>
<span class="org-comment">% initializeFramesPositions</span>
args.H (1,1) double {mustBeNumeric, mustBePositive} = 350e<span class="org-type">-</span>3
args.MO_B (1,1) double {mustBeNumeric} = 270e<span class="org-type">-</span>3
<span class="org-comment">% generateGeneralConfiguration</span>
args.FH (1,1) double {mustBeNumeric, mustBePositive} = 50e<span class="org-type">-</span>3
args.FR (1,1) double {mustBeNumeric, mustBePositive} = 175.5e<span class="org-type">-</span>3
args.FTh (6,1) double {mustBeNumeric} = [<span class="org-type">-</span>10, 10, 120<span class="org-type">-</span>10, 120<span class="org-type">+</span>10, 240<span class="org-type">-</span>10, 240<span class="org-type">+</span>10]<span class="org-type">*</span>(<span class="org-constant">pi</span><span class="org-type">/</span>180)
args.MH (1,1) double {mustBeNumeric, mustBePositive} = 45e<span class="org-type">-</span>3
args.MR (1,1) double {mustBeNumeric, mustBePositive} = 118e<span class="org-type">-</span>3
args.MTh (6,1) double {mustBeNumeric} = [<span class="org-type">-</span>60<span class="org-type">+</span>10, 60<span class="org-type">-</span>10, 60<span class="org-type">+</span>10, 180<span class="org-type">-</span>10, 180<span class="org-type">+</span>10, <span class="org-type">-</span>60<span class="org-type">-</span>10]<span class="org-type">*</span>(<span class="org-constant">pi</span><span class="org-type">/</span>180)
<span class="org-comment">% initializeStrutDynamics</span>
args.Ki (6,1) double {mustBeNumeric, mustBeNonnegative} = 2e7<span class="org-type">*</span>ones(6,1)
args.Ci (6,1) double {mustBeNumeric, mustBeNonnegative} = 1.4e3<span class="org-type">*</span>ones(6,1)
<span class="org-comment">% initializeCylindricalPlatforms</span>
args.Fpm (1,1) double {mustBeNumeric, mustBePositive} = 10
args.Fph (1,1) double {mustBeNumeric, mustBePositive} = 26e<span class="org-type">-</span>3
args.Fpr (1,1) double {mustBeNumeric, mustBePositive} = 207.5e<span class="org-type">-</span>3
args.Mpm (1,1) double {mustBeNumeric, mustBePositive} = 10
args.Mph (1,1) double {mustBeNumeric, mustBePositive} = 26e<span class="org-type">-</span>3
args.Mpr (1,1) double {mustBeNumeric, mustBePositive} = 150e<span class="org-type">-</span>3
<span class="org-comment">% initializeCylindricalStruts</span>
args.Fsm (1,1) double {mustBeNumeric, mustBePositive} = 1
args.Fsh (1,1) double {mustBeNumeric, mustBePositive} = 100e<span class="org-type">-</span>3
args.Fsr (1,1) double {mustBeNumeric, mustBePositive} = 25e<span class="org-type">-</span>3
args.Msm (1,1) double {mustBeNumeric, mustBePositive} = 1
args.Msh (1,1) double {mustBeNumeric, mustBePositive} = 100e<span class="org-type">-</span>3
args.Msr (1,1) double {mustBeNumeric, mustBePositive} = 25e<span class="org-type">-</span>3
<span class="org-comment">% inverseKinematics</span>
args.AP (3,1) double {mustBeNumeric} = zeros(3,1)
args.ARB (3,3) double {mustBeNumeric} = eye(3)
<span class="org-comment">% Force that stiffness of each joint should apply at t=0</span>
2020-03-17 11:23:47 +01:00
args.Foffset logical {mustBeNumericOrLogical} = <span class="org-constant">false</span>
<span class="org-keyword">end</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org7aee51e" class="outline-3">
<h3 id="org7aee51e">Function content</h3>
<div class="outline-text-3" id="text-org7aee51e">
<div class="org-src-container">
<pre class="src src-matlab">micro_hexapod = initializeFramesPositions(<span class="org-string">'H'</span>, args.H, <span class="org-string">'MO_B'</span>, args.MO_B);
micro_hexapod = generateGeneralConfiguration(micro_hexapod, <span class="org-string">'FH'</span>, args.FH, <span class="org-string">'FR'</span>, args.FR, <span class="org-string">'FTh'</span>, args.FTh, <span class="org-string">'MH'</span>, args.MH, <span class="org-string">'MR'</span>, args.MR, <span class="org-string">'MTh'</span>, args.MTh);
micro_hexapod = computeJointsPose(micro_hexapod);
micro_hexapod = initializeStrutDynamics(micro_hexapod, <span class="org-string">'Ki'</span>, args.Ki, <span class="org-string">'Ci'</span>, args.Ci);
micro_hexapod = initializeCylindricalPlatforms(micro_hexapod, <span class="org-string">'Fpm'</span>, args.Fpm, <span class="org-string">'Fph'</span>, args.Fph, <span class="org-string">'Fpr'</span>, args.Fpr, <span class="org-string">'Mpm'</span>, args.Mpm, <span class="org-string">'Mph'</span>, args.Mph, <span class="org-string">'Mpr'</span>, args.Mpr);
micro_hexapod = initializeCylindricalStruts(micro_hexapod, <span class="org-string">'Fsm'</span>, args.Fsm, <span class="org-string">'Fsh'</span>, args.Fsh, <span class="org-string">'Fsr'</span>, args.Fsr, <span class="org-string">'Msm'</span>, args.Msm, <span class="org-string">'Msh'</span>, args.Msh, <span class="org-string">'Msr'</span>, args.Msr);
micro_hexapod = computeJacobian(micro_hexapod);
[Li, dLi] = inverseKinematics(micro_hexapod, <span class="org-string">'AP'</span>, args.AP, <span class="org-string">'ARB'</span>, args.ARB);
micro_hexapod.Li = Li;
micro_hexapod.dLi = dLi;
</pre>
</div>
<p>
Equilibrium position of the each joint.
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-keyword">if</span> args.Foffset <span class="org-type">&amp;&amp;</span> <span class="org-type">~</span>strcmp(args.type, <span class="org-string">'none'</span>) <span class="org-type">&amp;&amp;</span> <span class="org-type">~</span>strcmp(args.type, <span class="org-string">'rigid'</span>) <span class="org-type">&amp;&amp;</span> <span class="org-type">~</span>strcmp(args.type, <span class="org-string">'init'</span>)
load(<span class="org-string">'mat/Foffset.mat'</span>, <span class="org-string">'Fhm'</span>);
micro_hexapod.dLeq = <span class="org-type">-</span>Fhm<span class="org-type">'./</span>args.Ki;
<span class="org-keyword">else</span>
micro_hexapod.dLeq = zeros(6,1);
<span class="org-keyword">end</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org6bc2b55" class="outline-3">
<h3 id="org6bc2b55">Add Type</h3>
<div class="outline-text-3" id="text-org6bc2b55">
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-keyword">switch</span> <span class="org-constant">args.type</span>
<span class="org-keyword">case</span> <span class="org-string">'none'</span>
micro_hexapod.type = 0;
<span class="org-keyword">case</span> <span class="org-string">'rigid'</span>
micro_hexapod.type = 1;
<span class="org-keyword">case</span> <span class="org-string">'flexible'</span>
micro_hexapod.type = 2;
<span class="org-keyword">case</span> <span class="org-string">'modal-analysis'</span>
micro_hexapod.type = 3;
<span class="org-keyword">case</span> <span class="org-string">'init'</span>
micro_hexapod.type = 4;
2020-04-01 16:17:26 +02:00
<span class="org-keyword">case</span> <span class="org-string">'compliance'</span>
micro_hexapod.type = 5;
<span class="org-keyword">end</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org8213553" class="outline-3">
<h3 id="org8213553">Save the Structure</h3>
<div class="outline-text-3" id="text-org8213553">
<p>
The <code>micro_hexapod</code> structure is saved.
</p>
<div class="org-src-container">
<pre class="src src-matlab">save(<span class="org-string">'./mat/stages.mat'</span>, <span class="org-string">'micro_hexapod'</span>, <span class="org-string">'-append'</span>);
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-orga55d418" class="outline-2">
<h2 id="orga55d418"><span class="section-number-2">9</span> Center of gravity compensation</h2>
<div class="outline-text-2" id="text-9">
<p>
<a id="org9989724"></a>
</p>
</div>
<div id="outline-container-org3941025" class="outline-3">
<h3 id="org3941025">Simscape Model</h3>
<div class="outline-text-3" id="text-org3941025">
<p>
The Simscape model of the Center of gravity compensator is composed of:
</p>
<ul class="org-ul">
<li>One main solid that is connected to two other solids (the masses to position of center of mass) through two revolute joints</li>
<li>The angle of both revolute joints is set by the input</li>
</ul>
<div id="orge09d585" class="figure">
<p><img src="figs/images/simscape_model_axisc.png" alt="simscape_model_axisc.png" />
</p>
<p><span class="figure-number">Figure 14: </span>Simscape model for the Center of Mass compensation system</p>
</div>
<div id="orga3d0932" class="figure">
<p><img src="figs/images/simscape_picture_axisc.png" alt="simscape_picture_axisc.png" />
</p>
<p><span class="figure-number">Figure 15: </span>Simscape picture for the Center of Mass compensation system</p>
</div>
</div>
</div>
<div id="outline-container-orgb36c81d" class="outline-3">
<h3 id="orgb36c81d">Function description</h3>
<div class="outline-text-3" id="text-orgb36c81d">
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-keyword">function</span> <span class="org-variable-name">[axisc]</span> = <span class="org-function-name">initializeAxisc</span>(<span class="org-variable-name">args</span>)
</pre>
</div>
</div>
</div>
<div id="outline-container-orgaf8fac6" class="outline-3">
<h3 id="orgaf8fac6">Optional Parameters</h3>
<div class="outline-text-3" id="text-orgaf8fac6">
<div class="org-src-container">
<pre class="src src-matlab">arguments
args.type char {mustBeMember(args.type,{<span class="org-string">'none'</span>, <span class="org-string">'rigid'</span>, <span class="org-string">'flexible'</span>})} = <span class="org-string">'flexible'</span>
<span class="org-keyword">end</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org53fd6a5" class="outline-3">
<h3 id="org53fd6a5">Structure initialization</h3>
<div class="outline-text-3" id="text-org53fd6a5">
<p>
First, we initialize the <code>axisc</code> structure.
</p>
<div class="org-src-container">
<pre class="src src-matlab">axisc = struct();
</pre>
</div>
</div>
</div>
<div id="outline-container-org2a78f53" class="outline-3">
<h3 id="org2a78f53">Add Type</h3>
<div class="outline-text-3" id="text-org2a78f53">
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-keyword">switch</span> <span class="org-constant">args.type</span>
<span class="org-keyword">case</span> <span class="org-string">'none'</span>
axisc.type = 0;
<span class="org-keyword">case</span> <span class="org-string">'rigid'</span>
axisc.type = 1;
<span class="org-keyword">case</span> <span class="org-string">'flexible'</span>
axisc.type = 2;
<span class="org-keyword">end</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-orgf24be75" class="outline-3">
<h3 id="orgf24be75">Material and Geometry</h3>
<div class="outline-text-3" id="text-orgf24be75">
<p>
Properties of the Material and link to the geometry files.
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-comment">% Structure</span>
axisc.structure.density = 3400; <span class="org-comment">% [kg/m3]</span>
axisc.structure.STEP = <span class="org-string">'./STEPS/axisc/axisc_structure.STEP'</span>;
<span class="org-comment">% Wheel</span>
axisc.wheel.density = 2700; <span class="org-comment">% [kg/m3]</span>
axisc.wheel.STEP = <span class="org-string">'./STEPS/axisc/axisc_wheel.STEP'</span>;
<span class="org-comment">% Mass</span>
axisc.mass.density = 7800; <span class="org-comment">% [kg/m3]</span>
axisc.mass.STEP = <span class="org-string">'./STEPS/axisc/axisc_mass.STEP'</span>;
<span class="org-comment">% Gear</span>
axisc.gear.density = 7800; <span class="org-comment">% [kg/m3]</span>
axisc.gear.STEP = <span class="org-string">'./STEPS/axisc/axisc_gear.STEP'</span>;
</pre>
</div>
</div>
</div>
<div id="outline-container-org9a0dd75" class="outline-3">
<h3 id="org9a0dd75">Save the Structure</h3>
<div class="outline-text-3" id="text-org9a0dd75">
<p>
The <code>axisc</code> structure is saved.
</p>
<div class="org-src-container">
<pre class="src src-matlab">save(<span class="org-string">'./mat/stages.mat'</span>, <span class="org-string">'axisc'</span>, <span class="org-string">'-append'</span>);
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-org7586ab7" class="outline-2">
<h2 id="org7586ab7"><span class="section-number-2">10</span> Mirror</h2>
<div class="outline-text-2" id="text-10">
<p>
<a id="org3d670bf"></a>
</p>
</div>
<div id="outline-container-org32434c0" class="outline-3">
<h3 id="org32434c0">Simscape Model</h3>
<div class="outline-text-3" id="text-org32434c0">
<p>
The Simscape Model of the mirror is just a solid body.
The output <code>mirror_center</code> corresponds to the center of the Sphere and is the point of measurement for the metrology
</p>
<div id="org281f48a" class="figure">
<p><img src="figs/images/simscape_model_mirror.png" alt="simscape_model_mirror.png" />
</p>
<p><span class="figure-number">Figure 16: </span>Simscape model for the Mirror</p>
</div>
<div id="orgf4fa701" class="figure">
<p><img src="figs/images/simscape_picture_mirror.png" alt="simscape_picture_mirror.png" />
</p>
<p><span class="figure-number">Figure 17: </span>Simscape picture for the Mirror</p>
</div>
</div>
</div>
<div id="outline-container-org26ab22d" class="outline-3">
<h3 id="org26ab22d">Function description</h3>
<div class="outline-text-3" id="text-org26ab22d">
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-keyword">function</span> <span class="org-variable-name">[]</span> = <span class="org-function-name">initializeMirror</span>(<span class="org-variable-name">args</span>)
</pre>
</div>
</div>
</div>
<div id="outline-container-org800114b" class="outline-3">
<h3 id="org800114b">Optional Parameters</h3>
<div class="outline-text-3" id="text-org800114b">
<div class="org-src-container">
<pre class="src src-matlab">arguments
args.type char {mustBeMember(args.type,{<span class="org-string">'none'</span>, <span class="org-string">'rigid'</span>, <span class="org-string">'flexible'</span>})} = <span class="org-string">'rigid'</span>
args.shape char {mustBeMember(args.shape,{<span class="org-string">'spherical'</span>, <span class="org-string">'conical'</span>})} = <span class="org-string">'spherical'</span>
args.angle (1,1) double {mustBeNumeric, mustBePositive} = 45 <span class="org-comment">% [deg]</span>
args.mass (1,1) double {mustBeNumeric, mustBePositive} = 10 <span class="org-comment">% [kg]</span>
args.freq (6,1) double {mustBeNumeric, mustBeNonnegative} = 200<span class="org-type">*</span>ones(6,1) <span class="org-comment">% [Hz]</span>
<span class="org-keyword">end</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org00f76ae" class="outline-3">
<h3 id="org00f76ae">Structure initialization</h3>
<div class="outline-text-3" id="text-org00f76ae">
<p>
First, we initialize the <code>mirror</code> structure.
</p>
<div class="org-src-container">
<pre class="src src-matlab">mirror = struct();
</pre>
</div>
</div>
</div>
<div id="outline-container-orgff14824" class="outline-3">
<h3 id="orgff14824">Add Mirror Type</h3>
<div class="outline-text-3" id="text-orgff14824">
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-keyword">switch</span> <span class="org-constant">args.type</span>
<span class="org-keyword">case</span> <span class="org-string">'none'</span>
mirror.type = 0;
<span class="org-keyword">case</span> <span class="org-string">'rigid'</span>
mirror.type = 1;
<span class="org-keyword">case</span> <span class="org-string">'flexible'</span>
mirror.type = 2;
<span class="org-keyword">end</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org4ad73aa" class="outline-3">
<h3 id="org4ad73aa">Mass and Inertia</h3>
<div class="outline-text-3" id="text-org4ad73aa">
<div class="org-src-container">
<pre class="src src-matlab">mirror.mass = args.mass;
mirror.freq = args.freq;
</pre>
</div>
</div>
</div>
<div id="outline-container-org58eb0d1" class="outline-3">
<h3 id="org58eb0d1">Stiffness and Damping properties</h3>
<div class="outline-text-3" id="text-org58eb0d1">
<div class="org-src-container">
<pre class="src src-matlab">mirror.K = zeros(6,1);
mirror.K(1<span class="org-type">:</span>3) = mirror.mass <span class="org-type">*</span> (2<span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">*</span>mirror.freq(1<span class="org-type">:</span>3))<span class="org-type">.^</span>2;
mirror.C = zeros(6,1);
mirror.C(1<span class="org-type">:</span>3) = 0.2 <span class="org-type">*</span> sqrt(mirror.K(1<span class="org-type">:</span>3)<span class="org-type">.*</span>mirror.mass);
</pre>
</div>
</div>
</div>
<div id="outline-container-org2aad5e8" class="outline-3">
<h3 id="org2aad5e8">Equilibrium position of the each joint.</h3>
<div class="outline-text-3" id="text-org2aad5e8">
<div class="org-src-container">
<pre class="src src-matlab">mirror.Deq = zeros(6,1);
</pre>
</div>
</div>
</div>
<div id="outline-container-orgc381755" class="outline-3">
<h3 id="orgc381755">Geometry</h3>
<div class="outline-text-3" id="text-orgc381755">
<p>
We define the geometrical values.
</p>
<div class="org-src-container">
<pre class="src src-matlab">mirror.h = 0.05; <span class="org-comment">% Height of the mirror [m]</span>
mirror.thickness = 0.025; <span class="org-comment">% Thickness of the plate supporting the sample [m]</span>
mirror.hole_rad = 0.125; <span class="org-comment">% radius of the hole in the mirror [m]</span>
mirror.support_rad = 0.1; <span class="org-comment">% radius of the support plate [m]</span>
<span class="org-comment">% point of interest offset in z (above the top surfave) [m]</span>
<span class="org-keyword">switch</span> <span class="org-constant">args.type</span>
<span class="org-keyword">case</span> <span class="org-string">'none'</span>
mirror.jacobian = 0.20;
<span class="org-keyword">case</span> <span class="org-string">'rigid'</span>
mirror.jacobian = 0.20 <span class="org-type">-</span> mirror.h;
<span class="org-keyword">case</span> <span class="org-string">'flexible'</span>
mirror.jacobian = 0.20 <span class="org-type">-</span> mirror.h;
<span class="org-keyword">end</span>
mirror.rad = 0.180; <span class="org-comment">% radius of the mirror (at the bottom surface) [m]</span>
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">mirror.cone_length = mirror.rad<span class="org-type">*</span>tand(args.angle)<span class="org-type">+</span>mirror.h<span class="org-type">+</span>mirror.jacobian; <span class="org-comment">% Distance from Apex point of the cone to jacobian point</span>
</pre>
</div>
<p>
Now we define the Shape of the mirror.
We first start with the internal part.
</p>
<div class="org-src-container">
<pre class="src src-matlab">mirror.shape = [...
mirror.support_rad<span class="org-type">+</span>5e<span class="org-type">-</span>3 mirror.h<span class="org-type">-</span>mirror.thickness
mirror.hole_rad mirror.h<span class="org-type">-</span>mirror.thickness; ...
mirror.hole_rad 0; ...
mirror.rad 0 ...
];
</pre>
</div>
<p>
Then, we define the reflective used part of the mirror.
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-keyword">if</span> strcmp(args.shape, <span class="org-string">'spherical'</span>)
mirror.sphere_radius = sqrt((mirror.jacobian<span class="org-type">+</span>mirror.h)<span class="org-type">^</span>2<span class="org-type">+</span>mirror.rad<span class="org-type">^</span>2); <span class="org-comment">% Radius of the sphere [mm]</span>
<span class="org-keyword">for</span> <span class="org-variable-name">z</span> = <span class="org-constant">linspace(0, mirror.h, 101)</span>
mirror.shape = [mirror.shape; sqrt(mirror.sphere_radius<span class="org-type">^</span>2<span class="org-type">-</span>(z<span class="org-type">-</span>mirror.jacobian<span class="org-type">-</span>mirror.h)<span class="org-type">^</span>2) z];
<span class="org-keyword">end</span>
<span class="org-keyword">elseif</span> strcmp(args.shape, <span class="org-string">'conical'</span>)
mirror.shape = [mirror.shape; mirror.rad<span class="org-type">+</span>mirror.h<span class="org-type">/</span>tand(args.angle) mirror.h];
<span class="org-keyword">else</span>
error(<span class="org-string">'Shape should be either conical or spherical'</span>);
<span class="org-keyword">end</span>
</pre>
</div>
<p>
Finally, we close the shape.
</p>
<div class="org-src-container">
<pre class="src src-matlab">mirror.shape = [mirror.shape; mirror.support_rad<span class="org-type">+</span>5e<span class="org-type">-</span>3 mirror.h];
</pre>
</div>
</div>
</div>
<div id="outline-container-orgb8d89d9" class="outline-3">
<h3 id="orgb8d89d9">Save the Structure</h3>
<div class="outline-text-3" id="text-orgb8d89d9">
<p>
The <code>mirror</code> structure is saved.
</p>
<div class="org-src-container">
<pre class="src src-matlab">save(<span class="org-string">'./mat/stages.mat'</span>, <span class="org-string">'mirror'</span>, <span class="org-string">'-append'</span>);
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-org7906acb" class="outline-2">
<h2 id="org7906acb"><span class="section-number-2">11</span> Nano Hexapod</h2>
<div class="outline-text-2" id="text-11">
<p>
<a id="org9a9721e"></a>
</p>
</div>
<div id="outline-container-orgcd30dc1" class="outline-3">
<h3 id="orgcd30dc1">Simscape Model</h3>
<div class="outline-text-3" id="text-orgcd30dc1">
<div id="orga6643fc" class="figure">
<p><img src="figs/images/simscape_model_nano_hexapod.png" alt="simscape_model_nano_hexapod.png" />
</p>
<p><span class="figure-number">Figure 18: </span>Simscape model for the Nano Hexapod</p>
</div>
<div id="org4d9fd08" class="figure">
<p><img src="figs/images/simscape_picture_nano_hexapod.png" alt="simscape_picture_nano_hexapod.png" />
</p>
<p><span class="figure-number">Figure 19: </span>Simscape picture for the Nano Hexapod</p>
</div>
</div>
</div>
<div id="outline-container-orgd83dd69" class="outline-3">
<h3 id="orgd83dd69">Function description</h3>
<div class="outline-text-3" id="text-orgd83dd69">
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-keyword">function</span> <span class="org-variable-name">[nano_hexapod]</span> = <span class="org-function-name">initializeNanoHexapod</span>(<span class="org-variable-name">args</span>)
</pre>
</div>
</div>
</div>
<div id="outline-container-org424ead8" class="outline-3">
<h3 id="org424ead8">Optional Parameters</h3>
<div class="outline-text-3" id="text-org424ead8">
<div class="org-src-container">
<pre class="src src-matlab">arguments
2020-04-01 16:17:26 +02:00
args.type char {mustBeMember(args.type,{<span class="org-string">'none'</span>, <span class="org-string">'rigid'</span>, <span class="org-string">'flexible'</span>, <span class="org-string">'init'</span>})} = <span class="org-string">'flexible'</span>
<span class="org-comment">% initializeFramesPositions</span>
args.H (1,1) double {mustBeNumeric, mustBePositive} = 90e<span class="org-type">-</span>3
args.MO_B (1,1) double {mustBeNumeric} = 175e<span class="org-type">-</span>3
<span class="org-comment">% generateGeneralConfiguration</span>
args.FH (1,1) double {mustBeNumeric, mustBePositive} = 15e<span class="org-type">-</span>3
args.FR (1,1) double {mustBeNumeric, mustBePositive} = 100e<span class="org-type">-</span>3
args.FTh (6,1) double {mustBeNumeric} = [<span class="org-type">-</span>10, 10, 120<span class="org-type">-</span>10, 120<span class="org-type">+</span>10, 240<span class="org-type">-</span>10, 240<span class="org-type">+</span>10]<span class="org-type">*</span>(<span class="org-constant">pi</span><span class="org-type">/</span>180)
args.MH (1,1) double {mustBeNumeric, mustBePositive} = 15e<span class="org-type">-</span>3
args.MR (1,1) double {mustBeNumeric, mustBePositive} = 90e<span class="org-type">-</span>3
args.MTh (6,1) double {mustBeNumeric} = [<span class="org-type">-</span>60<span class="org-type">+</span>10, 60<span class="org-type">-</span>10, 60<span class="org-type">+</span>10, 180<span class="org-type">-</span>10, 180<span class="org-type">+</span>10, <span class="org-type">-</span>60<span class="org-type">-</span>10]<span class="org-type">*</span>(<span class="org-constant">pi</span><span class="org-type">/</span>180)
<span class="org-comment">% initializeStrutDynamics</span>
args.actuator char {mustBeMember(args.actuator,{<span class="org-string">'piezo'</span>, <span class="org-string">'lorentz'</span>})} = <span class="org-string">'piezo'</span>
2020-04-03 18:04:47 +02:00
args.k (1,1) double {mustBeNumeric} = <span class="org-type">-</span>1
args.c (1,1) double {mustBeNumeric} = <span class="org-type">-</span>1
<span class="org-comment">% initializeCylindricalPlatforms</span>
args.Fpm (1,1) double {mustBeNumeric, mustBePositive} = 1
args.Fph (1,1) double {mustBeNumeric, mustBePositive} = 10e<span class="org-type">-</span>3
args.Fpr (1,1) double {mustBeNumeric, mustBePositive} = 150e<span class="org-type">-</span>3
args.Mpm (1,1) double {mustBeNumeric, mustBePositive} = 1
args.Mph (1,1) double {mustBeNumeric, mustBePositive} = 10e<span class="org-type">-</span>3
args.Mpr (1,1) double {mustBeNumeric, mustBePositive} = 120e<span class="org-type">-</span>3
<span class="org-comment">% initializeCylindricalStruts</span>
args.Fsm (1,1) double {mustBeNumeric, mustBePositive} = 0.1
args.Fsh (1,1) double {mustBeNumeric, mustBePositive} = 50e<span class="org-type">-</span>3
args.Fsr (1,1) double {mustBeNumeric, mustBePositive} = 5e<span class="org-type">-</span>3
args.Msm (1,1) double {mustBeNumeric, mustBePositive} = 0.1
args.Msh (1,1) double {mustBeNumeric, mustBePositive} = 50e<span class="org-type">-</span>3
args.Msr (1,1) double {mustBeNumeric, mustBePositive} = 5e<span class="org-type">-</span>3
<span class="org-comment">% inverseKinematics</span>
args.AP (3,1) double {mustBeNumeric} = zeros(3,1)
args.ARB (3,3) double {mustBeNumeric} = eye(3)
<span class="org-comment">% Equilibrium position of each leg</span>
args.dLeq (6,1) double {mustBeNumeric} = zeros(6,1)
2020-04-01 16:17:26 +02:00
<span class="org-comment">% Force that stiffness of each joint should apply at t=0</span>
args.Foffset logical {mustBeNumericOrLogical} = <span class="org-constant">false</span>
<span class="org-keyword">end</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org4f2e11d" class="outline-3">
<h3 id="org4f2e11d">Function content</h3>
<div class="outline-text-3" id="text-org4f2e11d">
<div class="org-src-container">
<pre class="src src-matlab">nano_hexapod = initializeFramesPositions(<span class="org-string">'H'</span>, args.H, <span class="org-string">'MO_B'</span>, args.MO_B);
nano_hexapod = generateGeneralConfiguration(nano_hexapod, <span class="org-string">'FH'</span>, args.FH, <span class="org-string">'FR'</span>, args.FR, <span class="org-string">'FTh'</span>, args.FTh, <span class="org-string">'MH'</span>, args.MH, <span class="org-string">'MR'</span>, args.MR, <span class="org-string">'MTh'</span>, args.MTh);
nano_hexapod = computeJointsPose(nano_hexapod);
2020-04-03 18:04:47 +02:00
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-keyword">if</span> args.k <span class="org-type">&gt;</span> 0 <span class="org-type">&amp;&amp;</span> args.c <span class="org-type">&gt;</span> 0
nano_hexapod = initializeStrutDynamics(nano_hexapod, <span class="org-string">'Ki'</span>, args.k<span class="org-type">*</span>ones(6,1), <span class="org-string">'Ci'</span>, args.c<span class="org-type">*</span>ones(6,1));
<span class="org-keyword">elseif</span> args.k <span class="org-type">&gt;</span> 0
nano_hexapod = initializeStrutDynamics(nano_hexapod, <span class="org-string">'Ki'</span>, args.k<span class="org-type">*</span>ones(6,1), <span class="org-string">'Ci'</span>, 1.5<span class="org-type">*</span>sqrt(args.k)<span class="org-type">*</span>ones(6,1));
<span class="org-keyword">elseif</span> strcmp(args.actuator, <span class="org-string">'piezo'</span>)
nano_hexapod = initializeStrutDynamics(nano_hexapod, <span class="org-string">'Ki'</span>, 1e7<span class="org-type">*</span>ones(6,1), <span class="org-string">'Ci'</span>, 1e2<span class="org-type">*</span>ones(6,1));
<span class="org-keyword">elseif</span> strcmp(args.actuator, <span class="org-string">'lorentz'</span>)
nano_hexapod = initializeStrutDynamics(nano_hexapod, <span class="org-string">'Ki'</span>, 1e4<span class="org-type">*</span>ones(6,1), <span class="org-string">'Ci'</span>, 1e2<span class="org-type">*</span>ones(6,1));
<span class="org-keyword">else</span>
error(<span class="org-string">'args.actuator should be piezo or lorentz'</span>);
<span class="org-keyword">end</span>
2020-04-03 18:04:47 +02:00
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">nano_hexapod = initializeCylindricalPlatforms(nano_hexapod, <span class="org-string">'Fpm'</span>, args.Fpm, <span class="org-string">'Fph'</span>, args.Fph, <span class="org-string">'Fpr'</span>, args.Fpr, <span class="org-string">'Mpm'</span>, args.Mpm, <span class="org-string">'Mph'</span>, args.Mph, <span class="org-string">'Mpr'</span>, args.Mpr);
nano_hexapod = initializeCylindricalStruts(nano_hexapod, <span class="org-string">'Fsm'</span>, args.Fsm, <span class="org-string">'Fsh'</span>, args.Fsh, <span class="org-string">'Fsr'</span>, args.Fsr, <span class="org-string">'Msm'</span>, args.Msm, <span class="org-string">'Msh'</span>, args.Msh, <span class="org-string">'Msr'</span>, args.Msr);
nano_hexapod = computeJacobian(nano_hexapod);
[Li, dLi] = inverseKinematics(nano_hexapod, <span class="org-string">'AP'</span>, args.AP, <span class="org-string">'ARB'</span>, args.ARB);
nano_hexapod.Li = Li;
nano_hexapod.dLi = dLi;
</pre>
</div>
2020-04-01 16:17:26 +02:00
<p>
Equilibrium position of the each joint.
</p>
<div class="org-src-container">
2020-04-01 16:17:26 +02:00
<pre class="src src-matlab">
<span class="org-keyword">if</span> args.Foffset <span class="org-type">&amp;&amp;</span> <span class="org-type">~</span>strcmp(args.type, <span class="org-string">'none'</span>) <span class="org-type">&amp;&amp;</span> <span class="org-type">~</span>strcmp(args.type, <span class="org-string">'rigid'</span>) <span class="org-type">&amp;&amp;</span> <span class="org-type">~</span>strcmp(args.type, <span class="org-string">'init'</span>)
load(<span class="org-string">'mat/Foffset.mat'</span>, <span class="org-string">'Fnm'</span>);
nano_hexapod.dLeq = <span class="org-type">-</span>Fnm<span class="org-type">'./</span>nano_hexapod.Ki;
<span class="org-keyword">else</span>
nano_hexapod.dLeq = args.dLeq;
<span class="org-keyword">end</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org1e0f7f4" class="outline-3">
<h3 id="org1e0f7f4">Add Type</h3>
<div class="outline-text-3" id="text-org1e0f7f4">
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-keyword">switch</span> <span class="org-constant">args.type</span>
<span class="org-keyword">case</span> <span class="org-string">'none'</span>
nano_hexapod.type = 0;
<span class="org-keyword">case</span> <span class="org-string">'rigid'</span>
nano_hexapod.type = 1;
<span class="org-keyword">case</span> <span class="org-string">'flexible'</span>
nano_hexapod.type = 2;
2020-04-01 16:17:26 +02:00
<span class="org-keyword">case</span> <span class="org-string">'init'</span>
nano_hexapod.type = 4;
<span class="org-keyword">end</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org30be760" class="outline-3">
<h3 id="org30be760">Save the Structure</h3>
<div class="outline-text-3" id="text-org30be760">
<div class="org-src-container">
<pre class="src src-matlab">save(<span class="org-string">'./mat/stages.mat'</span>, <span class="org-string">'nano_hexapod'</span>, <span class="org-string">'-append'</span>);
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-org3d615a1" class="outline-2">
<h2 id="org3d615a1"><span class="section-number-2">12</span> Sample</h2>
<div class="outline-text-2" id="text-12">
<p>
<a id="org9f0d804"></a>
</p>
</div>
<div id="outline-container-org92b9277" class="outline-3">
<h3 id="org92b9277">Simscape Model</h3>
<div class="outline-text-3" id="text-org92b9277">
<p>
The Simscape model of the sample environment is composed of:
</p>
<ul class="org-ul">
<li>A rigid transform that can be used to translate the sample (position offset)</li>
<li>A cartesian joint to add some flexibility to the sample environment mount</li>
<li>A solid that represent the sample</li>
<li>An input is added to apply some external forces and torques at the center of the sample environment.
This could be the case for cable forces for instance.</li>
</ul>
<div id="org4bf20ba" class="figure">
<p><img src="figs/images/simscape_model_sample.png" alt="simscape_model_sample.png" />
</p>
<p><span class="figure-number">Figure 20: </span>Simscape model for the Sample</p>
</div>
<div id="orgfaf9137" class="figure">
<p><img src="figs/images/simscape_picture_sample.png" alt="simscape_picture_sample.png" />
</p>
<p><span class="figure-number">Figure 21: </span>Simscape picture for the Sample</p>
</div>
</div>
</div>
<div id="outline-container-org246ce35" class="outline-3">
<h3 id="org246ce35">Function description</h3>
<div class="outline-text-3" id="text-org246ce35">
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-keyword">function</span> <span class="org-variable-name">[sample]</span> = <span class="org-function-name">initializeSample</span>(<span class="org-variable-name">args</span>)
</pre>
</div>
</div>
</div>
<div id="outline-container-orga7f047e" class="outline-3">
<h3 id="orga7f047e">Optional Parameters</h3>
<div class="outline-text-3" id="text-orga7f047e">
<div class="org-src-container">
<pre class="src src-matlab">arguments
args.type char {mustBeMember(args.type,{<span class="org-string">'rigid'</span>, <span class="org-string">'flexible'</span>, <span class="org-string">'none'</span>, <span class="org-string">'init'</span>})} = <span class="org-string">'flexible'</span>
args.radius (1,1) double {mustBeNumeric, mustBePositive} = 0.1 <span class="org-comment">% [m]</span>
args.height (1,1) double {mustBeNumeric, mustBePositive} = 0.3 <span class="org-comment">% [m]</span>
args.mass (1,1) double {mustBeNumeric, mustBePositive} = 50 <span class="org-comment">% [kg]</span>
2020-04-01 16:17:26 +02:00
args.freq (6,1) double {mustBeNumeric, mustBePositive} = 100<span class="org-type">*</span>ones(6,1) <span class="org-comment">% [Hz]</span>
args.offset (1,1) double {mustBeNumeric} = 0 <span class="org-comment">% [m]</span>
2020-03-17 11:23:47 +01:00
args.Foffset logical {mustBeNumericOrLogical} = <span class="org-constant">false</span>
<span class="org-keyword">end</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org55660d5" class="outline-3">
<h3 id="org55660d5">Structure initialization</h3>
<div class="outline-text-3" id="text-org55660d5">
<p>
First, we initialize the <code>sample</code> structure.
</p>
<div class="org-src-container">
<pre class="src src-matlab">sample = struct();
</pre>
</div>
</div>
</div>
<div id="outline-container-org2bb1d24" class="outline-3">
<h3 id="org2bb1d24">Add Sample Type</h3>
<div class="outline-text-3" id="text-org2bb1d24">
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-keyword">switch</span> <span class="org-constant">args.type</span>
<span class="org-keyword">case</span> <span class="org-string">'none'</span>
sample.type = 0;
<span class="org-keyword">case</span> <span class="org-string">'rigid'</span>
sample.type = 1;
<span class="org-keyword">case</span> <span class="org-string">'flexible'</span>
sample.type = 2;
<span class="org-keyword">case</span> <span class="org-string">'init'</span>
sample.type = 3;
<span class="org-keyword">end</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org8f61ce3" class="outline-3">
<h3 id="org8f61ce3">Material and Geometry</h3>
<div class="outline-text-3" id="text-org8f61ce3">
<p>
We define the geometrical parameters of the sample as well as its mass and position.
</p>
<div class="org-src-container">
<pre class="src src-matlab">sample.radius = args.radius; <span class="org-comment">% [m]</span>
sample.height = args.height; <span class="org-comment">% [m]</span>
sample.mass = args.mass; <span class="org-comment">% [kg]</span>
sample.offset = args.offset; <span class="org-comment">% [m]</span>
</pre>
</div>
</div>
</div>
2020-04-01 16:17:26 +02:00
<div id="outline-container-org228453f" class="outline-3">
<h3 id="org228453f">Compute the Inertia</h3>
<div class="outline-text-3" id="text-org228453f">
<div class="org-src-container">
2020-04-01 16:17:26 +02:00
<pre class="src src-matlab">sample.inertia = [1<span class="org-type">/</span>12 <span class="org-type">*</span> sample.mass <span class="org-type">*</span> (3<span class="org-type">*</span>sample.radius<span class="org-type">^</span>2 <span class="org-type">+</span> sample.height<span class="org-type">^</span>2); ...
1<span class="org-type">/</span>12 <span class="org-type">*</span> sample.mass <span class="org-type">*</span> (3<span class="org-type">*</span>sample.radius<span class="org-type">^</span>2 <span class="org-type">+</span> sample.height<span class="org-type">^</span>2); ...
1<span class="org-type">/</span>2 <span class="org-type">*</span> sample.mass <span class="org-type">*</span> sample.radius<span class="org-type">^</span>2];
</pre>
</div>
</div>
</div>
<div id="outline-container-org9976da6" class="outline-3">
<h3 id="org9976da6">Stiffness and Damping properties</h3>
<div class="outline-text-3" id="text-org9976da6">
2020-04-01 16:17:26 +02:00
<div class="org-src-container">
<pre class="src src-matlab">sample.K = zeros(6, 1);
sample.C = zeros(6, 1);
</pre>
</div>
<p>
Translation Stiffness and Damping:
</p>
<div class="org-src-container">
<pre class="src src-matlab">sample.K(1<span class="org-type">:</span>3) = sample.mass <span class="org-type">.*</span> (2<span class="org-type">*</span><span class="org-constant">pi</span> <span class="org-type">*</span> args.freq(1<span class="org-type">:</span>3))<span class="org-type">.^</span>2; <span class="org-comment">% [N/m]</span>
sample.C(1<span class="org-type">:</span>3) = 0.1 <span class="org-type">*</span> sqrt(sample.K(1<span class="org-type">:</span>3)<span class="org-type">*</span>sample.mass); <span class="org-comment">% [N/(m/s)]</span>
</pre>
</div>
<p>
Rotational Stiffness and Damping:
</p>
<div class="org-src-container">
<pre class="src src-matlab">sample.K(4<span class="org-type">:</span>6) = sample.inertia <span class="org-type">.*</span> (2<span class="org-type">*</span><span class="org-constant">pi</span> <span class="org-type">*</span> args.freq(4<span class="org-type">:</span>6))<span class="org-type">.^</span>2; <span class="org-comment">% [N/m]</span>
sample.C(4<span class="org-type">:</span>6) = 0.1 <span class="org-type">*</span> sqrt(sample.K(4<span class="org-type">:</span>6)<span class="org-type">.*</span>sample.inertia); <span class="org-comment">% [N/(m/s)]</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-orge84d6de" class="outline-3">
<h3 id="orge84d6de">Equilibrium position of the each joint.</h3>
<div class="outline-text-3" id="text-orge84d6de">
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-keyword">if</span> args.Foffset <span class="org-type">&amp;&amp;</span> <span class="org-type">~</span>strcmp(args.type, <span class="org-string">'none'</span>) <span class="org-type">&amp;&amp;</span> <span class="org-type">~</span>strcmp(args.type, <span class="org-string">'rigid'</span>) <span class="org-type">&amp;&amp;</span> <span class="org-type">~</span>strcmp(args.type, <span class="org-string">'init'</span>)
load(<span class="org-string">'mat/Foffset.mat'</span>, <span class="org-string">'Fsm'</span>);
sample.Deq = <span class="org-type">-</span>Fsm<span class="org-type">'./</span>sample.K;
<span class="org-keyword">else</span>
2020-04-01 16:17:26 +02:00
sample.Deq = zeros(6,1);
<span class="org-keyword">end</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org287465f" class="outline-3">
<h3 id="org287465f">Save the Structure</h3>
<div class="outline-text-3" id="text-org287465f">
<p>
The <code>sample</code> structure is saved.
</p>
<div class="org-src-container">
<pre class="src src-matlab">save(<span class="org-string">'./mat/stages.mat'</span>, <span class="org-string">'sample'</span>, <span class="org-string">'-append'</span>);
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-orge9cbdc9" class="outline-2">
<h2 id="orge9cbdc9"><span class="section-number-2">13</span> Initialize Controller</h2>
<div class="outline-text-2" id="text-13">
<p>
<a id="orgd0062b9"></a>
</p>
</div>
<div id="outline-container-org0272560" class="outline-3">
<h3 id="org0272560">Function Declaration and Documentation</h3>
<div class="outline-text-3" id="text-org0272560">
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-keyword">function</span> <span class="org-variable-name">[]</span> = <span class="org-function-name">initializeController</span>(<span class="org-variable-name">args</span>)
</pre>
</div>
</div>
</div>
<div id="outline-container-org977a259" class="outline-3">
<h3 id="org977a259">Optional Parameters</h3>
<div class="outline-text-3" id="text-org977a259">
<div class="org-src-container">
<pre class="src src-matlab">arguments
2020-04-03 18:04:47 +02:00
args.type char {mustBeMember(args.type,{<span class="org-string">'open-loop'</span>, <span class="org-string">'iff'</span>, <span class="org-string">'dvf'</span>, <span class="org-string">'hac-dvf'</span>, <span class="org-string">'ref-track-L'</span>, <span class="org-string">'ref-track-iff-L'</span>, <span class="org-string">'cascade-hac-lac'</span>, <span class="org-string">'hac-iff'</span>, <span class="org-string">'stabilizing'</span>})} = <span class="org-string">'open-loop'</span>
<span class="org-keyword">end</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-orgd4f5644" class="outline-3">
<h3 id="orgd4f5644">Structure initialization</h3>
<div class="outline-text-3" id="text-orgd4f5644">
<p>
First, we initialize the <code>controller</code> structure.
</p>
<div class="org-src-container">
<pre class="src src-matlab">controller = struct();
</pre>
</div>
</div>
</div>
<div id="outline-container-org4207f98" class="outline-3">
<h3 id="org4207f98">Controller Type</h3>
<div class="outline-text-3" id="text-org4207f98">
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-keyword">switch</span> <span class="org-constant">args.type</span>
<span class="org-keyword">case</span> <span class="org-string">'open-loop'</span>
controller.type = 1;
controller.name = <span class="org-string">'Open-Loop'</span>;
<span class="org-keyword">case</span> <span class="org-string">'dvf'</span>
controller.type = 2;
controller.name = <span class="org-string">'Decentralized Direct Velocity Feedback'</span>;
<span class="org-keyword">case</span> <span class="org-string">'iff'</span>
controller.type = 3;
controller.name = <span class="org-string">'Decentralized Integral Force Feedback'</span>;
2020-03-13 17:40:22 +01:00
<span class="org-keyword">case</span> <span class="org-string">'hac-dvf'</span>
controller.type = 4;
controller.name = <span class="org-string">'HAC-DVF'</span>;
2020-03-23 10:05:32 +01:00
<span class="org-keyword">case</span> <span class="org-string">'ref-track-L'</span>
controller.type = 5;
controller.name = <span class="org-string">'Reference Tracking in the frame of the legs'</span>;
2020-03-23 10:05:32 +01:00
<span class="org-keyword">case</span> <span class="org-string">'ref-track-iff-L'</span>
controller.type = 6;
controller.name = <span class="org-string">'Reference Tracking in the frame of the legs + IFF'</span>;
2020-03-23 10:05:32 +01:00
<span class="org-keyword">case</span> <span class="org-string">'cascade-hac-lac'</span>
controller.type = 7;
controller.name = <span class="org-string">'Cascade Control + HAC-LAC'</span>;
<span class="org-keyword">case</span> <span class="org-string">'hac-iff'</span>
controller.type = 8;
controller.name = <span class="org-string">'HAC-IFF'</span>;
2020-04-03 18:04:47 +02:00
<span class="org-keyword">case</span> <span class="org-string">'stabilizing'</span>
controller.type = 9;
controller.name = <span class="org-string">'Stabilizing Controller'</span>;
<span class="org-keyword">end</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-orgded6aac" class="outline-3">
<h3 id="orgded6aac">Save the Structure</h3>
<div class="outline-text-3" id="text-orgded6aac">
<p>
The <code>controller</code> structure is saved.
</p>
<div class="org-src-container">
<pre class="src src-matlab">save(<span class="org-string">'./mat/controller.mat'</span>, <span class="org-string">'controller'</span>);
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-orgae5cb57" class="outline-2">
<h2 id="orgae5cb57"><span class="section-number-2">14</span> Generate Reference Signals</h2>
<div class="outline-text-2" id="text-14">
<p>
<a id="org5ace526"></a>
</p>
</div>
<div id="outline-container-org05dcced" class="outline-3">
<h3 id="org05dcced">Function Declaration and Documentation</h3>
<div class="outline-text-3" id="text-org05dcced">
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-keyword">function</span> <span class="org-variable-name">[ref]</span> = <span class="org-function-name">initializeReferences</span>(<span class="org-variable-name">args</span>)
</pre>
</div>
</div>
</div>
<div id="outline-container-orgb9c3029" class="outline-3">
<h3 id="orgb9c3029">Optional Parameters</h3>
<div class="outline-text-3" id="text-orgb9c3029">
<div class="org-src-container">
<pre class="src src-matlab">arguments
<span class="org-comment">% Sampling Frequency [s]</span>
args.Ts (1,1) double {mustBeNumeric, mustBePositive} = 1e<span class="org-type">-</span>3
<span class="org-comment">% Maximum simulation time [s]</span>
args.Tmax (1,1) double {mustBeNumeric, mustBePositive} = 100
<span class="org-comment">% Either "constant" / "triangular" / "sinusoidal"</span>
args.Dy_type char {mustBeMember(args.Dy_type,{<span class="org-string">'constant'</span>, <span class="org-string">'triangular'</span>, <span class="org-string">'sinusoidal'</span>})} = <span class="org-string">'constant'</span>
<span class="org-comment">% Amplitude of the displacement [m]</span>
args.Dy_amplitude (1,1) double {mustBeNumeric} = 0
<span class="org-comment">% Period of the displacement [s]</span>
args.Dy_period (1,1) double {mustBeNumeric, mustBePositive} = 1
<span class="org-comment">% Either "constant" / "triangular" / "sinusoidal"</span>
args.Ry_type char {mustBeMember(args.Ry_type,{<span class="org-string">'constant'</span>, <span class="org-string">'triangular'</span>, <span class="org-string">'sinusoidal'</span>})} = <span class="org-string">'constant'</span>
<span class="org-comment">% Amplitude [rad]</span>
args.Ry_amplitude (1,1) double {mustBeNumeric} = 0
<span class="org-comment">% Period of the displacement [s]</span>
args.Ry_period (1,1) double {mustBeNumeric, mustBePositive} = 1
<span class="org-comment">% Either "constant" / "rotating"</span>
2020-04-03 18:04:47 +02:00
args.Rz_type char {mustBeMember(args.Rz_type,{<span class="org-string">'constant'</span>, <span class="org-string">'rotating'</span>, <span class="org-string">'rotating-not-filtered'</span>})} = <span class="org-string">'constant'</span>
<span class="org-comment">% Initial angle [rad]</span>
args.Rz_amplitude (1,1) double {mustBeNumeric} = 0
<span class="org-comment">% Period of the rotating [s]</span>
args.Rz_period (1,1) double {mustBeNumeric, mustBePositive} = 1
<span class="org-comment">% For now, only constant is implemented</span>
args.Dh_type char {mustBeMember(args.Dh_type,{<span class="org-string">'constant'</span>})} = <span class="org-string">'constant'</span>
<span class="org-comment">% Initial position [m,m,m,rad,rad,rad] of the top platform (Pitch-Roll-Yaw Euler angles)</span>
args.Dh_pos (6,1) double {mustBeNumeric} = zeros(6, 1), ...
<span class="org-comment">% For now, only constant is implemented</span>
args.Rm_type char {mustBeMember(args.Rm_type,{<span class="org-string">'constant'</span>})} = <span class="org-string">'constant'</span>
<span class="org-comment">% Initial position of the two masses</span>
args.Rm_pos (2,1) double {mustBeNumeric} = [0; <span class="org-constant">pi</span>]
<span class="org-comment">% For now, only constant is implemented</span>
args.Dn_type char {mustBeMember(args.Dn_type,{<span class="org-string">'constant'</span>})} = <span class="org-string">'constant'</span>
<span class="org-comment">% Initial position [m,m,m,rad,rad,rad] of the top platform</span>
args.Dn_pos (6,1) double {mustBeNumeric} = zeros(6,1)
<span class="org-keyword">end</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-orge94c0c2" class="outline-3">
<h3 id="orge94c0c2">Initialize Parameters</h3>
<div class="outline-text-3" id="text-orge94c0c2">
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Set Sampling Time</span></span>
Ts = args.Ts;
Tmax = args.Tmax;
<span class="org-matlab-cellbreak"><span class="org-comment">%% Low Pass Filter to filter out the references</span></span>
s = zpk(<span class="org-string">'s'</span>);
w0 = 2<span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">*</span>10;
xi = 1;
H_lpf = 1<span class="org-type">/</span>(1 <span class="org-type">+</span> 2<span class="org-type">*</span>xi<span class="org-type">/</span>w0<span class="org-type">*</span>s <span class="org-type">+</span> s<span class="org-type">^</span>2<span class="org-type">/</span>w0<span class="org-type">^</span>2);
</pre>
</div>
</div>
</div>
<div id="outline-container-org55e59c3" class="outline-3">
<h3 id="org55e59c3">Translation Stage</h3>
<div class="outline-text-3" id="text-org55e59c3">
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Translation stage - Dy</span></span>
t = 0<span class="org-type">:</span>Ts<span class="org-type">:</span>Tmax; <span class="org-comment">% Time Vector [s]</span>
Dy = zeros(length(t), 1);
Dyd = zeros(length(t), 1);
Dydd = zeros(length(t), 1);
<span class="org-keyword">switch</span> <span class="org-constant">args.Dy_type</span>
<span class="org-keyword">case</span> <span class="org-string">'constant'</span>
Dy<span class="org-type">(:) </span>= args.Dy_amplitude;
Dyd<span class="org-type">(:) </span>= 0;
Dydd<span class="org-type">(:) </span>= 0;
<span class="org-keyword">case</span> <span class="org-string">'triangular'</span>
<span class="org-comment">% This is done to unsure that we start with no displacement</span>
Dy_raw = args.Dy_amplitude<span class="org-type">*</span>sawtooth(2<span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">*</span>t<span class="org-type">/</span>args.Dy_period,1<span class="org-type">/</span>2);
i0 = find(t<span class="org-type">&gt;=</span>args.Dy_period<span class="org-type">/</span>4,1);
Dy(1<span class="org-type">:</span>end<span class="org-type">-</span>i0<span class="org-type">+</span>1) = Dy_raw(i0<span class="org-type">:</span>end);
Dy(end<span class="org-type">-</span>i0<span class="org-type">+</span>2<span class="org-type">:</span>end) = Dy_raw(end); <span class="org-comment">% we fix the last value</span>
<span class="org-comment">% The signal is filtered out</span>
Dy = lsim(H_lpf, Dy, t);
Dyd = lsim(H_lpf<span class="org-type">*</span>s, Dy, t);
Dydd = lsim(H_lpf<span class="org-type">*</span>s<span class="org-type">^</span>2, Dy, t);
<span class="org-keyword">case</span> <span class="org-string">'sinusoidal'</span>
Dy<span class="org-type">(:) </span>= args.Dy_amplitude<span class="org-type">*</span>sin(2<span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">/</span>args.Dy_period<span class="org-type">*</span>t);
Dyd = args.Dy_amplitude<span class="org-type">*</span>2<span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">/</span>args.Dy_period<span class="org-type">*</span>cos(2<span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">/</span>args.Dy_period<span class="org-type">*</span>t);
Dydd = <span class="org-type">-</span>args.Dy_amplitude<span class="org-type">*</span>(2<span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">/</span>args.Dy_period)<span class="org-type">^</span>2<span class="org-type">*</span>sin(2<span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">/</span>args.Dy_period<span class="org-type">*</span>t);
<span class="org-keyword">otherwise</span>
warning(<span class="org-string">'Dy_type is not set correctly'</span>);
<span class="org-keyword">end</span>
Dy = struct(<span class="org-string">'time'</span>, t, <span class="org-string">'signals'</span>, struct(<span class="org-string">'values'</span>, Dy), <span class="org-string">'deriv'</span>, Dyd, <span class="org-string">'dderiv'</span>, Dydd);
</pre>
</div>
</div>
</div>
<div id="outline-container-orga4374f1" class="outline-3">
<h3 id="orga4374f1">Tilt Stage</h3>
<div class="outline-text-3" id="text-orga4374f1">
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Tilt Stage - Ry</span></span>
t = 0<span class="org-type">:</span>Ts<span class="org-type">:</span>Tmax; <span class="org-comment">% Time Vector [s]</span>
Ry = zeros(length(t), 1);
Ryd = zeros(length(t), 1);
Rydd = zeros(length(t), 1);
<span class="org-keyword">switch</span> <span class="org-constant">args.Ry_type</span>
<span class="org-keyword">case</span> <span class="org-string">'constant'</span>
Ry<span class="org-type">(:) </span>= args.Ry_amplitude;
Ryd<span class="org-type">(:) </span>= 0;
Rydd<span class="org-type">(:) </span>= 0;
<span class="org-keyword">case</span> <span class="org-string">'triangular'</span>
Ry_raw = args.Ry_amplitude<span class="org-type">*</span>sawtooth(2<span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">*</span>t<span class="org-type">/</span>args.Ry_period,1<span class="org-type">/</span>2);
i0 = find(t<span class="org-type">&gt;=</span>args.Ry_period<span class="org-type">/</span>4,1);
Ry(1<span class="org-type">:</span>end<span class="org-type">-</span>i0<span class="org-type">+</span>1) = Ry_raw(i0<span class="org-type">:</span>end);
Ry(end<span class="org-type">-</span>i0<span class="org-type">+</span>2<span class="org-type">:</span>end) = Ry_raw(end); <span class="org-comment">% we fix the last value</span>
<span class="org-comment">% The signal is filtered out</span>
Ry = lsim(H_lpf, Ry, t);
Ryd = lsim(H_lpf<span class="org-type">*</span>s, Ry, t);
Rydd = lsim(H_lpf<span class="org-type">*</span>s<span class="org-type">^</span>2, Ry, t);
<span class="org-keyword">case</span> <span class="org-string">'sinusoidal'</span>
Ry<span class="org-type">(:) </span>= args.Ry_amplitude<span class="org-type">*</span>sin(2<span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">/</span>args.Ry_period<span class="org-type">*</span>t);
Ryd = args.Ry_amplitude<span class="org-type">*</span>2<span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">/</span>args.Ry_period<span class="org-type">*</span>cos(2<span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">/</span>args.Ry_period<span class="org-type">*</span>t);
Rydd = <span class="org-type">-</span>args.Ry_amplitude<span class="org-type">*</span>(2<span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">/</span>args.Ry_period)<span class="org-type">^</span>2<span class="org-type">*</span>sin(2<span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">/</span>args.Ry_period<span class="org-type">*</span>t);
<span class="org-keyword">otherwise</span>
warning(<span class="org-string">'Ry_type is not set correctly'</span>);
<span class="org-keyword">end</span>
Ry = struct(<span class="org-string">'time'</span>, t, <span class="org-string">'signals'</span>, struct(<span class="org-string">'values'</span>, Ry), <span class="org-string">'deriv'</span>, Ryd, <span class="org-string">'dderiv'</span>, Rydd);
</pre>
</div>
</div>
</div>
<div id="outline-container-orgcd779c6" class="outline-3">
<h3 id="orgcd779c6">Spindle</h3>
<div class="outline-text-3" id="text-orgcd779c6">
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Spindle - Rz</span></span>
t = 0<span class="org-type">:</span>Ts<span class="org-type">:</span>Tmax; <span class="org-comment">% Time Vector [s]</span>
Rz = zeros(length(t), 1);
Rzd = zeros(length(t), 1);
Rzdd = zeros(length(t), 1);
<span class="org-keyword">switch</span> <span class="org-constant">args.Rz_type</span>
<span class="org-keyword">case</span> <span class="org-string">'constant'</span>
Rz<span class="org-type">(:) </span>= args.Rz_amplitude;
Rzd<span class="org-type">(:) </span>= 0;
Rzdd<span class="org-type">(:) </span>= 0;
2020-04-03 18:04:47 +02:00
<span class="org-keyword">case</span> <span class="org-string">'rotating-not-filtered'</span>
Rz<span class="org-type">(:) </span>= 2<span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">/</span>args.Rz_period<span class="org-type">*</span>t;
<span class="org-comment">% The signal is filtered out</span>
Rz<span class="org-type">(:) </span>= 2<span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">/</span>args.Rz_period<span class="org-type">*</span>t;
Rzd<span class="org-type">(:) </span>= 2<span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">/</span>args.Rz_period;
Rzdd<span class="org-type">(:) </span>= 0;
<span class="org-comment">% We add the angle offset</span>
Rz = Rz <span class="org-type">+</span> args.Rz_amplitude;
<span class="org-keyword">case</span> <span class="org-string">'rotating'</span>
Rz<span class="org-type">(:) </span>= 2<span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">/</span>args.Rz_period<span class="org-type">*</span>t;
<span class="org-comment">% The signal is filtered out</span>
Rz = lsim(H_lpf, Rz, t);
Rzd = lsim(H_lpf<span class="org-type">*</span>s, Rz, t);
Rzdd = lsim(H_lpf<span class="org-type">*</span>s<span class="org-type">^</span>2, Rz, t);
<span class="org-comment">% We add the angle offset</span>
Rz = Rz <span class="org-type">+</span> args.Rz_amplitude;
<span class="org-keyword">otherwise</span>
warning(<span class="org-string">'Rz_type is not set correctly'</span>);
<span class="org-keyword">end</span>
Rz = struct(<span class="org-string">'time'</span>, t, <span class="org-string">'signals'</span>, struct(<span class="org-string">'values'</span>, Rz), <span class="org-string">'deriv'</span>, Rzd, <span class="org-string">'dderiv'</span>, Rzdd);
</pre>
</div>
</div>
</div>
<div id="outline-container-orgaac7776" class="outline-3">
<h3 id="orgaac7776">Micro Hexapod</h3>
<div class="outline-text-3" id="text-orgaac7776">
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Micro-Hexapod</span></span>
t = [0, Ts];
Dh = zeros(length(t), 6);
Dhl = zeros(length(t), 6);
<span class="org-keyword">switch</span> <span class="org-constant">args.Dh_type</span>
<span class="org-keyword">case</span> <span class="org-string">'constant'</span>
Dh = [args.Dh_pos, args.Dh_pos];
load(<span class="org-string">'mat/stages.mat'</span>, <span class="org-string">'micro_hexapod'</span>);
AP = [args.Dh_pos(1) ; args.Dh_pos(2) ; args.Dh_pos(3)];
tx = args.Dh_pos(4);
ty = args.Dh_pos(5);
tz = args.Dh_pos(6);
ARB = [cos(tz) <span class="org-type">-</span>sin(tz) 0;
sin(tz) cos(tz) 0;
0 0 1]<span class="org-type">*</span>...
[ cos(ty) 0 sin(ty);
0 1 0;
<span class="org-type">-</span>sin(ty) 0 cos(ty)]<span class="org-type">*</span>...
[1 0 0;
0 cos(tx) <span class="org-type">-</span>sin(tx);
0 sin(tx) cos(tx)];
[<span class="org-type">~</span>, Dhl] = inverseKinematics(micro_hexapod, <span class="org-string">'AP'</span>, AP, <span class="org-string">'ARB'</span>, ARB);
Dhl = [Dhl, Dhl];
<span class="org-keyword">otherwise</span>
warning(<span class="org-string">'Dh_type is not set correctly'</span>);
<span class="org-keyword">end</span>
Dh = struct(<span class="org-string">'time'</span>, t, <span class="org-string">'signals'</span>, struct(<span class="org-string">'values'</span>, Dh));
Dhl = struct(<span class="org-string">'time'</span>, t, <span class="org-string">'signals'</span>, struct(<span class="org-string">'values'</span>, Dhl));
</pre>
</div>
</div>
</div>
<div id="outline-container-org04d73dc" class="outline-3">
<h3 id="org04d73dc">Axis Compensation</h3>
<div class="outline-text-3" id="text-org04d73dc">
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Axis Compensation - Rm</span></span>
t = [0, Ts];
Rm = [args.Rm_pos, args.Rm_pos];
Rm = struct(<span class="org-string">'time'</span>, t, <span class="org-string">'signals'</span>, struct(<span class="org-string">'values'</span>, Rm));
</pre>
</div>
</div>
</div>
<div id="outline-container-org16c8d40" class="outline-3">
<h3 id="org16c8d40">Nano Hexapod</h3>
<div class="outline-text-3" id="text-org16c8d40">
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Nano-Hexapod</span></span>
t = [0, Ts];
Dn = zeros(length(t), 6);
<span class="org-keyword">switch</span> <span class="org-constant">args.Dn_type</span>
<span class="org-keyword">case</span> <span class="org-string">'constant'</span>
Dn = [args.Dn_pos, args.Dn_pos];
load(<span class="org-string">'mat/stages.mat'</span>, <span class="org-string">'nano_hexapod'</span>);
AP = [args.Dn_pos(1) ; args.Dn_pos(2) ; args.Dn_pos(3)];
tx = args.Dn_pos(4);
ty = args.Dn_pos(5);
tz = args.Dn_pos(6);
ARB = [cos(tz) <span class="org-type">-</span>sin(tz) 0;
sin(tz) cos(tz) 0;
0 0 1]<span class="org-type">*</span>...
[ cos(ty) 0 sin(ty);
0 1 0;
<span class="org-type">-</span>sin(ty) 0 cos(ty)]<span class="org-type">*</span>...
[1 0 0;
0 cos(tx) <span class="org-type">-</span>sin(tx);
0 sin(tx) cos(tx)];
[<span class="org-type">~</span>, Dnl] = inverseKinematics(nano_hexapod, <span class="org-string">'AP'</span>, AP, <span class="org-string">'ARB'</span>, ARB);
Dnl = [Dnl, Dnl];
<span class="org-keyword">otherwise</span>
warning(<span class="org-string">'Dn_type is not set correctly'</span>);
<span class="org-keyword">end</span>
Dn = struct(<span class="org-string">'time'</span>, t, <span class="org-string">'signals'</span>, struct(<span class="org-string">'values'</span>, Dn));
Dnl = struct(<span class="org-string">'time'</span>, t, <span class="org-string">'signals'</span>, struct(<span class="org-string">'values'</span>, Dnl));
</pre>
</div>
</div>
</div>
<div id="outline-container-orga751ae8" class="outline-3">
<h3 id="orga751ae8">Save</h3>
<div class="outline-text-3" id="text-orga751ae8">
<div class="org-src-container">
<pre class="src src-matlab"> <span class="org-matlab-cellbreak"><span class="org-comment">%% Save</span></span>
save(<span class="org-string">'./mat/nass_references.mat'</span>, <span class="org-string">'Dy'</span>, <span class="org-string">'Ry'</span>, <span class="org-string">'Rz'</span>, <span class="org-string">'Dh'</span>, <span class="org-string">'Dhl'</span>, <span class="org-string">'Rm'</span>, <span class="org-string">'Dn'</span>, <span class="org-string">'Dnl'</span>, <span class="org-string">'args'</span>, <span class="org-string">'Ts'</span>);
<span class="org-keyword">end</span>
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-org544c9dd" class="outline-2">
<h2 id="org544c9dd"><span class="section-number-2">15</span> Initialize Disturbances</h2>
<div class="outline-text-2" id="text-15">
<p>
<a id="org199c5f8"></a>
</p>
</div>
<div id="outline-container-orgbb2d2bb" class="outline-3">
<h3 id="orgbb2d2bb">Function Declaration and Documentation</h3>
<div class="outline-text-3" id="text-orgbb2d2bb">
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-keyword">function</span> <span class="org-variable-name">[]</span> = <span class="org-function-name">initializeDisturbances</span>(<span class="org-variable-name">args</span>)
<span class="org-comment">% initializeDisturbances - Initialize the disturbances</span>
<span class="org-comment">%</span>
<span class="org-comment">% Syntax: [] = initializeDisturbances(args)</span>
<span class="org-comment">%</span>
<span class="org-comment">% Inputs:</span>
<span class="org-comment">% - args -</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-orgcdc38a6" class="outline-3">
<h3 id="orgcdc38a6">Optional Parameters</h3>
<div class="outline-text-3" id="text-orgcdc38a6">
<div class="org-src-container">
<pre class="src src-matlab">arguments
<span class="org-comment">% Global parameter to enable or disable the disturbances</span>
args.enable logical {mustBeNumericOrLogical} = <span class="org-constant">true</span>
<span class="org-comment">% Ground Motion - X direction</span>
args.Dwx logical {mustBeNumericOrLogical} = <span class="org-constant">true</span>
<span class="org-comment">% Ground Motion - Y direction</span>
args.Dwy logical {mustBeNumericOrLogical} = <span class="org-constant">true</span>
<span class="org-comment">% Ground Motion - Z direction</span>
args.Dwz logical {mustBeNumericOrLogical} = <span class="org-constant">true</span>
<span class="org-comment">% Translation Stage - X direction</span>
args.Fty_x logical {mustBeNumericOrLogical} = <span class="org-constant">true</span>
<span class="org-comment">% Translation Stage - Z direction</span>
args.Fty_z logical {mustBeNumericOrLogical} = <span class="org-constant">true</span>
<span class="org-comment">% Spindle - Z direction</span>
args.Frz_z logical {mustBeNumericOrLogical} = <span class="org-constant">true</span>
<span class="org-keyword">end</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-orgf744aeb" class="outline-3">
<h3 id="orgf744aeb">Load Data</h3>
<div class="outline-text-3" id="text-orgf744aeb">
<div class="org-src-container">
2020-03-13 17:40:22 +01:00
<pre class="src src-matlab">load(<span class="org-string">'./mat/dist_psd.mat'</span>, <span class="org-string">'dist_f'</span>);
</pre>
</div>
<p>
We remove the first frequency point that usually is very large.
</p>
</div>
</div>
<div id="outline-container-org6c7d666" class="outline-3">
<h3 id="org6c7d666">Parameters</h3>
<div class="outline-text-3" id="text-org6c7d666">
<p>
We define some parameters that will be used in the algorithm.
</p>
<div class="org-src-container">
<pre class="src src-matlab">Fs = 2<span class="org-type">*</span>dist_f.f(end); <span class="org-comment">% Sampling Frequency of data is twice the maximum frequency of the PSD vector [Hz]</span>
N = 2<span class="org-type">*</span>length(dist_f.f); <span class="org-comment">% Number of Samples match the one of the wanted PSD</span>
T0 = N<span class="org-type">/</span>Fs; <span class="org-comment">% Signal Duration [s]</span>
df = 1<span class="org-type">/</span>T0; <span class="org-comment">% Frequency resolution of the DFT [Hz]</span>
<span class="org-comment">% Also equal to (dist_f.f(2)-dist_f.f(1))</span>
t = linspace(0, T0, N<span class="org-type">+</span>1)<span class="org-type">'</span>; <span class="org-comment">% Time Vector [s]</span>
Ts = 1<span class="org-type">/</span>Fs; <span class="org-comment">% Sampling Time [s]</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-orgb2108c4" class="outline-3">
<h3 id="orgb2108c4">Ground Motion</h3>
<div class="outline-text-3" id="text-orgb2108c4">
<div class="org-src-container">
<pre class="src src-matlab">phi = dist_f.psd_gm;
C = zeros(N<span class="org-type">/</span>2,1);
<span class="org-keyword">for</span> <span class="org-variable-name"><span class="org-constant">i</span></span> = <span class="org-constant">1:N/2</span>
C(<span class="org-constant">i</span>) = sqrt(phi(<span class="org-constant">i</span>)<span class="org-type">*</span>df);
<span class="org-keyword">end</span>
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-keyword">if</span> args.Dwx <span class="org-type">&amp;&amp;</span> args.enable
rng<span class="org-type">(111);</span>
theta = 2<span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">*</span>rand(N<span class="org-type">/</span>2,1); <span class="org-comment">% Generate random phase [rad]</span>
Cx = [0 ; C<span class="org-type">.*</span>complex(cos(theta),sin(theta))];
Cx = [Cx; flipud(conj(Cx(2<span class="org-type">:</span>end)))];;
Dwx = N<span class="org-type">/</span>sqrt(2)<span class="org-type">*</span>ifft(Cx); <span class="org-comment">% Ground Motion - x direction [m]</span>
<span class="org-keyword">else</span>
Dwx = zeros(length(t), 1);
<span class="org-keyword">end</span>
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-keyword">if</span> args.Dwy <span class="org-type">&amp;&amp;</span> args.enable
rng<span class="org-type">(112);</span>
theta = 2<span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">*</span>rand(N<span class="org-type">/</span>2,1); <span class="org-comment">% Generate random phase [rad]</span>
Cx = [0 ; C<span class="org-type">.*</span>complex(cos(theta),sin(theta))];
Cx = [Cx; flipud(conj(Cx(2<span class="org-type">:</span>end)))];;
Dwy = N<span class="org-type">/</span>sqrt(2)<span class="org-type">*</span>ifft(Cx); <span class="org-comment">% Ground Motion - y direction [m]</span>
<span class="org-keyword">else</span>
Dwy = zeros(length(t), 1);
<span class="org-keyword">end</span>
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-keyword">if</span> args.Dwy <span class="org-type">&amp;&amp;</span> args.enable
rng<span class="org-type">(113);</span>
theta = 2<span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">*</span>rand(N<span class="org-type">/</span>2,1); <span class="org-comment">% Generate random phase [rad]</span>
Cx = [0 ; C<span class="org-type">.*</span>complex(cos(theta),sin(theta))];
Cx = [Cx; flipud(conj(Cx(2<span class="org-type">:</span>end)))];;
Dwz = N<span class="org-type">/</span>sqrt(2)<span class="org-type">*</span>ifft(Cx); <span class="org-comment">% Ground Motion - z direction [m]</span>
<span class="org-keyword">else</span>
Dwz = zeros(length(t), 1);
<span class="org-keyword">end</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-orgb70c65e" class="outline-3">
<h3 id="orgb70c65e">Translation Stage - X direction</h3>
<div class="outline-text-3" id="text-orgb70c65e">
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-keyword">if</span> args.Fty_x <span class="org-type">&amp;&amp;</span> args.enable
phi = dist_f.psd_ty; <span class="org-comment">% TODO - we take here the vertical direction which is wrong but approximate</span>
C = zeros(N<span class="org-type">/</span>2,1);
<span class="org-keyword">for</span> <span class="org-variable-name"><span class="org-constant">i</span></span> = <span class="org-constant">1:N/2</span>
C(<span class="org-constant">i</span>) = sqrt(phi(<span class="org-constant">i</span>)<span class="org-type">*</span>df);
<span class="org-keyword">end</span>
rng<span class="org-type">(121);</span>
theta = 2<span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">*</span>rand(N<span class="org-type">/</span>2,1); <span class="org-comment">% Generate random phase [rad]</span>
Cx = [0 ; C<span class="org-type">.*</span>complex(cos(theta),sin(theta))];
Cx = [Cx; flipud(conj(Cx(2<span class="org-type">:</span>end)))];;
u = N<span class="org-type">/</span>sqrt(2)<span class="org-type">*</span>ifft(Cx); <span class="org-comment">% Disturbance Force Ty x [N]</span>
Fty_x = u;
<span class="org-keyword">else</span>
Fty_x = zeros(length(t), 1);
<span class="org-keyword">end</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org070255a" class="outline-3">
<h3 id="org070255a">Translation Stage - Z direction</h3>
<div class="outline-text-3" id="text-org070255a">
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-keyword">if</span> args.Fty_z <span class="org-type">&amp;&amp;</span> args.enable
phi = dist_f.psd_ty;
C = zeros(N<span class="org-type">/</span>2,1);
<span class="org-keyword">for</span> <span class="org-variable-name"><span class="org-constant">i</span></span> = <span class="org-constant">1:N/2</span>
C(<span class="org-constant">i</span>) = sqrt(phi(<span class="org-constant">i</span>)<span class="org-type">*</span>df);
<span class="org-keyword">end</span>
rng<span class="org-type">(122);</span>
theta = 2<span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">*</span>rand(N<span class="org-type">/</span>2,1); <span class="org-comment">% Generate random phase [rad]</span>
Cx = [0 ; C<span class="org-type">.*</span>complex(cos(theta),sin(theta))];
Cx = [Cx; flipud(conj(Cx(2<span class="org-type">:</span>end)))];;
u = N<span class="org-type">/</span>sqrt(2)<span class="org-type">*</span>ifft(Cx); <span class="org-comment">% Disturbance Force Ty z [N]</span>
Fty_z = u;
<span class="org-keyword">else</span>
Fty_z = zeros(length(t), 1);
<span class="org-keyword">end</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-orgfd5f32b" class="outline-3">
<h3 id="orgfd5f32b">Spindle - Z direction</h3>
<div class="outline-text-3" id="text-orgfd5f32b">
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-keyword">if</span> args.Frz_z <span class="org-type">&amp;&amp;</span> args.enable
phi = dist_f.psd_rz;
C = zeros(N<span class="org-type">/</span>2,1);
<span class="org-keyword">for</span> <span class="org-variable-name"><span class="org-constant">i</span></span> = <span class="org-constant">1:N/2</span>
C(<span class="org-constant">i</span>) = sqrt(phi(<span class="org-constant">i</span>)<span class="org-type">*</span>df);
<span class="org-keyword">end</span>
rng<span class="org-type">(131);</span>
theta = 2<span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">*</span>rand(N<span class="org-type">/</span>2,1); <span class="org-comment">% Generate random phase [rad]</span>
Cx = [0 ; C<span class="org-type">.*</span>complex(cos(theta),sin(theta))];
Cx = [Cx; flipud(conj(Cx(2<span class="org-type">:</span>end)))];;
u = N<span class="org-type">/</span>sqrt(2)<span class="org-type">*</span>ifft(Cx); <span class="org-comment">% Disturbance Force Rz z [N]</span>
Frz_z = u;
<span class="org-keyword">else</span>
Frz_z = zeros(length(t), 1);
<span class="org-keyword">end</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-orgba4d479" class="outline-3">
<h3 id="orgba4d479">Direct Forces</h3>
<div class="outline-text-3" id="text-orgba4d479">
<div class="org-src-container">
<pre class="src src-matlab">u = zeros(length(t), 6);
Fd = u;
</pre>
</div>
</div>
</div>
<div id="outline-container-orgf6d2198" class="outline-3">
<h3 id="orgf6d2198">Set initial value to zero</h3>
<div class="outline-text-3" id="text-orgf6d2198">
<div class="org-src-container">
<pre class="src src-matlab">Dwx = Dwx <span class="org-type">-</span> Dwx(1);
Dwy = Dwy <span class="org-type">-</span> Dwy(1);
Dwz = Dwz <span class="org-type">-</span> Dwz(1);
Fty_x = Fty_x <span class="org-type">-</span> Fty_x(1);
Fty_z = Fty_z <span class="org-type">-</span> Fty_z(1);
Frz_z = Frz_z <span class="org-type">-</span> Frz_z(1);
</pre>
</div>
</div>
</div>
<div id="outline-container-org6c1def3" class="outline-3">
<h3 id="org6c1def3">Save</h3>
<div class="outline-text-3" id="text-org6c1def3">
<div class="org-src-container">
<pre class="src src-matlab">save(<span class="org-string">'./mat/nass_disturbances.mat'</span>, <span class="org-string">'Dwx'</span>, <span class="org-string">'Dwy'</span>, <span class="org-string">'Dwz'</span>, <span class="org-string">'Fty_x'</span>, <span class="org-string">'Fty_z'</span>, <span class="org-string">'Frz_z'</span>, <span class="org-string">'Fd'</span>, <span class="org-string">'Ts'</span>, <span class="org-string">'t'</span>, <span class="org-string">'args'</span>);
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-orgefb8a5e" class="outline-2">
<h2 id="orgefb8a5e"><span class="section-number-2">16</span> Initialize Position Errors</h2>
<div class="outline-text-2" id="text-16">
<p>
<a id="orga39c5fc"></a>
</p>
</div>
<div id="outline-container-orgb134e02" class="outline-3">
<h3 id="orgb134e02">Function Declaration and Documentation</h3>
<div class="outline-text-3" id="text-orgb134e02">
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-keyword">function</span> <span class="org-variable-name">[]</span> = <span class="org-function-name">initializePosError</span>(<span class="org-variable-name">args</span>)
<span class="org-comment">% initializePosError - Initialize the position errors</span>
<span class="org-comment">%</span>
<span class="org-comment">% Syntax: [] = initializePosError(args)</span>
<span class="org-comment">%</span>
<span class="org-comment">% Inputs:</span>
<span class="org-comment">% - args -</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org27c3039" class="outline-3">
<h3 id="org27c3039">Optional Parameters</h3>
<div class="outline-text-3" id="text-org27c3039">
<div class="org-src-container">
<pre class="src src-matlab">arguments
args.error logical {mustBeNumericOrLogical} = <span class="org-constant">false</span>
args.Dy (1,1) double {mustBeNumeric} = 0 <span class="org-comment">% [m]</span>
args.Ry (1,1) double {mustBeNumeric} = 0 <span class="org-comment">% [m]</span>
args.Rz (1,1) double {mustBeNumeric} = 0 <span class="org-comment">% [m]</span>
<span class="org-keyword">end</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org4a0049b" class="outline-3">
<h3 id="org4a0049b">Structure initialization</h3>
<div class="outline-text-3" id="text-org4a0049b">
<p>
First, we initialize the <code>pos_error</code> structure.
</p>
<div class="org-src-container">
<pre class="src src-matlab">pos_error = struct();
</pre>
</div>
</div>
</div>
<div id="outline-container-orgc890f7d" class="outline-3">
<h3 id="orgc890f7d">Type</h3>
<div class="outline-text-3" id="text-orgc890f7d">
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-keyword">if</span> args.error
pos_error.type = 1;
<span class="org-keyword">else</span>
pos_error.type = 0;
<span class="org-keyword">end</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org7d50228" class="outline-3">
<h3 id="org7d50228">Position Errors</h3>
<div class="outline-text-3" id="text-org7d50228">
<div class="org-src-container">
<pre class="src src-matlab">pos_error.Dy = args.Dy;
pos_error.Ry = args.Ry;
pos_error.Rz = args.Rz;
</pre>
</div>
</div>
</div>
<div id="outline-container-org2b550dd" class="outline-3">
<h3 id="org2b550dd">Save</h3>
<div class="outline-text-3" id="text-org2b550dd">
<div class="org-src-container">
2020-03-13 17:40:22 +01:00
<pre class="src src-matlab">save(<span class="org-string">'./mat/pos_error.mat'</span>, <span class="org-string">'pos_error'</span>);
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-orgc87e890" class="outline-2">
<h2 id="orgc87e890"><span class="section-number-2">17</span> Z-Axis Geophone</h2>
<div class="outline-text-2" id="text-17">
<p>
<a id="orgda06de2"></a>
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-keyword">function</span> <span class="org-variable-name">[geophone]</span> = <span class="org-function-name">initializeZAxisGeophone</span>(<span class="org-variable-name">args</span>)
arguments
args.mass (1,1) double {mustBeNumeric, mustBePositive} = 1e<span class="org-type">-</span>3 <span class="org-comment">% [kg]</span>
args.freq (1,1) double {mustBeNumeric, mustBePositive} = 1 <span class="org-comment">% [Hz]</span>
<span class="org-keyword">end</span>
<span class="org-matlab-cellbreak"><span class="org-comment">%%</span></span>
geophone.m = args.mass;
<span class="org-matlab-cellbreak"><span class="org-comment">%% The Stiffness is set to have the damping resonance frequency</span></span>
geophone.k = geophone.m <span class="org-type">*</span> (2<span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">*</span>args.freq)<span class="org-type">^</span>2;
<span class="org-matlab-cellbreak"><span class="org-comment">%% We set the damping value to have critical damping</span></span>
geophone.c = 2<span class="org-type">*</span>sqrt(geophone.m <span class="org-type">*</span> geophone.k);
<span class="org-matlab-cellbreak"><span class="org-comment">%% Save</span></span>
save(<span class="org-string">'./mat/geophone_z_axis.mat'</span>, <span class="org-string">'geophone'</span>);
<span class="org-keyword">end</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-orgcbddbd1" class="outline-2">
<h2 id="orgcbddbd1"><span class="section-number-2">18</span> Z-Axis Accelerometer</h2>
<div class="outline-text-2" id="text-18">
<p>
<a id="org071e205"></a>
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-keyword">function</span> <span class="org-variable-name">[accelerometer]</span> = <span class="org-function-name">initializeZAxisAccelerometer</span>(<span class="org-variable-name">args</span>)
arguments
args.mass (1,1) double {mustBeNumeric, mustBePositive} = 1e<span class="org-type">-</span>3 <span class="org-comment">% [kg]</span>
args.freq (1,1) double {mustBeNumeric, mustBePositive} = 5e3 <span class="org-comment">% [Hz]</span>
<span class="org-keyword">end</span>
<span class="org-matlab-cellbreak"><span class="org-comment">%%</span></span>
accelerometer.m = args.mass;
<span class="org-matlab-cellbreak"><span class="org-comment">%% The Stiffness is set to have the damping resonance frequency</span></span>
accelerometer.k = accelerometer.m <span class="org-type">*</span> (2<span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">*</span>args.freq)<span class="org-type">^</span>2;
<span class="org-matlab-cellbreak"><span class="org-comment">%% We set the damping value to have critical damping</span></span>
accelerometer.c = 2<span class="org-type">*</span>sqrt(accelerometer.m <span class="org-type">*</span> accelerometer.k);
<span class="org-matlab-cellbreak"><span class="org-comment">%% Gain correction of the accelerometer to have a unity gain until the resonance</span></span>
accelerometer.gain = <span class="org-type">-</span>accelerometer.k<span class="org-type">/</span>accelerometer.m;
<span class="org-matlab-cellbreak"><span class="org-comment">%% Save</span></span>
save(<span class="org-string">'./mat/accelerometer_z_axis.mat'</span>, <span class="org-string">'accelerometer'</span>);
<span class="org-keyword">end</span>
</pre>
</div>
</div>
</div>
</div>
<div id="postamble" class="status">
<p class="author">Author: Dehaeze Thomas</p>
<p class="date">Created: 2020-04-17 ven. 09:35</p>
</div>
</body>
</html>