1308 lines
43 KiB
HTML
1308 lines
43 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-19 lun. 16:33 -->
|
|
<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="#orgd96939c">1. Introduction</a></li>
|
|
<li><a href="#org8f2a9d3">2. Experimental Setup</a>
|
|
<ul>
|
|
<li><a href="#orgf60715e">2.1. CAD Model</a></li>
|
|
<li><a href="#org0740e89">2.2. Instrumentation</a></li>
|
|
<li><a href="#orgfae411d">2.3. Suspended table</a></li>
|
|
<li><a href="#org56dc68e">2.4. Inertial Sensors</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#org7c42c7b">3. Compute the 6DoF solid body motion from several inertial sensors</a>
|
|
<ul>
|
|
<li><a href="#orgb354999">3.1. Define accelerometers positions/orientations</a></li>
|
|
<li><a href="#org162ae73">3.2. Transformation matrix from motion of the solid body to accelerometer measurements</a></li>
|
|
<li><a href="#orgb865df3">3.3. Compute the transformation matrix from accelerometer measurement to motion of the solid body</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#orgfff4a19">4. Simscape Model</a>
|
|
<ul>
|
|
<li><a href="#orgd1b8332">4.1. Simscape Sub-systems</a>
|
|
<ul>
|
|
<li><a href="#org25263d5">4.1.1. Springs</a></li>
|
|
<li><a href="#org8fbfccb">4.1.2. Inertial Shaker (IS20)</a></li>
|
|
<li><a href="#org778a701">4.1.3. 3D accelerometer (356B18)</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#orgab1e576">4.2. Identification</a>
|
|
<ul>
|
|
<li><a href="#org356f48c">4.2.1. Number of states</a></li>
|
|
<li><a href="#org11eb355">4.2.2. Resonance frequencies and mode shapes</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#org337cc72">4.3. Verify transformation</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#org75a0e2e">5. Nano-Hexapod</a></li>
|
|
<li><a href="#orge8fad0c">6. Identification of the table’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-orgd96939c" class="outline-2">
|
|
<h2 id="orgd96939c"><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="#org2abcf65">2</a>: the experimental setup and all the instrumentation are described</li>
|
|
<li>Section <a href="#orge226c57">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="#orga8d4a3c">4</a>: a Simscape model of the vibration table is developed</li>
|
|
<li>Section <a href="#org21d6634">6</a>: the table dynamics is identified and compared with the Simscape model</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org8f2a9d3" class="outline-2">
|
|
<h2 id="org8f2a9d3"><span class="section-number-2">2</span> Experimental Setup</h2>
|
|
<div class="outline-text-2" id="text-2">
|
|
<p>
|
|
<a id="org2abcf65"></a>
|
|
</p>
|
|
</div>
|
|
<div id="outline-container-orgf60715e" class="outline-3">
|
|
<h3 id="orgf60715e"><span class="section-number-3">2.1</span> CAD Model</h3>
|
|
<div class="outline-text-3" id="text-2-1">
|
|
|
|
<div id="org36d3c3b" 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-org0740e89" class="outline-3">
|
|
<h3 id="org0740e89"><span class="section-number-3">2.2</span> Instrumentation</h3>
|
|
<div class="outline-text-3" id="text-2-2">
|
|
<div class="note" id="orga53b0fe">
|
|
<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-orgfae411d" class="outline-3">
|
|
<h3 id="orgfae411d"><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="org37d8d17" 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-org56dc68e" class="outline-3">
|
|
<h3 id="org56dc68e"><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-org7c42c7b" class="outline-2">
|
|
<h2 id="org7c42c7b"><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="orge226c57"></a>
|
|
</p>
|
|
<p>
|
|
Let’s consider a solid body with several accelerometers attached to it (Figure <a href="#org7cea217">3</a>).
|
|
</p>
|
|
|
|
|
|
<div id="org7cea217" 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="#orgda5223d">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="#org01e9572">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="#org8cbcf02">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-orgb354999" class="outline-3">
|
|
<h3 id="orgb354999"><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="orgda5223d"></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="#org9069f15">1</a>.
|
|
</p>
|
|
|
|
<table id="org9069f15" 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, 0, 1;]<span class="org-type">'</span>;
|
|
</pre>
|
|
</div>
|
|
|
|
<p>
|
|
They are summarized in Table <a href="#org2f05f69">2</a>.
|
|
</p>
|
|
|
|
<table id="org2f05f69" 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-org162ae73" class="outline-3">
|
|
<h3 id="org162ae73"><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="org01e9572"></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="org9083ed5">
|
|
<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="#org7dd170d">3</a>.
|
|
</p>
|
|
|
|
<table id="org7dd170d" 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-orgb865df3" class="outline-3">
|
|
<h3 id="orgb865df3"><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="org8cbcf02"></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="#org8a443b4">4</a>.
|
|
</p>
|
|
|
|
<table id="org8a443b4" 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-orgfff4a19" class="outline-2">
|
|
<h2 id="orgfff4a19"><span class="section-number-2">4</span> Simscape Model</h2>
|
|
<div class="outline-text-2" id="text-4">
|
|
<p>
|
|
<a id="orga8d4a3c"></a>
|
|
</p>
|
|
<p>
|
|
In this section, the Simscape model of the vibration table is described.
|
|
</p>
|
|
|
|
|
|
<div id="org2ecfaca" 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-orgd1b8332" class="outline-3">
|
|
<h3 id="orgd1b8332"><span class="section-number-3">4.1</span> Simscape Sub-systems</h3>
|
|
<div class="outline-text-3" id="text-4-1">
|
|
<p>
|
|
<a id="org39306c3"></a>
|
|
</p>
|
|
|
|
<p>
|
|
Parameters for sub-components of the simscape model are defined below.
|
|
</p>
|
|
</div>
|
|
|
|
<div id="outline-container-org25263d5" class="outline-4">
|
|
<h4 id="org25263d5"><span class="section-number-4">4.1.1</span> Springs</h4>
|
|
<div class="outline-text-4" id="text-4-1-1">
|
|
<p>
|
|
<a id="orgee18182"></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-org8fbfccb" class="outline-4">
|
|
<h4 id="org8fbfccb"><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="org4592c5e"></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="orgec31de6" 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="#orgec31de6">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-org778a701" class="outline-4">
|
|
<h4 id="org778a701"><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="orgdc35834"></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="org64105ec" 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-orgab1e576" class="outline-3">
|
|
<h3 id="orgab1e576"><span class="section-number-3">4.2</span> Identification</h3>
|
|
<div class="outline-text-3" id="text-4-2">
|
|
<p>
|
|
<a id="org350a100"></a>
|
|
</p>
|
|
</div>
|
|
|
|
<div id="outline-container-org356f48c" class="outline-4">
|
|
<h4 id="org356f48c"><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-org11eb355" class="outline-4">
|
|
<h4 id="org11eb355"><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">'/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">></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="#org909caf2">7</a>.
|
|
The motion associated to the mode shapes are just indicative.
|
|
</p>
|
|
|
|
<table id="org909caf2" 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-org337cc72" class="outline-3">
|
|
<h3 id="org337cc72"><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-org75a0e2e" class="outline-2">
|
|
<h2 id="org75a0e2e"><span class="section-number-2">5</span> Nano-Hexapod</h2>
|
|
<div class="outline-text-2" id="text-5">
|
|
<p>
|
|
<a id="orga1006b8"></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="#org2ecfaca">4</a>.
|
|
</p>
|
|
|
|
|
|
<div id="org4d16b70" 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>
|
|
|
|
<div id="outline-container-orge8fad0c" class="outline-2">
|
|
<h2 id="orge8fad0c"><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="org21d6634"></a>
|
|
</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div id="postamble" class="status">
|
|
<p class="author">Author: Dehaeze Thomas</p>
|
|
<p class="date">Created: 2021-04-19 lun. 16:33</p>
|
|
</div>
|
|
</body>
|
|
</html>
|