785 lines
59 KiB
HTML
785 lines
59 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>
|
||
|
<!-- 2019-07-05 ven. 10:16 -->
|
||
|
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
|
||
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||
|
<title>Modal Analysis - Processing of FRF</title>
|
||
|
<meta name="generator" content="Org mode" />
|
||
|
<meta name="author" content="Dehaeze Thomas" />
|
||
|
<style type="text/css">
|
||
|
<!--/*--><![CDATA[/*><!--*/
|
||
|
.title { text-align: center;
|
||
|
margin-bottom: .2em; }
|
||
|
.subtitle { text-align: center;
|
||
|
font-size: medium;
|
||
|
font-weight: bold;
|
||
|
margin-top:0; }
|
||
|
.todo { font-family: monospace; color: red; }
|
||
|
.done { font-family: monospace; color: green; }
|
||
|
.priority { font-family: monospace; color: orange; }
|
||
|
.tag { background-color: #eee; font-family: monospace;
|
||
|
padding: 2px; font-size: 80%; font-weight: normal; }
|
||
|
.timestamp { color: #bebebe; }
|
||
|
.timestamp-kwd { color: #5f9ea0; }
|
||
|
.org-right { margin-left: auto; margin-right: 0px; text-align: right; }
|
||
|
.org-left { margin-left: 0px; margin-right: auto; text-align: left; }
|
||
|
.org-center { margin-left: auto; margin-right: auto; text-align: center; }
|
||
|
.underline { text-decoration: underline; }
|
||
|
#postamble p, #preamble p { font-size: 90%; margin: .2em; }
|
||
|
p.verse { margin-left: 3%; }
|
||
|
pre {
|
||
|
border: 1px solid #ccc;
|
||
|
box-shadow: 3px 3px 3px #eee;
|
||
|
padding: 8pt;
|
||
|
font-family: monospace;
|
||
|
overflow: auto;
|
||
|
margin: 1.2em;
|
||
|
}
|
||
|
pre.src {
|
||
|
position: relative;
|
||
|
overflow: visible;
|
||
|
padding-top: 1.2em;
|
||
|
}
|
||
|
pre.src:before {
|
||
|
display: none;
|
||
|
position: absolute;
|
||
|
background-color: white;
|
||
|
top: -10px;
|
||
|
right: 10px;
|
||
|
padding: 3px;
|
||
|
border: 1px solid black;
|
||
|
}
|
||
|
pre.src:hover:before { display: inline;}
|
||
|
/* Languages per Org manual */
|
||
|
pre.src-asymptote:before { content: 'Asymptote'; }
|
||
|
pre.src-awk:before { content: 'Awk'; }
|
||
|
pre.src-C:before { content: 'C'; }
|
||
|
/* pre.src-C++ doesn't work in CSS */
|
||
|
pre.src-clojure:before { content: 'Clojure'; }
|
||
|
pre.src-css:before { content: 'CSS'; }
|
||
|
pre.src-D:before { content: 'D'; }
|
||
|
pre.src-ditaa:before { content: 'ditaa'; }
|
||
|
pre.src-dot:before { content: 'Graphviz'; }
|
||
|
pre.src-calc:before { content: 'Emacs Calc'; }
|
||
|
pre.src-emacs-lisp:before { content: 'Emacs Lisp'; }
|
||
|
pre.src-fortran:before { content: 'Fortran'; }
|
||
|
pre.src-gnuplot:before { content: 'gnuplot'; }
|
||
|
pre.src-haskell:before { content: 'Haskell'; }
|
||
|
pre.src-hledger:before { content: 'hledger'; }
|
||
|
pre.src-java:before { content: 'Java'; }
|
||
|
pre.src-js:before { content: 'Javascript'; }
|
||
|
pre.src-latex:before { content: 'LaTeX'; }
|
||
|
pre.src-ledger:before { content: 'Ledger'; }
|
||
|
pre.src-lisp:before { content: 'Lisp'; }
|
||
|
pre.src-lilypond:before { content: 'Lilypond'; }
|
||
|
pre.src-lua:before { content: 'Lua'; }
|
||
|
pre.src-matlab:before { content: 'MATLAB'; }
|
||
|
pre.src-mscgen:before { content: 'Mscgen'; }
|
||
|
pre.src-ocaml:before { content: 'Objective Caml'; }
|
||
|
pre.src-octave:before { content: 'Octave'; }
|
||
|
pre.src-org:before { content: 'Org mode'; }
|
||
|
pre.src-oz:before { content: 'OZ'; }
|
||
|
pre.src-plantuml:before { content: 'Plantuml'; }
|
||
|
pre.src-processing:before { content: 'Processing.js'; }
|
||
|
pre.src-python:before { content: 'Python'; }
|
||
|
pre.src-R:before { content: 'R'; }
|
||
|
pre.src-ruby:before { content: 'Ruby'; }
|
||
|
pre.src-sass:before { content: 'Sass'; }
|
||
|
pre.src-scheme:before { content: 'Scheme'; }
|
||
|
pre.src-screen:before { content: 'Gnu Screen'; }
|
||
|
pre.src-sed:before { content: 'Sed'; }
|
||
|
pre.src-sh:before { content: 'shell'; }
|
||
|
pre.src-sql:before { content: 'SQL'; }
|
||
|
pre.src-sqlite:before { content: 'SQLite'; }
|
||
|
/* additional languages in org.el's org-babel-load-languages alist */
|
||
|
pre.src-forth:before { content: 'Forth'; }
|
||
|
pre.src-io:before { content: 'IO'; }
|
||
|
pre.src-J:before { content: 'J'; }
|
||
|
pre.src-makefile:before { content: 'Makefile'; }
|
||
|
pre.src-maxima:before { content: 'Maxima'; }
|
||
|
pre.src-perl:before { content: 'Perl'; }
|
||
|
pre.src-picolisp:before { content: 'Pico Lisp'; }
|
||
|
pre.src-scala:before { content: 'Scala'; }
|
||
|
pre.src-shell:before { content: 'Shell Script'; }
|
||
|
pre.src-ebnf2ps:before { content: 'ebfn2ps'; }
|
||
|
/* additional language identifiers per "defun org-babel-execute"
|
||
|
in ob-*.el */
|
||
|
pre.src-cpp:before { content: 'C++'; }
|
||
|
pre.src-abc:before { content: 'ABC'; }
|
||
|
pre.src-coq:before { content: 'Coq'; }
|
||
|
pre.src-groovy:before { content: 'Groovy'; }
|
||
|
/* additional language identifiers from org-babel-shell-names in
|
||
|
ob-shell.el: ob-shell is the only babel language using a lambda to put
|
||
|
the execution function name together. */
|
||
|
pre.src-bash:before { content: 'bash'; }
|
||
|
pre.src-csh:before { content: 'csh'; }
|
||
|
pre.src-ash:before { content: 'ash'; }
|
||
|
pre.src-dash:before { content: 'dash'; }
|
||
|
pre.src-ksh:before { content: 'ksh'; }
|
||
|
pre.src-mksh:before { content: 'mksh'; }
|
||
|
pre.src-posh:before { content: 'posh'; }
|
||
|
/* Additional Emacs modes also supported by the LaTeX listings package */
|
||
|
pre.src-ada:before { content: 'Ada'; }
|
||
|
pre.src-asm:before { content: 'Assembler'; }
|
||
|
pre.src-caml:before { content: 'Caml'; }
|
||
|
pre.src-delphi:before { content: 'Delphi'; }
|
||
|
pre.src-html:before { content: 'HTML'; }
|
||
|
pre.src-idl:before { content: 'IDL'; }
|
||
|
pre.src-mercury:before { content: 'Mercury'; }
|
||
|
pre.src-metapost:before { content: 'MetaPost'; }
|
||
|
pre.src-modula-2:before { content: 'Modula-2'; }
|
||
|
pre.src-pascal:before { content: 'Pascal'; }
|
||
|
pre.src-ps:before { content: 'PostScript'; }
|
||
|
pre.src-prolog:before { content: 'Prolog'; }
|
||
|
pre.src-simula:before { content: 'Simula'; }
|
||
|
pre.src-tcl:before { content: 'tcl'; }
|
||
|
pre.src-tex:before { content: 'TeX'; }
|
||
|
pre.src-plain-tex:before { content: 'Plain TeX'; }
|
||
|
pre.src-verilog:before { content: 'Verilog'; }
|
||
|
pre.src-vhdl:before { content: 'VHDL'; }
|
||
|
pre.src-xml:before { content: 'XML'; }
|
||
|
pre.src-nxml:before { content: 'XML'; }
|
||
|
/* add a generic configuration mode; LaTeX export needs an additional
|
||
|
(add-to-list 'org-latex-listings-langs '(conf " ")) in .emacs */
|
||
|
pre.src-conf:before { content: 'Configuration File'; }
|
||
|
|
||
|
table { border-collapse:collapse; }
|
||
|
caption.t-above { caption-side: top; }
|
||
|
caption.t-bottom { caption-side: bottom; }
|
||
|
td, th { vertical-align:top; }
|
||
|
th.org-right { text-align: center; }
|
||
|
th.org-left { text-align: center; }
|
||
|
th.org-center { text-align: center; }
|
||
|
td.org-right { text-align: right; }
|
||
|
td.org-left { text-align: left; }
|
||
|
td.org-center { text-align: center; }
|
||
|
dt { font-weight: bold; }
|
||
|
.footpara { display: inline; }
|
||
|
.footdef { margin-bottom: 1em; }
|
||
|
.figure { padding: 1em; }
|
||
|
.figure p { text-align: center; }
|
||
|
.equation-container {
|
||
|
display: table;
|
||
|
text-align: center;
|
||
|
width: 100%;
|
||
|
}
|
||
|
.equation {
|
||
|
vertical-align: middle;
|
||
|
}
|
||
|
.equation-label {
|
||
|
display: table-cell;
|
||
|
text-align: right;
|
||
|
vertical-align: middle;
|
||
|
}
|
||
|
.inlinetask {
|
||
|
padding: 10px;
|
||
|
border: 2px solid gray;
|
||
|
margin: 10px;
|
||
|
background: #ffffcc;
|
||
|
}
|
||
|
#org-div-home-and-up
|
||
|
{ text-align: right; font-size: 70%; white-space: nowrap; }
|
||
|
textarea { overflow-x: auto; }
|
||
|
.linenr { font-size: smaller }
|
||
|
.code-highlighted { background-color: #ffff00; }
|
||
|
.org-info-js_info-navigation { border-style: none; }
|
||
|
#org-info-js_console-label
|
||
|
{ font-size: 10px; font-weight: bold; white-space: nowrap; }
|
||
|
.org-info-js_search-highlight
|
||
|
{ background-color: #ffff00; color: #000000; font-weight: bold; }
|
||
|
.org-svg { width: 90%; }
|
||
|
/*]]>*/-->
|
||
|
</style>
|
||
|
<link rel="stylesheet" type="text/css" href="../css/htmlize.css"/>
|
||
|
<link rel="stylesheet" type="text/css" href="../css/readtheorg.css"/>
|
||
|
<link rel="stylesheet" type="text/css" href="../css/zenburn.css"/>
|
||
|
<script type="text/javascript" src="../js/jquery.min.js"></script>
|
||
|
<script type="text/javascript" src="../js/bootstrap.min.js"></script>
|
||
|
<script type="text/javascript" src="../js/jquery.stickytableheaders.min.js"></script>
|
||
|
<script type="text/javascript" src="../js/readtheorg.js"></script>
|
||
|
<script type="text/javascript">
|
||
|
/*
|
||
|
@licstart The following is the entire license notice for the
|
||
|
JavaScript code in this tag.
|
||
|
|
||
|
Copyright (C) 2012-2019 Free Software Foundation, Inc.
|
||
|
|
||
|
The JavaScript code in this tag is free software: you can
|
||
|
redistribute it and/or modify it under the terms of the GNU
|
||
|
General Public License (GNU GPL) as published by the Free Software
|
||
|
Foundation, either version 3 of the License, or (at your option)
|
||
|
any later version. The code is distributed WITHOUT ANY WARRANTY;
|
||
|
without even the implied warranty of MERCHANTABILITY or FITNESS
|
||
|
FOR A PARTICULAR PURPOSE. See the GNU GPL for more details.
|
||
|
|
||
|
As additional permission under GNU GPL version 3 section 7, you
|
||
|
may distribute non-source (e.g., minimized or compacted) forms of
|
||
|
that code without the copy of the GNU GPL normally required by
|
||
|
section 4, provided you include this license notice and a URL
|
||
|
through which recipients can access the Corresponding Source.
|
||
|
|
||
|
|
||
|
@licend The above is the entire license notice
|
||
|
for the JavaScript code in this tag.
|
||
|
*/
|
||
|
<!--/*--><![CDATA[/*><!--*/
|
||
|
function CodeHighlightOn(elem, id)
|
||
|
{
|
||
|
var target = document.getElementById(id);
|
||
|
if(null != target) {
|
||
|
elem.cacheClassElem = elem.className;
|
||
|
elem.cacheClassTarget = target.className;
|
||
|
target.className = "code-highlighted";
|
||
|
elem.className = "code-highlighted";
|
||
|
}
|
||
|
}
|
||
|
function CodeHighlightOff(elem, id)
|
||
|
{
|
||
|
var target = document.getElementById(id);
|
||
|
if(elem.cacheClassElem)
|
||
|
elem.className = elem.cacheClassElem;
|
||
|
if(elem.cacheClassTarget)
|
||
|
target.className = elem.cacheClassTarget;
|
||
|
}
|
||
|
/*]]>*///-->
|
||
|
</script>
|
||
|
<script type="text/x-mathjax-config">
|
||
|
MathJax.Hub.Config({
|
||
|
displayAlign: "center",
|
||
|
displayIndent: "0em",
|
||
|
|
||
|
"HTML-CSS": { scale: 100,
|
||
|
linebreaks: { automatic: "false" },
|
||
|
webFont: "TeX"
|
||
|
},
|
||
|
SVG: {scale: 100,
|
||
|
linebreaks: { automatic: "false" },
|
||
|
font: "TeX"},
|
||
|
NativeMML: {scale: 100},
|
||
|
TeX: { equationNumbers: {autoNumber: "AMS"},
|
||
|
MultLineWidth: "85%",
|
||
|
TagSide: "right",
|
||
|
TagIndent: ".8em"
|
||
|
}
|
||
|
});
|
||
|
</script>
|
||
|
<script type="text/javascript"
|
||
|
src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS_HTML"></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">Modal Analysis - Processing of FRF</h1>
|
||
|
<div id="table-of-contents">
|
||
|
<h2>Table of Contents</h2>
|
||
|
<div id="text-table-of-contents">
|
||
|
<ul>
|
||
|
<li><a href="#orgd95e287">1. Importation of measured FRF curves</a></li>
|
||
|
<li><a href="#org0649187">2. From accelerometer DOFs to solid body DOFs - Mathematics</a></li>
|
||
|
<li><a href="#orgbfc68dd">3. What reference frame to choose?</a></li>
|
||
|
<li><a href="#org5d9a38b">4. From accelerometer DOFs to solid body DOFs - Matlab Implementation</a></li>
|
||
|
<li><a href="#orgbb81ded">5. Analysis of some FRF in the global coordinates</a></li>
|
||
|
<li><a href="#orgb0c1df8">6. <span class="todo TODO">TODO</span> How to compare the relative motion of solid bodies</a></li>
|
||
|
<li><a href="#org9c93ccf">7. Relative Motion in the global coordinates</a></li>
|
||
|
<li><a href="#org7803dae">8. <span class="todo TODO">TODO</span> Compare original FRF measurements to transformed FRF in the global frame</a></li>
|
||
|
<li><a href="#org45fdd6c">9. Verify that we find the original FRF from the FRF in the global coordinates</a></li>
|
||
|
</ul>
|
||
|
</div>
|
||
|
</div>
|
||
|
|
||
|
<p>
|
||
|
The measurements have been conducted and we have computed the \(n \times p \times q\) Frequency Response Functions Matrix with:
|
||
|
</p>
|
||
|
<ul class="org-ul">
|
||
|
<li>\(n\): the number of measurements: \(23 \times 3 = 69\) (23 accelerometers measuring 3 directions each)</li>
|
||
|
<li>\(p\): the number of excitation inputs: \(3\)</li>
|
||
|
<li>\(q\): the number of frequency points \(\omega_i\)</li>
|
||
|
</ul>
|
||
|
|
||
|
<p>
|
||
|
However, in our model, we only consider 6 solid bodies, namely:
|
||
|
</p>
|
||
|
<ul class="org-ul">
|
||
|
<li>Bottom Granite</li>
|
||
|
<li>Top Granite</li>
|
||
|
<li>Translation Stage</li>
|
||
|
<li>Tilt Stage</li>
|
||
|
<li>Spindle</li>
|
||
|
<li>Hexapod</li>
|
||
|
</ul>
|
||
|
|
||
|
<p>
|
||
|
Thus, we are only interested in \(6 \times 6 = 36\) degrees of freedom.
|
||
|
</p>
|
||
|
|
||
|
<p>
|
||
|
We here process the FRF matrix to go from the 69 measured DOFs to the wanted 36 DOFs.
|
||
|
</p>
|
||
|
|
||
|
<div id="outline-container-orgd95e287" class="outline-2">
|
||
|
<h2 id="orgd95e287"><span class="section-number-2">1</span> Importation of measured FRF curves</h2>
|
||
|
<div class="outline-text-2" id="text-1">
|
||
|
<p>
|
||
|
We load the measured FRF and Coherence matrices.
|
||
|
We also load the geometric parameters of the station: solid bodies considered and the position of the accelerometers.
|
||
|
</p>
|
||
|
|
||
|
<div class="org-src-container">
|
||
|
<pre class="src src-matlab">load<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-string">'./mat/frf_coh_matrices.mat', 'FRFs', 'COHs', 'freqs'</span><span class="org-rainbow-delimiters-depth-1">)</span>;
|
||
|
load<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-string">'mat/geometry.mat', 'solids', 'solid_names', 'acc_pos'</span><span class="org-rainbow-delimiters-depth-1">)</span>;
|
||
|
</pre>
|
||
|
</div>
|
||
|
</div>
|
||
|
</div>
|
||
|
|
||
|
<div id="outline-container-org0649187" class="outline-2">
|
||
|
<h2 id="org0649187"><span class="section-number-2">2</span> From accelerometer DOFs to solid body DOFs - Mathematics</h2>
|
||
|
<div class="outline-text-2" id="text-2">
|
||
|
<p>
|
||
|
Let's consider the schematic shown on figure <a href="#org0345801">1</a> where we are measuring the motion of a (supposed) solid body at 4 distinct points in x-y-z.
|
||
|
</p>
|
||
|
|
||
|
<p>
|
||
|
The goal here is to link these \(4 \times 3 = 12\) measurements to the 6 DOFs of the solid body expressed in the frame \(\{O\}\).
|
||
|
</p>
|
||
|
|
||
|
|
||
|
<div id="org0345801" class="figure">
|
||
|
<p><img src="figs/local_to_global_coordinates.png" alt="local_to_global_coordinates.png" />
|
||
|
</p>
|
||
|
<p><span class="figure-number">Figure 1: </span>Schematic of the measured motions of a solid body</p>
|
||
|
</div>
|
||
|
|
||
|
<p>
|
||
|
From the figure <a href="#org0345801">1</a>, we can write:
|
||
|
</p>
|
||
|
\begin{align*}
|
||
|
\vec{v}_1 &= \vec{v} + \Omega \vec{p}_1\\
|
||
|
\vec{v}_2 &= \vec{v} + \Omega \vec{p}_2\\
|
||
|
\vec{v}_3 &= \vec{v} + \Omega \vec{p}_3\\
|
||
|
\vec{v}_4 &= \vec{v} + \Omega \vec{p}_4
|
||
|
\end{align*}
|
||
|
|
||
|
<p>
|
||
|
With
|
||
|
</p>
|
||
|
\begin{equation}
|
||
|
\Omega = \begin{bmatrix}
|
||
|
0 & -\Omega_z & \Omega_y \\
|
||
|
\Omega_z & 0 & -\Omega_x \\
|
||
|
-\Omega_y & \Omega_x & 0
|
||
|
\end{bmatrix}
|
||
|
\end{equation}
|
||
|
<p>
|
||
|
\(\vec{v}\) and \(\Omega\) represent to velocity and rotation of the solid expressed in the frame \(\{O\}\).
|
||
|
</p>
|
||
|
|
||
|
<p>
|
||
|
We can rearrange the equations in a matrix form:
|
||
|
</p>
|
||
|
|
||
|
\begin{equation}
|
||
|
\left[\begin{array}{ccc|ccc}
|
||
|
1 & 0 & 0 & 0 & p_{1z} & -p_{1y} \\
|
||
|
0 & 1 & 0 & -p_{1z} & 0 & p_{1x} \\
|
||
|
0 & 0 & 1 & p_{1y} & -p_{1x} & 0 \\ \hline
|
||
|
& \vdots & & & \vdots & \\ \hline
|
||
|
1 & 0 & 0 & 0 & p_{4z} & -p_{4y} \\
|
||
|
0 & 1 & 0 & -p_{4z} & 0 & p_{4x} \\
|
||
|
0 & 0 & 1 & p_{4y} & -p_{4x} & 0
|
||
|
\end{array}\right] \begin{bmatrix}
|
||
|
v_x \\ v_y \\ v_z \\ \hline \Omega_x \\ \Omega_y \\ \Omega_z
|
||
|
\end{bmatrix} = \begin{bmatrix}
|
||
|
v_{1x} \\ v_{1y} \\ v_{1z} \\\hline \vdots \\\hline v_{4x} \\ v_{4y} \\ v_{4z}
|
||
|
\end{bmatrix}
|
||
|
\end{equation}
|
||
|
|
||
|
<p>
|
||
|
and then we obtain the velocity and rotation of the solid in the wanted frame \(\{O\}\):
|
||
|
</p>
|
||
|
\begin{equation}
|
||
|
\begin{bmatrix}
|
||
|
v_x \\ v_y \\ v_z \\ \hline \Omega_x \\ \Omega_y \\ \Omega_z
|
||
|
\end{bmatrix} =
|
||
|
\left[\begin{array}{ccc|ccc}
|
||
|
1 & 0 & 0 & 0 & p_{1z} & -p_{1y} \\
|
||
|
0 & 1 & 0 & -p_{1z} & 0 & p_{1x} \\
|
||
|
0 & 0 & 1 & p_{1y} & -p_{1x} & 0 \\ \hline
|
||
|
& \vdots & & & \vdots & \\ \hline
|
||
|
1 & 0 & 0 & 0 & p_{4z} & -p_{4y} \\
|
||
|
0 & 1 & 0 & -p_{4z} & 0 & p_{4x} \\
|
||
|
0 & 0 & 1 & p_{4y} & -p_{4x} & 0
|
||
|
\end{array}\right]^{-1} \begin{bmatrix}
|
||
|
v_{1x} \\ v_{1y} \\ v_{1z} \\\hline \vdots \\\hline v_{4x} \\ v_{4y} \\ v_{4z}
|
||
|
\end{bmatrix}
|
||
|
\end{equation}
|
||
|
|
||
|
<p>
|
||
|
This inversion is equivalent to resolving a mean square problem.
|
||
|
</p>
|
||
|
</div>
|
||
|
</div>
|
||
|
|
||
|
<div id="outline-container-orgbfc68dd" class="outline-2">
|
||
|
<h2 id="orgbfc68dd"><span class="section-number-2">3</span> What reference frame to choose?</h2>
|
||
|
<div class="outline-text-2" id="text-3">
|
||
|
<p>
|
||
|
The question we wish here to answer is how to choose the reference frame \(\{O\}\) in which the DOFs of the solid bodies are defined.
|
||
|
</p>
|
||
|
|
||
|
<p>
|
||
|
The goal is to compare the motion of each solid body to see which relative DOFs between solid bodies can be neglected, that is to say, which joint between solid bodies can be regarded as perfect (and this in all the frequency range of interest).
|
||
|
Ideally, we would like to have the same number of degrees of freedom than the number of identified modes.
|
||
|
</p>
|
||
|
|
||
|
<p>
|
||
|
The possibles choices are:
|
||
|
</p>
|
||
|
<ul class="org-ul">
|
||
|
<li><b>One frame for each solid body</b> which is located at its center of mass</li>
|
||
|
<li><b>One common frame</b>, for instance located at the point of interest (\(270mm\) above the Hexapod)</li>
|
||
|
<li><b>Base located at the joint position</b>: this is where we want to see the motion and estimate stiffness</li>
|
||
|
</ul>
|
||
|
|
||
|
<table id="org6509a46" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
|
||
|
<caption class="t-above"><span class="table-number">Table 1:</span> Advantages and disadvantages for the choice of reference frame</caption>
|
||
|
|
||
|
<colgroup>
|
||
|
<col class="org-left" />
|
||
|
|
||
|
<col class="org-left" />
|
||
|
|
||
|
<col class="org-left" />
|
||
|
</colgroup>
|
||
|
<thead>
|
||
|
<tr>
|
||
|
<th scope="col" class="org-left">Chosen Frame</th>
|
||
|
<th scope="col" class="org-left">Advantages</th>
|
||
|
<th scope="col" class="org-left">Disadvantages</th>
|
||
|
</tr>
|
||
|
</thead>
|
||
|
<tbody>
|
||
|
<tr>
|
||
|
<td class="org-left">Frames at CoM</td>
|
||
|
<td class="org-left">Physically, it makes more sense</td>
|
||
|
<td class="org-left">How to compare the motion of the solid bodies?</td>
|
||
|
</tr>
|
||
|
|
||
|
<tr>
|
||
|
<td class="org-left">Common Frame</td>
|
||
|
<td class="org-left">We can compare the motion of each solid body</td>
|
||
|
<td class="org-left">Small \(\theta_{x, y}\) may result in large \(T_{x, y}\)</td>
|
||
|
</tr>
|
||
|
|
||
|
<tr>
|
||
|
<td class="org-left">Frames at joint position</td>
|
||
|
<td class="org-left">Directly gives which joint direction can be blocked</td>
|
||
|
<td class="org-left">How to choose the joint position?</td>
|
||
|
</tr>
|
||
|
</tbody>
|
||
|
</table>
|
||
|
|
||
|
<p>
|
||
|
As the easiest choice is to choose a common frame, we start with that solution.
|
||
|
</p>
|
||
|
</div>
|
||
|
</div>
|
||
|
|
||
|
<div id="outline-container-org5d9a38b" class="outline-2">
|
||
|
<h2 id="org5d9a38b"><span class="section-number-2">4</span> From accelerometer DOFs to solid body DOFs - Matlab Implementation</h2>
|
||
|
<div class="outline-text-2" id="text-4">
|
||
|
<p>
|
||
|
First, we initialize a new FRF matrix <code>FRFs_O</code> which is an \(n \times p \times q\) with:
|
||
|
</p>
|
||
|
<ul class="org-ul">
|
||
|
<li>\(n\) is the number of DOFs of the considered 6 solid-bodies: \(6 \times 6 = 36\)</li>
|
||
|
<li>\(p\) is the number of excitation inputs: \(3\)</li>
|
||
|
<li>\(q\) is the number of frequency points \(\omega_i\)</li>
|
||
|
</ul>
|
||
|
|
||
|
<div class="org-src-container">
|
||
|
<pre class="src src-matlab">FRFs_O = zeros<span class="org-rainbow-delimiters-depth-1">(</span>length<span class="org-rainbow-delimiters-depth-2">(</span>solid_names<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-type">*</span><span class="org-highlight-numbers-number">6</span>, <span class="org-highlight-numbers-number">3</span>, <span class="org-highlight-numbers-number">801</span><span class="org-rainbow-delimiters-depth-1">)</span>;
|
||
|
</pre>
|
||
|
</div>
|
||
|
|
||
|
<p>
|
||
|
Then, as we know the positions of the accelerometers on each solid body, and we have the response of those accelerometers, we can use the equations derived in the previous section to determine the response of each solid body expressed in the frame \(\{O\}\).
|
||
|
</p>
|
||
|
<div class="org-src-container">
|
||
|
<pre class="src src-matlab"><span class="org-keyword">for</span> <span class="org-variable-name">solid_i</span> = <span class="org-constant"><span class="org-highlight-numbers-number">1</span></span><span class="org-constant">:length</span><span class="org-constant"><span class="org-rainbow-delimiters-depth-1">(</span></span><span class="org-constant">solid_names</span><span class="org-constant"><span class="org-rainbow-delimiters-depth-1">)</span></span>
|
||
|
solids_i = solids.<span class="org-rainbow-delimiters-depth-1">(</span>solid_names<span class="org-rainbow-delimiters-depth-2">{</span>solid_i<span class="org-rainbow-delimiters-depth-2">}</span><span class="org-rainbow-delimiters-depth-1">)</span>;
|
||
|
|
||
|
A = zeros<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-highlight-numbers-number">3</span><span class="org-type">*</span>length<span class="org-rainbow-delimiters-depth-2">(</span>solids_i<span class="org-rainbow-delimiters-depth-2">)</span>, <span class="org-highlight-numbers-number">6</span><span class="org-rainbow-delimiters-depth-1">)</span>;
|
||
|
<span class="org-keyword">for</span> <span class="org-variable-name">i</span> = <span class="org-constant"><span class="org-highlight-numbers-number">1</span></span><span class="org-constant">:length</span><span class="org-constant"><span class="org-rainbow-delimiters-depth-1">(</span></span><span class="org-constant">solids_i</span><span class="org-constant"><span class="org-rainbow-delimiters-depth-1">)</span></span>
|
||
|
acc_i = solids_i<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-constant">i</span><span class="org-rainbow-delimiters-depth-1">)</span>;
|
||
|
|
||
|
A<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-highlight-numbers-number">3</span><span class="org-type">*</span><span class="org-rainbow-delimiters-depth-2">(</span><span class="org-constant">i</span><span class="org-type">-</span><span class="org-highlight-numbers-number">1</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-type">+</span><span class="org-highlight-numbers-number">1</span><span class="org-type">:</span><span class="org-highlight-numbers-number">3</span><span class="org-type">*</span><span class="org-constant">i</span>, <span class="org-highlight-numbers-number">1</span><span class="org-type">:</span><span class="org-highlight-numbers-number">3</span><span class="org-rainbow-delimiters-depth-1">)</span> = eye<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-highlight-numbers-number">3</span><span class="org-rainbow-delimiters-depth-1">)</span>;
|
||
|
A<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-highlight-numbers-number">3</span><span class="org-type">*</span><span class="org-rainbow-delimiters-depth-2">(</span><span class="org-constant">i</span><span class="org-type">-</span><span class="org-highlight-numbers-number">1</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-type">+</span><span class="org-highlight-numbers-number">1</span><span class="org-type">:</span><span class="org-highlight-numbers-number">3</span><span class="org-type">*</span><span class="org-constant">i</span>, <span class="org-highlight-numbers-number">4</span><span class="org-type">:</span><span class="org-highlight-numbers-number">6</span><span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-rainbow-delimiters-depth-1">[</span> <span class="org-highlight-numbers-number">0</span> acc_pos<span class="org-rainbow-delimiters-depth-2">(</span>acc_i, <span class="org-highlight-numbers-number">3</span><span class="org-rainbow-delimiters-depth-2">)</span> <span class="org-type">-</span>acc_pos<span class="org-rainbow-delimiters-depth-2">(</span>acc_i, <span class="org-highlight-numbers-number">2</span><span class="org-rainbow-delimiters-depth-2">)</span> ;
|
||
|
<span class="org-type">-</span>acc_pos<span class="org-rainbow-delimiters-depth-2">(</span>acc_i, <span class="org-highlight-numbers-number">3</span><span class="org-rainbow-delimiters-depth-2">)</span> <span class="org-highlight-numbers-number">0</span> acc_pos<span class="org-rainbow-delimiters-depth-2">(</span>acc_i, <span class="org-highlight-numbers-number">1</span><span class="org-rainbow-delimiters-depth-2">)</span> ;
|
||
|
acc_pos<span class="org-rainbow-delimiters-depth-2">(</span>acc_i, <span class="org-highlight-numbers-number">2</span><span class="org-rainbow-delimiters-depth-2">)</span> <span class="org-type">-</span>acc_pos<span class="org-rainbow-delimiters-depth-2">(</span>acc_i, <span class="org-highlight-numbers-number">1</span><span class="org-rainbow-delimiters-depth-2">)</span> <span class="org-highlight-numbers-number">0</span><span class="org-rainbow-delimiters-depth-1">]</span>;
|
||
|
<span class="org-keyword">end</span>
|
||
|
|
||
|
<span class="org-keyword">for</span> <span class="org-variable-name">exc_dir</span> = <span class="org-constant"><span class="org-highlight-numbers-number">1</span></span><span class="org-constant">:</span><span class="org-constant"><span class="org-highlight-numbers-number">3</span></span>
|
||
|
FRFs_O<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-rainbow-delimiters-depth-2">(</span>solid_i<span class="org-type">-</span><span class="org-highlight-numbers-number">1</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-type">*</span><span class="org-highlight-numbers-number">6</span><span class="org-type">+</span><span class="org-highlight-numbers-number">1</span><span class="org-type">:</span>solid_i<span class="org-type">*</span><span class="org-highlight-numbers-number">6</span>, exc_dir, <span class="org-type">:</span><span class="org-rainbow-delimiters-depth-1">)</span> = A<span class="org-type">\</span>squeeze<span class="org-rainbow-delimiters-depth-1">(</span>FRFs<span class="org-rainbow-delimiters-depth-2">(</span><span class="org-rainbow-delimiters-depth-3">(</span>solids_i<span class="org-rainbow-delimiters-depth-4">(</span><span class="org-highlight-numbers-number">1</span><span class="org-rainbow-delimiters-depth-4">)</span><span class="org-type">-</span><span class="org-highlight-numbers-number">1</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-type">*</span><span class="org-highlight-numbers-number">3</span><span class="org-type">+</span><span class="org-highlight-numbers-number">1</span><span class="org-type">:</span>solids_i<span class="org-rainbow-delimiters-depth-3">(</span>end<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-type">*</span><span class="org-highlight-numbers-number">3</span>, exc_dir, <span class="org-type">:</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>;
|
||
|
<span class="org-keyword">end</span>
|
||
|
<span class="org-keyword">end</span>
|
||
|
</pre>
|
||
|
</div>
|
||
|
</div>
|
||
|
</div>
|
||
|
|
||
|
<div id="outline-container-orgbb81ded" class="outline-2">
|
||
|
<h2 id="orgbb81ded"><span class="section-number-2">5</span> Analysis of some FRF in the global coordinates</h2>
|
||
|
<div class="outline-text-2" id="text-5">
|
||
|
<p>
|
||
|
First, we can compare the motions of the 6 solid bodies in one direction (figure <a href="#orgc2878f8">2</a>)
|
||
|
</p>
|
||
|
|
||
|
<p>
|
||
|
We can also compare all the DOFs of one solid body (figure <a href="#orgfd0203f">3</a>).
|
||
|
</p>
|
||
|
|
||
|
|
||
|
<div id="orgc2878f8" class="figure">
|
||
|
<p><img src="figs/frf_all_bodies_one_direction.png" alt="frf_all_bodies_one_direction.png" />
|
||
|
</p>
|
||
|
<p><span class="figure-number">Figure 2: </span>FRFs of all the 6 solid bodies in one direction</p>
|
||
|
</div>
|
||
|
|
||
|
|
||
|
<div id="orgfd0203f" class="figure">
|
||
|
<p><img src="figs/frf_one_body_all_directions.png" alt="frf_one_body_all_directions.png" />
|
||
|
</p>
|
||
|
<p><span class="figure-number">Figure 3: </span>FRFs of one solid body in all its DOFs</p>
|
||
|
</div>
|
||
|
</div>
|
||
|
</div>
|
||
|
|
||
|
<div id="outline-container-orgb0c1df8" class="outline-2">
|
||
|
<h2 id="orgb0c1df8"><span class="section-number-2">6</span> <span class="todo TODO">TODO</span> How to compare the relative motion of solid bodies</h2>
|
||
|
<div class="outline-text-2" id="text-6">
|
||
|
<p>
|
||
|
We have some of elements of the full FRF matrix:
|
||
|
\[ \frac{D_{1x}}{F_x},\ \frac{D_{1y}}{F_x},\ \frac{D_{1z}}{F_x},\ \frac{D_{2x}}{F_x},\ \dots \]
|
||
|
</p>
|
||
|
|
||
|
<p>
|
||
|
\[ \frac{D_{1x}}{D_{2x}} = \frac{\frac{D_{1x}}{F_x}}{\frac{D_{2x}}{F_x}} \]
|
||
|
Then, if \(\left| \frac{D_{1x}}{D_{2x}} \right| \approx 1\) in all the frequency band of interest, we can block the \(x\) motion between the solids 1 and 2.
|
||
|
</p>
|
||
|
|
||
|
<p>
|
||
|
\[ \frac{D_{2x} - D_{1x}}{D_{1x} + D_{2x}} = \frac{\frac{D_{2x}}{F_x} - \frac{D_{1x}}{F_x}}{\frac{D_{1x}}{F_x} + \frac{D_{2x}}{F_x}} \]
|
||
|
</p>
|
||
|
|
||
|
<p>
|
||
|
Then if \(\left| \frac{D_{2x} - D_{1x}}{D_{1x} + D_{2x}} \right| \ll 1\) in all the frequency band of interest, we can block the \(x\) motion between the solids 1 and 2.
|
||
|
</p>
|
||
|
</div>
|
||
|
</div>
|
||
|
|
||
|
<div id="outline-container-org9c93ccf" class="outline-2">
|
||
|
<h2 id="org9c93ccf"><span class="section-number-2">7</span> Relative Motion in the global coordinates</h2>
|
||
|
<div class="outline-text-2" id="text-7">
|
||
|
<p>
|
||
|
Below we plot the normalized relative motion between each stage:
|
||
|
\[ 0 < \frac{\left| D_{ix} - D_{jx} \right|}{|D_{ix}| + |D_{jx}|} < 1 \]
|
||
|
</p>
|
||
|
|
||
|
<div class="org-src-container">
|
||
|
<pre class="src src-matlab">DOFs = <span class="org-rainbow-delimiters-depth-1">{</span><span class="org-string">'$T_x$', '$T_y$', '$T_z$', '</span>$<span class="org-type">\</span>theta_x$', '$<span class="org-type">\</span>theta_y$', '$<span class="org-type">\</span>theta_z$'<span class="org-rainbow-delimiters-depth-1">}</span>
|
||
|
|
||
|
dirs_i = <span class="org-highlight-numbers-number">1</span><span class="org-type">:</span><span class="org-highlight-numbers-number">6</span>;
|
||
|
exc_dir = <span class="org-highlight-numbers-number">1</span>;
|
||
|
|
||
|
<span class="org-type">figure</span>;
|
||
|
|
||
|
<span class="org-keyword">for</span> <span class="org-variable-name">i</span> = <span class="org-constant"><span class="org-highlight-numbers-number">2</span></span><span class="org-constant">:</span><span class="org-constant"><span class="org-highlight-numbers-number">6</span></span>
|
||
|
subaxis<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-highlight-numbers-number">3</span>, <span class="org-highlight-numbers-number">2</span>, <span class="org-constant">i</span><span class="org-rainbow-delimiters-depth-1">)</span>;
|
||
|
hold on;
|
||
|
<span class="org-keyword">for</span> <span class="org-variable-name">dir_i</span> = <span class="org-constant">dirs_i</span>
|
||
|
H = <span class="org-rainbow-delimiters-depth-1">(</span>squeeze<span class="org-rainbow-delimiters-depth-2">(</span>FRFs_O<span class="org-rainbow-delimiters-depth-3">(</span><span class="org-rainbow-delimiters-depth-4">(</span><span class="org-constant">i</span><span class="org-type">-</span><span class="org-highlight-numbers-number">1</span><span class="org-rainbow-delimiters-depth-4">)</span><span class="org-type">*</span><span class="org-highlight-numbers-number">6</span><span class="org-type">+</span>dir_i, exc_dir, <span class="org-type">:</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-type">-</span>squeeze<span class="org-rainbow-delimiters-depth-2">(</span>FRFs_O<span class="org-rainbow-delimiters-depth-3">(</span><span class="org-rainbow-delimiters-depth-4">(</span><span class="org-constant">i</span><span class="org-type">-</span><span class="org-highlight-numbers-number">2</span><span class="org-rainbow-delimiters-depth-4">)</span><span class="org-type">*</span><span class="org-highlight-numbers-number">6</span><span class="org-type">+</span>dir_i, exc_dir, <span class="org-type">:</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span><span class="org-type">./</span><span class="org-rainbow-delimiters-depth-1">(</span>abs<span class="org-rainbow-delimiters-depth-2">(</span>squeeze<span class="org-rainbow-delimiters-depth-3">(</span>FRFs_O<span class="org-rainbow-delimiters-depth-4">(</span><span class="org-rainbow-delimiters-depth-5">(</span><span class="org-constant">i</span><span class="org-type">-</span><span class="org-highlight-numbers-number">1</span><span class="org-rainbow-delimiters-depth-5">)</span><span class="org-type">*</span><span class="org-highlight-numbers-number">6</span><span class="org-type">+</span>dir_i, exc_dir, <span class="org-type">:</span><span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-type">+</span>abs<span class="org-rainbow-delimiters-depth-2">(</span>squeeze<span class="org-rainbow-delimiters-depth-3">(</span>FRFs_O<span class="org-rainbow-delimiters-depth-4">(</span><span class="org-rainbow-delimiters-depth-5">(</span><span class="org-constant">i</span><span class="org-type">-</span><span class="org-highlight-numbers-number">2</span><span class="org-rainbow-delimiters-depth-5">)</span><span class="org-type">*</span><span class="org-highlight-numbers-number">6</span><span class="org-type">+</span>dir_i, exc_dir, <span class="org-type">:</span><span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>;
|
||
|
plot<span class="org-rainbow-delimiters-depth-1">(</span>freqs, abs<span class="org-rainbow-delimiters-depth-2">(</span>H<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>;
|
||
|
<span class="org-keyword">end</span>
|
||
|
hold off;
|
||
|
<span class="org-type">set</span><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-variable-name">gca</span>, <span class="org-string">'XScale', 'log'</span><span class="org-string"><span class="org-rainbow-delimiters-depth-1">)</span></span><span class="org-string">; set</span><span class="org-string"><span class="org-rainbow-delimiters-depth-1">(</span></span><span class="org-string">gca, 'YScale', 'lin'</span><span class="org-rainbow-delimiters-depth-1">)</span>;
|
||
|
xlim<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-rainbow-delimiters-depth-2">[</span><span class="org-highlight-numbers-number">1</span>, <span class="org-highlight-numbers-number">200</span><span class="org-rainbow-delimiters-depth-2">]</span><span class="org-rainbow-delimiters-depth-1">)</span>; ylim<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-rainbow-delimiters-depth-2">[</span><span class="org-highlight-numbers-number">0</span>, <span class="org-highlight-numbers-number">1</span><span class="org-rainbow-delimiters-depth-2">]</span><span class="org-rainbow-delimiters-depth-1">)</span>;
|
||
|
<span class="org-comment">% xlabel('Frequency [Hz]'); ylabel('Relative Motion');</span>
|
||
|
title<span class="org-rainbow-delimiters-depth-1">(</span>sprintf<span class="org-rainbow-delimiters-depth-2">(</span><span class="org-string">'Normalized motion %s - %s'</span>, solid_names{<span class="org-constant">i</span><span class="org-type">-</span><span class="org-highlight-numbers-number">1</span>}, solid_names{<span class="org-constant">i</span>}));
|
||
|
<span class="org-keyword">if</span> <span class="org-constant">i</span> <span class="org-type">></span> <span class="org-highlight-numbers-number">4</span>
|
||
|
xlabel<span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">'Frequency </span><span class="org-string"><span class="org-rainbow-delimiters-depth-4">[</span></span><span class="org-string">Hz</span><span class="org-string"><span class="org-rainbow-delimiters-depth-4">]</span></span><span class="org-string">'</span><span class="org-rainbow-delimiters-depth-3">)</span>;
|
||
|
<span class="org-keyword">else</span>
|
||
|
<span class="org-type">set</span><span class="org-rainbow-delimiters-depth-3">(</span><span class="org-variable-name">gca</span>, <span class="org-string">'XTickLabel'</span>,<span class="org-rainbow-delimiters-depth-4">[]</span><span class="org-rainbow-delimiters-depth-3">)</span>;
|
||
|
<span class="org-keyword">end</span>
|
||
|
<span class="org-keyword">end</span>
|
||
|
|
||
|
<span class="org-keyword">for</span> <span class="org-variable-name">i</span> = <span class="org-constant"><span class="org-highlight-numbers-number">1</span></span><span class="org-constant">:length</span><span class="org-constant"><span class="org-rainbow-delimiters-depth-3">(</span></span><span class="org-constant">dirs_i</span><span class="org-constant"><span class="org-rainbow-delimiters-depth-3">)</span></span>
|
||
|
legend_names<span class="org-rainbow-delimiters-depth-3">{</span><span class="org-constant">i</span><span class="org-rainbow-delimiters-depth-3">}</span> = DOFs<span class="org-rainbow-delimiters-depth-3">{</span>dirs_i<span class="org-rainbow-delimiters-depth-4">(</span><span class="org-constant">i</span><span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">}</span>;
|
||
|
<span class="org-keyword">end</span>
|
||
|
lgd = legend<span class="org-rainbow-delimiters-depth-3">(</span>legend_names<span class="org-rainbow-delimiters-depth-3">)</span>;
|
||
|
|
||
|
hL = subplot<span class="org-rainbow-delimiters-depth-3">(</span><span class="org-highlight-numbers-number">3</span>, <span class="org-highlight-numbers-number">2</span>, <span class="org-highlight-numbers-number">1</span><span class="org-rainbow-delimiters-depth-3">)</span>;
|
||
|
poshL = <span class="org-type">get</span><span class="org-rainbow-delimiters-depth-3">(</span><span class="org-variable-name">hL</span>,<span class="org-string">'position'</span><span class="org-rainbow-delimiters-depth-3">)</span>;
|
||
|
|
||
|
<span class="org-type">set</span><span class="org-rainbow-delimiters-depth-3">(</span><span class="org-variable-name">lgd</span>,<span class="org-string">'position'</span>, poshL<span class="org-rainbow-delimiters-depth-3">)</span>;
|
||
|
<span class="org-type">axis</span><span class="org-rainbow-delimiters-depth-3">(</span>hL, <span class="org-string">'off'</span><span class="org-rainbow-delimiters-depth-3">)</span>;
|
||
|
</pre>
|
||
|
</div>
|
||
|
|
||
|
|
||
|
<div id="org1cd90a2" class="figure">
|
||
|
<p><img src="figs/relative_motion_comparison.png" alt="relative_motion_comparison.png" />
|
||
|
</p>
|
||
|
<p><span class="figure-number">Figure 4: </span>Relative motion between each stage</p>
|
||
|
</div>
|
||
|
</div>
|
||
|
</div>
|
||
|
|
||
|
<div id="outline-container-org7803dae" class="outline-2">
|
||
|
<h2 id="org7803dae"><span class="section-number-2">8</span> <span class="todo TODO">TODO</span> Compare original FRF measurements to transformed FRF in the global frame</h2>
|
||
|
<div class="outline-text-2" id="text-8">
|
||
|
<p>
|
||
|
We wish here to compare the FRF in order to verify if there is any mistake.
|
||
|
</p>
|
||
|
|
||
|
<div class="org-src-container">
|
||
|
<pre class="src src-matlab">dir_names = <span class="org-rainbow-delimiters-depth-1">{</span><span class="org-string">'X', 'Y', 'Z', '</span>$<span class="org-type">\</span>theta_X$', '$<span class="org-type">\</span>theta_Y$', '$<span class="org-type">\</span>theta_Z$'<span class="org-rainbow-delimiters-depth-1">}</span>;
|
||
|
|
||
|
solid_i = <span class="org-highlight-numbers-number">6</span>;
|
||
|
acc_dir_O = <span class="org-highlight-numbers-number">1</span>;
|
||
|
acc_dir = <span class="org-highlight-numbers-number">1</span>;
|
||
|
exc_dir = <span class="org-highlight-numbers-number">1</span>;
|
||
|
|
||
|
<span class="org-type">figure</span>;
|
||
|
|
||
|
ax1 = subplot<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-highlight-numbers-number">2</span>, <span class="org-highlight-numbers-number">1</span>, <span class="org-highlight-numbers-number">1</span><span class="org-rainbow-delimiters-depth-1">)</span>;
|
||
|
hold on;
|
||
|
<span class="org-keyword">for</span> <span class="org-variable-name">i</span> = <span class="org-constant">solids.</span><span class="org-constant"><span class="org-rainbow-delimiters-depth-1">(</span></span><span class="org-constant">solid_names</span><span class="org-constant"><span class="org-rainbow-delimiters-depth-2">{</span></span><span class="org-constant">solid_i</span><span class="org-constant"><span class="org-rainbow-delimiters-depth-2">}</span></span><span class="org-constant"><span class="org-rainbow-delimiters-depth-1">)</span></span>
|
||
|
plot<span class="org-rainbow-delimiters-depth-1">(</span>freqs, abs<span class="org-rainbow-delimiters-depth-2">(</span>squeeze<span class="org-rainbow-delimiters-depth-3">(</span>FRFs<span class="org-rainbow-delimiters-depth-4">(</span>acc_dir<span class="org-type">+</span><span class="org-highlight-numbers-number">3</span><span class="org-type">*</span><span class="org-rainbow-delimiters-depth-5">(</span><span class="org-constant">i</span><span class="org-type">-</span><span class="org-highlight-numbers-number">1</span><span class="org-rainbow-delimiters-depth-5">)</span>, exc_dir, <span class="org-type">:</span><span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>;
|
||
|
<span class="org-keyword">end</span>
|
||
|
plot<span class="org-rainbow-delimiters-depth-1">(</span>freqs, abs<span class="org-rainbow-delimiters-depth-2">(</span>squeeze<span class="org-rainbow-delimiters-depth-3">(</span>FRFs_O<span class="org-rainbow-delimiters-depth-4">(</span><span class="org-rainbow-delimiters-depth-5">(</span>solid_i<span class="org-type">-</span><span class="org-highlight-numbers-number">1</span><span class="org-rainbow-delimiters-depth-5">)</span><span class="org-type">*</span><span class="org-highlight-numbers-number">6</span><span class="org-type">+</span>acc_dir_O, exc_dir, <span class="org-type">:</span><span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>, <span class="org-string">'-k'</span><span class="org-rainbow-delimiters-depth-1">)</span>;
|
||
|
hold off;
|
||
|
<span class="org-type">set</span><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-variable-name">gca</span>, <span class="org-string">'XScale', 'log'</span><span class="org-string"><span class="org-rainbow-delimiters-depth-1">)</span></span><span class="org-string">; set</span><span class="org-string"><span class="org-rainbow-delimiters-depth-1">(</span></span><span class="org-string">gca, 'YScale', 'log'</span><span class="org-rainbow-delimiters-depth-1">)</span>;
|
||
|
<span class="org-type">set</span><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-variable-name">gca</span>, <span class="org-string">'XTickLabel'</span>,<span class="org-rainbow-delimiters-depth-2">[]</span><span class="org-rainbow-delimiters-depth-1">)</span>;
|
||
|
ylabel<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-string">'Amplitude'</span><span class="org-rainbow-delimiters-depth-1">)</span>;
|
||
|
title<span class="org-rainbow-delimiters-depth-1">(</span>sprintf<span class="org-rainbow-delimiters-depth-2">(</span><span class="org-string">'%s motion measured by the Acc. vs %s motion computed in the common frame - %s'</span>, dir_names{acc_dir}, dir_names{acc_dir_O}, solid_names{solid_i}));
|
||
|
|
||
|
ax2 = subplot<span class="org-rainbow-delimiters-depth-3">(</span><span class="org-highlight-numbers-number">2</span>, <span class="org-highlight-numbers-number">1</span>, <span class="org-highlight-numbers-number">2</span><span class="org-rainbow-delimiters-depth-3">)</span>;
|
||
|
hold on;
|
||
|
<span class="org-keyword">for</span> <span class="org-variable-name">i</span> = <span class="org-constant">solids.</span><span class="org-constant"><span class="org-rainbow-delimiters-depth-3">(</span></span><span class="org-constant">solid_names</span><span class="org-constant"><span class="org-rainbow-delimiters-depth-4">{</span></span><span class="org-constant">solid_i</span><span class="org-constant"><span class="org-rainbow-delimiters-depth-4">}</span></span><span class="org-constant"><span class="org-rainbow-delimiters-depth-3">)</span></span>
|
||
|
plot<span class="org-rainbow-delimiters-depth-3">(</span>freqs, mod<span class="org-rainbow-delimiters-depth-4">(</span><span class="org-highlight-numbers-number">180</span><span class="org-type">+</span><span class="org-highlight-numbers-number">180</span><span class="org-type">/</span><span class="org-constant">pi</span><span class="org-type">*</span>phase<span class="org-rainbow-delimiters-depth-5">(</span>squeeze<span class="org-rainbow-delimiters-depth-6">(</span>FRFs<span class="org-rainbow-delimiters-depth-7">(</span>acc_dir<span class="org-type">+</span><span class="org-highlight-numbers-number">3</span><span class="org-type">*</span><span class="org-rainbow-delimiters-depth-8">(</span><span class="org-constant">i</span><span class="org-type">-</span><span class="org-highlight-numbers-number">1</span><span class="org-rainbow-delimiters-depth-8">)</span>, exc_dir, <span class="org-type">:</span><span class="org-rainbow-delimiters-depth-7">)</span><span class="org-rainbow-delimiters-depth-6">)</span><span class="org-rainbow-delimiters-depth-5">)</span>, <span class="org-highlight-numbers-number">360</span><span class="org-rainbow-delimiters-depth-4">)</span><span class="org-type">-</span><span class="org-highlight-numbers-number">180</span><span class="org-rainbow-delimiters-depth-3">)</span>;
|
||
|
<span class="org-keyword">end</span>
|
||
|
plot<span class="org-rainbow-delimiters-depth-3">(</span>freqs, mod<span class="org-rainbow-delimiters-depth-4">(</span><span class="org-highlight-numbers-number">180</span><span class="org-type">+</span><span class="org-highlight-numbers-number">180</span><span class="org-type">/</span><span class="org-constant">pi</span><span class="org-type">*</span>phase<span class="org-rainbow-delimiters-depth-5">(</span>squeeze<span class="org-rainbow-delimiters-depth-6">(</span>FRFs_O<span class="org-rainbow-delimiters-depth-7">(</span><span class="org-rainbow-delimiters-depth-8">(</span>solid_i<span class="org-type">-</span><span class="org-highlight-numbers-number">1</span><span class="org-rainbow-delimiters-depth-8">)</span><span class="org-type">*</span><span class="org-highlight-numbers-number">6</span><span class="org-type">+</span>acc_dir_O, exc_dir, <span class="org-type">:</span><span class="org-rainbow-delimiters-depth-7">)</span><span class="org-rainbow-delimiters-depth-6">)</span><span class="org-rainbow-delimiters-depth-5">)</span>, <span class="org-highlight-numbers-number">360</span><span class="org-rainbow-delimiters-depth-4">)</span><span class="org-type">-</span><span class="org-highlight-numbers-number">180</span>, <span class="org-string">'-k'</span><span class="org-rainbow-delimiters-depth-3">)</span>;
|
||
|
hold off;
|
||
|
ylim<span class="org-rainbow-delimiters-depth-3">(</span><span class="org-rainbow-delimiters-depth-4">[</span><span class="org-type">-</span><span class="org-highlight-numbers-number">180</span>, <span class="org-highlight-numbers-number">180</span><span class="org-rainbow-delimiters-depth-4">]</span><span class="org-rainbow-delimiters-depth-3">)</span>; yticks<span class="org-rainbow-delimiters-depth-3">(</span><span class="org-type">-</span><span class="org-highlight-numbers-number">180</span><span class="org-type">:</span><span class="org-highlight-numbers-number">90</span><span class="org-type">:</span><span class="org-highlight-numbers-number">180</span><span class="org-rainbow-delimiters-depth-3">)</span>;
|
||
|
xlabel<span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">'Frequency </span><span class="org-string"><span class="org-rainbow-delimiters-depth-4">[</span></span><span class="org-string">Hz</span><span class="org-string"><span class="org-rainbow-delimiters-depth-4">]</span></span><span class="org-string">'</span><span class="org-string"><span class="org-rainbow-delimiters-depth-3">)</span></span><span class="org-string">; ylabel</span><span class="org-string"><span class="org-rainbow-delimiters-depth-3">(</span></span><span class="org-string">'Phase </span><span class="org-string"><span class="org-rainbow-delimiters-depth-4">[</span></span><span class="org-string">deg</span><span class="org-string"><span class="org-rainbow-delimiters-depth-4">]</span></span><span class="org-string">'</span><span class="org-rainbow-delimiters-depth-3">)</span>;
|
||
|
<span class="org-type">set</span><span class="org-rainbow-delimiters-depth-3">(</span><span class="org-variable-name">gca</span>, <span class="org-string">'xscale', 'log'</span><span class="org-rainbow-delimiters-depth-3">)</span>;
|
||
|
|
||
|
linkaxes<span class="org-rainbow-delimiters-depth-3">(</span><span class="org-rainbow-delimiters-depth-4">[</span>ax1,ax2<span class="org-rainbow-delimiters-depth-4">]</span>,<span class="org-string">'x'</span><span class="org-rainbow-delimiters-depth-3">)</span>;
|
||
|
xlim<span class="org-rainbow-delimiters-depth-3">(</span><span class="org-rainbow-delimiters-depth-4">[</span><span class="org-highlight-numbers-number">1</span>, <span class="org-highlight-numbers-number">200</span><span class="org-rainbow-delimiters-depth-4">]</span><span class="org-rainbow-delimiters-depth-3">)</span>;
|
||
|
</pre>
|
||
|
</div>
|
||
|
</div>
|
||
|
</div>
|
||
|
|
||
|
<div id="outline-container-org45fdd6c" class="outline-2">
|
||
|
<h2 id="org45fdd6c"><span class="section-number-2">9</span> Verify that we find the original FRF from the FRF in the global coordinates</h2>
|
||
|
<div class="outline-text-2" id="text-9">
|
||
|
<p>
|
||
|
We have computed the Frequency Response Functions Matrix <code>FRFs_O</code> representing the response of the 6 solid bodies in their 6 DOFs.
|
||
|
</p>
|
||
|
|
||
|
<p>
|
||
|
From the response of one body in its 6 DOFs, we should be able to compute the FRF of each of its accelerometer fixed to it during the measurement.
|
||
|
</p>
|
||
|
|
||
|
<p>
|
||
|
We can then compare the result with the original measurements.
|
||
|
This will help us to determine if:
|
||
|
</p>
|
||
|
<ul class="org-ul">
|
||
|
<li>the previous inversion used is correct</li>
|
||
|
<li>the solid body assumption is correct in the frequency band of interest</li>
|
||
|
</ul>
|
||
|
|
||
|
<div class="org-src-container">
|
||
|
<pre class="src src-matlab">FRF_recovered = zeros<span class="org-rainbow-delimiters-depth-1">(</span>size<span class="org-rainbow-delimiters-depth-2">(</span>FRFs<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>;
|
||
|
|
||
|
<span class="org-comment">% For each excitation direction</span>
|
||
|
<span class="org-keyword">for</span> <span class="org-variable-name">exc_dir</span> = <span class="org-constant"><span class="org-highlight-numbers-number">1</span></span><span class="org-constant">:</span><span class="org-constant"><span class="org-highlight-numbers-number">3</span></span>
|
||
|
<span class="org-comment">% For each solid</span>
|
||
|
<span class="org-keyword">for</span> <span class="org-variable-name">solid_i</span> = <span class="org-constant"><span class="org-highlight-numbers-number">1</span></span><span class="org-constant">:length</span><span class="org-constant"><span class="org-rainbow-delimiters-depth-1">(</span></span><span class="org-constant">solid_names</span><span class="org-constant"><span class="org-rainbow-delimiters-depth-1">)</span></span>
|
||
|
v0 = squeeze<span class="org-rainbow-delimiters-depth-1">(</span>FRFs_O<span class="org-rainbow-delimiters-depth-2">(</span><span class="org-rainbow-delimiters-depth-3">(</span>solid_i<span class="org-type">-</span><span class="org-highlight-numbers-number">1</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-type">*</span><span class="org-highlight-numbers-number">6</span><span class="org-type">+</span><span class="org-highlight-numbers-number">1</span><span class="org-type">:</span><span class="org-rainbow-delimiters-depth-3">(</span>solid_i<span class="org-type">-</span><span class="org-highlight-numbers-number">1</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-type">*</span><span class="org-highlight-numbers-number">6</span><span class="org-type">+</span><span class="org-highlight-numbers-number">3</span>, exc_dir, <span class="org-type">:</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>;
|
||
|
W0 = squeeze<span class="org-rainbow-delimiters-depth-1">(</span>FRFs_O<span class="org-rainbow-delimiters-depth-2">(</span><span class="org-rainbow-delimiters-depth-3">(</span>solid_i<span class="org-type">-</span><span class="org-highlight-numbers-number">1</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-type">*</span><span class="org-highlight-numbers-number">6</span><span class="org-type">+</span><span class="org-highlight-numbers-number">4</span><span class="org-type">:</span><span class="org-rainbow-delimiters-depth-3">(</span>solid_i<span class="org-type">-</span><span class="org-highlight-numbers-number">1</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-type">*</span><span class="org-highlight-numbers-number">6</span><span class="org-type">+</span><span class="org-highlight-numbers-number">6</span>, exc_dir, <span class="org-type">:</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>;
|
||
|
|
||
|
<span class="org-comment">% For each accelerometer attached to the current solid</span>
|
||
|
<span class="org-keyword">for</span> <span class="org-variable-name">acc_i</span> = <span class="org-constant">solids.</span><span class="org-constant"><span class="org-rainbow-delimiters-depth-1">(</span></span><span class="org-constant">solid_names</span><span class="org-constant"><span class="org-rainbow-delimiters-depth-2">{</span></span><span class="org-constant">solid_i</span><span class="org-constant"><span class="org-rainbow-delimiters-depth-2">}</span></span><span class="org-constant"><span class="org-rainbow-delimiters-depth-1">)</span></span>
|
||
|
<span class="org-comment">% We get the position of the accelerometer expressed in frame O</span>
|
||
|
pos = acc_pos<span class="org-rainbow-delimiters-depth-1">(</span>acc_i, <span class="org-type">:</span><span class="org-rainbow-delimiters-depth-1">)</span>';
|
||
|
posX = <span class="org-rainbow-delimiters-depth-1">[</span><span class="org-highlight-numbers-number">0</span> pos<span class="org-rainbow-delimiters-depth-2">(</span><span class="org-highlight-numbers-number">3</span><span class="org-rainbow-delimiters-depth-2">)</span> <span class="org-type">-</span>pos<span class="org-rainbow-delimiters-depth-2">(</span><span class="org-highlight-numbers-number">2</span><span class="org-rainbow-delimiters-depth-2">)</span>; <span class="org-type">-</span>pos<span class="org-rainbow-delimiters-depth-2">(</span><span class="org-highlight-numbers-number">3</span><span class="org-rainbow-delimiters-depth-2">)</span> <span class="org-highlight-numbers-number">0</span> pos<span class="org-rainbow-delimiters-depth-2">(</span><span class="org-highlight-numbers-number">1</span><span class="org-rainbow-delimiters-depth-2">)</span> ; pos<span class="org-rainbow-delimiters-depth-2">(</span><span class="org-highlight-numbers-number">2</span><span class="org-rainbow-delimiters-depth-2">)</span> <span class="org-type">-</span>pos<span class="org-rainbow-delimiters-depth-2">(</span><span class="org-highlight-numbers-number">1</span><span class="org-rainbow-delimiters-depth-2">)</span> <span class="org-highlight-numbers-number">0</span><span class="org-rainbow-delimiters-depth-1">]</span>;
|
||
|
<span class="org-rainbow-delimiters-depth-1">[</span><span class="org-highlight-numbers-number">0</span> acc_pos<span class="org-rainbow-delimiters-depth-2">(</span><span class="org-constant">i</span>, <span class="org-highlight-numbers-number">3</span><span class="org-rainbow-delimiters-depth-2">)</span> <span class="org-type">-</span>acc_pos<span class="org-rainbow-delimiters-depth-2">(</span><span class="org-constant">i</span>, <span class="org-highlight-numbers-number">2</span><span class="org-rainbow-delimiters-depth-2">)</span> ; <span class="org-type">-</span>acc_pos<span class="org-rainbow-delimiters-depth-2">(</span><span class="org-constant">i</span>, <span class="org-highlight-numbers-number">3</span><span class="org-rainbow-delimiters-depth-2">)</span> <span class="org-highlight-numbers-number">0</span> acc_pos<span class="org-rainbow-delimiters-depth-2">(</span><span class="org-constant">i</span>, <span class="org-highlight-numbers-number">1</span><span class="org-rainbow-delimiters-depth-2">)</span> ; acc_pos<span class="org-rainbow-delimiters-depth-2">(</span><span class="org-constant">i</span>, <span class="org-highlight-numbers-number">2</span><span class="org-rainbow-delimiters-depth-2">)</span> <span class="org-type">-</span>acc_pos<span class="org-rainbow-delimiters-depth-2">(</span><span class="org-constant">i</span>, <span class="org-highlight-numbers-number">1</span><span class="org-rainbow-delimiters-depth-2">)</span> <span class="org-highlight-numbers-number">0</span><span class="org-rainbow-delimiters-depth-1">]</span>
|
||
|
|
||
|
FRF_recovered<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-highlight-numbers-number">3</span><span class="org-type">*</span><span class="org-rainbow-delimiters-depth-2">(</span>acc_i<span class="org-type">-</span><span class="org-highlight-numbers-number">1</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-type">+</span><span class="org-highlight-numbers-number">1</span><span class="org-type">:</span><span class="org-highlight-numbers-number">3</span><span class="org-type">*</span><span class="org-rainbow-delimiters-depth-2">(</span>acc_i<span class="org-type">-</span><span class="org-highlight-numbers-number">1</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-type">+</span><span class="org-highlight-numbers-number">3</span>, exc_dir, <span class="org-type">:</span><span class="org-rainbow-delimiters-depth-1">)</span> = v0 <span class="org-type">+</span> posX<span class="org-type">*</span>W0;
|
||
|
<span class="org-keyword">end</span>
|
||
|
<span class="org-keyword">end</span>
|
||
|
<span class="org-keyword">end</span>
|
||
|
</pre>
|
||
|
</div>
|
||
|
|
||
|
<p>
|
||
|
We then compare the original FRF measured for each accelerometer with the recovered FRF from the global FRF matrix in the common frame.
|
||
|
</p>
|
||
|
|
||
|
<p>
|
||
|
The FRF for the 4 accelerometers on the Hexapod are compared on figure <a href="#orgdf7e1b1">5</a>.
|
||
|
All the FRF are matching very well in all the frequency range displayed.
|
||
|
</p>
|
||
|
|
||
|
<p>
|
||
|
The FRF for accelerometers located on the translation stage are compared on figure <a href="#orgc07a0c4">6</a>.
|
||
|
The FRF are matching well until 100Hz.
|
||
|
</p>
|
||
|
|
||
|
|
||
|
<div id="orgdf7e1b1" class="figure">
|
||
|
<p><img src="figs/recovered_frf_comparison_hexa.png" alt="recovered_frf_comparison_hexa.png" />
|
||
|
</p>
|
||
|
<p><span class="figure-number">Figure 5: </span>Comparison of the original FRF with the recovered ones - Hexapod</p>
|
||
|
</div>
|
||
|
|
||
|
|
||
|
<div id="orgc07a0c4" class="figure">
|
||
|
<p><img src="figs/recovered_frf_comparison_ty.png" alt="recovered_frf_comparison_ty.png" />
|
||
|
</p>
|
||
|
<p><span class="figure-number">Figure 6: </span>Comparison of the original FRF with the recovered ones - Ty</p>
|
||
|
</div>
|
||
|
|
||
|
|
||
|
<div class="important">
|
||
|
<p>
|
||
|
The reduction of the number of degrees of freedom from 69 (23 accelerometers with each 3DOF) to 36 (6 solid bodies with 6 DOF) seems to work well.
|
||
|
</p>
|
||
|
|
||
|
<p>
|
||
|
This confirms the fact that the stages are indeed behaving as a solid body in the frequency band of interest.
|
||
|
This valid the fact that a multi-body model can be used to represent the dynamics of the micro-station.
|
||
|
</p>
|
||
|
|
||
|
</div>
|
||
|
</div>
|
||
|
</div>
|
||
|
</div>
|
||
|
<div id="postamble" class="status">
|
||
|
<p class="author">Author: Dehaeze Thomas</p>
|
||
|
<p class="date">Created: 2019-07-05 ven. 10:16</p>
|
||
|
<p class="validation"><a href="http://validator.w3.org/check?uri=referer">Validate</a></p>
|
||
|
</div>
|
||
|
</body>
|
||
|
</html>
|