1829 lines
92 KiB
HTML
1829 lines
92 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-02-02 mar. 18:53 -->
|
||
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
|
||
<title>Sensor Fusion - Test Bench</title>
|
||
<meta name="generator" content="Org mode" />
|
||
<meta name="author" content="Dehaeze Thomas" />
|
||
<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="content">
|
||
<h1 class="title">Sensor Fusion - Test Bench</h1>
|
||
<div id="table-of-contents">
|
||
<h2>Table of Contents</h2>
|
||
<div id="text-table-of-contents">
|
||
<ul>
|
||
<li><a href="#org9154fb5">1. Experimental Setup</a></li>
|
||
<li><a href="#org22ccef0">2. First identification of the system</a>
|
||
<ul>
|
||
<li><a href="#orga102414">2.1. Load Data</a></li>
|
||
<li><a href="#org2f24a86">2.2. Excitation Signal</a></li>
|
||
<li><a href="#org57f658f">2.3. Identified Plant</a></li>
|
||
<li><a href="#org0d832f8">2.4. Simscape Model - Comparison</a></li>
|
||
<li><a href="#orgb9d80c9">2.5. Integral Force Feedback</a></li>
|
||
<li><a href="#org74fa50a">2.6. Inertial Sensors</a></li>
|
||
</ul>
|
||
</li>
|
||
<li><a href="#orgf52e5c8">3. Optimal IFF Development</a>
|
||
<ul>
|
||
<li><a href="#org84db43d">3.1. Load Data</a></li>
|
||
<li><a href="#org8224124">3.2. Experimental Data</a></li>
|
||
<li><a href="#org0d2f2b4">3.3. Model of the IFF Plant</a></li>
|
||
<li><a href="#org74e01b3">3.4. Root Locus and optimal Controller</a></li>
|
||
<li><a href="#org94b17f4">3.5. Verification of the achievable damping</a></li>
|
||
</ul>
|
||
</li>
|
||
<li><a href="#orgfae8d1a">4. Generate the excitation signal</a>
|
||
<ul>
|
||
<li><a href="#org470c9d5">4.1. Transfer function from excitation signal to displacement</a></li>
|
||
<li><a href="#org065774d">4.2. Motion measured during Huddle test</a></li>
|
||
</ul>
|
||
</li>
|
||
<li><a href="#org00c3462">5. Identification of the Inertial Sensors Dynamics</a>
|
||
<ul>
|
||
<li><a href="#orgc51ddfc">5.1. Load Data</a></li>
|
||
<li><a href="#org567be9d">5.2. Compare PSD during Huddle and and during identification</a></li>
|
||
<li><a href="#org79fc1c9">5.3. Compute transfer functions</a></li>
|
||
</ul>
|
||
</li>
|
||
<li><a href="#orge9bf4b9">6. Inertial Sensor Noise and the \(\mathcal{H}_2\) Synthesis of complementary filters</a>
|
||
<ul>
|
||
<li><a href="#org23d9265">6.1. Load Data</a></li>
|
||
<li><a href="#org6b88428">6.2. ASD of the Measured displacement</a></li>
|
||
<li><a href="#orgc6ed38c">6.3. ASD of the Sensor Noise</a></li>
|
||
<li><a href="#orge7b920f">6.4. Noise Model</a></li>
|
||
<li><a href="#org0488b1a">6.5. \(\mathcal{H}_2\) Synthesis of the Complementary Filters</a></li>
|
||
<li><a href="#org3cfa936">6.6. Results</a></li>
|
||
</ul>
|
||
</li>
|
||
<li><a href="#org7aef41f">7. Inertial Sensor Dynamics Uncertainty and the \(\mathcal{H}_\infty\) Synthesis of complementary filters</a>
|
||
<ul>
|
||
<li><a href="#org4935bc2">7.1. Load Data</a></li>
|
||
<li><a href="#org2e2b552">7.2. Compute the dynamics of both sensors</a></li>
|
||
<li><a href="#orgd9c0615">7.3. Dynamics uncertainty estimation</a></li>
|
||
<li><a href="#org9927374">7.4. \(\mathcal{H}_\infty\) Synthesis of Complementary Filters</a></li>
|
||
<li><a href="#org1a848c4">7.5. Obtained Super Sensor Dynamical Uncertainty</a></li>
|
||
</ul>
|
||
</li>
|
||
<li><a href="#org8fd3dbf">8. Optimal and Robust sensor fusion using the \(\mathcal{H}_2/\mathcal{H}_\infty\) synthesis</a>
|
||
<ul>
|
||
<li><a href="#org81bcb28">8.1. Noise and Dynamical uncertainty weights</a></li>
|
||
<li><a href="#org74f7865">8.2. Obtained Super Sensor Noise</a></li>
|
||
<li><a href="#org2dc3d6d">8.3. Obtained Super Sensor Dynamical Uncertainty</a></li>
|
||
<li><a href="#org580eeef">8.4. Experimental Super Sensor Dynamical Uncertainty</a></li>
|
||
<li><a href="#orgc907798">8.5. Experimental Super Sensor Noise</a></li>
|
||
</ul>
|
||
</li>
|
||
<li><a href="#org47873a7">9. Matlab Functions</a>
|
||
<ul>
|
||
<li><a href="#orgc94c293">9.1. <code>createWeight</code></a></li>
|
||
<li><a href="#orgac520ac">9.2. <code>plotMagUncertainty</code></a></li>
|
||
<li><a href="#orgf15effe">9.3. <code>plotPhaseUncertainty</code></a></li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
<hr>
|
||
<p>This report is also available as a <a href="./test-bench-sensor-fusion.pdf">pdf</a>.</p>
|
||
<hr>
|
||
|
||
<p>
|
||
In this document, we wish the experimentally validate sensor fusion of inertial sensors.
|
||
</p>
|
||
|
||
<p>
|
||
This document is divided into the following sections:
|
||
</p>
|
||
<ul class="org-ul">
|
||
<li>Section <a href="#org3d27308">1</a>: the experimental setup is described</li>
|
||
<li>Section <a href="#org69076fb">2</a>: a first identification of the system dynamics is performed</li>
|
||
<li>Section <a href="#orgf008644">3</a>: the integral force feedback active damping technique is applied on the system</li>
|
||
<li>Section <a href="#org0f76ddc">4</a>: the optimal excitation signal is determine in order to have the best possible system dynamics estimation</li>
|
||
<li>Section <a href="#org837e5d1">5</a>: the inertial sensor dynamics are experimentally estimated</li>
|
||
<li>Section <a href="#orgc9ebefd">6</a>: the inertial sensor noises are estimated and the \(\mathcal{H}_2\) synthesis of complementary filters is performed in order to yield a super sensor with minimal noise</li>
|
||
<li>Section <a href="#orgca64b78">7</a>: the dynamical uncertainty of the inertial sensors is estimated. Then the \(\mathcal{H}_\infty\) synthesis of complementary filters is performed in order to minimize the super sensor dynamical uncertainty</li>
|
||
<li>Section <a href="#org3d37653">8</a>: Optimal sensor fusion is performed using the \(\mathcal{H}_2/\mathcal{H}_\infty\) synthesis</li>
|
||
</ul>
|
||
|
||
<div id="outline-container-org9154fb5" class="outline-2">
|
||
<h2 id="org9154fb5"><span class="section-number-2">1</span> Experimental Setup</h2>
|
||
<div class="outline-text-2" id="text-1">
|
||
<p>
|
||
<a id="org3d27308"></a>
|
||
</p>
|
||
|
||
<p>
|
||
The goal of this experimental setup is to experimentally merge inertial sensors.
|
||
To merge the sensors, optimal and robust complementary filters are designed.
|
||
</p>
|
||
|
||
<p>
|
||
A schematic of the test-bench used is shown in Figure <a href="#orga032475">1</a> and a picture of it is shown in Figure <a href="#orgd6f5b36">2</a>.
|
||
</p>
|
||
|
||
|
||
<div id="orga032475" class="figure">
|
||
<p><img src="figs/exp_setup_sensor_fusion.png" alt="exp_setup_sensor_fusion.png" />
|
||
</p>
|
||
<p><span class="figure-number">Figure 1: </span>Schematic of the test-bench</p>
|
||
</div>
|
||
|
||
|
||
<div id="orgd6f5b36" class="figure">
|
||
<p><img src="figs/test-bench-sensor-fusion-picture.png" alt="test-bench-sensor-fusion-picture.png" />
|
||
</p>
|
||
<p><span class="figure-number">Figure 2: </span>Picture of the test-bench</p>
|
||
</div>
|
||
|
||
|
||
<p>
|
||
Two inertial sensors are used:
|
||
</p>
|
||
<ul class="org-ul">
|
||
<li>An vertical accelerometer <i>PCB 393B05</i> (<a href="doc/TM-VIB-Seismic_Lowres.pdf">doc</a>)</li>
|
||
<li>A vertical geophone <i>Mark Product L-22</i></li>
|
||
</ul>
|
||
|
||
<p>
|
||
Basic characteristics of both sensors are shown in Tables <a href="#org5cbc16d">1</a> and <a href="#orgeb20955">2</a>.
|
||
</p>
|
||
|
||
<table id="org5cbc16d" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
|
||
<caption class="t-above"><span class="table-number">Table 1:</span> Accelerometer (393B05) Specifications</caption>
|
||
|
||
<colgroup>
|
||
<col class="org-left" />
|
||
|
||
<col class="org-left" />
|
||
</colgroup>
|
||
<thead>
|
||
<tr>
|
||
<th scope="col" class="org-left"><b>Specification</b></th>
|
||
<th scope="col" class="org-left"><b>Value</b></th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td class="org-left">Sensitivity</td>
|
||
<td class="org-left">1.02 [V/(m/s2)]</td>
|
||
</tr>
|
||
|
||
<tr>
|
||
<td class="org-left">Resonant Frequency</td>
|
||
<td class="org-left">> 2.5 [kHz]</td>
|
||
</tr>
|
||
|
||
<tr>
|
||
<td class="org-left">Resolution (1 to 10kHz)</td>
|
||
<td class="org-left">0.00004 [m/s2 rms]</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
|
||
<table id="orgeb20955" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
|
||
<caption class="t-above"><span class="table-number">Table 2:</span> Geophone (L22) Specifications</caption>
|
||
|
||
<colgroup>
|
||
<col class="org-left" />
|
||
|
||
<col class="org-left" />
|
||
</colgroup>
|
||
<thead>
|
||
<tr>
|
||
<th scope="col" class="org-left"><b>Specification</b></th>
|
||
<th scope="col" class="org-left"><b>Value</b></th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td class="org-left">Sensitivity</td>
|
||
<td class="org-left">To be measured [V/(m/s)]</td>
|
||
</tr>
|
||
|
||
<tr>
|
||
<td class="org-left">Resonant Frequency</td>
|
||
<td class="org-left">2 [Hz]</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
|
||
<p>
|
||
The ADC used are the IO131 Speedgoat module (<a href="https://www.speedgoat.com/products/io-connectivity-analog-io131">link</a>) with a 16bit resolution over +/- 10V.
|
||
</p>
|
||
|
||
<p>
|
||
The geophone signals are amplified using a DLPVA-100-B-D voltage amplified from Femto (<a href="doc/de-dlpva-100-b.pdf">doc</a>).
|
||
The force sensor signal is amplified using a Low Noise Voltage Preamplifier from Ametek (<a href="doc/model_5113.pdf">doc</a>).
|
||
</p>
|
||
|
||
<p>
|
||
The excitation signal is amplified by a linear amplified from Cedrat (LA75B) with a gain equals to 20 (<a href="doc/LA75B.pdf">doc</a>).
|
||
</p>
|
||
|
||
<p>
|
||
Geophone electronics:
|
||
</p>
|
||
<ul class="org-ul">
|
||
<li>gain: 10 (20dB)</li>
|
||
<li>low pass filter: 1.5Hz</li>
|
||
<li>hifh pass filter: 100kHz (2nd order)</li>
|
||
</ul>
|
||
|
||
<p>
|
||
Force Sensor electronics:
|
||
</p>
|
||
<ul class="org-ul">
|
||
<li>gain: 10 (20dB)</li>
|
||
<li>low pass filter: 1st order at 3Hz</li>
|
||
<li>high pass filter: 1st order at 30kHz</li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
|
||
<div id="outline-container-org22ccef0" class="outline-2">
|
||
<h2 id="org22ccef0"><span class="section-number-2">2</span> First identification of the system</h2>
|
||
<div class="outline-text-2" id="text-2">
|
||
<p>
|
||
<a id="org69076fb"></a>
|
||
</p>
|
||
<p>
|
||
In this section, a first identification of each elements of the system is performed.
|
||
This include the dynamics from the actuator to the force sensor, interferometer and inertial sensors.
|
||
</p>
|
||
|
||
<p>
|
||
Each of the dynamics is compared with the dynamics identified form a Simscape model.
|
||
</p>
|
||
</div>
|
||
<div id="outline-container-orga102414" class="outline-3">
|
||
<h3 id="orga102414"><span class="section-number-3">2.1</span> Load Data</h3>
|
||
<div class="outline-text-3" id="text-2-1">
|
||
<p>
|
||
The data is loaded in the Matlab workspace.
|
||
</p>
|
||
<div class="org-src-container">
|
||
<pre class="src src-matlab"> id_ol = load(<span class="org-string">'identification_noise_bis.mat'</span>, <span class="org-string">'d'</span>, <span class="org-string">'acc_1'</span>, <span class="org-string">'acc_2'</span>, <span class="org-string">'geo_1'</span>, <span class="org-string">'geo_2'</span>, <span class="org-string">'f_meas'</span>, <span class="org-string">'u'</span>, <span class="org-string">'t'</span>);
|
||
</pre>
|
||
</div>
|
||
|
||
<p>
|
||
Then, any offset is removed.
|
||
</p>
|
||
<div class="org-src-container">
|
||
<pre class="src src-matlab"> id_ol.d = detrend(id_ol.d, 0);
|
||
id_ol.acc_1 = detrend(id_ol.acc_1, 0);
|
||
id_ol.acc_2 = detrend(id_ol.acc_2, 0);
|
||
id_ol.geo_1 = detrend(id_ol.geo_1, 0);
|
||
id_ol.geo_2 = detrend(id_ol.geo_2, 0);
|
||
id_ol.f_meas = detrend(id_ol.f_meas, 0);
|
||
id_ol.u = detrend(id_ol.u, 0);
|
||
</pre>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div id="outline-container-org2f24a86" class="outline-3">
|
||
<h3 id="org2f24a86"><span class="section-number-3">2.2</span> Excitation Signal</h3>
|
||
<div class="outline-text-3" id="text-2-2">
|
||
<p>
|
||
The generated voltage used to excite the system is a white noise and can be seen in Figure <a href="#org07ec004">3</a>.
|
||
</p>
|
||
|
||
|
||
<div id="org07ec004" class="figure">
|
||
<p><img src="figs/excitation_signal_first_identification.png" alt="excitation_signal_first_identification.png" />
|
||
</p>
|
||
<p><span class="figure-number">Figure 3: </span>Voltage excitation signal</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div id="outline-container-org57f658f" class="outline-3">
|
||
<h3 id="org57f658f"><span class="section-number-3">2.3</span> Identified Plant</h3>
|
||
<div class="outline-text-3" id="text-2-3">
|
||
<p>
|
||
The transfer function from the excitation voltage to the mass displacement and to the force sensor stack voltage are identified using the <code>tfestimate</code> command.
|
||
</p>
|
||
|
||
<div class="org-src-container">
|
||
<pre class="src src-matlab"> Ts = id_ol.t(2) <span class="org-type">-</span> id_ol.t(1);
|
||
win = hann(ceil(10<span class="org-type">/</span>Ts));
|
||
</pre>
|
||
</div>
|
||
|
||
<div class="org-src-container">
|
||
<pre class="src src-matlab"> [tf_fmeas_est, f] = tfestimate(id_ol.u, id_ol.f_meas, win, [], [], 1<span class="org-type">/</span>Ts); <span class="org-comment">% [V/V]</span>
|
||
[tf_G_ol_est, <span class="org-type">~</span>] = tfestimate(id_ol.u, id_ol.d, win, [], [], 1<span class="org-type">/</span>Ts); <span class="org-comment">% [m/V]</span>
|
||
</pre>
|
||
</div>
|
||
|
||
<p>
|
||
The bode plots of the obtained dynamics are shown in Figures <a href="#org3ccf70f">4</a> and <a href="#orgec7a152">5</a>.
|
||
</p>
|
||
|
||
|
||
<div id="org3ccf70f" class="figure">
|
||
<p><img src="figs/force_sensor_bode_plot.png" alt="force_sensor_bode_plot.png" />
|
||
</p>
|
||
<p><span class="figure-number">Figure 4: </span>Bode plot of the dynamics from excitation voltage to measured force sensor stack voltage</p>
|
||
</div>
|
||
|
||
|
||
<div id="orgec7a152" class="figure">
|
||
<p><img src="figs/displacement_sensor_bode_plot.png" alt="displacement_sensor_bode_plot.png" />
|
||
</p>
|
||
<p><span class="figure-number">Figure 5: </span>Bode plot of the dynamics from excitation voltage to displacement of the mass as measured by the interferometer</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div id="outline-container-org0d832f8" class="outline-3">
|
||
<h3 id="org0d832f8"><span class="section-number-3">2.4</span> Simscape Model - Comparison</h3>
|
||
<div class="outline-text-3" id="text-2-4">
|
||
<p>
|
||
A simscape model representing the test-bench has been developed.
|
||
The same transfer functions as the one identified using the test-bench can be obtained thanks to the simscape model.
|
||
</p>
|
||
|
||
<p>
|
||
They are compared in Figure <a href="#org07bf4ae">6</a> and <a href="#orgd70240a">7</a>.
|
||
It is shown that there is a good agreement between the model and the experiment.
|
||
</p>
|
||
|
||
<div class="org-src-container">
|
||
<pre class="src src-matlab"> load(<span class="org-string">'piezo_amplified_3d.mat'</span>, <span class="org-string">'int_xyz'</span>, <span class="org-string">'int_i'</span>, <span class="org-string">'n_xyz'</span>, <span class="org-string">'n_i'</span>, <span class="org-string">'nodes'</span>, <span class="org-string">'M'</span>, <span class="org-string">'K'</span>);
|
||
</pre>
|
||
</div>
|
||
|
||
|
||
<div id="org07bf4ae" class="figure">
|
||
<p><img src="figs/simscape_comp_iff_plant.png" alt="simscape_comp_iff_plant.png" />
|
||
</p>
|
||
<p><span class="figure-number">Figure 6: </span>Comparison of the dynamics from excitation voltage to measured force sensor stack voltage - Identified dynamics and Simscape Model</p>
|
||
</div>
|
||
|
||
|
||
<div id="orgd70240a" class="figure">
|
||
<p><img src="figs/simscape_comp_disp_plant.png" alt="simscape_comp_disp_plant.png" />
|
||
</p>
|
||
<p><span class="figure-number">Figure 7: </span>Comparison of the dynamics from excitation voltage to measured mass displacement - Identified dynamics and Simscape Model</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div id="outline-container-orgb9d80c9" class="outline-3">
|
||
<h3 id="orgb9d80c9"><span class="section-number-3">2.5</span> Integral Force Feedback</h3>
|
||
<div class="outline-text-3" id="text-2-5">
|
||
<p>
|
||
The force sensor stack can be used to damp the system.
|
||
This makes the system easier to excite properly without too much amplification near resonances.
|
||
</p>
|
||
|
||
<p>
|
||
This is done thanks to the integral force feedback control architecture.
|
||
</p>
|
||
|
||
<p>
|
||
The force sensor stack signal is integrated (or rather low pass filtered) and fed back to the force sensor stacks.
|
||
</p>
|
||
|
||
<p>
|
||
The low pass filter used as the controller is defined below:
|
||
</p>
|
||
<div class="org-src-container">
|
||
<pre class="src src-matlab"> Kiff = 102<span class="org-type">/</span>(s <span class="org-type">+</span> 2<span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">*</span>2);
|
||
</pre>
|
||
</div>
|
||
|
||
<p>
|
||
The integral force feedback control strategy is applied to the simscape model as well as to the real test bench.
|
||
</p>
|
||
|
||
<p>
|
||
The damped system is then identified again using a noise excitation.
|
||
</p>
|
||
|
||
<p>
|
||
The data is loaded into Matlab and any offset is removed.
|
||
</p>
|
||
<div class="org-src-container">
|
||
<pre class="src src-matlab"> id_cl = load(<span class="org-string">'identification_noise_iff_bis.mat'</span>, <span class="org-string">'d'</span>, <span class="org-string">'acc_1'</span>, <span class="org-string">'acc_2'</span>, <span class="org-string">'geo_1'</span>, <span class="org-string">'geo_2'</span>, <span class="org-string">'f_meas'</span>, <span class="org-string">'u'</span>, <span class="org-string">'t'</span>);
|
||
|
||
id_cl.d = detrend(id_cl.d, 0);
|
||
id_cl.acc_1 = detrend(id_cl.acc_1, 0);
|
||
id_cl.acc_2 = detrend(id_cl.acc_2, 0);
|
||
id_cl.geo_1 = detrend(id_cl.geo_1, 0);
|
||
id_cl.geo_2 = detrend(id_cl.geo_2, 0);
|
||
id_cl.f_meas = detrend(id_cl.f_meas, 0);
|
||
id_cl.u = detrend(id_cl.u, 0);
|
||
</pre>
|
||
</div>
|
||
|
||
<p>
|
||
The transfer functions are estimated using <code>tfestimate</code>.
|
||
</p>
|
||
<div class="org-src-container">
|
||
<pre class="src src-matlab"> [tf_G_cl_est, <span class="org-type">~</span>] = tfestimate(id_cl.u, id_cl.d, win, [], [], 1<span class="org-type">/</span>Ts);
|
||
[co_G_cl_est, <span class="org-type">~</span>] = mscohere( id_cl.u, id_cl.d, win, [], [], 1<span class="org-type">/</span>Ts);
|
||
</pre>
|
||
</div>
|
||
|
||
<p>
|
||
The dynamics from driving voltage to the measured displacement are compared both in the open-loop and IFF case, and for the test-bench experimental identification and for the Simscape model in Figure <a href="#orgd9f3fed">8</a>.
|
||
This shows that the Integral Force Feedback architecture effectively damps the first resonance of the system.
|
||
</p>
|
||
|
||
|
||
<div id="orgd9f3fed" class="figure">
|
||
<p><img src="figs/iff_ol_cl_identified_simscape_comp.png" alt="iff_ol_cl_identified_simscape_comp.png" />
|
||
</p>
|
||
<p><span class="figure-number">Figure 8: </span>Comparison of the open-loop and closed-loop (IFF) dynamics for both the real identification and the Simscape one</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div id="outline-container-org74fa50a" class="outline-3">
|
||
<h3 id="org74fa50a"><span class="section-number-3">2.6</span> Inertial Sensors</h3>
|
||
<div class="outline-text-3" id="text-2-6">
|
||
<p>
|
||
In order to estimate the dynamics of the inertial sensor (the transfer function from the “absolute” displacement to the measured voltage), the following experiment can be performed:
|
||
</p>
|
||
<ul class="org-ul">
|
||
<li>The mass is excited such that is relative displacement as measured by the interferometer is much larger that the ground “absolute” motion.</li>
|
||
<li>The transfer function from the measured displacement by the interferometer to the measured voltage generated by the inertial sensors can be estimated.</li>
|
||
</ul>
|
||
|
||
<p>
|
||
The first point is quite important in order to have a good coherence between the interferometer measurement and the inertial sensor measurement.
|
||
</p>
|
||
|
||
<p>
|
||
Here, a first identification is performed were the excitation signal is a white noise.
|
||
</p>
|
||
|
||
|
||
<p>
|
||
As usual, the data is loaded and any offset is removed.
|
||
</p>
|
||
<div class="org-src-container">
|
||
<pre class="src src-matlab"> id = load(<span class="org-string">'identification_noise_opt_iff.mat'</span>, <span class="org-string">'d'</span>, <span class="org-string">'acc_1'</span>, <span class="org-string">'acc_2'</span>, <span class="org-string">'geo_1'</span>, <span class="org-string">'geo_2'</span>, <span class="org-string">'f_meas'</span>, <span class="org-string">'u'</span>, <span class="org-string">'t'</span>);
|
||
|
||
id.d = detrend(id.d, 0);
|
||
id.acc_1 = detrend(id.acc_1, 0);
|
||
id.acc_2 = detrend(id.acc_2, 0);
|
||
id.geo_1 = detrend(id.geo_1, 0);
|
||
id.geo_2 = detrend(id.geo_2, 0);
|
||
id.f_meas = detrend(id.f_meas, 0);
|
||
</pre>
|
||
</div>
|
||
|
||
<p>
|
||
Then the transfer functions from the measured displacement by the interferometer to the generated voltage of the inertial sensors are computed..
|
||
</p>
|
||
<div class="org-src-container">
|
||
<pre class="src src-matlab"> Ts = id.t(2) <span class="org-type">-</span> id.t(1);
|
||
win = hann(ceil(10<span class="org-type">/</span>Ts));
|
||
</pre>
|
||
</div>
|
||
|
||
<div class="org-src-container">
|
||
<pre class="src src-matlab"> [tf_acc1_est, f] = tfestimate(id.d, id.acc_1, win, [], [], 1<span class="org-type">/</span>Ts);
|
||
[co_acc1_est, <span class="org-type">~</span>] = mscohere( id.d, id.acc_1, win, [], [], 1<span class="org-type">/</span>Ts);
|
||
[tf_acc2_est, <span class="org-type">~</span>] = tfestimate(id.d, id.acc_2, win, [], [], 1<span class="org-type">/</span>Ts);
|
||
[co_acc2_est, <span class="org-type">~</span>] = mscohere( id.d, id.acc_2, win, [], [], 1<span class="org-type">/</span>Ts);
|
||
|
||
[tf_geo1_est, <span class="org-type">~</span>] = tfestimate(id.d, id.geo_1, win, [], [], 1<span class="org-type">/</span>Ts);
|
||
[co_geo1_est, <span class="org-type">~</span>] = mscohere( id.d, id.geo_1, win, [], [], 1<span class="org-type">/</span>Ts);
|
||
[tf_geo2_est, <span class="org-type">~</span>] = tfestimate(id.d, id.geo_2, win, [], [], 1<span class="org-type">/</span>Ts);
|
||
[co_geo2_est, <span class="org-type">~</span>] = mscohere( id.d, id.geo_2, win, [], [], 1<span class="org-type">/</span>Ts);
|
||
</pre>
|
||
</div>
|
||
|
||
<p>
|
||
The same transfer functions are estimated using the Simscape model.
|
||
</p>
|
||
|
||
<p>
|
||
The obtained dynamics of the accelerometer are compared in Figure <a href="#org9e98657">9</a> while the one of the geophones are compared in Figure <a href="#orgaa4372b">10</a>.
|
||
</p>
|
||
|
||
|
||
<div id="org9e98657" class="figure">
|
||
<p><img src="figs/comp_dynamics_accelerometer.png" alt="comp_dynamics_accelerometer.png" />
|
||
</p>
|
||
<p><span class="figure-number">Figure 9: </span>Comparison of the measured accelerometer dynamics</p>
|
||
</div>
|
||
|
||
|
||
<div id="orgaa4372b" class="figure">
|
||
<p><img src="figs/comp_dynamics_geophone.png" alt="comp_dynamics_geophone.png" />
|
||
</p>
|
||
<p><span class="figure-number">Figure 10: </span>Comparison of the measured geophone dynamics</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div id="outline-container-orgf52e5c8" class="outline-2">
|
||
<h2 id="orgf52e5c8"><span class="section-number-2">3</span> Optimal IFF Development</h2>
|
||
<div class="outline-text-2" id="text-3">
|
||
<p>
|
||
<a id="orgf008644"></a>
|
||
</p>
|
||
<p>
|
||
In this section, a proper identification of the transfer function from the force actuator to the force sensor is performed.
|
||
Then, an optimal IFF controller is developed and applied experimentally.
|
||
</p>
|
||
|
||
<p>
|
||
The damped system is identified to verified the effectiveness of the added method.
|
||
</p>
|
||
</div>
|
||
<div id="outline-container-org84db43d" class="outline-3">
|
||
<h3 id="org84db43d"><span class="section-number-3">3.1</span> Load Data</h3>
|
||
<div class="outline-text-3" id="text-3-1">
|
||
<p>
|
||
The experimental data is loaded and any offset is removed.
|
||
</p>
|
||
<div class="org-src-container">
|
||
<pre class="src src-matlab"> id_ol = load(<span class="org-string">'identification_noise_bis.mat'</span>, <span class="org-string">'d'</span>, <span class="org-string">'acc_1'</span>, <span class="org-string">'acc_2'</span>, <span class="org-string">'geo_1'</span>, <span class="org-string">'geo_2'</span>, <span class="org-string">'f_meas'</span>, <span class="org-string">'u'</span>, <span class="org-string">'t'</span>);
|
||
</pre>
|
||
</div>
|
||
|
||
<div class="org-src-container">
|
||
<pre class="src src-matlab"> id_ol.d = detrend(id_ol.d, 0);
|
||
id_ol.acc_1 = detrend(id_ol.acc_1, 0);
|
||
id_ol.acc_2 = detrend(id_ol.acc_2, 0);
|
||
id_ol.geo_1 = detrend(id_ol.geo_1, 0);
|
||
id_ol.geo_2 = detrend(id_ol.geo_2, 0);
|
||
id_ol.f_meas = detrend(id_ol.f_meas, 0);
|
||
id_ol.u = detrend(id_ol.u, 0);
|
||
</pre>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div id="outline-container-org8224124" class="outline-3">
|
||
<h3 id="org8224124"><span class="section-number-3">3.2</span> Experimental Data</h3>
|
||
<div class="outline-text-3" id="text-3-2">
|
||
<p>
|
||
The transfer function from force actuator to force sensors is estimated.
|
||
</p>
|
||
|
||
<p>
|
||
The coherence shown in Figure <a href="#org2a28cd8">11</a> shows that the excitation signal is good enough.
|
||
</p>
|
||
|
||
<div class="org-src-container">
|
||
<pre class="src src-matlab"> Ts = id_ol.t(2) <span class="org-type">-</span> id_ol.t(1);
|
||
win = hann(ceil(10<span class="org-type">/</span>Ts));
|
||
</pre>
|
||
</div>
|
||
|
||
<div class="org-src-container">
|
||
<pre class="src src-matlab"> [tf_fmeas_est, f] = tfestimate(id_ol.u, id_ol.f_meas, win, [], [], 1<span class="org-type">/</span>Ts); <span class="org-comment">% [V/m]</span>
|
||
[co_fmeas_est, <span class="org-type">~</span>] = mscohere( id_ol.u, id_ol.f_meas, win, [], [], 1<span class="org-type">/</span>Ts);
|
||
</pre>
|
||
</div>
|
||
|
||
|
||
<div id="org2a28cd8" class="figure">
|
||
<p><img src="figs/iff_identification_coh.png" alt="iff_identification_coh.png" />
|
||
</p>
|
||
<p><span class="figure-number">Figure 11: </span>Coherence for the identification of the IFF plant</p>
|
||
</div>
|
||
|
||
<p>
|
||
The obtained dynamics is shown in Figure <a href="#org9fbd61c">12</a>.
|
||
</p>
|
||
|
||
|
||
<div id="org9fbd61c" class="figure">
|
||
<p><img src="figs/iff_identification_bode_plot.png" alt="iff_identification_bode_plot.png" />
|
||
</p>
|
||
<p><span class="figure-number">Figure 12: </span>Bode plot of the identified IFF plant</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div id="outline-container-org0d2f2b4" class="outline-3">
|
||
<h3 id="org0d2f2b4"><span class="section-number-3">3.3</span> Model of the IFF Plant</h3>
|
||
<div class="outline-text-3" id="text-3-3">
|
||
<p>
|
||
In order to plot the root locus for the IFF control strategy, a model of the identified plant is developed.
|
||
</p>
|
||
|
||
<p>
|
||
It consists of several poles and zeros are shown below.
|
||
</p>
|
||
<div class="org-src-container">
|
||
<pre class="src src-matlab"> wz = 2<span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">*</span>102;
|
||
xi_z = 0.01;
|
||
wp = 2<span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">*</span>239.4;
|
||
xi_p = 0.015;
|
||
|
||
Giff = 2.2<span class="org-type">*</span>(s<span class="org-type">^</span>2 <span class="org-type">+</span> 2<span class="org-type">*</span>xi_z<span class="org-type">*</span>s<span class="org-type">*</span>wz <span class="org-type">+</span> wz<span class="org-type">^</span>2)<span class="org-type">/</span>(s<span class="org-type">^</span>2 <span class="org-type">+</span> 2<span class="org-type">*</span>xi_p<span class="org-type">*</span>s<span class="org-type">*</span>wp <span class="org-type">+</span> wp<span class="org-type">^</span>2) <span class="org-type">*</span> ...<span class="org-comment"> % Dynamics</span>
|
||
10<span class="org-type">*</span>(s<span class="org-type">/</span>3<span class="org-type">/</span><span class="org-constant">pi</span><span class="org-type">/</span>(1 <span class="org-type">+</span> s<span class="org-type">/</span>3<span class="org-type">/</span><span class="org-constant">pi</span>)) <span class="org-type">*</span> ...<span class="org-comment"> % Low pass filter and gain of the voltage amplifier</span>
|
||
exp(<span class="org-type">-</span>Ts<span class="org-type">*</span>s); <span class="org-comment">% Time delay induced by ADC/DAC</span>
|
||
</pre>
|
||
</div>
|
||
|
||
<p>
|
||
The comparison of the identified dynamics and the developed model is done in Figure <a href="#orgf75af12">13</a>.
|
||
</p>
|
||
|
||
|
||
<div id="orgf75af12" class="figure">
|
||
<p><img src="figs/iff_plant_model.png" alt="iff_plant_model.png" />
|
||
</p>
|
||
<p><span class="figure-number">Figure 13: </span>IFF Plant + Model</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div id="outline-container-org74e01b3" class="outline-3">
|
||
<h3 id="org74e01b3"><span class="section-number-3">3.4</span> Root Locus and optimal Controller</h3>
|
||
<div class="outline-text-3" id="text-3-4">
|
||
<p>
|
||
Now, the root locus for the Integral Force Feedback strategy is computed and shown in Figure <a href="#orgf03bd5f">14</a>.
|
||
</p>
|
||
|
||
<p>
|
||
Note that the controller used is not a pure integrator but rather a first order low pass filter with a cut-off frequency set at 2Hz.
|
||
</p>
|
||
|
||
|
||
<div id="orgf03bd5f" class="figure">
|
||
<p><img src="figs/iff_root_locus.png" alt="iff_root_locus.png" />
|
||
</p>
|
||
<p><span class="figure-number">Figure 14: </span>Root Locus for the IFF control</p>
|
||
</div>
|
||
|
||
<p>
|
||
The controller that yield maximum damping (shown by the red cross in Figure <a href="#orgf03bd5f">14</a>) is:
|
||
</p>
|
||
<div class="org-src-container">
|
||
<pre class="src src-matlab"> Kiff_opt = 102<span class="org-type">/</span>(s <span class="org-type">+</span> 2<span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">*</span>2);
|
||
</pre>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div id="outline-container-org94b17f4" class="outline-3">
|
||
<h3 id="org94b17f4"><span class="section-number-3">3.5</span> Verification of the achievable damping</h3>
|
||
<div class="outline-text-3" id="text-3-5">
|
||
<p>
|
||
A new identification is performed with the IFF control strategy applied to the system.
|
||
</p>
|
||
|
||
<p>
|
||
Data is loaded and offset removed.
|
||
</p>
|
||
<div class="org-src-container">
|
||
<pre class="src src-matlab"> id_cl = load(<span class="org-string">'identification_noise_iff_bis.mat'</span>, <span class="org-string">'d'</span>, <span class="org-string">'acc_1'</span>, <span class="org-string">'acc_2'</span>, <span class="org-string">'geo_1'</span>, <span class="org-string">'geo_2'</span>, <span class="org-string">'f_meas'</span>, <span class="org-string">'u'</span>, <span class="org-string">'t'</span>);
|
||
</pre>
|
||
</div>
|
||
|
||
<div class="org-src-container">
|
||
<pre class="src src-matlab"> id_cl.d = detrend(id_cl.d, 0);
|
||
id_cl.acc_1 = detrend(id_cl.acc_1, 0);
|
||
id_cl.acc_2 = detrend(id_cl.acc_2, 0);
|
||
id_cl.geo_1 = detrend(id_cl.geo_1, 0);
|
||
id_cl.geo_2 = detrend(id_cl.geo_2, 0);
|
||
id_cl.f_meas = detrend(id_cl.f_meas, 0);
|
||
id_cl.u = detrend(id_cl.u, 0);
|
||
</pre>
|
||
</div>
|
||
|
||
<p>
|
||
The open-loop and closed-loop dynamics are estimated.
|
||
</p>
|
||
<div class="org-src-container">
|
||
<pre class="src src-matlab"> [tf_G_ol_est, f] = tfestimate(id_ol.u, id_ol.d, win, [], [], 1<span class="org-type">/</span>Ts);
|
||
[co_G_ol_est, <span class="org-type">~</span>] = mscohere( id_ol.u, id_ol.d, win, [], [], 1<span class="org-type">/</span>Ts);
|
||
[tf_G_cl_est, <span class="org-type">~</span>] = tfestimate(id_cl.u, id_cl.d, win, [], [], 1<span class="org-type">/</span>Ts);
|
||
[co_G_cl_est, <span class="org-type">~</span>] = mscohere( id_cl.u, id_cl.d, win, [], [], 1<span class="org-type">/</span>Ts);
|
||
</pre>
|
||
</div>
|
||
|
||
<p>
|
||
The obtained coherence is shown in Figure <a href="#orgcb45f16">15</a> and the dynamics in Figure <a href="#org9c2f60f">16</a>.
|
||
</p>
|
||
|
||
|
||
<div id="orgcb45f16" class="figure">
|
||
<p><img src="figs/Gd_identification_iff_coherence.png" alt="Gd_identification_iff_coherence.png" />
|
||
</p>
|
||
<p><span class="figure-number">Figure 15: </span>Coherence for the transfer function from F to d, with and without IFF</p>
|
||
</div>
|
||
|
||
|
||
|
||
<div id="org9c2f60f" class="figure">
|
||
<p><img src="figs/Gd_identification_iff_bode_plot.png" alt="Gd_identification_iff_bode_plot.png" />
|
||
</p>
|
||
<p><span class="figure-number">Figure 16: </span>Coherence for the transfer function from F to d, with and without IFF</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div id="outline-container-orgfae8d1a" class="outline-2">
|
||
<h2 id="orgfae8d1a"><span class="section-number-2">4</span> Generate the excitation signal</h2>
|
||
<div class="outline-text-2" id="text-4">
|
||
<p>
|
||
<a id="org0f76ddc"></a>
|
||
</p>
|
||
<p>
|
||
In order to properly estimate the dynamics of the inertial sensor, the excitation signal must be properly chosen.
|
||
</p>
|
||
|
||
<p>
|
||
The requirements on the excitation signal is:
|
||
</p>
|
||
<ul class="org-ul">
|
||
<li>General much larger motion that the measured motion during the huddle test</li>
|
||
<li>Don’t damage the actuator</li>
|
||
</ul>
|
||
|
||
<p>
|
||
To determine the perfect voltage signal to be generated, we need two things:
|
||
</p>
|
||
<ul class="org-ul">
|
||
<li>the transfer function from voltage to mass displacement</li>
|
||
<li>the PSD of the measured motion by the inertial sensors</li>
|
||
<li>not saturate the sensor signals</li>
|
||
<li>provide enough signal/noise ratio (good coherence) in the frequency band of interest (~0.5Hz to 3kHz)</li>
|
||
</ul>
|
||
</div>
|
||
<div id="outline-container-org470c9d5" class="outline-3">
|
||
<h3 id="org470c9d5"><span class="section-number-3">4.1</span> Transfer function from excitation signal to displacement</h3>
|
||
<div class="outline-text-3" id="text-4-1">
|
||
<p>
|
||
Let’s first estimate the transfer function from the excitation signal in [V] to the generated displacement in [m] as measured by the inteferometer.
|
||
</p>
|
||
|
||
<div class="org-src-container">
|
||
<pre class="src src-matlab"> id_cl = load(<span class="org-string">'identification_noise_iff_bis.mat'</span>, <span class="org-string">'d'</span>, <span class="org-string">'acc_1'</span>, <span class="org-string">'acc_2'</span>, <span class="org-string">'geo_1'</span>, <span class="org-string">'geo_2'</span>, <span class="org-string">'f_meas'</span>, <span class="org-string">'u'</span>, <span class="org-string">'t'</span>);
|
||
</pre>
|
||
</div>
|
||
|
||
<div class="org-src-container">
|
||
<pre class="src src-matlab"> Ts = id_cl.t(2) <span class="org-type">-</span> id_cl.t(1);
|
||
win = hann(ceil(10<span class="org-type">/</span>Ts));
|
||
</pre>
|
||
</div>
|
||
|
||
<div class="org-src-container">
|
||
<pre class="src src-matlab"> [tf_G_cl_est, f] = tfestimate(id_cl.u, id_cl.d, win, [], [], 1<span class="org-type">/</span>Ts);
|
||
[co_G_cl_est, <span class="org-type">~</span>] = mscohere( id_cl.u, id_cl.d, win, [], [], 1<span class="org-type">/</span>Ts);
|
||
</pre>
|
||
</div>
|
||
|
||
<p>
|
||
Approximate transfer function from voltage output to generated displacement when IFF is used, in [m/V].
|
||
</p>
|
||
<div class="org-src-container">
|
||
<pre class="src src-matlab"> G_d_est = <span class="org-type">-</span>5e<span class="org-type">-</span>6<span class="org-type">*</span>(2<span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">*</span>230)<span class="org-type">^</span>2<span class="org-type">/</span>(s<span class="org-type">^</span>2 <span class="org-type">+</span> 2<span class="org-type">*</span>0.3<span class="org-type">*</span>2<span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">*</span>240<span class="org-type">*</span>s <span class="org-type">+</span> (2<span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">*</span>240)<span class="org-type">^</span>2);
|
||
</pre>
|
||
</div>
|
||
|
||
|
||
<div id="orgf3f406b" class="figure">
|
||
<p><img src="figs/Gd_plant_estimation.png" alt="Gd_plant_estimation.png" />
|
||
</p>
|
||
<p><span class="figure-number">Figure 17: </span>Estimation of the transfer function from the excitation signal to the generated displacement</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div id="outline-container-org065774d" class="outline-3">
|
||
<h3 id="org065774d"><span class="section-number-3">4.2</span> Motion measured during Huddle test</h3>
|
||
<div class="outline-text-3" id="text-4-2">
|
||
<p>
|
||
We now compute the PSD of the measured motion by the inertial sensors during the huddle test.
|
||
</p>
|
||
<div class="org-src-container">
|
||
<pre class="src src-matlab"> ht = load(<span class="org-string">'huddle_test.mat'</span>, <span class="org-string">'d'</span>, <span class="org-string">'acc_1'</span>, <span class="org-string">'acc_2'</span>, <span class="org-string">'geo_1'</span>, <span class="org-string">'geo_2'</span>, <span class="org-string">'f_meas'</span>, <span class="org-string">'u'</span>, <span class="org-string">'t'</span>);
|
||
ht.d = detrend(ht.d, 0);
|
||
ht.acc_1 = detrend(ht.acc_1, 0);
|
||
ht.acc_2 = detrend(ht.acc_2, 0);
|
||
ht.geo_1 = detrend(ht.geo_1, 0);
|
||
ht.geo_2 = detrend(ht.geo_2, 0);
|
||
</pre>
|
||
</div>
|
||
|
||
<div class="org-src-container">
|
||
<pre class="src src-matlab"> [p_d, f] = pwelch(ht.d, win, [], [], 1<span class="org-type">/</span>Ts);
|
||
[p_acc1, <span class="org-type">~</span>] = pwelch(ht.acc_1, win, [], [], 1<span class="org-type">/</span>Ts);
|
||
[p_acc2, <span class="org-type">~</span>] = pwelch(ht.acc_2, win, [], [], 1<span class="org-type">/</span>Ts);
|
||
[p_geo1, <span class="org-type">~</span>] = pwelch(ht.geo_1, win, [], [], 1<span class="org-type">/</span>Ts);
|
||
[p_geo2, <span class="org-type">~</span>] = pwelch(ht.geo_2, win, [], [], 1<span class="org-type">/</span>Ts);
|
||
</pre>
|
||
</div>
|
||
|
||
<p>
|
||
Using an estimated model of the sensor dynamics from the documentation of the sensors, we can compute the ASD of the motion in \(m/\sqrt{Hz}\) measured by the sensors.
|
||
</p>
|
||
<div class="org-src-container">
|
||
<pre class="src src-matlab"> G_acc = 1<span class="org-type">/</span>(1 <span class="org-type">+</span> s<span class="org-type">/</span>2<span class="org-type">/</span><span class="org-constant">pi</span><span class="org-type">/</span>2500); <span class="org-comment">% [V/(m/s2)]</span>
|
||
G_geo = <span class="org-type">-</span>120<span class="org-type">*</span>s<span class="org-type">^</span>2<span class="org-type">/</span>(s<span class="org-type">^</span>2 <span class="org-type">+</span> 2<span class="org-type">*</span>0.7<span class="org-type">*</span>2<span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">*</span>2<span class="org-type">*</span>s <span class="org-type">+</span> (2<span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">*</span>2)<span class="org-type">^</span>2); <span class="org-comment">% [V/(m/s)]</span>
|
||
</pre>
|
||
</div>
|
||
|
||
|
||
<div id="org0bd4ae0" class="figure">
|
||
<p><img src="figs/huddle_test_psd_motion.png" alt="huddle_test_psd_motion.png" />
|
||
</p>
|
||
<p><span class="figure-number">Figure 18: </span>ASD of the motion measured by the sensors</p>
|
||
</div>
|
||
|
||
<p>
|
||
From the ASD of the motion measured by the sensors, we can create an excitation signal that will generate much motion motion that the motion under no excitation.
|
||
</p>
|
||
|
||
<p>
|
||
We create <code>G_exc</code> that corresponds to the wanted generated motion.
|
||
</p>
|
||
<div class="org-src-container">
|
||
<pre class="src src-matlab"> G_exc = 0.2e<span class="org-type">-</span>6<span class="org-type">/</span>(1 <span class="org-type">+</span> s<span class="org-type">/</span>2<span class="org-type">/</span><span class="org-constant">pi</span><span class="org-type">/</span>2)<span class="org-type">/</span>(1 <span class="org-type">+</span> s<span class="org-type">/</span>2<span class="org-type">/</span><span class="org-constant">pi</span><span class="org-type">/</span>50);
|
||
</pre>
|
||
</div>
|
||
|
||
<p>
|
||
And we create a time domain signal <code>y_d</code> that have the spectral density described by <code>G_exc</code>.
|
||
</p>
|
||
<div class="org-src-container">
|
||
<pre class="src src-matlab"> Fs = 1<span class="org-type">/</span>Ts;
|
||
t = 0<span class="org-type">:</span>Ts<span class="org-type">:</span>180; <span class="org-comment">% Time Vector [s]</span>
|
||
u = sqrt(Fs<span class="org-type">/</span>2)<span class="org-type">*</span>randn(length(t), 1); <span class="org-comment">% Signal with an ASD equal to one</span>
|
||
|
||
y_d = lsim(G_exc, u, t);
|
||
</pre>
|
||
</div>
|
||
|
||
<div class="org-src-container">
|
||
<pre class="src src-matlab"> [pxx, <span class="org-type">~</span>] = pwelch(y_d, win, 0, [], Fs);
|
||
</pre>
|
||
</div>
|
||
|
||
|
||
<div id="org7f57908" class="figure">
|
||
<p><img src="figs/comp_huddle_test_excited_motion_psd.png" alt="comp_huddle_test_excited_motion_psd.png" />
|
||
</p>
|
||
<p><span class="figure-number">Figure 19: </span>Comparison of the ASD of the motion during Huddle and the wanted generated motion</p>
|
||
</div>
|
||
|
||
|
||
<p>
|
||
We can now generate the voltage signal that will generate the wanted motion.
|
||
</p>
|
||
<div class="org-src-container">
|
||
<pre class="src src-matlab"> y_v = lsim(G_exc <span class="org-type">*</span> ...<span class="org-comment"> % from unit PSD to shaped PSD</span>
|
||
(1 <span class="org-type">+</span> s<span class="org-type">/</span>2<span class="org-type">/</span><span class="org-constant">pi</span><span class="org-type">/</span>50) <span class="org-type">*</span> ...<span class="org-comment"> % Inverse of pre-filter included in the Simulink file</span>
|
||
1<span class="org-type">/</span>G_d_est <span class="org-type">*</span> ...<span class="org-comment"> % Wanted displacement => required voltage</span>
|
||
1<span class="org-type">/</span>(1 <span class="org-type">+</span> s<span class="org-type">/</span>2<span class="org-type">/</span><span class="org-constant">pi</span><span class="org-type">/</span>5e3), ...<span class="org-comment"> % Add some high frequency filtering</span>
|
||
u, t);
|
||
</pre>
|
||
</div>
|
||
|
||
|
||
<div id="orga696821" class="figure">
|
||
<p><img src="figs/optimal_exc_signal_time.png" alt="optimal_exc_signal_time.png" />
|
||
</p>
|
||
<p><span class="figure-number">Figure 20: </span>Generated excitation signal</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div id="outline-container-org00c3462" class="outline-2">
|
||
<h2 id="org00c3462"><span class="section-number-2">5</span> Identification of the Inertial Sensors Dynamics</h2>
|
||
<div class="outline-text-2" id="text-5">
|
||
<p>
|
||
<a id="org837e5d1"></a>
|
||
</p>
|
||
<p>
|
||
Using the excitation signal generated in Section <a href="#org0f76ddc">4</a>, the dynamics of the inertial sensors are identified.
|
||
</p>
|
||
</div>
|
||
<div id="outline-container-orgc51ddfc" class="outline-3">
|
||
<h3 id="orgc51ddfc"><span class="section-number-3">5.1</span> Load Data</h3>
|
||
<div class="outline-text-3" id="text-5-1">
|
||
<p>
|
||
Both the measurement data during the identification test and during an “huddle test” are loaded.
|
||
</p>
|
||
<div class="org-src-container">
|
||
<pre class="src src-matlab"> id = load(<span class="org-string">'identification_noise_opt_iff.mat'</span>, <span class="org-string">'d'</span>, <span class="org-string">'acc_1'</span>, <span class="org-string">'acc_2'</span>, <span class="org-string">'geo_1'</span>, <span class="org-string">'geo_2'</span>, <span class="org-string">'f_meas'</span>, <span class="org-string">'u'</span>, <span class="org-string">'t'</span>);
|
||
ht = load(<span class="org-string">'huddle_test.mat'</span>, <span class="org-string">'d'</span>, <span class="org-string">'acc_1'</span>, <span class="org-string">'acc_2'</span>, <span class="org-string">'geo_1'</span>, <span class="org-string">'geo_2'</span>, <span class="org-string">'f_meas'</span>, <span class="org-string">'u'</span>, <span class="org-string">'t'</span>);
|
||
</pre>
|
||
</div>
|
||
|
||
<div class="org-src-container">
|
||
<pre class="src src-matlab"> ht.d = detrend(ht.d, 0);
|
||
ht.acc_1 = detrend(ht.acc_1, 0);
|
||
ht.acc_2 = detrend(ht.acc_2, 0);
|
||
ht.geo_1 = detrend(ht.geo_1, 0);
|
||
ht.geo_2 = detrend(ht.geo_2, 0);
|
||
ht.f_meas = detrend(ht.f_meas, 0);
|
||
</pre>
|
||
</div>
|
||
|
||
<div class="org-src-container">
|
||
<pre class="src src-matlab"> id.d = detrend(id.d, 0);
|
||
id.acc_1 = detrend(id.acc_1, 0);
|
||
id.acc_2 = detrend(id.acc_2, 0);
|
||
id.geo_1 = detrend(id.geo_1, 0);
|
||
id.geo_2 = detrend(id.geo_2, 0);
|
||
id.f_meas = detrend(id.f_meas, 0);
|
||
</pre>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div id="outline-container-org567be9d" class="outline-3">
|
||
<h3 id="org567be9d"><span class="section-number-3">5.2</span> Compare PSD during Huddle and and during identification</h3>
|
||
<div class="outline-text-3" id="text-5-2">
|
||
<p>
|
||
The Power Spectral Density of the measured motion during the huddle test and during the identification test are compared in Figures <a href="#org574b06a">21</a> and <a href="#org5dd984f">22</a>.
|
||
</p>
|
||
|
||
<div class="org-src-container">
|
||
<pre class="src src-matlab"> Ts = ht.t(2) <span class="org-type">-</span> ht.t(1);
|
||
win = hann(ceil(10<span class="org-type">/</span>Ts));
|
||
</pre>
|
||
</div>
|
||
|
||
<div class="org-src-container">
|
||
<pre class="src src-matlab"> [p_id_d, f] = pwelch(id.d, win, [], [], 1<span class="org-type">/</span>Ts);
|
||
[p_id_acc1, <span class="org-type">~</span>] = pwelch(id.acc_1, win, [], [], 1<span class="org-type">/</span>Ts);
|
||
[p_id_acc2, <span class="org-type">~</span>] = pwelch(id.acc_2, win, [], [], 1<span class="org-type">/</span>Ts);
|
||
[p_id_geo1, <span class="org-type">~</span>] = pwelch(id.geo_1, win, [], [], 1<span class="org-type">/</span>Ts);
|
||
[p_id_geo2, <span class="org-type">~</span>] = pwelch(id.geo_2, win, [], [], 1<span class="org-type">/</span>Ts);
|
||
</pre>
|
||
</div>
|
||
|
||
<div class="org-src-container">
|
||
<pre class="src src-matlab"> [p_ht_d, <span class="org-type">~</span>] = pwelch(ht.d, win, [], [], 1<span class="org-type">/</span>Ts);
|
||
[p_ht_acc1, <span class="org-type">~</span>] = pwelch(ht.acc_1, win, [], [], 1<span class="org-type">/</span>Ts);
|
||
[p_ht_acc2, <span class="org-type">~</span>] = pwelch(ht.acc_2, win, [], [], 1<span class="org-type">/</span>Ts);
|
||
[p_ht_geo1, <span class="org-type">~</span>] = pwelch(ht.geo_1, win, [], [], 1<span class="org-type">/</span>Ts);
|
||
[p_ht_geo2, <span class="org-type">~</span>] = pwelch(ht.geo_2, win, [], [], 1<span class="org-type">/</span>Ts);
|
||
[p_ht_fmeas, <span class="org-type">~</span>] = pwelch(ht.f_meas, win, [], [], 1<span class="org-type">/</span>Ts);
|
||
</pre>
|
||
</div>
|
||
|
||
|
||
<div id="org574b06a" class="figure">
|
||
<p><img src="figs/comp_psd_huddle_test_identification_acc.png" alt="comp_psd_huddle_test_identification_acc.png" />
|
||
</p>
|
||
<p><span class="figure-number">Figure 21: </span>Comparison of the PSD of the measured motion during the Huddle test and during the identification</p>
|
||
</div>
|
||
|
||
|
||
<div id="org5dd984f" class="figure">
|
||
<p><img src="figs/comp_psd_huddle_test_identification_geo.png" alt="comp_psd_huddle_test_identification_geo.png" />
|
||
</p>
|
||
<p><span class="figure-number">Figure 22: </span>Comparison of the PSD of the measured motion during the Huddle test and during the identification</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div id="outline-container-org79fc1c9" class="outline-3">
|
||
<h3 id="org79fc1c9"><span class="section-number-3">5.3</span> Compute transfer functions</h3>
|
||
<div class="outline-text-3" id="text-5-3">
|
||
<p>
|
||
The transfer functions from the motion as measured by the interferometer (and that should represent the absolute motion of the mass) to the inertial sensors are estimated:
|
||
</p>
|
||
<div class="org-src-container">
|
||
<pre class="src src-matlab"> [tf_acc1_est, f] = tfestimate(id.d, id.acc_1, win, [], [], 1<span class="org-type">/</span>Ts);
|
||
[co_acc1_est, <span class="org-type">~</span>] = mscohere( id.d, id.acc_1, win, [], [], 1<span class="org-type">/</span>Ts);
|
||
[tf_acc2_est, <span class="org-type">~</span>] = tfestimate(id.d, id.acc_2, win, [], [], 1<span class="org-type">/</span>Ts);
|
||
[co_acc2_est, <span class="org-type">~</span>] = mscohere( id.d, id.acc_2, win, [], [], 1<span class="org-type">/</span>Ts);
|
||
|
||
[tf_geo1_est, <span class="org-type">~</span>] = tfestimate(id.d, id.geo_1, win, [], [], 1<span class="org-type">/</span>Ts);
|
||
[co_geo1_est, <span class="org-type">~</span>] = mscohere( id.d, id.geo_1, win, [], [], 1<span class="org-type">/</span>Ts);
|
||
[tf_geo2_est, <span class="org-type">~</span>] = tfestimate(id.d, id.geo_2, win, [], [], 1<span class="org-type">/</span>Ts);
|
||
[co_geo2_est, <span class="org-type">~</span>] = mscohere( id.d, id.geo_2, win, [], [], 1<span class="org-type">/</span>Ts);
|
||
</pre>
|
||
</div>
|
||
|
||
<p>
|
||
The obtained coherence are shown in Figure <a href="#org8a3f68b">23</a>.
|
||
</p>
|
||
|
||
|
||
<div id="org8a3f68b" class="figure">
|
||
<p><img src="figs/id_sensor_dynamics_coherence.png" alt="id_sensor_dynamics_coherence.png" />
|
||
</p>
|
||
<p><span class="figure-number">Figure 23: </span>Coherence for the estimation of the sensor dynamics</p>
|
||
</div>
|
||
|
||
<p>
|
||
We also make a simplified model of the inertial sensors to be compared with the identified dynamics.
|
||
</p>
|
||
<div class="org-src-container">
|
||
<pre class="src src-matlab"> G_acc = 1<span class="org-type">/</span>(1 <span class="org-type">+</span> s<span class="org-type">/</span>2<span class="org-type">/</span><span class="org-constant">pi</span><span class="org-type">/</span>2500); <span class="org-comment">% [V/(m/s2)]</span>
|
||
G_geo = <span class="org-type">-</span>1200<span class="org-type">*</span>s<span class="org-type">^</span>2<span class="org-type">/</span>(s<span class="org-type">^</span>2 <span class="org-type">+</span> 2<span class="org-type">*</span>0.7<span class="org-type">*</span>2<span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">*</span>2<span class="org-type">*</span>s <span class="org-type">+</span> (2<span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">*</span>2)<span class="org-type">^</span>2); <span class="org-comment">% [[V/(m/s)]</span>
|
||
</pre>
|
||
</div>
|
||
|
||
<p>
|
||
The model and identified dynamics show good agreement (Figures <a href="#org86aa9f8">24</a> and <a href="#org7553fb7">25</a>.)
|
||
</p>
|
||
|
||
|
||
<div id="org86aa9f8" class="figure">
|
||
<p><img src="figs/id_sensor_dynamics_accelerometers.png" alt="id_sensor_dynamics_accelerometers.png" />
|
||
</p>
|
||
<p><span class="figure-number">Figure 24: </span>Identified dynamics of the accelerometers</p>
|
||
</div>
|
||
|
||
|
||
<div id="org7553fb7" class="figure">
|
||
<p><img src="figs/id_sensor_dynamics_geophones.png" alt="id_sensor_dynamics_geophones.png" />
|
||
</p>
|
||
<p><span class="figure-number">Figure 25: </span>Identified dynamics of the geophones</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div id="outline-container-orge9bf4b9" class="outline-2">
|
||
<h2 id="orge9bf4b9"><span class="section-number-2">6</span> Inertial Sensor Noise and the \(\mathcal{H}_2\) Synthesis of complementary filters</h2>
|
||
<div class="outline-text-2" id="text-6">
|
||
<p>
|
||
<a id="orgc9ebefd"></a>
|
||
</p>
|
||
<p>
|
||
In this section, the noise of the inertial sensors (geophones and accelerometers) is estimated.
|
||
</p>
|
||
</div>
|
||
<div id="outline-container-org23d9265" class="outline-3">
|
||
<h3 id="org23d9265"><span class="section-number-3">6.1</span> Load Data</h3>
|
||
<div class="outline-text-3" id="text-6-1">
|
||
<p>
|
||
As before, the identification data is loaded and any offset if removed.
|
||
</p>
|
||
<div class="org-src-container">
|
||
<pre class="src src-matlab"> id = load(<span class="org-string">'identification_noise_opt_iff.mat'</span>, <span class="org-string">'d'</span>, <span class="org-string">'acc_1'</span>, <span class="org-string">'acc_2'</span>, <span class="org-string">'geo_1'</span>, <span class="org-string">'geo_2'</span>, <span class="org-string">'f_meas'</span>, <span class="org-string">'u'</span>, <span class="org-string">'t'</span>);
|
||
</pre>
|
||
</div>
|
||
|
||
<div class="org-src-container">
|
||
<pre class="src src-matlab"> id.d = detrend(id.d, 0);
|
||
id.acc_1 = detrend(id.acc_1, 0);
|
||
id.acc_2 = detrend(id.acc_2, 0);
|
||
id.geo_1 = detrend(id.geo_1, 0);
|
||
id.geo_2 = detrend(id.geo_2, 0);
|
||
id.f_meas = detrend(id.f_meas, 0);
|
||
</pre>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div id="outline-container-org6b88428" class="outline-3">
|
||
<h3 id="org6b88428"><span class="section-number-3">6.2</span> ASD of the Measured displacement</h3>
|
||
<div class="outline-text-3" id="text-6-2">
|
||
<p>
|
||
The Power Spectral Density of the displacement as measured by the interferometer and the inertial sensors is computed.
|
||
</p>
|
||
<div class="org-src-container">
|
||
<pre class="src src-matlab"> Ts = id.t(2) <span class="org-type">-</span> id.t(1);
|
||
win = hann(ceil(10<span class="org-type">/</span>Ts));
|
||
</pre>
|
||
</div>
|
||
|
||
<div class="org-src-container">
|
||
<pre class="src src-matlab"> [p_id_d, f] = pwelch(id.d, win, [], [], 1<span class="org-type">/</span>Ts);
|
||
[p_id_acc1, <span class="org-type">~</span>] = pwelch(id.acc_1, win, [], [], 1<span class="org-type">/</span>Ts);
|
||
[p_id_acc2, <span class="org-type">~</span>] = pwelch(id.acc_2, win, [], [], 1<span class="org-type">/</span>Ts);
|
||
[p_id_geo1, <span class="org-type">~</span>] = pwelch(id.geo_1, win, [], [], 1<span class="org-type">/</span>Ts);
|
||
[p_id_geo2, <span class="org-type">~</span>] = pwelch(id.geo_2, win, [], [], 1<span class="org-type">/</span>Ts);
|
||
</pre>
|
||
</div>
|
||
|
||
<p>
|
||
Let’s use a model of the accelerometer and geophone to compute the motion from the measured voltage.
|
||
</p>
|
||
<div class="org-src-container">
|
||
<pre class="src src-matlab"> G_acc = 1<span class="org-type">/</span>(1 <span class="org-type">+</span> s<span class="org-type">/</span>2<span class="org-type">/</span><span class="org-constant">pi</span><span class="org-type">/</span>2500); <span class="org-comment">% [V/(m/s2)]</span>
|
||
G_geo = <span class="org-type">-</span>1200<span class="org-type">*</span>s<span class="org-type">^</span>2<span class="org-type">/</span>(s<span class="org-type">^</span>2 <span class="org-type">+</span> 2<span class="org-type">*</span>0.7<span class="org-type">*</span>2<span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">*</span>2<span class="org-type">*</span>s <span class="org-type">+</span> (2<span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">*</span>2)<span class="org-type">^</span>2); <span class="org-comment">% [[V/(m/s)]</span>
|
||
</pre>
|
||
</div>
|
||
|
||
<p>
|
||
The obtained ASD in \(m/\sqrt{Hz}\) is shown in Figure <a href="#org0ee6124">26</a>.
|
||
</p>
|
||
|
||
|
||
<div id="org0ee6124" class="figure">
|
||
<p><img src="figs/measure_displacement_all_sensors.png" alt="measure_displacement_all_sensors.png" />
|
||
</p>
|
||
<p><span class="figure-number">Figure 26: </span>ASD of the measured displacement as measured by all the sensors</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div id="outline-container-orgc6ed38c" class="outline-3">
|
||
<h3 id="orgc6ed38c"><span class="section-number-3">6.3</span> ASD of the Sensor Noise</h3>
|
||
<div class="outline-text-3" id="text-6-3">
|
||
<p>
|
||
The noise of a sensor can be estimated using two identical sensors by computing:
|
||
</p>
|
||
<ul class="org-ul">
|
||
<li>the Power Spectral Density of the measured motion by the two sensors</li>
|
||
<li>the Cross Spectral Density between the two sensors (coherence)</li>
|
||
</ul>
|
||
|
||
<p>
|
||
This technique to estimate the sensor noise is described in (<a href="#citeproc_bib_item_1">Barzilai, VanZandt, and Kenny 1998</a>).
|
||
</p>
|
||
|
||
<p>
|
||
The Power Spectral Density of the sensor noise can be estimated using the following equation:
|
||
</p>
|
||
\begin{equation}
|
||
|S_n(\omega)| = |S_{x_1}(\omega)| \Big( 1 - \gamma_{x_1 x_2}(\omega) \Big)
|
||
\end{equation}
|
||
<p>
|
||
with \(S_{x_1}\) the PSD of one of the sensor and \(\gamma_{x_1 x_2}\) the coherence between the two sensors.
|
||
</p>
|
||
|
||
<p>
|
||
The coherence between the two accelerometers and between the two geophones is computed.
|
||
</p>
|
||
<div class="org-src-container">
|
||
<pre class="src src-matlab"> [coh_acc, <span class="org-type">~</span>] = mscohere(id.acc_1, id.acc_2, win, [], [], 1<span class="org-type">/</span>Ts);
|
||
[coh_geo, <span class="org-type">~</span>] = mscohere(id.geo_1, id.geo_2, win, [], [], 1<span class="org-type">/</span>Ts);
|
||
</pre>
|
||
</div>
|
||
|
||
<p>
|
||
Finally, the Power Spectral Density of the sensors is computed and converted in \([m^2/Hz]\).
|
||
</p>
|
||
<div class="org-src-container">
|
||
<pre class="src src-matlab"> pN_acc = p_id_acc1<span class="org-type">.*</span>(1 <span class="org-type">-</span> coh_acc) <span class="org-type">.*</span> ...<span class="org-comment"> % [V^2/Hz]</span>
|
||
1<span class="org-type">./</span>abs(squeeze(freqresp(G_acc<span class="org-type">*</span>s<span class="org-type">^</span>2, f, <span class="org-string">'Hz'</span>)))<span class="org-type">.^</span>2; <span class="org-comment">% [(m/V)^2]</span>
|
||
pN_geo = p_id_geo1<span class="org-type">.*</span>(1 <span class="org-type">-</span> coh_geo) <span class="org-type">.*</span> ...<span class="org-comment"> % [V^2/Hz]</span>
|
||
1<span class="org-type">./</span>abs(squeeze(freqresp(G_geo<span class="org-type">*</span>s, f, <span class="org-string">'Hz'</span>)))<span class="org-type">.^</span>2; <span class="org-comment">% [(m/V)^2]</span>
|
||
</pre>
|
||
</div>
|
||
|
||
<p>
|
||
The ASD of obtained noises are compared with the ASD of the measured signals in Figure <a href="#org994df99">27</a>.
|
||
</p>
|
||
|
||
<div id="org994df99" class="figure">
|
||
<p><img src="figs/noise_inertial_sensors_comparison.png" alt="noise_inertial_sensors_comparison.png" />
|
||
</p>
|
||
<p><span class="figure-number">Figure 27: </span>Comparison of the computed ASD of the noise of the two inertial sensors</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div id="outline-container-orge7b920f" class="outline-3">
|
||
<h3 id="orge7b920f"><span class="section-number-3">6.4</span> Noise Model</h3>
|
||
<div class="outline-text-3" id="text-6-4">
|
||
<p>
|
||
Transfer functions are adjusted in order to fit the ASD of the sensor noises (expressed in \([m/s/\sqrt{Hz}]\) for more easy fitting).
|
||
</p>
|
||
|
||
<p>
|
||
These transfer functions are defined below and compared with the measured ASD in Figure <a href="#org807825e">28</a>.
|
||
</p>
|
||
<div class="org-src-container">
|
||
<pre class="src src-matlab"> N_acc = 1<span class="org-type">*</span>(s<span class="org-type">/</span>(2<span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">*</span>2000) <span class="org-type">+</span> 1)<span class="org-type">^</span>2<span class="org-type">/</span>(s <span class="org-type">+</span> 0.1<span class="org-type">*</span>2<span class="org-type">*</span><span class="org-constant">pi</span>)<span class="org-type">/</span>(s <span class="org-type">+</span> 1e3<span class="org-type">*</span>2<span class="org-type">*</span><span class="org-constant">pi</span>); <span class="org-comment">% [m/sqrt(Hz)]</span>
|
||
N_geo = 4e<span class="org-type">-</span>4<span class="org-type">*</span>(s<span class="org-type">/</span>(2<span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">*</span>200) <span class="org-type">+</span> 1)<span class="org-type">/</span>(s <span class="org-type">+</span> 1e3<span class="org-type">*</span>2<span class="org-type">*</span><span class="org-constant">pi</span>); <span class="org-comment">% [m/sqrt(Hz)]</span>
|
||
</pre>
|
||
</div>
|
||
|
||
|
||
<div id="org807825e" class="figure">
|
||
<p><img src="figs/noise_models_velocity.png" alt="noise_models_velocity.png" />
|
||
</p>
|
||
<p><span class="figure-number">Figure 28: </span>ASD of the velocity noise measured by the sensors and the noise models</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div id="outline-container-org0488b1a" class="outline-3">
|
||
<h3 id="org0488b1a"><span class="section-number-3">6.5</span> \(\mathcal{H}_2\) Synthesis of the Complementary Filters</h3>
|
||
<div class="outline-text-3" id="text-6-5">
|
||
<p>
|
||
We now wish to synthesize two complementary filters to merge the geophone and the accelerometer signal in such a way that the fused signal has the lowest possible RMS noise.
|
||
</p>
|
||
|
||
<p>
|
||
To do so, we use the \(\mathcal{H}_2\) synthesis where the transfer functions representing the noise density of both sensors are used as weights.
|
||
</p>
|
||
|
||
<p>
|
||
The generalized plant used for the synthesis is defined below.
|
||
</p>
|
||
<div class="org-src-container">
|
||
<pre class="src src-matlab"> P = [0 N_acc 1;
|
||
N_geo <span class="org-type">-</span>N_acc 0];
|
||
</pre>
|
||
</div>
|
||
|
||
<p>
|
||
And the \(\mathcal{H}_2\) synthesis is done using the <code>h2syn</code> command.
|
||
</p>
|
||
<div class="org-src-container">
|
||
<pre class="src src-matlab"> [H_geo, <span class="org-type">~</span>, gamma] = h2syn(P, 1, 1);
|
||
H_acc = 1 <span class="org-type">-</span> H_geo;
|
||
</pre>
|
||
</div>
|
||
|
||
<p>
|
||
The obtained complementary filters are shown in Figure <a href="#orgc464ed3">29</a>.
|
||
</p>
|
||
|
||
|
||
<div id="orgc464ed3" class="figure">
|
||
<p><img src="figs/complementary_filters_velocity_H2.png" alt="complementary_filters_velocity_H2.png" />
|
||
</p>
|
||
<p><span class="figure-number">Figure 29: </span>Obtained Complementary Filters</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div id="outline-container-org3cfa936" class="outline-3">
|
||
<h3 id="org3cfa936"><span class="section-number-3">6.6</span> Results</h3>
|
||
<div class="outline-text-3" id="text-6-6">
|
||
<p>
|
||
Finally, the signals of both sensors are merged using the complementary filters and the super sensor noise is estimated and compared with the individual sensor noises in Figure <a href="#org6111e9b">30</a>.
|
||
</p>
|
||
|
||
|
||
<div id="org6111e9b" class="figure">
|
||
<p><img src="figs/super_sensor_noise_asd_velocity.png" alt="super_sensor_noise_asd_velocity.png" />
|
||
</p>
|
||
<p><span class="figure-number">Figure 30: </span>ASD of the super sensor noise (velocity)</p>
|
||
</div>
|
||
|
||
<p>
|
||
Finally, the Cumulative Power Spectrum is computed and compared in Figure <a href="#orgc8997fe">31</a>.
|
||
</p>
|
||
<div class="org-src-container">
|
||
<pre class="src src-matlab"> [<span class="org-type">~</span>, i_1Hz] = min(abs(f <span class="org-type">-</span> 1));
|
||
</pre>
|
||
</div>
|
||
|
||
<div class="org-src-container">
|
||
<pre class="src src-matlab"> CPS_acc = 1<span class="org-type">/</span><span class="org-constant">pi</span><span class="org-type">*</span>flip(<span class="org-type">-</span>cumtrapz(2<span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">*</span>flip(f), flip((pN_acc<span class="org-type">.*</span>(2<span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">*</span>f))<span class="org-type">.^</span>2)));
|
||
CPS_geo = 1<span class="org-type">/</span><span class="org-constant">pi</span><span class="org-type">*</span>flip(<span class="org-type">-</span>cumtrapz(2<span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">*</span>flip(f), flip((pN_geo<span class="org-type">.*</span>(2<span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">*</span>f))<span class="org-type">.^</span>2)));
|
||
CPS_SS = 1<span class="org-type">/</span><span class="org-constant">pi</span><span class="org-type">*</span>flip(<span class="org-type">-</span>cumtrapz(2<span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">*</span>flip(f), flip((pN_acc<span class="org-type">.*</span>(2<span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">*</span>f))<span class="org-type">.^</span>2<span class="org-type">.*</span>abs(squeeze(freqresp(H_acc, f, <span class="org-string">'Hz'</span>)))<span class="org-type">.^</span>2 <span class="org-type">+</span> (pN_geo<span class="org-type">.*</span>(2<span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">*</span>f))<span class="org-type">.^</span>2<span class="org-type">.*</span>abs(squeeze(freqresp(H_geo, f, <span class="org-string">'Hz'</span>)))<span class="org-type">.^</span>2)));
|
||
</pre>
|
||
</div>
|
||
|
||
|
||
<div id="orgc8997fe" class="figure">
|
||
<p><img src="figs/super_sensor_noise_cas_velocity.png" alt="super_sensor_noise_cas_velocity.png" />
|
||
</p>
|
||
<p><span class="figure-number">Figure 31: </span>Cumulative Power Spectrum of the Sensor Noise (velocity)</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div id="outline-container-org7aef41f" class="outline-2">
|
||
<h2 id="org7aef41f"><span class="section-number-2">7</span> Inertial Sensor Dynamics Uncertainty and the \(\mathcal{H}_\infty\) Synthesis of complementary filters</h2>
|
||
<div class="outline-text-2" id="text-7">
|
||
<p>
|
||
<a id="orgca64b78"></a>
|
||
</p>
|
||
<p>
|
||
When merging two sensors, it is important to be sure that we correctly know the sensor dynamics near the merging frequency.
|
||
Thus, identifying the uncertainty on the sensor dynamics is quite important to perform a robust merging.
|
||
</p>
|
||
</div>
|
||
<div id="outline-container-org4935bc2" class="outline-3">
|
||
<h3 id="org4935bc2"><span class="section-number-3">7.1</span> Load Data</h3>
|
||
<div class="outline-text-3" id="text-7-1">
|
||
<p>
|
||
Data is loaded and offset is removed.
|
||
</p>
|
||
|
||
<div class="org-src-container">
|
||
<pre class="src src-matlab"> id = load(<span class="org-string">'identification_noise_opt_iff.mat'</span>, <span class="org-string">'d'</span>, <span class="org-string">'acc_1'</span>, <span class="org-string">'acc_2'</span>, <span class="org-string">'geo_1'</span>, <span class="org-string">'geo_2'</span>, <span class="org-string">'f_meas'</span>, <span class="org-string">'u'</span>, <span class="org-string">'t'</span>);
|
||
</pre>
|
||
</div>
|
||
|
||
<div class="org-src-container">
|
||
<pre class="src src-matlab"> id.d = detrend(id.d, 0);
|
||
id.acc_1 = detrend(id.acc_1, 0);
|
||
id.acc_2 = detrend(id.acc_2, 0);
|
||
id.geo_1 = detrend(id.geo_1, 0);
|
||
id.geo_2 = detrend(id.geo_2, 0);
|
||
id.f_meas = detrend(id.f_meas, 0);
|
||
</pre>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div id="outline-container-org2e2b552" class="outline-3">
|
||
<h3 id="org2e2b552"><span class="section-number-3">7.2</span> Compute the dynamics of both sensors</h3>
|
||
<div class="outline-text-3" id="text-7-2">
|
||
<p>
|
||
The dynamics of inertial sensors are estimated (in \([V/m]\)).
|
||
</p>
|
||
<div class="org-src-container">
|
||
<pre class="src src-matlab"> Ts = id.t(2) <span class="org-type">-</span> id.t(1);
|
||
win = hann(ceil(10<span class="org-type">/</span>Ts));
|
||
</pre>
|
||
</div>
|
||
|
||
<div class="org-src-container">
|
||
<pre class="src src-matlab"> [tf_acc1_est, f] = tfestimate(id.d, id.acc_1, win, [], [], 1<span class="org-type">/</span>Ts);
|
||
[co_acc1_est, <span class="org-type">~</span>] = mscohere( id.d, id.acc_1, win, [], [], 1<span class="org-type">/</span>Ts);
|
||
[tf_acc2_est, <span class="org-type">~</span>] = tfestimate(id.d, id.acc_2, win, [], [], 1<span class="org-type">/</span>Ts);
|
||
[co_acc2_est, <span class="org-type">~</span>] = mscohere( id.d, id.acc_2, win, [], [], 1<span class="org-type">/</span>Ts);
|
||
|
||
[tf_geo1_est, <span class="org-type">~</span>] = tfestimate(id.d, id.geo_1, win, [], [], 1<span class="org-type">/</span>Ts);
|
||
[co_geo1_est, <span class="org-type">~</span>] = mscohere( id.d, id.geo_1, win, [], [], 1<span class="org-type">/</span>Ts);
|
||
[tf_geo2_est, <span class="org-type">~</span>] = tfestimate(id.d, id.geo_2, win, [], [], 1<span class="org-type">/</span>Ts);
|
||
[co_geo2_est, <span class="org-type">~</span>] = mscohere( id.d, id.geo_2, win, [], [], 1<span class="org-type">/</span>Ts);
|
||
</pre>
|
||
</div>
|
||
|
||
<p>
|
||
The (nominal) models of the inertial sensors from the absolute displacement to the generated voltage are defined below:
|
||
</p>
|
||
<div class="org-src-container">
|
||
<pre class="src src-matlab"> G_acc = 1<span class="org-type">/</span>(1 <span class="org-type">+</span> s<span class="org-type">/</span>2<span class="org-type">/</span><span class="org-constant">pi</span><span class="org-type">/</span>2000)
|
||
G_geo = <span class="org-type">-</span>1200<span class="org-type">*</span>s<span class="org-type">^</span>2<span class="org-type">/</span>(s<span class="org-type">^</span>2 <span class="org-type">+</span> 2<span class="org-type">*</span>0.7<span class="org-type">*</span>2<span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">*</span>2<span class="org-type">*</span>s <span class="org-type">+</span> (2<span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">*</span>2)<span class="org-type">^</span>2);
|
||
</pre>
|
||
</div>
|
||
|
||
<p>
|
||
These models are very simplistic models, and we then take into account the un-modelled dynamics with dynamical uncertainty.
|
||
</p>
|
||
</div>
|
||
</div>
|
||
|
||
<div id="outline-container-orgd9c0615" class="outline-3">
|
||
<h3 id="orgd9c0615"><span class="section-number-3">7.3</span> Dynamics uncertainty estimation</h3>
|
||
<div class="outline-text-3" id="text-7-3">
|
||
<p>
|
||
Weights representing the dynamical uncertainty of the sensors are defined below.
|
||
</p>
|
||
<div class="org-src-container">
|
||
<pre class="src src-matlab"> w_acc = createWeight(<span class="org-string">'n'</span>, 2, <span class="org-string">'G0'</span>, 10, <span class="org-string">'G1'</span>, 0.2, <span class="org-string">'Gc'</span>, 1, <span class="org-string">'w0'</span>, 6<span class="org-type">*</span>2<span class="org-type">*</span><span class="org-constant">pi</span>) <span class="org-type">*</span> ...
|
||
createWeight(<span class="org-string">'n'</span>, 2, <span class="org-string">'G0'</span>, 1, <span class="org-string">'G1'</span>, 5<span class="org-type">/</span>0.2, <span class="org-string">'Gc'</span>, 1<span class="org-type">/</span>0.2, <span class="org-string">'w0'</span>, 1300<span class="org-type">*</span>2<span class="org-type">*</span><span class="org-constant">pi</span>);
|
||
|
||
w_geo = createWeight(<span class="org-string">'n'</span>, 2, <span class="org-string">'G0'</span>, 0.6, <span class="org-string">'G1'</span>, 0.2, <span class="org-string">'Gc'</span>, 0.3, <span class="org-string">'w0'</span>, 3<span class="org-type">*</span>2<span class="org-type">*</span><span class="org-constant">pi</span>) <span class="org-type">*</span> ...
|
||
createWeight(<span class="org-string">'n'</span>, 2, <span class="org-string">'G0'</span>, 1, <span class="org-string">'G1'</span>, 10<span class="org-type">/</span>0.2, <span class="org-string">'Gc'</span>, 1<span class="org-type">/</span>0.2, <span class="org-string">'w0'</span>, 800<span class="org-type">*</span>2<span class="org-type">*</span><span class="org-constant">pi</span>);
|
||
</pre>
|
||
</div>
|
||
|
||
<p>
|
||
The measured dynamics are compared with the modelled one as well as the modelled uncertainty in Figure <a href="#orge982fdc">32</a> for the accelerometers and in Figure <a href="#org06d28d8">33</a> for the geophones.
|
||
</p>
|
||
|
||
|
||
<div id="orge982fdc" class="figure">
|
||
<p><img src="figs/dyn_uncertainty_acc.png" alt="dyn_uncertainty_acc.png" />
|
||
</p>
|
||
<p><span class="figure-number">Figure 32: </span>Modeled dynamical uncertainty and meaured dynamics of the accelerometers</p>
|
||
</div>
|
||
|
||
|
||
<div id="org06d28d8" class="figure">
|
||
<p><img src="figs/dyn_uncertainty_geo.png" alt="dyn_uncertainty_geo.png" />
|
||
</p>
|
||
<p><span class="figure-number">Figure 33: </span>Modeled dynamical uncertainty and meaured dynamics of the geophones</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div id="outline-container-org9927374" class="outline-3">
|
||
<h3 id="org9927374"><span class="section-number-3">7.4</span> \(\mathcal{H}_\infty\) Synthesis of Complementary Filters</h3>
|
||
<div class="outline-text-3" id="text-7-4">
|
||
<p>
|
||
A last weight is now defined that represents the maximum dynamical uncertainty that is allowed for the super sensor.
|
||
</p>
|
||
<div class="org-src-container">
|
||
<pre class="src src-matlab"> wu = inv(createWeight(<span class="org-string">'n'</span>, 2, <span class="org-string">'G0'</span>, 0.7, <span class="org-string">'G1'</span>, 0.3, <span class="org-string">'Gc'</span>, 0.4, <span class="org-string">'w0'</span>, 3<span class="org-type">*</span>2<span class="org-type">*</span><span class="org-constant">pi</span>) <span class="org-type">*</span> ...
|
||
createWeight(<span class="org-string">'n'</span>, 2, <span class="org-string">'G0'</span>, 1, <span class="org-string">'G1'</span>, 6<span class="org-type">/</span>0.3, <span class="org-string">'Gc'</span>, 1<span class="org-type">/</span>0.3, <span class="org-string">'w0'</span>, 1200<span class="org-type">*</span>2<span class="org-type">*</span><span class="org-constant">pi</span>));
|
||
</pre>
|
||
</div>
|
||
|
||
<p>
|
||
This dynamical uncertainty is compared with the two sensor uncertainties in Figure <a href="#org6ca8d75">34</a>.
|
||
</p>
|
||
|
||
<div id="org6ca8d75" class="figure">
|
||
<p><img src="figs/uncertainty_weight_and_sensor_uncertainties.png" alt="uncertainty_weight_and_sensor_uncertainties.png" />
|
||
</p>
|
||
<p><span class="figure-number">Figure 34: </span>Individual sensor uncertainty (normalized by their dynamics) and the wanted maximum super sensor noise uncertainty</p>
|
||
</div>
|
||
|
||
<p>
|
||
The generalized plant used for the synthesis is defined:
|
||
</p>
|
||
<div class="org-src-container">
|
||
<pre class="src src-matlab"> P = [wu<span class="org-type">*</span>w_acc <span class="org-type">-</span>wu<span class="org-type">*</span>w_acc;
|
||
0 wu<span class="org-type">*</span>w_geo;
|
||
1 0];
|
||
</pre>
|
||
</div>
|
||
|
||
<p>
|
||
And the \(\mathcal{H}_\infty\) synthesis using the <code>hinfsyn</code> command is performed.
|
||
</p>
|
||
<div class="org-src-container">
|
||
<pre class="src src-matlab"> [H_geo, <span class="org-type">~</span>, gamma, <span class="org-type">~</span>] = hinfsyn(P, 1, 1,<span class="org-string">'TOLGAM'</span>, 0.001, <span class="org-string">'METHOD'</span>, <span class="org-string">'ric'</span>, <span class="org-string">'DISPLAY'</span>, <span class="org-string">'on'</span>);
|
||
</pre>
|
||
</div>
|
||
|
||
<pre class="example" id="org74708c9">
|
||
Test bounds: 0.8556 <= gamma <= 1.34
|
||
|
||
gamma X>=0 Y>=0 rho(XY)<1 p/f
|
||
1.071e+00 0.0e+00 0.0e+00 0.000e+00 p
|
||
9.571e-01 0.0e+00 0.0e+00 9.436e-16 p
|
||
9.049e-01 0.0e+00 0.0e+00 1.084e-15 p
|
||
8.799e-01 0.0e+00 0.0e+00 1.191e-16 p
|
||
8.677e-01 0.0e+00 0.0e+00 6.905e-15 p
|
||
8.616e-01 0.0e+00 0.0e+00 0.000e+00 p
|
||
8.586e-01 1.1e-17 0.0e+00 6.917e-16 p
|
||
8.571e-01 0.0e+00 0.0e+00 6.991e-17 p
|
||
8.564e-01 0.0e+00 0.0e+00 1.492e-16 p
|
||
|
||
Best performance (actual): 0.8563
|
||
</pre>
|
||
|
||
<p>
|
||
The complementary filter is defined as follows:
|
||
</p>
|
||
<div class="org-src-container">
|
||
<pre class="src src-matlab"> H_acc = 1 <span class="org-type">-</span> H_geo;
|
||
</pre>
|
||
</div>
|
||
|
||
<p>
|
||
The bode plot of the obtained complementary filters is shown in Figure
|
||
</p>
|
||
|
||
<div id="orgbb0dcad" class="figure">
|
||
<p><img src="figs/h_infinity_obtained_complementary_filters.png" alt="h_infinity_obtained_complementary_filters.png" />
|
||
</p>
|
||
<p><span class="figure-number">Figure 35: </span>Bode plot of the obtained complementary filters using the \(\mathcal{H}_\infty\) synthesis</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div id="outline-container-org1a848c4" class="outline-3">
|
||
<h3 id="org1a848c4"><span class="section-number-3">7.5</span> Obtained Super Sensor Dynamical Uncertainty</h3>
|
||
<div class="outline-text-3" id="text-7-5">
|
||
<p>
|
||
The obtained super sensor dynamical uncertainty is shown in Figure <a href="#orgb89c649">36</a>.
|
||
</p>
|
||
|
||
|
||
<div id="orgb89c649" class="figure">
|
||
<p><img src="figs/super_sensor_uncertainty_h_infinity.png" alt="super_sensor_uncertainty_h_infinity.png" />
|
||
</p>
|
||
<p><span class="figure-number">Figure 36: </span>Obtained Super sensor dynamics uncertainty</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div id="outline-container-org8fd3dbf" class="outline-2">
|
||
<h2 id="org8fd3dbf"><span class="section-number-2">8</span> Optimal and Robust sensor fusion using the \(\mathcal{H}_2/\mathcal{H}_\infty\) synthesis</h2>
|
||
<div class="outline-text-2" id="text-8">
|
||
<p>
|
||
<a id="org3d37653"></a>
|
||
</p>
|
||
</div>
|
||
<div id="outline-container-org81bcb28" class="outline-3">
|
||
<h3 id="org81bcb28"><span class="section-number-3">8.1</span> Noise and Dynamical uncertainty weights</h3>
|
||
<div class="outline-text-3" id="text-8-1">
|
||
<div class="org-src-container">
|
||
<pre class="src src-matlab"> N_acc = (s<span class="org-type">/</span>(2<span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">*</span>2000) <span class="org-type">+</span> 1)<span class="org-type">^</span>2<span class="org-type">/</span>(s <span class="org-type">+</span> 0.1<span class="org-type">*</span>2<span class="org-type">*</span><span class="org-constant">pi</span>)<span class="org-type">/</span>(s <span class="org-type">+</span> 1e3<span class="org-type">*</span>2<span class="org-type">*</span><span class="org-constant">pi</span>)<span class="org-type">/</span>(1 <span class="org-type">+</span> s<span class="org-type">/</span>2<span class="org-type">/</span><span class="org-constant">pi</span><span class="org-type">/</span>1e3); <span class="org-comment">% [m/sqrt(Hz)]</span>
|
||
N_geo = 4e<span class="org-type">-</span>4<span class="org-type">*</span>((s <span class="org-type">+</span> 2<span class="org-type">*</span><span class="org-constant">pi</span>)<span class="org-type">/</span>(2<span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">*</span>200) <span class="org-type">+</span> 1)<span class="org-type">/</span>(s <span class="org-type">+</span> 1e3<span class="org-type">*</span>2<span class="org-type">*</span><span class="org-constant">pi</span>)<span class="org-type">/</span>(1 <span class="org-type">+</span> s<span class="org-type">/</span>2<span class="org-type">/</span><span class="org-constant">pi</span><span class="org-type">/</span>1e3); <span class="org-comment">% [m/sqrt(Hz)]</span>
|
||
</pre>
|
||
</div>
|
||
|
||
<div class="org-src-container">
|
||
<pre class="src src-matlab"> w_acc = createWeight(<span class="org-string">'n'</span>, 2, <span class="org-string">'G0'</span>, 10, <span class="org-string">'G1'</span>, 0.2, <span class="org-string">'Gc'</span>, 1, <span class="org-string">'w0'</span>, 6<span class="org-type">*</span>2<span class="org-type">*</span><span class="org-constant">pi</span>) <span class="org-type">*</span> ...
|
||
createWeight(<span class="org-string">'n'</span>, 2, <span class="org-string">'G0'</span>, 1, <span class="org-string">'G1'</span>, 5<span class="org-type">/</span>0.2, <span class="org-string">'Gc'</span>, 1<span class="org-type">/</span>0.2, <span class="org-string">'w0'</span>, 1300<span class="org-type">*</span>2<span class="org-type">*</span><span class="org-constant">pi</span>);
|
||
|
||
w_geo = createWeight(<span class="org-string">'n'</span>, 2, <span class="org-string">'G0'</span>, 0.6, <span class="org-string">'G1'</span>, 0.2, <span class="org-string">'Gc'</span>, 0.3, <span class="org-string">'w0'</span>, 3<span class="org-type">*</span>2<span class="org-type">*</span><span class="org-constant">pi</span>) <span class="org-type">*</span> ...
|
||
createWeight(<span class="org-string">'n'</span>, 2, <span class="org-string">'G0'</span>, 1, <span class="org-string">'G1'</span>, 10<span class="org-type">/</span>0.2, <span class="org-string">'Gc'</span>, 1<span class="org-type">/</span>0.2, <span class="org-string">'w0'</span>, 800<span class="org-type">*</span>2<span class="org-type">*</span><span class="org-constant">pi</span>);
|
||
</pre>
|
||
</div>
|
||
|
||
<div class="org-src-container">
|
||
<pre class="src src-matlab"> wu = inv(createWeight(<span class="org-string">'n'</span>, 2, <span class="org-string">'G0'</span>, 0.7, <span class="org-string">'G1'</span>, 0.3, <span class="org-string">'Gc'</span>, 0.4, <span class="org-string">'w0'</span>, 3<span class="org-type">*</span>2<span class="org-type">*</span><span class="org-constant">pi</span>) <span class="org-type">*</span> ...
|
||
createWeight(<span class="org-string">'n'</span>, 2, <span class="org-string">'G0'</span>, 1, <span class="org-string">'G1'</span>, 6<span class="org-type">/</span>0.3, <span class="org-string">'Gc'</span>, 1<span class="org-type">/</span>0.3, <span class="org-string">'w0'</span>, 1200<span class="org-type">*</span>2<span class="org-type">*</span><span class="org-constant">pi</span>));
|
||
</pre>
|
||
</div>
|
||
|
||
<div class="org-src-container">
|
||
<pre class="src src-matlab"> P = [wu<span class="org-type">*</span>w_acc <span class="org-type">-</span>wu<span class="org-type">*</span>w_acc;
|
||
0 wu<span class="org-type">*</span>w_geo;
|
||
N_acc <span class="org-type">-</span>N_acc;
|
||
0 N_geo;
|
||
1 0];
|
||
</pre>
|
||
</div>
|
||
|
||
<p>
|
||
And the mixed \(\mathcal{H}_2/\mathcal{H}_\infty\) synthesis is performed.
|
||
</p>
|
||
<div class="org-src-container">
|
||
<pre class="src src-matlab"> [H_geo, <span class="org-type">~</span>] = h2hinfsyn(ss(P), 1, 1, 2, [0, 1], <span class="org-string">'HINFMAX'</span>, 1, <span class="org-string">'H2MAX'</span>, <span class="org-constant">Inf</span>, <span class="org-string">'DKMAX'</span>, 100, <span class="org-string">'TOL'</span>, 1e<span class="org-type">-</span>3, <span class="org-string">'DISPLAY'</span>, <span class="org-string">'on'</span>);
|
||
</pre>
|
||
</div>
|
||
|
||
<div class="org-src-container">
|
||
<pre class="src src-matlab"> H_acc = 1 <span class="org-type">-</span> H_geo;
|
||
</pre>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div id="outline-container-org74f7865" class="outline-3">
|
||
<h3 id="org74f7865"><span class="section-number-3">8.2</span> Obtained Super Sensor Noise</h3>
|
||
<div class="outline-text-3" id="text-8-2">
|
||
<div class="org-src-container">
|
||
<pre class="src src-matlab"> freqs = logspace(0, 4, 1000);
|
||
PSD_Sgeo = abs(squeeze(freqresp(N_geo, freqs, <span class="org-string">'Hz'</span>)))<span class="org-type">.^</span>2;
|
||
PSD_Sacc = abs(squeeze(freqresp(N_acc, freqs, <span class="org-string">'Hz'</span>)))<span class="org-type">.^</span>2;
|
||
PSD_Hss = abs(squeeze(freqresp(N_acc<span class="org-type">*</span>H_acc, freqs, <span class="org-string">'Hz'</span>)))<span class="org-type">.^</span>2 <span class="org-type">+</span> ...
|
||
abs(squeeze(freqresp(N_geo<span class="org-type">*</span>H_geo, freqs, <span class="org-string">'Hz'</span>)))<span class="org-type">.^</span>2;
|
||
</pre>
|
||
</div>
|
||
|
||
|
||
<div id="orgd2415ea" class="figure">
|
||
<p><img src="figs/psd_sensors_htwo_hinf_synthesis.png" alt="psd_sensors_htwo_hinf_synthesis.png" />
|
||
</p>
|
||
<p><span class="figure-number">Figure 37: </span>Power Spectral Density of the Super Sensor obtained with the mixed \(\mathcal{H}_2/\mathcal{H}_\infty\) synthesis</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div id="outline-container-org2dc3d6d" class="outline-3">
|
||
<h3 id="org2dc3d6d"><span class="section-number-3">8.3</span> Obtained Super Sensor Dynamical Uncertainty</h3>
|
||
<div class="outline-text-3" id="text-8-3">
|
||
|
||
<div id="org2574eda" class="figure">
|
||
<p><img src="figs/super_sensor_dynamical_uncertainty_Htwo_Hinf.png" alt="super_sensor_dynamical_uncertainty_Htwo_Hinf.png" />
|
||
</p>
|
||
<p><span class="figure-number">Figure 38: </span>Super sensor dynamical uncertainty (solid curve) when using the mixed \(\mathcal{H}_2/\mathcal{H}_\infty\) Synthesis</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div id="outline-container-org580eeef" class="outline-3">
|
||
<h3 id="org580eeef"><span class="section-number-3">8.4</span> Experimental Super Sensor Dynamical Uncertainty</h3>
|
||
<div class="outline-text-3" id="text-8-4">
|
||
<p>
|
||
The super sensor dynamics is shown in Figure <a href="#org2650a01">39</a>.
|
||
</p>
|
||
|
||
|
||
<div id="org2650a01" class="figure">
|
||
<p><img src="figs/super_sensor_optimal_uncertainty.png" alt="super_sensor_optimal_uncertainty.png" />
|
||
</p>
|
||
<p><span class="figure-number">Figure 39: </span>Inertial Sensor dynamics as well as the super sensor dynamics</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div id="outline-container-orgc907798" class="outline-3">
|
||
<h3 id="orgc907798"><span class="section-number-3">8.5</span> Experimental Super Sensor Noise</h3>
|
||
<div class="outline-text-3" id="text-8-5">
|
||
<p>
|
||
The obtained super sensor noise is shown in Figure <a href="#org9b7ff71">40</a>.
|
||
</p>
|
||
|
||
|
||
<div id="org9b7ff71" class="figure">
|
||
<p><img src="figs/super_sensor_optimal_noise.png" alt="super_sensor_optimal_noise.png" />
|
||
</p>
|
||
<p><span class="figure-number">Figure 40: </span>ASD of the super sensor obtained using the \(\mathcal{H}_2/\mathcal{H}_\infty\) synthesis</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div id="outline-container-org47873a7" class="outline-2">
|
||
<h2 id="org47873a7"><span class="section-number-2">9</span> Matlab Functions</h2>
|
||
<div class="outline-text-2" id="text-9">
|
||
<p>
|
||
<a id="org9c1fee7"></a>
|
||
</p>
|
||
</div>
|
||
<div id="outline-container-orgc94c293" class="outline-3">
|
||
<h3 id="orgc94c293"><span class="section-number-3">9.1</span> <code>createWeight</code></h3>
|
||
<div class="outline-text-3" id="text-9-1">
|
||
<p>
|
||
<a id="org336e128"></a>
|
||
</p>
|
||
|
||
<p>
|
||
This Matlab function is accessible <a href="src/createWeight.m">here</a>.
|
||
</p>
|
||
|
||
<div class="org-src-container">
|
||
<pre class="src src-matlab"> <span class="org-keyword">function</span> <span class="org-variable-name">[W]</span> = <span class="org-function-name">createWeight</span>(<span class="org-variable-name">args</span>)
|
||
<span class="org-comment">% createWeight -</span>
|
||
<span class="org-comment">%</span>
|
||
<span class="org-comment">% Syntax: [in_data] = createWeight(in_data)</span>
|
||
<span class="org-comment">%</span>
|
||
<span class="org-comment">% Inputs:</span>
|
||
<span class="org-comment">% - n - Weight Order</span>
|
||
<span class="org-comment">% - G0 - Low frequency Gain</span>
|
||
<span class="org-comment">% - G1 - High frequency Gain</span>
|
||
<span class="org-comment">% - Gc - Gain of W at frequency w0</span>
|
||
<span class="org-comment">% - w0 - Frequency at which |W(j w0)| = Gc</span>
|
||
<span class="org-comment">%</span>
|
||
<span class="org-comment">% Outputs:</span>
|
||
<span class="org-comment">% - W - Generated Weight</span>
|
||
|
||
<span class="org-keyword">arguments</span>
|
||
<span class="org-variable-name">args</span>.n (1,1) double {mustBeInteger, mustBePositive} = 1
|
||
<span class="org-variable-name">args</span>.G0 (1,1) double {mustBeNumeric, mustBePositive} = 0.1
|
||
<span class="org-variable-name">args</span>.G1 (1,1) double {mustBeNumeric, mustBePositive} = 10
|
||
<span class="org-variable-name">args</span>.Gc (1,1) double {mustBeNumeric, mustBePositive} = 1
|
||
<span class="org-variable-name">args</span>.w0 (1,1) double {mustBeNumeric, mustBePositive} = 1
|
||
<span class="org-keyword">end</span>
|
||
|
||
mustBeBetween(args.G0, args.Gc, args.G1);
|
||
|
||
s = tf(<span class="org-string">'s'</span>);
|
||
|
||
W = (((1<span class="org-type">/</span>args.w0)<span class="org-type">*</span>sqrt((1<span class="org-type">-</span>(args.G0<span class="org-type">/</span>args.Gc)<span class="org-type">^</span>(2<span class="org-type">/</span>args.n))<span class="org-type">/</span>(1<span class="org-type">-</span>(args.Gc<span class="org-type">/</span>args.G1)<span class="org-type">^</span>(2<span class="org-type">/</span>args.n)))<span class="org-type">*</span>s <span class="org-type">+</span> (args.G0<span class="org-type">/</span>args.Gc)<span class="org-type">^</span>(1<span class="org-type">/</span>args.n))<span class="org-type">/</span>((1<span class="org-type">/</span>args.G1)<span class="org-type">^</span>(1<span class="org-type">/</span>args.n)<span class="org-type">*</span>(1<span class="org-type">/</span>args.w0)<span class="org-type">*</span>sqrt((1<span class="org-type">-</span>(args.G0<span class="org-type">/</span>args.Gc)<span class="org-type">^</span>(2<span class="org-type">/</span>args.n))<span class="org-type">/</span>(1<span class="org-type">-</span>(args.Gc<span class="org-type">/</span>args.G1)<span class="org-type">^</span>(2<span class="org-type">/</span>args.n)))<span class="org-type">*</span>s <span class="org-type">+</span> (1<span class="org-type">/</span>args.Gc)<span class="org-type">^</span>(1<span class="org-type">/</span>args.n)))<span class="org-type">^</span>args.n;
|
||
|
||
<span class="org-keyword">end</span>
|
||
|
||
<span class="org-comment">% Custom validation function</span>
|
||
<span class="org-keyword">function</span> <span class="org-function-name">mustBeBetween</span>(<span class="org-variable-name">a</span>,<span class="org-variable-name">b</span>,<span class="org-variable-name">c</span>)
|
||
<span class="org-keyword">if</span> <span class="org-type">~</span>((a <span class="org-type">></span> b <span class="org-type">&&</span> b <span class="org-type">></span> c) <span class="org-type">||</span> (c <span class="org-type">></span> b <span class="org-type">&&</span> b <span class="org-type">></span> a))
|
||
eid = <span class="org-string">'createWeight:inputError'</span>;
|
||
msg = <span class="org-string">'Gc should be between G0 and G1.'</span>;
|
||
throwAsCaller(MException(eid,msg))
|
||
<span class="org-keyword">end</span>
|
||
<span class="org-keyword">end</span>
|
||
</pre>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div id="outline-container-orgac520ac" class="outline-3">
|
||
<h3 id="orgac520ac"><span class="section-number-3">9.2</span> <code>plotMagUncertainty</code></h3>
|
||
<div class="outline-text-3" id="text-9-2">
|
||
<p>
|
||
<a id="org3b8753e"></a>
|
||
</p>
|
||
|
||
<p>
|
||
This Matlab function is accessible <a href="src/plotMagUncertainty.m">here</a>.
|
||
</p>
|
||
|
||
<div class="org-src-container">
|
||
<pre class="src src-matlab"> <span class="org-keyword">function</span> <span class="org-variable-name">[p]</span> = <span class="org-function-name">plotMagUncertainty</span>(<span class="org-variable-name">W</span>, <span class="org-variable-name">freqs</span>, <span class="org-variable-name">args</span>)
|
||
<span class="org-comment">% plotMagUncertainty -</span>
|
||
<span class="org-comment">%</span>
|
||
<span class="org-comment">% Syntax: [p] = plotMagUncertainty(W, freqs, args)</span>
|
||
<span class="org-comment">%</span>
|
||
<span class="org-comment">% Inputs:</span>
|
||
<span class="org-comment">% - W - Multiplicative Uncertainty Weight</span>
|
||
<span class="org-comment">% - freqs - Frequency Vector [Hz]</span>
|
||
<span class="org-comment">% - args - Optional Arguments:</span>
|
||
<span class="org-comment">% - G</span>
|
||
<span class="org-comment">% - color_i</span>
|
||
<span class="org-comment">% - opacity</span>
|
||
<span class="org-comment">%</span>
|
||
<span class="org-comment">% Outputs:</span>
|
||
<span class="org-comment">% - p - Plot Handle</span>
|
||
|
||
<span class="org-keyword">arguments</span>
|
||
<span class="org-variable-name">W</span>
|
||
<span class="org-variable-name">freqs</span> double {mustBeNumeric, mustBeNonnegative}
|
||
<span class="org-variable-name">args</span>.G = tf(1)
|
||
<span class="org-variable-name">args</span>.color_i (1,1) double {mustBeInteger, mustBePositive} = 1
|
||
<span class="org-variable-name">args</span>.opacity (1,1) double {mustBeNumeric, mustBeNonnegative} = 0.3
|
||
<span class="org-variable-name">args</span>.DisplayName char = <span class="org-string">''</span>
|
||
<span class="org-keyword">end</span>
|
||
|
||
<span class="org-comment">% Get defaults colors</span>
|
||
colors = <span class="org-type">get</span>(<span class="org-variable-name">groot</span>, <span class="org-string">'defaultAxesColorOrder'</span>);
|
||
|
||
p = <span class="org-type">patch</span>([freqs flip(freqs)], ...
|
||
[abs(squeeze(freqresp(args.G, freqs, <span class="org-string">'Hz'</span>)))<span class="org-type">.*</span>(1 <span class="org-type">+</span> abs(squeeze(freqresp(W, freqs, <span class="org-string">'Hz'</span>)))); ...
|
||
flip(abs(squeeze(freqresp(args.G, freqs, <span class="org-string">'Hz'</span>)))<span class="org-type">.*</span>max(1 <span class="org-type">-</span> abs(squeeze(freqresp(W, freqs, <span class="org-string">'Hz'</span>))), 1e<span class="org-type">-</span>6))], <span class="org-string">'w'</span>, ...
|
||
<span class="org-string">'DisplayName'</span>, args.DisplayName);
|
||
|
||
p.FaceColor = colors(args.color_i, <span class="org-type">:</span>);
|
||
p.EdgeColor = <span class="org-string">'none'</span>;
|
||
p.FaceAlpha = args.opacity;
|
||
|
||
<span class="org-keyword">end</span>
|
||
</pre>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div id="outline-container-orgf15effe" class="outline-3">
|
||
<h3 id="orgf15effe"><span class="section-number-3">9.3</span> <code>plotPhaseUncertainty</code></h3>
|
||
<div class="outline-text-3" id="text-9-3">
|
||
<p>
|
||
<a id="org59d4d8e"></a>
|
||
</p>
|
||
|
||
<p>
|
||
This Matlab function is accessible <a href="src/plotPhaseUncertainty.m">here</a>.
|
||
</p>
|
||
|
||
<div class="org-src-container">
|
||
<pre class="src src-matlab"> <span class="org-keyword">function</span> <span class="org-variable-name">[p]</span> = <span class="org-function-name">plotPhaseUncertainty</span>(<span class="org-variable-name">W</span>, <span class="org-variable-name">freqs</span>, <span class="org-variable-name">args</span>)
|
||
<span class="org-comment">% plotPhaseUncertainty -</span>
|
||
<span class="org-comment">%</span>
|
||
<span class="org-comment">% Syntax: [p] = plotPhaseUncertainty(W, freqs, args)</span>
|
||
<span class="org-comment">%</span>
|
||
<span class="org-comment">% Inputs:</span>
|
||
<span class="org-comment">% - W - Multiplicative Uncertainty Weight</span>
|
||
<span class="org-comment">% - freqs - Frequency Vector [Hz]</span>
|
||
<span class="org-comment">% - args - Optional Arguments:</span>
|
||
<span class="org-comment">% - G</span>
|
||
<span class="org-comment">% - color_i</span>
|
||
<span class="org-comment">% - opacity</span>
|
||
<span class="org-comment">%</span>
|
||
<span class="org-comment">% Outputs:</span>
|
||
<span class="org-comment">% - p - Plot Handle</span>
|
||
|
||
<span class="org-keyword">arguments</span>
|
||
<span class="org-variable-name">W</span>
|
||
<span class="org-variable-name">freqs</span> double {mustBeNumeric, mustBeNonnegative}
|
||
<span class="org-variable-name">args</span>.G = tf(1)
|
||
<span class="org-variable-name">args</span>.color_i (1,1) double {mustBeInteger, mustBePositive} = 1
|
||
<span class="org-variable-name">args</span>.opacity (1,1) double {mustBeNumeric, mustBePositive} = 0.3
|
||
<span class="org-variable-name">args</span>.DisplayName char = <span class="org-string">''</span>
|
||
<span class="org-keyword">end</span>
|
||
|
||
<span class="org-comment">% Get defaults colors</span>
|
||
colors = <span class="org-type">get</span>(<span class="org-variable-name">groot</span>, <span class="org-string">'defaultAxesColorOrder'</span>);
|
||
|
||
<span class="org-comment">% Compute Phase Uncertainty</span>
|
||
Dphi = 180<span class="org-type">/</span><span class="org-constant">pi</span><span class="org-type">*</span>asin(abs(squeeze(freqresp(W, freqs, <span class="org-string">'Hz'</span>))));
|
||
Dphi(abs(squeeze(freqresp(W, freqs, <span class="org-string">'Hz'</span>))) <span class="org-type">></span> 1) = 360;
|
||
|
||
<span class="org-comment">% Compute Plant Phase</span>
|
||
G_ang = 180<span class="org-type">/</span><span class="org-constant">pi</span><span class="org-type">*</span>angle(squeeze(freqresp(args.G, freqs, <span class="org-string">'Hz'</span>)));
|
||
|
||
p = <span class="org-type">patch</span>([freqs flip(freqs)], [G_ang<span class="org-type">+</span>Dphi; flip(G_ang<span class="org-type">-</span>Dphi)], <span class="org-string">'w'</span>, ...
|
||
<span class="org-string">'DisplayName'</span>, args.DisplayName);
|
||
|
||
p.FaceColor = colors(args.color_i, <span class="org-type">:</span>);
|
||
p.EdgeColor = <span class="org-string">'none'</span>;
|
||
p.FaceAlpha = args.opacity;
|
||
|
||
<span class="org-keyword">end</span>
|
||
</pre>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<style>.csl-entry{text-indent: -1.5em; margin-left: 1.5em;}</style><h2 class='citeproc-org-bib-h2'>Bibliography</h2>
|
||
<div class="csl-bib-body">
|
||
<div class="csl-entry"><a name="citeproc_bib_item_1"></a>Barzilai, Aaron, Tom VanZandt, and Tom Kenny. 1998. “Technique for Measurement of the Noise of a Sensor in the Presence of Large Background Signals.” <i>Review of Scientific Instruments</i> 69 (7):2767–72. <a href="https://doi.org/10.1063/1.1149013">https://doi.org/10.1063/1.1149013</a>.</div>
|
||
</div>
|
||
</div>
|
||
<div id="postamble" class="status">
|
||
<p class="author">Author: Dehaeze Thomas</p>
|
||
<p class="date">Created: 2021-02-02 mar. 18:53</p>
|
||
</div>
|
||
</body>
|
||
</html>
|