vibration-table/vibration-table.html

1276 lines
42 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-04-16 ven. 18:28 -->
<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="#org2fecce4">1. Introduction</a></li>
<li><a href="#orga939dcb">2. Experimental Setup</a>
<ul>
<li><a href="#org7491bb1">2.1. CAD Model</a></li>
<li><a href="#orgf462a56">2.2. Instrumentation</a></li>
<li><a href="#orgfb87c68">2.3. Suspended table</a></li>
<li><a href="#org5f360e2">2.4. Inertial Sensors</a></li>
</ul>
</li>
<li><a href="#orgcd95d84">3. Compute the 6DoF solid body motion from several inertial sensors</a>
<ul>
<li><a href="#org55b742b">3.1. Define accelerometers positions/orientations</a></li>
<li><a href="#org6a41e77">3.2. Transformation matrix from motion of the solid body to accelerometer measurements</a></li>
<li><a href="#org7548678">3.3. Compute the transformation matrix from accelerometer measurement to motion of the solid body</a></li>
</ul>
</li>
<li><a href="#org568ec42">4. Simscape Model</a>
<ul>
<li><a href="#org9dcca59">4.1. Simscape Sub-systems</a>
<ul>
<li><a href="#org5983163">4.1.1. Springs</a></li>
<li><a href="#orgda4ce0a">4.1.2. Inertial Shaker (IS20)</a></li>
<li><a href="#org3ec68ec">4.1.3. 3D accelerometer (356B18)</a></li>
</ul>
</li>
<li><a href="#org03afc98">4.2. Identification</a>
<ul>
<li><a href="#org7eaac5b">4.2.1. Number of states</a></li>
<li><a href="#org553cc8c">4.2.2. Resonance frequencies and mode shapes</a></li>
</ul>
</li>
<li><a href="#org4c51a63">4.3. Verify transformation</a></li>
</ul>
</li>
<li><a href="#org630e0e9">5. Identification of the table&rsquo;s dynamics</a></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-org2fecce4" class="outline-2">
<h2 id="org2fecce4"><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="#orga82ad00">2</a>: the experimental setup and all the instrumentation are described</li>
<li>Section <a href="#org37dfa0b">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="#orgc494ecb">4</a>: a Simscape model of the vibration table is developed</li>
<li>Section <a href="#org275ad8b">5</a>: the table dynamics is identified and compared with the Simscape model</li>
</ul>
</div>
</div>
<div id="outline-container-orga939dcb" class="outline-2">
<h2 id="orga939dcb"><span class="section-number-2">2</span> Experimental Setup</h2>
<div class="outline-text-2" id="text-2">
<p>
<a id="orga82ad00"></a>
</p>
</div>
<div id="outline-container-org7491bb1" class="outline-3">
<h3 id="org7491bb1"><span class="section-number-3">2.1</span> CAD Model</h3>
<div class="outline-text-3" id="text-2-1">
<div id="org3881e63" 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-orgf462a56" class="outline-3">
<h3 id="orgf462a56"><span class="section-number-3">2.2</span> Instrumentation</h3>
<div class="outline-text-3" id="text-2-2">
<div class="note" id="org198ea81">
<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-orgfb87c68" class="outline-3">
<h3 id="orgfb87c68"><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="orga1448eb" 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>
</div>
</div>
<div id="outline-container-org5f360e2" class="outline-3">
<h3 id="org5f360e2"><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-orgcd95d84" class="outline-2">
<h2 id="orgcd95d84"><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="org37dfa0b"></a>
</p>
<p>
Let&rsquo;s consider a solid body with several accelerometers attached to it (Figure <a href="#orgdf3ed42">3</a>).
</p>
<div id="orgdf3ed42" 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="#org0c6bf9c">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="#org2d30f57">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="#orgf420152">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-org55b742b" class="outline-3">
<h3 id="org55b742b"><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="org0c6bf9c"></a>
Let&rsquo;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="#org36e16bb">1</a>.
</p>
<table id="org36e16bb" 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">&#xa0;</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, 0, 1;]<span class="org-type">'</span>;
</pre>
</div>
<p>
They are summarized in Table <a href="#org33ec6f3">2</a>.
</p>
<table id="org33ec6f3" 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">&#xa0;</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-org6a41e77" class="outline-3">
<h3 id="org6a41e77"><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="org2d30f57"></a>
</p>
<p>
Let&rsquo;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="org1060d47">
<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&rsquo;th accelerometer expressed in frame \(\{O\}\) and \(P_{i,[\times]}\) the skew-symmetric matrix representing the cross product of the position of the i&rsquo;th accelerometer expressed in frame \(\{O\}\).
</p>
</div>
<p>
Let&rsquo;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="#org5d00f9c">3</a>.
</p>
<table id="org5d00f9c" 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">&#xa0;</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-org7548678" class="outline-3">
<h3 id="org7548678"><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="orgf420152"></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="#org322aa13">4</a>.
</p>
<table id="org322aa13" 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">&#xa0;</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-org568ec42" class="outline-2">
<h2 id="org568ec42"><span class="section-number-2">4</span> Simscape Model</h2>
<div class="outline-text-2" id="text-4">
<p>
<a id="orgc494ecb"></a>
</p>
<p>
In this section, the Simscape model of the vibration table is described.
</p>
<div id="org1d7efeb" 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-org9dcca59" class="outline-3">
<h3 id="org9dcca59"><span class="section-number-3">4.1</span> Simscape Sub-systems</h3>
<div class="outline-text-3" id="text-4-1">
<p>
<a id="org69420ab"></a>
</p>
<p>
Parameters for sub-components of the simscape model are defined below.
</p>
</div>
<div id="outline-container-org5983163" class="outline-4">
<h4 id="org5983163"><span class="section-number-4">4.1.1</span> Springs</h4>
<div class="outline-text-4" id="text-4-1-1">
<p>
<a id="org7d51a21"></a>
</p>
<p>
The 4 springs supporting the suspended optical table are modelled with &ldquo;bushing joints&rdquo; 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>
</div>
</div>
<div id="outline-container-orgda4ce0a" class="outline-4">
<h4 id="orgda4ce0a"><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="org64d06b0"></a>
</p>
<p>
The inertial shaker is defined as two solid bodies:
</p>
<ul class="org-ul">
<li>the &ldquo;housing&rdquo; that is fixed to the element that we want to excite</li>
<li>the &ldquo;inertial mass&rdquo; 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 &ldquo;reacting&rdquo; force on the support is then used as an excitation.
</p>
<table id="org13c1e94" 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="#org13c1e94">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-org3ec68ec" class="outline-4">
<h4 id="org3ec68ec"><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="org55e06a7"></a>
</p>
<p>
An accelerometer consists of 2 solids:
</p>
<ul class="org-ul">
<li>a &ldquo;housing&rdquo; rigidly fixed to the measured body</li>
<li>an &ldquo;inertial mass&rdquo; 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="orgc0a070c" 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">&gt; 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 &ldquo;transform sensors&rdquo; 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-org03afc98" class="outline-3">
<h3 id="org03afc98"><span class="section-number-3">4.2</span> Identification</h3>
<div class="outline-text-3" id="text-4-2">
<p>
<a id="org089a338"></a>
</p>
</div>
<div id="outline-container-org7eaac5b" class="outline-4">
<h4 id="org7eaac5b"><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&rsquo;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&rsquo;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-org553cc8c" class="outline-4">
<h4 id="org553cc8c"><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&rsquo;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">'/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);
G.InputName = {<span class="org-string">'F'</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">'wx'</span>, <span class="org-string">'wy'</span>, <span class="org-string">'wz'</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">&gt;</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="#orgfc9b1dd">7</a>.
The motion associated to the mode shapes are just indicative.
</p>
<table id="orgfc9b1dd" 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-org4c51a63" class="outline-3">
<h3 id="org4c51a63"><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">'/Absolute_Accelerometer'</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-org630e0e9" class="outline-2">
<h2 id="org630e0e9"><span class="section-number-2">5</span> Identification of the table&rsquo;s dynamics</h2>
<div class="outline-text-2" id="text-5">
<p>
<a id="org275ad8b"></a>
</p>
</div>
</div>
</div>
<div id="postamble" class="status">
<p class="author">Author: Dehaeze Thomas</p>
<p class="date">Created: 2021-04-16 ven. 18:28</p>
</div>
</body>
</html>