1820 lines
90 KiB
HTML
1820 lines
90 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>
|
||
<!-- 2020-11-12 jeu. 10:07 -->
|
||
<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 = {
|
||
tex: {
|
||
tags: 'ams',
|
||
macros: {bm: ["\\boldsymbol{#1}",1],}
|
||
}
|
||
};
|
||
</script>
|
||
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.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="#orgb357075">1. Experimental Setup</a></li>
|
||
<li><a href="#org970e8a2">2. First identification of the system</a>
|
||
<ul>
|
||
<li><a href="#org6b482aa">2.1. Load Data</a></li>
|
||
<li><a href="#orga904aac">2.2. Excitation Signal</a></li>
|
||
<li><a href="#org3281468">2.3. Identified Plant</a></li>
|
||
<li><a href="#orgef4562a">2.4. Simscape Model - Comparison</a></li>
|
||
<li><a href="#orgb3c970a">2.5. Integral Force Feedback</a></li>
|
||
<li><a href="#orge916662">2.6. Inertial Sensors</a></li>
|
||
</ul>
|
||
</li>
|
||
<li><a href="#orgc62c93c">3. Optimal IFF Development</a>
|
||
<ul>
|
||
<li><a href="#org14b24d3">3.1. Load Data</a></li>
|
||
<li><a href="#orgb2f51c1">3.2. Experimental Data</a></li>
|
||
<li><a href="#org7bf8af8">3.3. Model of the IFF Plant</a></li>
|
||
<li><a href="#org8020961">3.4. Root Locus and optimal Controller</a></li>
|
||
<li><a href="#org4d1b318">3.5. Verification of the achievable damping</a></li>
|
||
</ul>
|
||
</li>
|
||
<li><a href="#org9390331">4. Generate the excitation signal</a>
|
||
<ul>
|
||
<li><a href="#org2440d4b">4.1. Transfer function from excitation signal to displacement</a></li>
|
||
<li><a href="#org75a8dc8">4.2. Motion measured during Huddle test</a></li>
|
||
</ul>
|
||
</li>
|
||
<li><a href="#org7766f4e">5. Identification of the Inertial Sensors Dynamics</a>
|
||
<ul>
|
||
<li><a href="#orgefa381b">5.1. Load Data</a></li>
|
||
<li><a href="#org6bcb6b3">5.2. Compare PSD during Huddle and and during identification</a></li>
|
||
<li><a href="#org925d5d6">5.3. Compute transfer functions</a></li>
|
||
</ul>
|
||
</li>
|
||
<li><a href="#orgc7c5d31">6. Inertial Sensor Noise and the \(\mathcal{H}_2\) Synthesis of complementary filters</a>
|
||
<ul>
|
||
<li><a href="#org6d45259">6.1. Load Data</a></li>
|
||
<li><a href="#org1d3c6b1">6.2. ASD of the Measured displacement</a></li>
|
||
<li><a href="#orgbf02800">6.3. ASD of the Sensor Noise</a></li>
|
||
<li><a href="#orgee25183">6.4. Noise Model</a></li>
|
||
<li><a href="#org6219399">6.5. \(\mathcal{H}_2\) Synthesis of the Complementary Filters</a></li>
|
||
<li><a href="#orgc452df1">6.6. Results</a></li>
|
||
</ul>
|
||
</li>
|
||
<li><a href="#org2019808">7. Inertial Sensor Dynamics Uncertainty and the \(\mathcal{H}_\infty\) Synthesis of complementary filters</a>
|
||
<ul>
|
||
<li><a href="#org08b375a">7.1. Load Data</a></li>
|
||
<li><a href="#org9552c8d">7.2. Compute the dynamics of both sensors</a></li>
|
||
<li><a href="#org1836677">7.3. Dynamics uncertainty estimation</a></li>
|
||
<li><a href="#org01c2180">7.4. \(\mathcal{H}_\infty\) Synthesis of Complementary Filters</a></li>
|
||
<li><a href="#org22bc718">7.5. Obtained Super Sensor Dynamical Uncertainty</a></li>
|
||
</ul>
|
||
</li>
|
||
<li><a href="#org31194e4">8. Optimal and Robust sensor fusion using the \(\mathcal{H}_2/\mathcal{H}_\infty\) synthesis</a>
|
||
<ul>
|
||
<li><a href="#orga0f4e4b">8.1. Noise and Dynamical uncertainty weights</a></li>
|
||
<li><a href="#org7118847">8.2. Obtained Super Sensor Noise</a></li>
|
||
<li><a href="#org697ec57">8.3. Obtained Super Sensor Dynamical Uncertainty</a></li>
|
||
<li><a href="#org1dd5c70">8.4. Experimental Super Sensor Dynamical Uncertainty</a></li>
|
||
<li><a href="#orgd196b55">8.5. Experimental Super Sensor Noise</a></li>
|
||
</ul>
|
||
</li>
|
||
<li><a href="#org112e7ac">9. Matlab Functions</a>
|
||
<ul>
|
||
<li><a href="#org3592beb">9.1. <code>createWeight</code></a></li>
|
||
<li><a href="#org171a5aa">9.2. <code>plotMagUncertainty</code></a></li>
|
||
<li><a href="#orgc8d516f">9.3. <code>plotPhaseUncertainty</code></a></li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
<hr>
|
||
<p>This report is also available as a <a href="./index.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="#orgaca0cfb">1</a>: the experimental setup is described</li>
|
||
<li>Section <a href="#org8b2f86c">2</a>: a first identification of the system dynamics is performed</li>
|
||
<li>Section <a href="#orgc35c79f">3</a>: the integral force feedback active damping technique is applied on the system</li>
|
||
<li>Section <a href="#org02fe412">4</a>: the optimal excitation signal is determine in order to have the best possible system dynamics estimation</li>
|
||
<li>Section <a href="#orgac40b1c">5</a>: the inertial sensor dynamics are experimentally estimated</li>
|
||
<li>Section <a href="#orgad2c14e">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="#org5c6b228">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="#org299c2cb">8</a>: Optimal sensor fusion is performed using the \(\mathcal{H}_2/\mathcal{H}_\infty\) synthesis</li>
|
||
</ul>
|
||
|
||
<div id="outline-container-orgb357075" class="outline-2">
|
||
<h2 id="orgb357075"><span class="section-number-2">1</span> Experimental Setup</h2>
|
||
<div class="outline-text-2" id="text-1">
|
||
<p>
|
||
<a id="orgaca0cfb"></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="#org0b2299f">1</a> and a picture of it is shown in Figure <a href="#org1ab3250">2</a>.
|
||
</p>
|
||
|
||
|
||
<div id="org0b2299f" 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="org1ab3250" 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="#org4272fa9">1</a> and <a href="#orgbf68f67">2</a>.
|
||
</p>
|
||
|
||
<table id="org4272fa9" 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="orgbf68f67" 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-org970e8a2" class="outline-2">
|
||
<h2 id="org970e8a2"><span class="section-number-2">2</span> First identification of the system</h2>
|
||
<div class="outline-text-2" id="text-2">
|
||
<p>
|
||
<a id="org8b2f86c"></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-org6b482aa" class="outline-3">
|
||
<h3 id="org6b482aa"><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-orga904aac" class="outline-3">
|
||
<h3 id="orga904aac"><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="#org8376821">3</a>.
|
||
</p>
|
||
|
||
|
||
<div id="org8376821" 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-org3281468" class="outline-3">
|
||
<h3 id="org3281468"><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="#orgb8fcf1b">4</a> and <a href="#org2a942c6">5</a>.
|
||
</p>
|
||
|
||
|
||
<div id="orgb8fcf1b" 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="org2a942c6" 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-orgef4562a" class="outline-3">
|
||
<h3 id="orgef4562a"><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="#org7befadc">6</a> and <a href="#orgb29f1bf">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="org7befadc" 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="orgb29f1bf" 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-orgb3c970a" class="outline-3">
|
||
<h3 id="orgb3c970a"><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="#org9b30f1e">8</a>.
|
||
This shows that the Integral Force Feedback architecture effectively damps the first resonance of the system.
|
||
</p>
|
||
|
||
|
||
<div id="org9b30f1e" 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-orge916662" class="outline-3">
|
||
<h3 id="orge916662"><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="#orgfb32895">9</a> while the one of the geophones are compared in Figure <a href="#org2fa243c">10</a>.
|
||
</p>
|
||
|
||
|
||
<div id="orgfb32895" 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="org2fa243c" 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-orgc62c93c" class="outline-2">
|
||
<h2 id="orgc62c93c"><span class="section-number-2">3</span> Optimal IFF Development</h2>
|
||
<div class="outline-text-2" id="text-3">
|
||
<p>
|
||
<a id="orgc35c79f"></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-org14b24d3" class="outline-3">
|
||
<h3 id="org14b24d3"><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-orgb2f51c1" class="outline-3">
|
||
<h3 id="orgb2f51c1"><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="#org363185b">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="org363185b" 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="#orga2a59a0">12</a>.
|
||
</p>
|
||
|
||
|
||
<div id="orga2a59a0" 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-org7bf8af8" class="outline-3">
|
||
<h3 id="org7bf8af8"><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="#org9723c85">13</a>.
|
||
</p>
|
||
|
||
|
||
<div id="org9723c85" 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-org8020961" class="outline-3">
|
||
<h3 id="org8020961"><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="#org60e13d5">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="org60e13d5" 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="#org60e13d5">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-org4d1b318" class="outline-3">
|
||
<h3 id="org4d1b318"><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="#orgd1effda">15</a> and the dynamics in Figure <a href="#orgbbee024">16</a>.
|
||
</p>
|
||
|
||
|
||
<div id="orgd1effda" 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="orgbbee024" 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-org9390331" class="outline-2">
|
||
<h2 id="org9390331"><span class="section-number-2">4</span> Generate the excitation signal</h2>
|
||
<div class="outline-text-2" id="text-4">
|
||
<p>
|
||
<a id="org02fe412"></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-org2440d4b" class="outline-3">
|
||
<h3 id="org2440d4b"><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="org9c3fcc0" 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-org75a8dc8" class="outline-3">
|
||
<h3 id="org75a8dc8"><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="org365abd7" 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="orgc911952" 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="orgb8943f6" 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-org7766f4e" class="outline-2">
|
||
<h2 id="org7766f4e"><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="orgac40b1c"></a>
|
||
</p>
|
||
<p>
|
||
Using the excitation signal generated in Section <a href="#org02fe412">4</a>, the dynamics of the inertial sensors are identified.
|
||
</p>
|
||
</div>
|
||
<div id="outline-container-orgefa381b" class="outline-3">
|
||
<h3 id="orgefa381b"><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-org6bcb6b3" class="outline-3">
|
||
<h3 id="org6bcb6b3"><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="#org24d5a94">21</a> and <a href="#org6af1a30">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="org24d5a94" 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="org6af1a30" 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-org925d5d6" class="outline-3">
|
||
<h3 id="org925d5d6"><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="#org57a2780">23</a>.
|
||
</p>
|
||
|
||
|
||
<div id="org57a2780" 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="#org04d4f88">24</a> and <a href="#orgcb9641c">25</a>.)
|
||
</p>
|
||
|
||
|
||
<div id="org04d4f88" 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="orgcb9641c" 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-orgc7c5d31" class="outline-2">
|
||
<h2 id="orgc7c5d31"><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="orgad2c14e"></a>
|
||
</p>
|
||
<p>
|
||
In this section, the noise of the inertial sensors (geophones and accelerometers) is estimated.
|
||
</p>
|
||
</div>
|
||
<div id="outline-container-org6d45259" class="outline-3">
|
||
<h3 id="org6d45259"><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-org1d3c6b1" class="outline-3">
|
||
<h3 id="org1d3c6b1"><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="#org1773234">26</a>.
|
||
</p>
|
||
|
||
|
||
<div id="org1773234" 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-orgbf02800" class="outline-3">
|
||
<h3 id="orgbf02800"><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="#orgb721b73">27</a>.
|
||
</p>
|
||
|
||
<div id="orgb721b73" 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-orgee25183" class="outline-3">
|
||
<h3 id="orgee25183"><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="#orge6b1f65">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="orge6b1f65" 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-org6219399" class="outline-3">
|
||
<h3 id="org6219399"><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="#org0f021e4">29</a>.
|
||
</p>
|
||
|
||
|
||
<div id="org0f021e4" 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-orgc452df1" class="outline-3">
|
||
<h3 id="orgc452df1"><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="#org9c6f4d5">30</a>.
|
||
</p>
|
||
|
||
|
||
<div id="org9c6f4d5" 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="#orgf9cecef">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="orgf9cecef" 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-org2019808" class="outline-2">
|
||
<h2 id="org2019808"><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="org5c6b228"></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-org08b375a" class="outline-3">
|
||
<h3 id="org08b375a"><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-org9552c8d" class="outline-3">
|
||
<h3 id="org9552c8d"><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-org1836677" class="outline-3">
|
||
<h3 id="org1836677"><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="#orgade0997">32</a> for the accelerometers and in Figure <a href="#org5f8fa2d">33</a> for the geophones.
|
||
</p>
|
||
|
||
|
||
<div id="orgade0997" 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="org5f8fa2d" 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-org01c2180" class="outline-3">
|
||
<h3 id="org01c2180"><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="#orgc3b14d1">34</a>.
|
||
</p>
|
||
|
||
<div id="orgc3b14d1" 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="orgd84b5a5">
|
||
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="org40dde86" 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-org22bc718" class="outline-3">
|
||
<h3 id="org22bc718"><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="#orgfad8eca">36</a>.
|
||
</p>
|
||
|
||
|
||
<div id="orgfad8eca" 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-org31194e4" class="outline-2">
|
||
<h2 id="org31194e4"><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="org299c2cb"></a>
|
||
</p>
|
||
</div>
|
||
<div id="outline-container-orga0f4e4b" class="outline-3">
|
||
<h3 id="orga0f4e4b"><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-org7118847" class="outline-3">
|
||
<h3 id="org7118847"><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="orgede8f20" 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-org697ec57" class="outline-3">
|
||
<h3 id="org697ec57"><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="org75b5ae3" 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-org1dd5c70" class="outline-3">
|
||
<h3 id="org1dd5c70"><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="#org10b02fe">39</a>.
|
||
</p>
|
||
|
||
|
||
<div id="org10b02fe" 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-orgd196b55" class="outline-3">
|
||
<h3 id="orgd196b55"><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="#org932593f">40</a>.
|
||
</p>
|
||
|
||
|
||
<div id="org932593f" 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-org112e7ac" class="outline-2">
|
||
<h2 id="org112e7ac"><span class="section-number-2">9</span> Matlab Functions</h2>
|
||
<div class="outline-text-2" id="text-9">
|
||
<p>
|
||
<a id="orgd345bf3"></a>
|
||
</p>
|
||
</div>
|
||
<div id="outline-container-org3592beb" class="outline-3">
|
||
<h3 id="org3592beb"><span class="section-number-3">9.1</span> <code>createWeight</code></h3>
|
||
<div class="outline-text-3" id="text-9-1">
|
||
<p>
|
||
<a id="orgffb1fb1"></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>
|
||
|
||
arguments
|
||
args.n (1,1) double {mustBeInteger, mustBePositive} = 1
|
||
args.G0 (1,1) double {mustBeNumeric, mustBePositive} = 0.1
|
||
args.G1 (1,1) double {mustBeNumeric, mustBePositive} = 10
|
||
args.Gc (1,1) double {mustBeNumeric, mustBePositive} = 1
|
||
args.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-org171a5aa" class="outline-3">
|
||
<h3 id="org171a5aa"><span class="section-number-3">9.2</span> <code>plotMagUncertainty</code></h3>
|
||
<div class="outline-text-3" id="text-9-2">
|
||
<p>
|
||
<a id="org7144d93"></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>
|
||
|
||
arguments
|
||
W
|
||
freqs double {mustBeNumeric, mustBeNonnegative}
|
||
args.G = tf(1)
|
||
args.color_i (1,1) double {mustBeInteger, mustBePositive} = 1
|
||
args.opacity (1,1) double {mustBeNumeric, mustBeNonnegative} = 0.3
|
||
args.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-orgc8d516f" class="outline-3">
|
||
<h3 id="orgc8d516f"><span class="section-number-3">9.3</span> <code>plotPhaseUncertainty</code></h3>
|
||
<div class="outline-text-3" id="text-9-3">
|
||
<p>
|
||
<a id="orgb285bfd"></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>
|
||
|
||
arguments
|
||
W
|
||
freqs double {mustBeNumeric, mustBeNonnegative}
|
||
args.G = tf(1)
|
||
args.color_i (1,1) double {mustBeInteger, mustBePositive} = 1
|
||
args.opacity (1,1) double {mustBeNumeric, mustBePositive} = 0.3
|
||
args.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: 2020-11-12 jeu. 10:07</p>
|
||
</div>
|
||
</body>
|
||
</html>
|