1775 lines
60 KiB
HTML
1775 lines
60 KiB
HTML
<?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>
|
|
<!-- 2021-06-14 lun. 18:49 -->
|
|
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
|
|
<title>Vibration Table</title>
|
|
<meta name="author" content="Dehaeze Thomas" />
|
|
<meta name="generator" content="Org Mode" />
|
|
<link rel="stylesheet" type="text/css" href="https://research.tdehaeze.xyz/css/style.css"/>
|
|
<script type="text/javascript" src="https://research.tdehaeze.xyz/js/script.js"></script>
|
|
<script>
|
|
MathJax = {
|
|
svg: {
|
|
scale: 1,
|
|
fontCache: "global"
|
|
},
|
|
tex: {
|
|
tags: "ams",
|
|
multlineWidth: "%MULTLINEWIDTH",
|
|
tagSide: "right",
|
|
macros: {bm: ["\\boldsymbol{#1}",1],},
|
|
tagIndent: ".8em"
|
|
}
|
|
};
|
|
</script>
|
|
<script id="MathJax-script" async
|
|
src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-svg.js"></script>
|
|
</head>
|
|
<body>
|
|
<div id="org-div-home-and-up">
|
|
<a accesskey="h" href="../index.html"> UP </a>
|
|
|
|
|
<a accesskey="H" href="../index.html"> HOME </a>
|
|
</div><div id="content">
|
|
<h1 class="title">Vibration Table</h1>
|
|
<div id="table-of-contents">
|
|
<h2>Table of Contents</h2>
|
|
<div id="text-table-of-contents">
|
|
<ul>
|
|
<li><a href="#org1f7479a">1. Introduction</a></li>
|
|
<li><a href="#org4cd0cb9">2. Experimental Setup</a>
|
|
<ul>
|
|
<li><a href="#orgc61a6db">2.1. CAD Model</a></li>
|
|
<li><a href="#org758f947">2.2. Instrumentation</a></li>
|
|
<li><a href="#orga974fbb">2.3. Suspended table</a></li>
|
|
<li><a href="#org456ccca">2.4. Inertial Sensors</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#org17e6266">3. Compute the 6DoF solid body motion from several inertial sensors</a>
|
|
<ul>
|
|
<li><a href="#org77279e3">3.1. Define accelerometers positions/orientations</a></li>
|
|
<li><a href="#orgf99f0e9">3.2. Transformation matrix from motion of the solid body to accelerometer measurements</a></li>
|
|
<li><a href="#org0380df9">3.3. Compute the transformation matrix from accelerometer measurement to motion of the solid body</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#org9f131a6">4. Simscape Model</a>
|
|
<ul>
|
|
<li><a href="#org1708179">4.1. Simscape Sub-systems</a>
|
|
<ul>
|
|
<li><a href="#org59a9e6c">4.1.1. Springs</a></li>
|
|
<li><a href="#org892238c">4.1.2. Inertial Shaker (IS20)</a></li>
|
|
<li><a href="#orgad3867f">4.1.3. 3D accelerometer (356B18)</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#orga9c7d6e">4.2. Identification</a>
|
|
<ul>
|
|
<li><a href="#orgecac927">4.2.1. Number of states</a></li>
|
|
<li><a href="#orgde2f853">4.2.2. Resonance frequencies and mode shapes</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#org4e5d067">4.3. Verify transformation</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#org1de5c6f">5. Nano-Hexapod</a>
|
|
<ul>
|
|
<li><a href="#org61a310d">5.1. Nano-Hexapod</a></li>
|
|
<li><a href="#org853c5a3">5.2. Computation of the transmissibility from accelerometer data</a>
|
|
<ul>
|
|
<li><a href="#org7875585">5.2.1. Jacobian matrices</a></li>
|
|
<li><a href="#org1035e82">5.2.2. Using <code>linearize</code> function</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#orgb5673c5">5.3. Comparison with “true” transmissibility</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#org1997df3">6. Identification of the table’s dynamics</a>
|
|
<ul>
|
|
<li><a href="#org0c04ac3">6.1. Mode Shapes</a></li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
<hr>
|
|
<p>This report is also available as a <a href="./vibration-table.pdf">pdf</a>.</p>
|
|
<hr>
|
|
|
|
<div id="outline-container-org1f7479a" class="outline-2">
|
|
<h2 id="org1f7479a"><span class="section-number-2">1</span> Introduction</h2>
|
|
<div class="outline-text-2" id="text-1">
|
|
<p>
|
|
This document is divided as follows:
|
|
</p>
|
|
<ul class="org-ul">
|
|
<li>Section <a href="#orgecbe1dc">2</a>: the experimental setup and all the instrumentation are described</li>
|
|
<li>Section <a href="#org484532e">3</a>: the mathematics used to compute the 6DoF motion of a solid body from several inertial sensor is derived</li>
|
|
<li>Section <a href="#orge75ecea">4</a>: a Simscape model of the vibration table is developed</li>
|
|
<li>Section <a href="#orgb02308b">6</a>: the table dynamics is identified and compared with the Simscape model</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org4cd0cb9" class="outline-2">
|
|
<h2 id="org4cd0cb9"><span class="section-number-2">2</span> Experimental Setup</h2>
|
|
<div class="outline-text-2" id="text-2">
|
|
<p>
|
|
<a id="orgecbe1dc"></a>
|
|
</p>
|
|
</div>
|
|
<div id="outline-container-orgc61a6db" class="outline-3">
|
|
<h3 id="orgc61a6db"><span class="section-number-3">2.1</span> CAD Model</h3>
|
|
<div class="outline-text-3" id="text-2-1">
|
|
|
|
<div id="org10e032e" class="figure">
|
|
<p><img src="figs/vibration-table-cad-view.png" alt="vibration-table-cad-view.png" />
|
|
</p>
|
|
<p><span class="figure-number">Figure 1: </span>CAD View of the vibration table</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org758f947" class="outline-3">
|
|
<h3 id="org758f947"><span class="section-number-3">2.2</span> Instrumentation</h3>
|
|
<div class="outline-text-3" id="text-2-2">
|
|
<div class="note" id="org1c41223">
|
|
<p>
|
|
Here are the documentation of the equipment used for this vibration table:
|
|
</p>
|
|
<ul class="org-ul">
|
|
<li>Modal Shaker: Watson and Gearing</li>
|
|
<li>Inertial Shaker: <a href="doc/inertial_shakers.pdf">IS20</a></li>
|
|
<li>Viscoelastic supports: <a href="doc/810002_doc.pdf">810002</a></li>
|
|
<li>Spring supports: <a href="doc/9129fcb6ec46bb52925bb16155a850f3be01c479.pdf">MV803-12CC</a></li>
|
|
<li>Optical Table: <a href="https://www.thorlabs.com/thorproduct.cfm?partnumber=B4545A">B4545A</a></li>
|
|
<li>Triaxial Accelerometer: <a href="https://www.pcb.com/products?model=356b18">356B18</a></li>
|
|
<li>OROS</li>
|
|
</ul>
|
|
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-orga974fbb" class="outline-3">
|
|
<h3 id="orga974fbb"><span class="section-number-3">2.3</span> Suspended table</h3>
|
|
<div class="outline-text-3" id="text-2-3">
|
|
<dl class="org-dl">
|
|
<dt>Dimensions</dt><dd>450 mm x 450 mm x 60 mm</dd>
|
|
<dt>Mass</dt><dd>21.30 kg</dd>
|
|
</dl>
|
|
|
|
|
|
<div id="orgde06f6e" class="figure">
|
|
<p><img src="figs/B4545A_Compliance_inLb-780.png" alt="B4545A_Compliance_inLb-780.png" />
|
|
</p>
|
|
<p><span class="figure-number">Figure 2: </span>Compliance of the B4545A optical table</p>
|
|
</div>
|
|
|
|
<p>
|
|
If we include including the bottom interface plate:
|
|
</p>
|
|
<ul class="org-ul">
|
|
<li>Total mass: 30.7 kg</li>
|
|
<li>CoM: 42mm below Center of optical table</li>
|
|
<li>Ix = 0.54, Iy = 0.54, Iz = 1.07 (with respect to CoM)</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org456ccca" class="outline-3">
|
|
<h3 id="org456ccca"><span class="section-number-3">2.4</span> Inertial Sensors</h3>
|
|
<div class="outline-text-3" id="text-2-4">
|
|
<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
|
|
|
|
|
|
<colgroup>
|
|
<col class="org-left" />
|
|
</colgroup>
|
|
<thead>
|
|
<tr>
|
|
<th scope="col" class="org-left">Equipment</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td class="org-left">(2x) 1D accelerometer <a href="https://www.pcbpiezotronics.fr/produit/accelerometre/393b05/">PCB 393B05</a></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left">(4x) 3D accelerometer <a href="https://www.pcbpiezotronics.fr/produit/accelerometres/356b18/">PCB 356B18</a></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org17e6266" class="outline-2">
|
|
<h2 id="org17e6266"><span class="section-number-2">3</span> Compute the 6DoF solid body motion from several inertial sensors</h2>
|
|
<div class="outline-text-2" id="text-3">
|
|
<p>
|
|
<a id="org484532e"></a>
|
|
</p>
|
|
<p>
|
|
Let’s consider a solid body with several accelerometers attached to it (Figure <a href="#orgace737a">3</a>).
|
|
</p>
|
|
|
|
|
|
<div id="orgace737a" class="figure">
|
|
<p><img src="figs/local_to_global_coordinates.png" alt="local_to_global_coordinates.png" />
|
|
</p>
|
|
<p><span class="figure-number">Figure 3: </span>Schematic of the measured motions of a solid body</p>
|
|
</div>
|
|
|
|
<p>
|
|
The goal of this section is to see how to compute the acceleration/angular acceleration of the solid body from the accelerations \(\vec{a}_i\) measured by the accelerometers.
|
|
</p>
|
|
|
|
<p>
|
|
The acceleration/angular acceleration of the solid body is defined as the vector \({}^O\vec{x}\):
|
|
</p>
|
|
\begin{equation}
|
|
{}^O\vec{x} = \begin{bmatrix}
|
|
\dot{v}_x \\ \dot{v}_y \\ \dot{v}_z \\ \dot{\omega}_x \\ \dot{\omega}_y \\ \dot{\omega}_z
|
|
\end{bmatrix}
|
|
\end{equation}
|
|
|
|
<p>
|
|
As we want to measure 6dof, we suppose that we have 6 uniaxial acceleremoters (we could use more, but 6 is enough).
|
|
The measurement of the individual vectors is defined as the vector \(\vec{a}\):
|
|
</p>
|
|
\begin{equation}
|
|
\vec{a} = \begin{bmatrix}
|
|
a_1 \\ a_2 \\ a_3 \\ a_4 \\ a_5 \\ a_6
|
|
\end{bmatrix}
|
|
\end{equation}
|
|
|
|
<p>
|
|
From the positions and orientations of the acceleremoters (defined in Section <a href="#orgf7c4b2e">3.1</a>), it is quite straightforward to compute the accelerations measured by the sensors from the acceleration/angular acceleration of the solid body (Section <a href="#org453cc27">3.2</a>).
|
|
From this, we can easily build a transformation matrix \(M\), such that:
|
|
</p>
|
|
\begin{equation}
|
|
\vec{a} = M \cdot {}^O\vec{x}
|
|
\end{equation}
|
|
|
|
<p>
|
|
If the matrix is invertible, we can just take the inverse in order to obtain the transformation matrix giving the 6dof acceleration of the solid body from the accelerometer measurements (Section <a href="#org3444b4c">3.3</a>):
|
|
</p>
|
|
\begin{equation}
|
|
{}^O\vec{x} = M^{-1} \cdot \vec{a}
|
|
\end{equation}
|
|
|
|
<p>
|
|
If it is not invertible, then it means that it is not possible to compute all 6dof of the solid body from the measurements.
|
|
The solution is then to change the location/orientation of some of the accelerometers.
|
|
</p>
|
|
</div>
|
|
<div id="outline-container-org77279e3" class="outline-3">
|
|
<h3 id="org77279e3"><span class="section-number-3">3.1</span> Define accelerometers positions/orientations</h3>
|
|
<div class="outline-text-3" id="text-3-1">
|
|
<p>
|
|
<a id="orgf7c4b2e"></a>
|
|
Let’s first define the position and orientation of all measured accelerations with respect to a defined frame \(\{O\}\).
|
|
</p>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">Opm = [<span class="org-type">-</span>0.1875, <span class="org-type">-</span>0.1875, <span class="org-type">-</span>0.245;
|
|
<span class="org-type">-</span>0.1875, <span class="org-type">-</span>0.1875, <span class="org-type">-</span>0.245;
|
|
0.1875, <span class="org-type">-</span>0.1875, <span class="org-type">-</span>0.245;
|
|
0.1875, <span class="org-type">-</span>0.1875, <span class="org-type">-</span>0.245;
|
|
0.1875, 0.1875, <span class="org-type">-</span>0.245;
|
|
0.1875, 0.1875, <span class="org-type">-</span>0.245]<span class="org-type">'</span>;
|
|
</pre>
|
|
</div>
|
|
|
|
<p>
|
|
There are summarized in Table <a href="#org9c3b031">1</a>.
|
|
</p>
|
|
|
|
<table id="org9c3b031" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
|
|
<caption class="t-above"><span class="table-number">Table 1:</span> Positions of the accelerometers fixed to the vibration table with respect to \(\{O\}\)</caption>
|
|
|
|
<colgroup>
|
|
<col class="org-left" />
|
|
|
|
<col class="org-right" />
|
|
|
|
<col class="org-right" />
|
|
|
|
<col class="org-right" />
|
|
|
|
<col class="org-right" />
|
|
|
|
<col class="org-right" />
|
|
|
|
<col class="org-right" />
|
|
</colgroup>
|
|
<thead>
|
|
<tr>
|
|
<th scope="col" class="org-left"> </th>
|
|
<th scope="col" class="org-right">\(a_1\)</th>
|
|
<th scope="col" class="org-right">\(a_2\)</th>
|
|
<th scope="col" class="org-right">\(a_3\)</th>
|
|
<th scope="col" class="org-right">\(a_4\)</th>
|
|
<th scope="col" class="org-right">\(a_5\)</th>
|
|
<th scope="col" class="org-right">\(a_6\)</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td class="org-left">x</td>
|
|
<td class="org-right">-0.188</td>
|
|
<td class="org-right">-0.188</td>
|
|
<td class="org-right">0.188</td>
|
|
<td class="org-right">0.188</td>
|
|
<td class="org-right">0.188</td>
|
|
<td class="org-right">0.188</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left">y</td>
|
|
<td class="org-right">-0.188</td>
|
|
<td class="org-right">-0.188</td>
|
|
<td class="org-right">-0.188</td>
|
|
<td class="org-right">-0.188</td>
|
|
<td class="org-right">0.188</td>
|
|
<td class="org-right">0.188</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left">z</td>
|
|
<td class="org-right">-0.245</td>
|
|
<td class="org-right">-0.245</td>
|
|
<td class="org-right">-0.245</td>
|
|
<td class="org-right">-0.245</td>
|
|
<td class="org-right">-0.245</td>
|
|
<td class="org-right">-0.245</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
<p>
|
|
We then define the direction of the measured accelerations (unit vectors):
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">Osm = [0, 1, 0;
|
|
0, 0, 1;
|
|
1, 0, 0;
|
|
0, 0, 1;
|
|
1, 0, 0;
|
|
0, 1, 0]<span class="org-type">'</span>;
|
|
</pre>
|
|
</div>
|
|
|
|
<p>
|
|
They are summarized in Table <a href="#org3c8b5a9">2</a>.
|
|
</p>
|
|
|
|
<table id="org3c8b5a9" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
|
|
<caption class="t-above"><span class="table-number">Table 2:</span> Orientations of the accelerometers fixed to the vibration table expressed in \(\{O\}\)</caption>
|
|
|
|
<colgroup>
|
|
<col class="org-left" />
|
|
|
|
<col class="org-right" />
|
|
|
|
<col class="org-right" />
|
|
|
|
<col class="org-right" />
|
|
|
|
<col class="org-right" />
|
|
|
|
<col class="org-right" />
|
|
|
|
<col class="org-right" />
|
|
</colgroup>
|
|
<thead>
|
|
<tr>
|
|
<th scope="col" class="org-left"> </th>
|
|
<th scope="col" class="org-right">\(\hat{s}_1\)</th>
|
|
<th scope="col" class="org-right">\(\hat{s}_2\)</th>
|
|
<th scope="col" class="org-right">\(\hat{s}_3\)</th>
|
|
<th scope="col" class="org-right">\(\hat{s}_4\)</th>
|
|
<th scope="col" class="org-right">\(\hat{s}_5\)</th>
|
|
<th scope="col" class="org-right">\(\hat{s}_6\)</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td class="org-left">x</td>
|
|
<td class="org-right">0</td>
|
|
<td class="org-right">0</td>
|
|
<td class="org-right">1</td>
|
|
<td class="org-right">0</td>
|
|
<td class="org-right">1</td>
|
|
<td class="org-right">0</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left">y</td>
|
|
<td class="org-right">1</td>
|
|
<td class="org-right">0</td>
|
|
<td class="org-right">0</td>
|
|
<td class="org-right">0</td>
|
|
<td class="org-right">0</td>
|
|
<td class="org-right">0</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left">z</td>
|
|
<td class="org-right">0</td>
|
|
<td class="org-right">1</td>
|
|
<td class="org-right">0</td>
|
|
<td class="org-right">1</td>
|
|
<td class="org-right">0</td>
|
|
<td class="org-right">1</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-orgf99f0e9" class="outline-3">
|
|
<h3 id="orgf99f0e9"><span class="section-number-3">3.2</span> Transformation matrix from motion of the solid body to accelerometer measurements</h3>
|
|
<div class="outline-text-3" id="text-3-2">
|
|
<p>
|
|
<a id="org453cc27"></a>
|
|
</p>
|
|
|
|
<p>
|
|
Let’s try to estimate the x-y-z acceleration of any point of the solid body from the acceleration/angular acceleration of the solid body expressed in \(\{O\}\).
|
|
For any point \(p_i\) of the solid body (corresponding to an accelerometer), we can write:
|
|
</p>
|
|
\begin{equation}
|
|
\begin{bmatrix}
|
|
a_{i,x} \\ a_{i,y} \\ a_{i,z}
|
|
\end{bmatrix} = \begin{bmatrix}
|
|
\dot{v}_x \\ \dot{v}_y \\ \dot{v}_z
|
|
\end{bmatrix} + p_i \times \begin{bmatrix}
|
|
\dot{\omega}_x \\ \dot{\omega}_y \\ \dot{\omega}_z
|
|
\end{bmatrix}
|
|
\end{equation}
|
|
|
|
<p>
|
|
We can write the cross product as a matrix product using the skew-symmetric transformation:
|
|
</p>
|
|
\begin{equation}
|
|
\begin{bmatrix}
|
|
a_{i,x} \\ a_{i,y} \\ a_{i,z}
|
|
\end{bmatrix} = \begin{bmatrix}
|
|
\dot{v}_x \\ \dot{v}_y \\ \dot{v}_z
|
|
\end{bmatrix} + \underbrace{\begin{bmatrix}
|
|
0 & p_{i,z} & -p_{i,y} \\
|
|
-p_{i,z} & 0 & p_{i,x} \\
|
|
p_{i,y} & -p_{i,x} & 0
|
|
\end{bmatrix}}_{P_{i,[\times]}} \cdot \begin{bmatrix}
|
|
\dot{\omega}_x \\ \dot{\omega}_y \\ \dot{\omega}_z
|
|
\end{bmatrix}
|
|
\end{equation}
|
|
|
|
<p>
|
|
If we now want to know the (scalar) acceleration \(a_i\) of the point \(p_i\) in the direction of the accelerometer direction \(\hat{s}_i\), we can just project the 3d acceleration on \(\hat{s}_i\):
|
|
</p>
|
|
\begin{equation}
|
|
a_i = \hat{s}_i^T \cdot \begin{bmatrix}
|
|
a_{i,x} \\ a_{i,y} \\ a_{i,z}
|
|
\end{bmatrix} = \hat{s}_i^T \cdot \begin{bmatrix}
|
|
\dot{v}_x \\ \dot{v}_y \\ \dot{v}_z
|
|
\end{bmatrix} + \left( \hat{s}_i^T \cdot P_{i,[\times]} \right) \cdot \begin{bmatrix}
|
|
\dot{\omega}_x \\ \dot{\omega}_y \\ \dot{\omega}_z
|
|
\end{bmatrix}
|
|
\end{equation}
|
|
|
|
<p>
|
|
Which is equivalent as a simple vector multiplication:
|
|
</p>
|
|
\begin{equation}
|
|
a_i = \begin{bmatrix}
|
|
\hat{s}_i^T & \hat{s}_i^T \cdot P_{i,[\times]}
|
|
\end{bmatrix}
|
|
\begin{bmatrix}
|
|
\dot{v}_x \\ \dot{v}_y \\ \dot{v}_z \\ \dot{\omega}_x \\ \dot{\omega}_y \\ \dot{\omega}_z
|
|
\end{bmatrix} = \begin{bmatrix}
|
|
\hat{s}_i^T & \hat{s}_i^T \cdot P_{i,[\times]}
|
|
\end{bmatrix} {}^O\vec{x}
|
|
\end{equation}
|
|
|
|
<p>
|
|
And finally we can combine the 6 (line) vectors for the 6 accelerometers to write that in a matrix form.
|
|
We obtain Eq. \eqref{eq:M_matrix}.
|
|
</p>
|
|
<div class="important" id="org6ade55b">
|
|
<p>
|
|
The transformation from solid body acceleration \({}^O\vec{x}\) from sensor measured acceleration \(\vec{a}\) is:
|
|
</p>
|
|
\begin{equation} \label{eq:M_matrix}
|
|
\vec{a} = \underbrace{\begin{bmatrix}
|
|
\hat{s}_1^T & \hat{s}_1^T \cdot P_{1,[\times]} \\
|
|
\vdots & \vdots \\
|
|
\hat{s}_6^T & \hat{s}_6^T \cdot P_{6,[\times]}
|
|
\end{bmatrix}}_{M} {}^O\vec{x}
|
|
\end{equation}
|
|
|
|
<p>
|
|
with \(\hat{s}_i\) the unit vector representing the measured direction of the i’th accelerometer expressed in frame \(\{O\}\) and \(P_{i,[\times]}\) the skew-symmetric matrix representing the cross product of the position of the i’th accelerometer expressed in frame \(\{O\}\).
|
|
</p>
|
|
|
|
</div>
|
|
|
|
<p>
|
|
Let’s define such matrix using matlab:
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">M = zeros(length(Opm), 6);
|
|
|
|
<span class="org-keyword">for</span> <span class="org-variable-name"><span class="org-constant">i</span></span> = <span class="org-constant">1:length(Opm)</span>
|
|
Ri = [0, Opm(3,<span class="org-constant">i</span>), <span class="org-type">-</span>Opm(2,<span class="org-constant">i</span>);
|
|
<span class="org-type">-</span>Opm(3,<span class="org-constant">i</span>), 0, Opm(1,<span class="org-constant">i</span>);
|
|
Opm(2,<span class="org-constant">i</span>), <span class="org-type">-</span>Opm(1,<span class="org-constant">i</span>), 0];
|
|
M(<span class="org-constant">i</span>, 1<span class="org-type">:</span>3) = Osm(<span class="org-type">:</span>,<span class="org-constant">i</span>)<span class="org-type">'</span>;
|
|
M(<span class="org-constant">i</span>, 4<span class="org-type">:</span>6) = Osm(<span class="org-type">:</span>,<span class="org-constant">i</span>)<span class="org-type">'*</span>Ri;
|
|
<span class="org-keyword">end</span>
|
|
</pre>
|
|
</div>
|
|
|
|
<p>
|
|
The obtained matrix is shown in Table <a href="#orgfd824b6">3</a>.
|
|
</p>
|
|
|
|
<table id="orgfd824b6" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
|
|
<caption class="t-above"><span class="table-number">Table 3:</span> Effect of a displacement/rotation on the 6 measurements</caption>
|
|
|
|
<colgroup>
|
|
<col class="org-left" />
|
|
|
|
<col class="org-right" />
|
|
|
|
<col class="org-right" />
|
|
|
|
<col class="org-right" />
|
|
|
|
<col class="org-right" />
|
|
|
|
<col class="org-right" />
|
|
|
|
<col class="org-right" />
|
|
</colgroup>
|
|
<thead>
|
|
<tr>
|
|
<th scope="col" class="org-left"> </th>
|
|
<th scope="col" class="org-right">\(\dot{x}_x\)</th>
|
|
<th scope="col" class="org-right">\(\dot{x}_y\)</th>
|
|
<th scope="col" class="org-right">\(\dot{x}_z\)</th>
|
|
<th scope="col" class="org-right">\(\dot{\omega}_x\)</th>
|
|
<th scope="col" class="org-right">\(\dot{\omega}_y\)</th>
|
|
<th scope="col" class="org-right">\(\dot{\omega}_z\)</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td class="org-left">\(a_1\)</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">1.0</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">0.24</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">-0.19</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left">\(a_2\)</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">1.0</td>
|
|
<td class="org-right">-0.19</td>
|
|
<td class="org-right">0.19</td>
|
|
<td class="org-right">0.0</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left">\(a_3\)</td>
|
|
<td class="org-right">1.0</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">-0.24</td>
|
|
<td class="org-right">0.19</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left">\(a_4\)</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">1.0</td>
|
|
<td class="org-right">-0.19</td>
|
|
<td class="org-right">-0.19</td>
|
|
<td class="org-right">0.0</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left">\(a_5\)</td>
|
|
<td class="org-right">1.0</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">-0.24</td>
|
|
<td class="org-right">-0.19</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left">\(a_6\)</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">1.0</td>
|
|
<td class="org-right">0.19</td>
|
|
<td class="org-right">-0.19</td>
|
|
<td class="org-right">0.0</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org0380df9" class="outline-3">
|
|
<h3 id="org0380df9"><span class="section-number-3">3.3</span> Compute the transformation matrix from accelerometer measurement to motion of the solid body</h3>
|
|
<div class="outline-text-3" id="text-3-3">
|
|
<p>
|
|
<a id="org3444b4c"></a>
|
|
</p>
|
|
|
|
<p>
|
|
In order to compute the motion of the solid body \({}^O\vec{x}\) with respect to frame \(\{O\}\) from the accelerometer measurements \(\vec{a}\), we have to inverse the transformation matrix \(M\).
|
|
</p>
|
|
\begin{equation}
|
|
{}^O\vec{x} = M^{-1} \vec{a}
|
|
\end{equation}
|
|
|
|
<p>
|
|
We therefore need the determinant of \(M\) to be non zero:
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">det(M)
|
|
</pre>
|
|
</div>
|
|
|
|
<p>
|
|
The obtained inverse of the matrix is shown in Table <a href="#org2d4c081">4</a>.
|
|
</p>
|
|
|
|
<table id="org2d4c081" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
|
|
<caption class="t-above"><span class="table-number">Table 4:</span> Compute the displacement/rotation from the 6 measurements</caption>
|
|
|
|
<colgroup>
|
|
<col class="org-left" />
|
|
|
|
<col class="org-right" />
|
|
|
|
<col class="org-right" />
|
|
|
|
<col class="org-right" />
|
|
|
|
<col class="org-right" />
|
|
|
|
<col class="org-right" />
|
|
|
|
<col class="org-right" />
|
|
</colgroup>
|
|
<thead>
|
|
<tr>
|
|
<th scope="col" class="org-left"> </th>
|
|
<th scope="col" class="org-right">\(a_1\)</th>
|
|
<th scope="col" class="org-right">\(a_2\)</th>
|
|
<th scope="col" class="org-right">\(a_3\)</th>
|
|
<th scope="col" class="org-right">\(a_4\)</th>
|
|
<th scope="col" class="org-right">\(a_5\)</th>
|
|
<th scope="col" class="org-right">\(a_6\)</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td class="org-left">\(\dot{x}_x\)</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">0.7</td>
|
|
<td class="org-right">0.5</td>
|
|
<td class="org-right">-0.7</td>
|
|
<td class="org-right">0.5</td>
|
|
<td class="org-right">0.0</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left">\(\dot{x}_y\)</td>
|
|
<td class="org-right">1.0</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">0.5</td>
|
|
<td class="org-right">0.7</td>
|
|
<td class="org-right">-0.5</td>
|
|
<td class="org-right">-0.7</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left">\(\dot{x}_z\)</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">0.5</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">0.5</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left">\(\dot{\omega}_x\)</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">-2.7</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">2.7</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left">\(\dot{\omega}_y\)</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">2.7</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">-2.7</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">0.0</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left">\(\dot{\omega}_z\)</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">2.7</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">-2.7</td>
|
|
<td class="org-right">0.0</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org9f131a6" class="outline-2">
|
|
<h2 id="org9f131a6"><span class="section-number-2">4</span> Simscape Model</h2>
|
|
<div class="outline-text-2" id="text-4">
|
|
<p>
|
|
<a id="orge75ecea"></a>
|
|
</p>
|
|
<p>
|
|
In this section, the Simscape model of the vibration table is described.
|
|
</p>
|
|
|
|
|
|
<div id="org87b5d8c" class="figure">
|
|
<p><img src="figs/simscape_vibration_table.png" alt="simscape_vibration_table.png" />
|
|
</p>
|
|
<p><span class="figure-number">Figure 4: </span>3D representation of the simscape model</p>
|
|
</div>
|
|
</div>
|
|
<div id="outline-container-org1708179" class="outline-3">
|
|
<h3 id="org1708179"><span class="section-number-3">4.1</span> Simscape Sub-systems</h3>
|
|
<div class="outline-text-3" id="text-4-1">
|
|
<p>
|
|
<a id="org9d6b970"></a>
|
|
</p>
|
|
|
|
<p>
|
|
Parameters for sub-components of the simscape model are defined below.
|
|
</p>
|
|
</div>
|
|
|
|
<div id="outline-container-org59a9e6c" class="outline-4">
|
|
<h4 id="org59a9e6c"><span class="section-number-4">4.1.1</span> Springs</h4>
|
|
<div class="outline-text-4" id="text-4-1-1">
|
|
<p>
|
|
<a id="orgf9565ea"></a>
|
|
</p>
|
|
|
|
<p>
|
|
The 4 springs supporting the suspended optical table are modelled with “bushing joints” having stiffness and damping in the x-y-z directions:
|
|
</p>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">spring.kx = 1e4; <span class="org-comment">% X- Stiffness [N/m]</span>
|
|
spring.cx = 1e1; <span class="org-comment">% X- Damping [N/(m/s)]</span>
|
|
|
|
spring.ky = 1e4; <span class="org-comment">% Y- Stiffness [N/m]</span>
|
|
spring.cy = 1e1; <span class="org-comment">% Y- Damping [N/(m/s)]</span>
|
|
|
|
spring.kz = 1e4; <span class="org-comment">% Z- Stiffness [N/m]</span>
|
|
spring.cz = 1e1; <span class="org-comment">% Z- Damping [N/(m/s)]</span>
|
|
|
|
spring.z0 = 32e<span class="org-type">-</span>3; <span class="org-comment">% Equilibrium z-length [m]</span>
|
|
</pre>
|
|
</div>
|
|
|
|
<p>
|
|
And we can increase the “equilibrium position” of the vertical springs to take into account the gravity forces and start closer to equilibrium:
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">spring.dl = (30.5918<span class="org-type">/</span>4)<span class="org-type">*</span>9.80665<span class="org-type">/</span>spring.kz;
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org892238c" class="outline-4">
|
|
<h4 id="org892238c"><span class="section-number-4">4.1.2</span> Inertial Shaker (IS20)</h4>
|
|
<div class="outline-text-4" id="text-4-1-2">
|
|
<p>
|
|
<a id="org5063bef"></a>
|
|
</p>
|
|
|
|
<p>
|
|
The inertial shaker is defined as two solid bodies:
|
|
</p>
|
|
<ul class="org-ul">
|
|
<li>the “housing” that is fixed to the element that we want to excite</li>
|
|
<li>the “inertial mass” that is suspended inside the housing</li>
|
|
</ul>
|
|
|
|
<p>
|
|
The inertial mass is guided inside the housing and an actuator (coil and magnet) can be used to apply a force between the inertial mass and the support.
|
|
The “reacting” force on the support is then used as an excitation.
|
|
</p>
|
|
|
|
<table id="orgfe2f26d" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
|
|
<caption class="t-above"><span class="table-number">Table 5:</span> Summary of the IS20 datasheet</caption>
|
|
|
|
<colgroup>
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
</colgroup>
|
|
<thead>
|
|
<tr>
|
|
<th scope="col" class="org-left">Characteristic</th>
|
|
<th scope="col" class="org-left">Value</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td class="org-left">Output Force</td>
|
|
<td class="org-left">20 N</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left">Frequency Range</td>
|
|
<td class="org-left">10-3000 Hz</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left">Moving Mass</td>
|
|
<td class="org-left">0.1 kg</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left">Total Mass</td>
|
|
<td class="org-left">0.3 kg</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
<p>
|
|
From the datasheet in Table <a href="#orgfe2f26d">5</a>, we can estimate the parameters of the physical shaker.
|
|
</p>
|
|
|
|
<p>
|
|
These parameters are defined below
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">shaker.w0 = 2<span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">*</span>10; <span class="org-comment">% Resonance frequency of moving mass [rad/s]</span>
|
|
shaker.m = 0.1; <span class="org-comment">% Moving mass [m]</span>
|
|
shaker.m_tot = 0.3; <span class="org-comment">% Total mass [m]</span>
|
|
shaker.k = shaker.m<span class="org-type">*</span>shaker.w0<span class="org-type">^</span>2; <span class="org-comment">% Spring constant [N/m]</span>
|
|
shaker.c = 0.2<span class="org-type">*</span>sqrt(shaker.k<span class="org-type">*</span>shaker.m); <span class="org-comment">% Damping [N/(m/s)]</span>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-orgad3867f" class="outline-4">
|
|
<h4 id="orgad3867f"><span class="section-number-4">4.1.3</span> 3D accelerometer (356B18)</h4>
|
|
<div class="outline-text-4" id="text-4-1-3">
|
|
<p>
|
|
<a id="org855b19f"></a>
|
|
</p>
|
|
|
|
<p>
|
|
An accelerometer consists of 2 solids:
|
|
</p>
|
|
<ul class="org-ul">
|
|
<li>a “housing” rigidly fixed to the measured body</li>
|
|
<li>an “inertial mass” suspended inside the housing by springs and guided in the measured direction</li>
|
|
</ul>
|
|
|
|
<p>
|
|
The relative motion between the housing and the inertial mass gives a measurement of the acceleration of the measured body (up to the suspension mode of the inertial mass).
|
|
</p>
|
|
|
|
<table id="org6e16f1e" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
|
|
<caption class="t-above"><span class="table-number">Table 6:</span> Summary of the 356B18 datasheet</caption>
|
|
|
|
<colgroup>
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
</colgroup>
|
|
<thead>
|
|
<tr>
|
|
<th scope="col" class="org-left">Characteristic</th>
|
|
<th scope="col" class="org-left">Value</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td class="org-left">Sensitivity</td>
|
|
<td class="org-left">0.102 V/(m/s2)</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left">Frequency Range</td>
|
|
<td class="org-left">0.5 to 3000 Hz</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left">Resonance Frequency</td>
|
|
<td class="org-left">> 20 kHz</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left">Resolution</td>
|
|
<td class="org-left">0.0005 m/s2 rms</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left">Weight</td>
|
|
<td class="org-left">0.025 kg</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left">Size</td>
|
|
<td class="org-left">20.3x26.1x20.3 [mm]</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
<p>
|
|
Here are defined the parameters for the triaxial accelerometer:
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">acc_3d.m = 0.005; <span class="org-comment">% Inertial mass [kg]</span>
|
|
acc_3d.m_tot = 0.025; <span class="org-comment">% Total mass [m]</span>
|
|
|
|
acc_3d.w0 = 2<span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">*</span>20e3; <span class="org-comment">% Resonance frequency [rad/s]</span>
|
|
|
|
acc_3d.kx = acc_3d.m<span class="org-type">*</span>acc_3d.w0<span class="org-type">^</span>2; <span class="org-comment">% Spring constant [N/m]</span>
|
|
acc_3d.ky = acc_3d.m<span class="org-type">*</span>acc_3d.w0<span class="org-type">^</span>2; <span class="org-comment">% Spring constant [N/m]</span>
|
|
acc_3d.kz = acc_3d.m<span class="org-type">*</span>acc_3d.w0<span class="org-type">^</span>2; <span class="org-comment">% Spring constant [N/m]</span>
|
|
|
|
acc_3d.cx = 1e2; <span class="org-comment">% Damping [N/(m/s)]</span>
|
|
acc_3d.cy = 1e2; <span class="org-comment">% Damping [N/(m/s)]</span>
|
|
acc_3d.cz = 1e2; <span class="org-comment">% Damping [N/(m/s)]</span>
|
|
</pre>
|
|
</div>
|
|
|
|
<p>
|
|
DC gain between support acceleration and inertial mass displacement is \(-m/k\):
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">acc_3d.g_x = 1<span class="org-type">/</span>(<span class="org-type">-</span>acc_3d.m<span class="org-type">/</span>acc_3d.kx); <span class="org-comment">% [m/s^2/m]</span>
|
|
acc_3d.g_y = 1<span class="org-type">/</span>(<span class="org-type">-</span>acc_3d.m<span class="org-type">/</span>acc_3d.ky); <span class="org-comment">% [m/s^2/m]</span>
|
|
acc_3d.g_z = 1<span class="org-type">/</span>(<span class="org-type">-</span>acc_3d.m<span class="org-type">/</span>acc_3d.kz); <span class="org-comment">% [m/s^2/m]</span>
|
|
</pre>
|
|
</div>
|
|
|
|
<p>
|
|
We also define the sensitivity in order to have the outputs in volts.
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">acc_3d.gV_x = 0.102; <span class="org-comment">% [V/(m/s^2)]</span>
|
|
acc_3d.gV_y = 0.102; <span class="org-comment">% [V/(m/s^2)]</span>
|
|
acc_3d.gV_z = 0.102; <span class="org-comment">% [V/(m/s^2)]</span>
|
|
</pre>
|
|
</div>
|
|
|
|
<p>
|
|
The problem with using such model for accelerometers is that this adds states to the identified models (2x3 states for each triaxial accelerometer).
|
|
These states represents the dynamics of the suspended inertial mass.
|
|
In the frequency band of interest (few Hz up to ~1 kHz), the dynamics of the inertial mass can be ignore (its resonance is way above 1kHz).
|
|
Therefore, we might as well use idealized “transform sensors” blocks as they will give the same result up to ~20kHz while allowing to reduce the number of identified states.
|
|
</p>
|
|
|
|
<p>
|
|
The accelerometer model can be chosen by setting the <code>type</code> property:
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">acc_3d.type = 2; <span class="org-comment">% 1: inertial mass, 2: perfect</span>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-orga9c7d6e" class="outline-3">
|
|
<h3 id="orga9c7d6e"><span class="section-number-3">4.2</span> Identification</h3>
|
|
<div class="outline-text-3" id="text-4-2">
|
|
<p>
|
|
<a id="org5980c73"></a>
|
|
</p>
|
|
</div>
|
|
|
|
<div id="outline-container-orgecac927" class="outline-4">
|
|
<h4 id="orgecac927"><span class="section-number-4">4.2.1</span> Number of states</h4>
|
|
<div class="outline-text-4" id="text-4-2-1">
|
|
<p>
|
|
Let’s first use perfect 3d accelerometers:
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">acc_3d.type = 2; <span class="org-comment">% 1: inertial mass, 2: perfect</span>
|
|
</pre>
|
|
</div>
|
|
|
|
<p>
|
|
And identify the dynamics from the shaker force to the measured accelerations:
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Name of the Simulink File</span></span>
|
|
mdl = <span class="org-string">'vibration_table'</span>;
|
|
|
|
<span class="org-matlab-cellbreak"><span class="org-comment">%% Input/Output definition</span></span>
|
|
clear io; io_i = 1;
|
|
io(io_i) = linio([mdl, <span class="org-string">'/F'</span>], 1, <span class="org-string">'openinput'</span>); io_i = io_i <span class="org-type">+</span> 1;
|
|
io(io_i) = linio([mdl, <span class="org-string">'/acc'</span>], 1, <span class="org-string">'openoutput'</span>); io_i = io_i <span class="org-type">+</span> 1;
|
|
|
|
<span class="org-matlab-cellbreak"><span class="org-comment">%% Run the linearization</span></span>
|
|
Gp = linearize(mdl, io);
|
|
Gp.InputName = {<span class="org-string">'F'</span>};
|
|
Gp.OutputName = {<span class="org-string">'a1'</span>, <span class="org-string">'a2'</span>, <span class="org-string">'a3'</span>, <span class="org-string">'a4'</span>, <span class="org-string">'a5'</span>, <span class="org-string">'a6'</span>};
|
|
</pre>
|
|
</div>
|
|
|
|
<pre class="example">
|
|
size(Gp)
|
|
State-space model with 6 outputs, 1 inputs, and 12 states.
|
|
</pre>
|
|
|
|
|
|
<p>
|
|
We indeed have the 12 states corresponding to the 6 DoF of the suspended optical table.
|
|
</p>
|
|
|
|
<p>
|
|
Let’s now consider the inertial masses for the triaxial accelerometers:
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">acc_3d.type = 1; <span class="org-comment">% 1: inertial mass, 2: perfect</span>
|
|
</pre>
|
|
</div>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Name of the Simulink File</span></span>
|
|
mdl = <span class="org-string">'vibration_table'</span>;
|
|
|
|
<span class="org-matlab-cellbreak"><span class="org-comment">%% Input/Output definition</span></span>
|
|
clear io; io_i = 1;
|
|
io(io_i) = linio([mdl, <span class="org-string">'/F'</span>], 1, <span class="org-string">'openinput'</span>); io_i = io_i <span class="org-type">+</span> 1;
|
|
io(io_i) = linio([mdl, <span class="org-string">'/acc'</span>], 1, <span class="org-string">'openoutput'</span>); io_i = io_i <span class="org-type">+</span> 1;
|
|
|
|
<span class="org-matlab-cellbreak"><span class="org-comment">%% Run the linearization</span></span>
|
|
Ga = linearize(mdl, io);
|
|
Ga.InputName = {<span class="org-string">'F'</span>};
|
|
Ga.OutputName = {<span class="org-string">'a1'</span>, <span class="org-string">'a2'</span>, <span class="org-string">'a3'</span>, <span class="org-string">'a4'</span>, <span class="org-string">'a5'</span>, <span class="org-string">'a6'</span>};
|
|
</pre>
|
|
</div>
|
|
|
|
<pre class="example">
|
|
size(Ga)
|
|
State-space model with 6 outputs, 1 inputs, and 30 states.
|
|
</pre>
|
|
|
|
|
|
<p>
|
|
And we can see that 18 states have been added.
|
|
This corresponds to 6 states for each triaxial accelerometers.
|
|
</p>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-orgde2f853" class="outline-4">
|
|
<h4 id="orgde2f853"><span class="section-number-4">4.2.2</span> Resonance frequencies and mode shapes</h4>
|
|
<div class="outline-text-4" id="text-4-2-2">
|
|
<p>
|
|
Let’s now identify the resonance frequency and mode shapes associated with the suspension modes of the optical table.
|
|
</p>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">acc_3d.type = 2; <span class="org-comment">% 1: inertial mass, 2: perfect</span>
|
|
|
|
<span class="org-matlab-cellbreak"><span class="org-comment">%% Name of the Simulink File</span></span>
|
|
mdl = <span class="org-string">'vibration_table'</span>;
|
|
|
|
<span class="org-matlab-cellbreak"><span class="org-comment">%% Input/Output definition</span></span>
|
|
clear io; io_i = 1;
|
|
io(io_i) = linio([mdl, <span class="org-string">'/F'</span>], 1, <span class="org-string">'openinput'</span>); io_i = io_i <span class="org-type">+</span> 1;
|
|
io(io_i) = linio([mdl, <span class="org-string">'/a1,a2'</span>], 1, <span class="org-string">'openoutput'</span>); io_i = io_i <span class="org-type">+</span> 1;
|
|
|
|
<span class="org-matlab-cellbreak"><span class="org-comment">%% Run the linearization</span></span>
|
|
G = linearize(mdl, io);
|
|
G.InputName = {<span class="org-string">'F'</span>};
|
|
G.OutputName = {<span class="org-string">'ax'</span>};
|
|
</pre>
|
|
</div>
|
|
|
|
<p>
|
|
Compute the resonance frequencies
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">ws = eig(G.A);
|
|
ws = ws(imag(ws) <span class="org-type">></span> 0);
|
|
</pre>
|
|
</div>
|
|
|
|
<p>
|
|
And the associated response of the optical table
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">x_mod = zeros(6, 6);
|
|
|
|
<span class="org-keyword">for</span> <span class="org-variable-name"><span class="org-constant">i</span></span> = <span class="org-constant">1:length(ws)</span>
|
|
xi = evalfr(G, ws(<span class="org-constant">i</span>));
|
|
x_mod(<span class="org-type">:</span>,<span class="org-constant">i</span>) = xi<span class="org-type">./</span>norm(xi);
|
|
<span class="org-keyword">end</span>
|
|
</pre>
|
|
</div>
|
|
|
|
<p>
|
|
The results are shown in Table <a href="#org91fd8a0">7</a>.
|
|
The motion associated to the mode shapes are just indicative.
|
|
</p>
|
|
|
|
<table id="org91fd8a0" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
|
|
<caption class="t-above"><span class="table-number">Table 7:</span> Resonance frequency and approximation of the mode shapes</caption>
|
|
|
|
<colgroup>
|
|
<col class="org-left" />
|
|
|
|
<col class="org-right" />
|
|
|
|
<col class="org-right" />
|
|
|
|
<col class="org-right" />
|
|
|
|
<col class="org-right" />
|
|
|
|
<col class="org-right" />
|
|
|
|
<col class="org-right" />
|
|
</colgroup>
|
|
<thead>
|
|
<tr>
|
|
<th scope="col" class="org-left">\(\omega_0\) [Hz]</th>
|
|
<th scope="col" class="org-right">5.6</th>
|
|
<th scope="col" class="org-right">5.6</th>
|
|
<th scope="col" class="org-right">5.7</th>
|
|
<th scope="col" class="org-right">8.2</th>
|
|
<th scope="col" class="org-right">8.2</th>
|
|
<th scope="col" class="org-right">8.2</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td class="org-left">x</td>
|
|
<td class="org-right">0.1</td>
|
|
<td class="org-right">0.7</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">0.2</td>
|
|
<td class="org-right">0.0</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left">y</td>
|
|
<td class="org-right">0.7</td>
|
|
<td class="org-right">0.1</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">0.2</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left">z</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">1.0</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">0.0</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left">Rx</td>
|
|
<td class="org-right">0.7</td>
|
|
<td class="org-right">0.1</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">0.1</td>
|
|
<td class="org-right">1.0</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left">Ry</td>
|
|
<td class="org-right">0.1</td>
|
|
<td class="org-right">0.7</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">1.0</td>
|
|
<td class="org-right">0.1</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left">Rz</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">1.0</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">0.0</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org4e5d067" class="outline-3">
|
|
<h3 id="org4e5d067"><span class="section-number-3">4.3</span> Verify transformation</h3>
|
|
<div class="outline-text-3" id="text-4-3">
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Options for Linearized</span></span>
|
|
options = linearizeOptions;
|
|
options.SampleTime = 0;
|
|
|
|
<span class="org-matlab-cellbreak"><span class="org-comment">%% Name of the Simulink File</span></span>
|
|
mdl = <span class="org-string">'vibration_table'</span>;
|
|
|
|
<span class="org-matlab-cellbreak"><span class="org-comment">%% Input/Output definition</span></span>
|
|
clear io; io_i = 1;
|
|
io(io_i) = linio([mdl, <span class="org-string">'/F'</span>], 1, <span class="org-string">'openinput'</span>); io_i = io_i <span class="org-type">+</span> 1;
|
|
io(io_i) = linio([mdl, <span class="org-string">'/acc'</span>], 1, <span class="org-string">'openoutput'</span>); io_i = io_i <span class="org-type">+</span> 1;
|
|
io(io_i) = linio([mdl, <span class="org-string">'/acc_O'</span>], 1, <span class="org-string">'openoutput'</span>); io_i = io_i <span class="org-type">+</span> 1;
|
|
|
|
<span class="org-matlab-cellbreak"><span class="org-comment">%% Run the linearization</span></span>
|
|
G = linearize(mdl, io, 0.0, options);
|
|
G.InputName = {<span class="org-string">'F'</span>};
|
|
G.OutputName = {<span class="org-string">'a1'</span>, <span class="org-string">'a2'</span>, <span class="org-string">'a3'</span>, <span class="org-string">'a4'</span>, <span class="org-string">'a5'</span>, <span class="org-string">'a6'</span>, ...
|
|
<span class="org-string">'Dx'</span>, <span class="org-string">'Dy'</span>, <span class="org-string">'Dz'</span>, <span class="org-string">'Rx'</span>, <span class="org-string">'Ry'</span>, <span class="org-string">'Rz'</span>};
|
|
</pre>
|
|
</div>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">G_acc = inv(M)<span class="org-type">*</span>G(1<span class="org-type">:</span>6, 1);
|
|
G_id = G(7<span class="org-type">:</span>12, 1);
|
|
</pre>
|
|
</div>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">bodeFig({G_acc(1), G_id(1)})
|
|
bodeFig({G_acc(2), G_id(2)})
|
|
bodeFig({G_acc(3), G_id(3)})
|
|
bodeFig({G_acc(4), G_id(4)})
|
|
bodeFig({G_acc(5), G_id(5)})
|
|
bodeFig({G_acc(6), G_id(6)})
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org1de5c6f" class="outline-2">
|
|
<h2 id="org1de5c6f"><span class="section-number-2">5</span> Nano-Hexapod</h2>
|
|
<div class="outline-text-2" id="text-5">
|
|
<p>
|
|
<a id="org5dd7cf7"></a>
|
|
</p>
|
|
<p>
|
|
A configuration is added to be able to put the nano-hexapod on top of the vibration table as shown in Figure <a href="#org87b5d8c">4</a>.
|
|
</p>
|
|
|
|
|
|
<div id="orgb06a61f" class="figure">
|
|
<p><img src="figs/vibration_table_nano_hexapod_simscape.png" alt="vibration_table_nano_hexapod_simscape.png" />
|
|
</p>
|
|
<p><span class="figure-number">Figure 5: </span>3D representation of the simscape model with the nano-hexapod</p>
|
|
</div>
|
|
|
|
<p>
|
|
The nano-hexapod’s simscape model is taken from another <a href="https://git.tdehaeze.xyz/tdehaeze/nass-simscape">git repository</a>.
|
|
</p>
|
|
</div>
|
|
<div id="outline-container-org61a310d" class="outline-3">
|
|
<h3 id="org61a310d"><span class="section-number-3">5.1</span> Nano-Hexapod</h3>
|
|
<div class="outline-text-3" id="text-5-1">
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">n_hexapod = initializeNanoHexapodFinal(<span class="org-string">'flex_bot_type'</span>, <span class="org-string">'4dof'</span>, ...
|
|
<span class="org-string">'flex_top_type'</span>, <span class="org-string">'3dof'</span>, ...
|
|
<span class="org-string">'motion_sensor_type'</span>, <span class="org-string">'struts'</span>, ...
|
|
<span class="org-string">'actuator_type'</span>, <span class="org-string">'2dof'</span>);
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org853c5a3" class="outline-3">
|
|
<h3 id="org853c5a3"><span class="section-number-3">5.2</span> Computation of the transmissibility from accelerometer data</h3>
|
|
<div class="outline-text-3" id="text-5-2">
|
|
<p>
|
|
The goal is to compute the \(6 \times 6\) transfer function matrix corresponding to the transmissibility of the Nano-Hexapod.
|
|
</p>
|
|
|
|
<p>
|
|
To do so, several accelerometers are located both on the vibration table and on the top of the nano-hexapod.
|
|
</p>
|
|
|
|
<p>
|
|
The vibration table is then excited using a Shaker and all the accelerometers signals are recorded.
|
|
</p>
|
|
|
|
<p>
|
|
Using transformation (jacobian) matrices, it is then possible to compute both the motion of the top and bottom platform of the nano-hexapod.
|
|
</p>
|
|
|
|
<p>
|
|
Finally, it is possible to compute the \(6 \times 6\) transmissibility matrix.
|
|
</p>
|
|
|
|
<p>
|
|
Such procedure is explained in (<a href="#citeproc_bib_item_1">Marneffe and André 2004</a>).
|
|
</p>
|
|
</div>
|
|
|
|
<div id="outline-container-org7875585" class="outline-4">
|
|
<h4 id="org7875585"><span class="section-number-4">5.2.1</span> Jacobian matrices</h4>
|
|
<div class="outline-text-4" id="text-5-2-1">
|
|
<p>
|
|
How to compute the Jacobian matrices is explained in Section <a href="#org484532e">3</a>.
|
|
</p>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Bottom Accelerometers</span></span>
|
|
Opb = [<span class="org-type">-</span>0.1875, <span class="org-type">-</span>0.1875, <span class="org-type">-</span>0.245;
|
|
<span class="org-type">-</span>0.1875, <span class="org-type">-</span>0.1875, <span class="org-type">-</span>0.245;
|
|
0.1875, <span class="org-type">-</span>0.1875, <span class="org-type">-</span>0.245;
|
|
0.1875, <span class="org-type">-</span>0.1875, <span class="org-type">-</span>0.245;
|
|
0.1875, 0.1875, <span class="org-type">-</span>0.245;
|
|
0.1875, 0.1875, <span class="org-type">-</span>0.245]<span class="org-type">'</span>;
|
|
|
|
Osb = [0, 1, 0;
|
|
0, 0, 1;
|
|
1, 0, 0;
|
|
0, 0, 1;
|
|
1, 0, 0;
|
|
0, 0, 1;]<span class="org-type">'</span>;
|
|
|
|
Jb = zeros(length(Opb), 6);
|
|
|
|
<span class="org-keyword">for</span> <span class="org-variable-name"><span class="org-constant">i</span></span> = <span class="org-constant">1:length(Opb)</span>
|
|
Ri = [0, Opb(3,<span class="org-constant">i</span>), <span class="org-type">-</span>Opb(2,<span class="org-constant">i</span>);
|
|
<span class="org-type">-</span>Opb(3,<span class="org-constant">i</span>), 0, Opb(1,<span class="org-constant">i</span>);
|
|
Opb(2,<span class="org-constant">i</span>), <span class="org-type">-</span>Opb(1,<span class="org-constant">i</span>), 0];
|
|
Jb(<span class="org-constant">i</span>, 1<span class="org-type">:</span>3) = Osb(<span class="org-type">:</span>,<span class="org-constant">i</span>)<span class="org-type">'</span>;
|
|
Jb(<span class="org-constant">i</span>, 4<span class="org-type">:</span>6) = Osb(<span class="org-type">:</span>,<span class="org-constant">i</span>)<span class="org-type">'*</span>Ri;
|
|
<span class="org-keyword">end</span>
|
|
|
|
Jbinv = inv(Jb);
|
|
</pre>
|
|
</div>
|
|
|
|
<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
|
|
|
|
|
|
<colgroup>
|
|
<col class="org-left" />
|
|
|
|
<col class="org-right" />
|
|
|
|
<col class="org-right" />
|
|
|
|
<col class="org-right" />
|
|
|
|
<col class="org-right" />
|
|
|
|
<col class="org-right" />
|
|
|
|
<col class="org-right" />
|
|
</colgroup>
|
|
<thead>
|
|
<tr>
|
|
<th scope="col" class="org-left"> </th>
|
|
<th scope="col" class="org-right">\(a_1\)</th>
|
|
<th scope="col" class="org-right">\(a_2\)</th>
|
|
<th scope="col" class="org-right">\(a_3\)</th>
|
|
<th scope="col" class="org-right">\(a_4\)</th>
|
|
<th scope="col" class="org-right">\(a_5\)</th>
|
|
<th scope="col" class="org-right">\(a_6\)</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td class="org-left">\(\dot{x}_x\)</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">0.7</td>
|
|
<td class="org-right">0.5</td>
|
|
<td class="org-right">-0.7</td>
|
|
<td class="org-right">0.5</td>
|
|
<td class="org-right">0.0</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left">\(\dot{x}_y\)</td>
|
|
<td class="org-right">1.0</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">0.5</td>
|
|
<td class="org-right">0.7</td>
|
|
<td class="org-right">-0.5</td>
|
|
<td class="org-right">-0.7</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left">\(\dot{x}_z\)</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">0.5</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">0.5</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left">\(\dot{\omega}_x\)</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">-2.7</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">2.7</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left">\(\dot{\omega}_y\)</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">2.7</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">-2.7</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">0.0</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left">\(\dot{\omega}_z\)</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">2.7</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">-2.7</td>
|
|
<td class="org-right">0.0</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Top Accelerometers</span></span>
|
|
Opt = [<span class="org-type">-</span>0.1, 0, <span class="org-type">-</span>0.150;
|
|
<span class="org-type">-</span>0.1, 0, <span class="org-type">-</span>0.150;
|
|
0.05, 0.075, <span class="org-type">-</span>0.150;
|
|
0.05, 0.075, <span class="org-type">-</span>0.150;
|
|
0.05, <span class="org-type">-</span>0.075, <span class="org-type">-</span>0.150;
|
|
0.05, <span class="org-type">-</span>0.075, <span class="org-type">-</span>0.150]<span class="org-type">'</span>;
|
|
|
|
Ost = [0, 1, 0;
|
|
0, 0, 1;
|
|
1, 0, 0;
|
|
0, 0, 1;
|
|
1, 0, 0;
|
|
0, 0, 1;]<span class="org-type">'</span>;
|
|
|
|
Jt = zeros(length(Opt), 6);
|
|
|
|
<span class="org-keyword">for</span> <span class="org-variable-name"><span class="org-constant">i</span></span> = <span class="org-constant">1:length(Opt)</span>
|
|
Ri = [0, Opt(3,<span class="org-constant">i</span>), <span class="org-type">-</span>Opt(2,<span class="org-constant">i</span>);
|
|
<span class="org-type">-</span>Opt(3,<span class="org-constant">i</span>), 0, Opt(1,<span class="org-constant">i</span>);
|
|
Opt(2,<span class="org-constant">i</span>), <span class="org-type">-</span>Opt(1,<span class="org-constant">i</span>), 0];
|
|
Jt(<span class="org-constant">i</span>, 1<span class="org-type">:</span>3) = Ost(<span class="org-type">:</span>,<span class="org-constant">i</span>)<span class="org-type">'</span>;
|
|
Jt(<span class="org-constant">i</span>, 4<span class="org-type">:</span>6) = Ost(<span class="org-type">:</span>,<span class="org-constant">i</span>)<span class="org-type">'*</span>Ri;
|
|
<span class="org-keyword">end</span>
|
|
|
|
Jtinv = inv(Jt);
|
|
</pre>
|
|
</div>
|
|
|
|
<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
|
|
|
|
|
|
<colgroup>
|
|
<col class="org-left" />
|
|
|
|
<col class="org-right" />
|
|
|
|
<col class="org-right" />
|
|
|
|
<col class="org-right" />
|
|
|
|
<col class="org-right" />
|
|
|
|
<col class="org-right" />
|
|
|
|
<col class="org-right" />
|
|
</colgroup>
|
|
<thead>
|
|
<tr>
|
|
<th scope="col" class="org-left"> </th>
|
|
<th scope="col" class="org-right">\(b_1\)</th>
|
|
<th scope="col" class="org-right">\(b_2\)</th>
|
|
<th scope="col" class="org-right">\(b_3\)</th>
|
|
<th scope="col" class="org-right">\(b_4\)</th>
|
|
<th scope="col" class="org-right">\(b_5\)</th>
|
|
<th scope="col" class="org-right">\(b_6\)</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td class="org-left">\(\dot{x}_x\)</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">1.0</td>
|
|
<td class="org-right">0.5</td>
|
|
<td class="org-right">-0.5</td>
|
|
<td class="org-right">0.5</td>
|
|
<td class="org-right">-0.5</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left">\(\dot{x}_y\)</td>
|
|
<td class="org-right">1.0</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">-0.7</td>
|
|
<td class="org-right">-1.0</td>
|
|
<td class="org-right">0.7</td>
|
|
<td class="org-right">1.0</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left">\(\dot{x}_z\)</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">0.3</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">0.3</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">0.3</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left">\(\dot{\omega}_x\)</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">6.7</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">-6.7</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left">\(\dot{\omega}_y\)</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">6.7</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">-3.3</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">-3.3</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left">\(\dot{\omega}_z\)</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">-6.7</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">6.7</td>
|
|
<td class="org-right">0.0</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org1035e82" class="outline-4">
|
|
<h4 id="org1035e82"><span class="section-number-4">5.2.2</span> Using <code>linearize</code> function</h4>
|
|
<div class="outline-text-4" id="text-5-2-2">
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">acc_3d.type = 2; <span class="org-comment">% 1: inertial mass, 2: perfect</span>
|
|
|
|
<span class="org-matlab-cellbreak"><span class="org-comment">%% Name of the Simulink File</span></span>
|
|
mdl = <span class="org-string">'vibration_table'</span>;
|
|
|
|
<span class="org-matlab-cellbreak"><span class="org-comment">%% Input/Output definition</span></span>
|
|
clear io; io_i = 1;
|
|
io(io_i) = linio([mdl, <span class="org-string">'/F_shaker'</span>], 1, <span class="org-string">'openinput'</span>); io_i = io_i <span class="org-type">+</span> 1;
|
|
io(io_i) = linio([mdl, <span class="org-string">'/acc'</span>], 1, <span class="org-string">'openoutput'</span>); io_i = io_i <span class="org-type">+</span> 1;
|
|
io(io_i) = linio([mdl, <span class="org-string">'/acc_top'</span>], 1, <span class="org-string">'openoutput'</span>); io_i = io_i <span class="org-type">+</span> 1;
|
|
|
|
<span class="org-matlab-cellbreak"><span class="org-comment">%% Run the linearization</span></span>
|
|
G = linearize(mdl, io);
|
|
G.InputName = {<span class="org-string">'F1'</span>, <span class="org-string">'F2'</span>, <span class="org-string">'F3'</span>, <span class="org-string">'F4'</span>, <span class="org-string">'F5'</span>, <span class="org-string">'F6'</span>};
|
|
G.OutputName = {<span class="org-string">'a1'</span>, <span class="org-string">'a2'</span>, <span class="org-string">'a3'</span>, <span class="org-string">'a4'</span>, <span class="org-string">'a5'</span>, <span class="org-string">'a6'</span>, ...
|
|
<span class="org-string">'b1'</span>, <span class="org-string">'b2'</span>, <span class="org-string">'b3'</span>, <span class="org-string">'b4'</span>, <span class="org-string">'b5'</span>, <span class="org-string">'b6'</span>};
|
|
</pre>
|
|
</div>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">Gb = Jbinv<span class="org-type">*</span>G({<span class="org-string">'a1'</span>, <span class="org-string">'a2'</span>, <span class="org-string">'a3'</span>, <span class="org-string">'a4'</span>, <span class="org-string">'a5'</span>, <span class="org-string">'a6'</span>}, <span class="org-type">:</span>);
|
|
Gt = Jtinv<span class="org-type">*</span>G({<span class="org-string">'b1'</span>, <span class="org-string">'b2'</span>, <span class="org-string">'b3'</span>, <span class="org-string">'b4'</span>, <span class="org-string">'b5'</span>, <span class="org-string">'b6'</span>}, <span class="org-type">:</span>);
|
|
</pre>
|
|
</div>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">T = inv(Gb)<span class="org-type">*</span>Gt;
|
|
T = minreal(T);
|
|
T = prescale(T, {2<span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">*</span>0.1, 2<span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">*</span>1e3});
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-orgb5673c5" class="outline-3">
|
|
<h3 id="orgb5673c5"><span class="section-number-3">5.3</span> Comparison with “true” transmissibility</h3>
|
|
<div class="outline-text-3" id="text-5-3">
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Name of the Simulink File</span></span>
|
|
mdl = <span class="org-string">'test_transmissibility'</span>;
|
|
|
|
<span class="org-matlab-cellbreak"><span class="org-comment">%% Input/Output definition</span></span>
|
|
clear io; io_i = 1;
|
|
io(io_i) = linio([mdl, <span class="org-string">'/d'</span>], 1, <span class="org-string">'openinput'</span>); io_i = io_i <span class="org-type">+</span> 1;
|
|
io(io_i) = linio([mdl, <span class="org-string">'/acc'</span>], 1, <span class="org-string">'openoutput'</span>); io_i = io_i <span class="org-type">+</span> 1;
|
|
|
|
<span class="org-matlab-cellbreak"><span class="org-comment">%% Run the linearization</span></span>
|
|
G = linearize(mdl, io);
|
|
G.InputName = {<span class="org-string">'Dx'</span>, <span class="org-string">'Dy'</span>, <span class="org-string">'Dz'</span>, <span class="org-string">'Rx'</span>, <span class="org-string">'Ry'</span>, <span class="org-string">'Rz'</span>};
|
|
G.OutputName = {<span class="org-string">'Ax'</span>, <span class="org-string">'Ay'</span>, <span class="org-string">'Az'</span>, <span class="org-string">'Bx'</span>, <span class="org-string">'By'</span>, <span class="org-string">'Bz'</span>};
|
|
</pre>
|
|
</div>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">Tp = G<span class="org-type">/</span>s<span class="org-type">^</span>2;
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org1997df3" class="outline-2">
|
|
<h2 id="org1997df3"><span class="section-number-2">6</span> Identification of the table’s dynamics</h2>
|
|
<div class="outline-text-2" id="text-6">
|
|
<p>
|
|
<a id="orgb02308b"></a>
|
|
</p>
|
|
</div>
|
|
<div id="outline-container-org0c04ac3" class="outline-3">
|
|
<h3 id="org0c04ac3"><span class="section-number-3">6.1</span> Mode Shapes</h3>
|
|
<div class="outline-text-3" id="text-6-1">
|
|
<table id="orgd6b24a5" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
|
|
<caption class="t-above"><span class="table-number">Table 8:</span> List of the identified modes</caption>
|
|
|
|
<colgroup>
|
|
<col class="org-right" />
|
|
|
|
<col class="org-right" />
|
|
|
|
<col class="org-left" />
|
|
</colgroup>
|
|
<thead>
|
|
<tr>
|
|
<th scope="col" class="org-right"> </th>
|
|
<th scope="col" class="org-right">Freq. [Hz]</th>
|
|
<th scope="col" class="org-left">Description</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td class="org-right">1</td>
|
|
<td class="org-right">1.3</td>
|
|
<td class="org-left">X-translation</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-right">2</td>
|
|
<td class="org-right">1.3</td>
|
|
<td class="org-left">Y-translation</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-right">3</td>
|
|
<td class="org-right">1.95</td>
|
|
<td class="org-left">Z-rotation</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-right">4</td>
|
|
<td class="org-right">6.85</td>
|
|
<td class="org-left">Z-translation</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-right">5</td>
|
|
<td class="org-right">8.9</td>
|
|
<td class="org-left">Tilt</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-right">6</td>
|
|
<td class="org-right">8.9</td>
|
|
<td class="org-left">Tilt</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-right">7</td>
|
|
<td class="org-right">700</td>
|
|
<td class="org-left">Flexible Mode</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
|
|
<div id="org79e2598" class="figure">
|
|
<p><img src="figs/mode_shapes_rigid_table.gif" alt="mode_shapes_rigid_table.gif" />
|
|
</p>
|
|
<p><span class="figure-number">Figure 6: </span>Mode shapes of the 6 suspension modes (from 1Hz to 9Hz)</p>
|
|
</div>
|
|
|
|
|
|
<div id="orgc93358f" class="figure">
|
|
<p><img src="figs/ModeShapeHF1_crop.gif" alt="ModeShapeHF1_crop.gif" />
|
|
</p>
|
|
<p><span class="figure-number">Figure 7: </span>First flexible mode of the table at 700Hz</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<style>.csl-entry{text-indent: -1.5em; margin-left: 1.5em;}</style><h2 class='citeproc-org-bib-h2'>Bibliography</h2>
|
|
<div class="csl-bib-body">
|
|
<div class="csl-entry"><a name="citeproc_bib_item_1"></a>Marneffe, Bruno, and Preumont André. 2004. “A Novel Design of Stewart Platform for Active Vibration Isolator.” ULB.</div>
|
|
</div>
|
|
</div>
|
|
<div id="postamble" class="status">
|
|
<p class="author">Author: Dehaeze Thomas</p>
|
|
<p class="date">Created: 2021-06-14 lun. 18:49</p>
|
|
</div>
|
|
</body>
|
|
</html>
|