1268 lines
42 KiB
HTML
1268 lines
42 KiB
HTML
<?xml version="1.0" encoding="utf-8"?>
|
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
|
|
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
|
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
|
|
<head>
|
|
<!-- 2020-09-14 lun. 09:51 -->
|
|
<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="./css/htmlize.css"/>
|
|
<link rel="stylesheet" type="text/css" href="./css/readtheorg.css"/>
|
|
<link rel="stylesheet" type="text/css" href="./css/zenburn.css"/>
|
|
<script type="text/javascript" src="./js/jquery.min.js"></script>
|
|
<script type="text/javascript" src="./js/bootstrap.min.js"></script>
|
|
<script type="text/javascript" src="./js/jquery.stickytableheaders.min.js"></script>
|
|
<script type="text/javascript" src="./js/readtheorg.js"></script>
|
|
<script>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="#org639e493">1. Experimental Setup</a></li>
|
|
<li><a href="#org1f78673">2. IFF Development</a>
|
|
<ul>
|
|
<li><a href="#orgf880cbc">2.1. Load Data</a></li>
|
|
<li><a href="#org7359873">2.2. Experimental Data</a></li>
|
|
<li><a href="#orgc965f53">2.3. Model of the IFF Plant</a></li>
|
|
<li><a href="#org2fd95b1">2.4. Root Locus and optimal Controller</a></li>
|
|
<li><a href="#orgf96fa1a">2.5. Verification of the achievable damping</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#org7227c6d">3. Generate the excitation signal</a>
|
|
<ul>
|
|
<li><a href="#orgf511d4a">3.1. Requirements</a></li>
|
|
<li><a href="#org4b67d39">3.2. Transfer function from excitation signal to displacement</a></li>
|
|
<li><a href="#org5ac02de">3.3. Motion measured during Huddle test</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#org1f3c50f">4. Identification of the Inertial Sensors Dynamics</a>
|
|
<ul>
|
|
<li><a href="#org7124079">4.1. Load Data</a></li>
|
|
<li><a href="#orgef508f7">4.2. Compare PSD during Huddle and and during identification</a></li>
|
|
<li><a href="#org3bae91a">4.3. Compute transfer functions</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#orgcdb10f4">5. Inertial Sensor Noise and H2 Synthesis</a>
|
|
<ul>
|
|
<li><a href="#orgc528ea2">5.1. Load Data</a></li>
|
|
<li><a href="#org27130c3">5.2. ASD of the Measured displacement</a></li>
|
|
<li><a href="#orgbfafcfc">5.3. ASD of the Sensor Noise</a></li>
|
|
<li><a href="#org945ed90">5.4. Noise Model</a></li>
|
|
<li><a href="#org940cdd1">5.5. H2 Synthesis</a></li>
|
|
<li><a href="#orgdbb15bc">5.6. Results</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#org0cc4adf">6. Inertial Sensor Dynamics Uncertainty</a>
|
|
<ul>
|
|
<li><a href="#org571b633">6.1. Load Data</a></li>
|
|
<li><a href="#orgfbf2abd">6.2. Compute the dynamics of both sensors</a></li>
|
|
<li><a href="#org3f7a50b">6.3. Dynamics uncertainty estimation</a></li>
|
|
<li><a href="#org684503c">6.4. Dynamical Uncertainty</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#orgd62ede5">7. To Order</a>
|
|
<ul>
|
|
<li><a href="#orgd3f8d60">7.1. Huddle Test</a>
|
|
<ul>
|
|
<li><a href="#org4accd5c">7.1.1. Load Data</a></li>
|
|
<li><a href="#org18b0b17">7.1.2. Detrend Data</a></li>
|
|
<li><a href="#org1a4f678">7.1.3. Compute PSD</a></li>
|
|
<li><a href="#org8c000ad">7.1.4. Sensor Noise in Volts</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#orgabcd36b">7.2. Sensor Dynamics</a>
|
|
<ul>
|
|
<li><a href="#orgf77e556">7.2.1. Time Domain Signals</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#orgb7a4097">7.3. H-2 Synthesis - Position</a>
|
|
<ul>
|
|
<li><a href="#orgdf8eee9">7.3.1. Noise Model</a></li>
|
|
<li><a href="#org74eb59d">7.3.2. H2 Synthesis</a></li>
|
|
<li><a href="#org22882c1">7.3.3. Results</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#orgc4b0ee7">7.4. Compare Time domain Estimation of the displacement</a></li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org639e493" class="outline-2">
|
|
<h2 id="org639e493"><span class="section-number-2">1</span> Experimental Setup</h2>
|
|
<div class="outline-text-2" id="text-1">
|
|
<p>
|
|
The goal of this experimental setup is to experimentally merge inertial sensors.
|
|
</p>
|
|
|
|
<p>
|
|
To merge the sensors, optimal and robust complementary filters are designed.
|
|
</p>
|
|
|
|
<p>
|
|
The inertial sensors used are shown in Table
|
|
</p>
|
|
|
|
<table id="orga74f0d0" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
|
|
<caption class="t-above"><span class="table-number">Table 1:</span> Inertial Sensors used</caption>
|
|
|
|
<colgroup>
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
</colgroup>
|
|
<thead>
|
|
<tr>
|
|
<th scope="col" class="org-left"><b>Type</b></th>
|
|
<th scope="col" class="org-left"><b>Model</b></th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td class="org-left">Accelerometer</td>
|
|
<td class="org-left">PCB 393B05 - Vertical (<a href="https://www.pcb.com/products?m=393B05">link</a>)</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left">Geophone</td>
|
|
<td class="org-left">Mark Product L-22 - Vertical</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
|
|
<table id="org99f2062" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
|
|
<caption class="t-above"><span class="table-number">Table 2:</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="org20ed040" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
|
|
<caption class="t-above"><span class="table-number">Table 3:</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="https://www.femto.de/en/products/voltage-amplifiers/variable-gain-100-khz-dlpva.html">link</a>).
|
|
The force sensor signal is amplified using a Low Noise Voltage Preamplifier from Ametek (<a href="https://www.ameteksi.com/support-center/legacy-products/signal-recovery-legacy/5113-low-noise-preamplifier">link</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-org1f78673" class="outline-2">
|
|
<h2 id="org1f78673"><span class="section-number-2">2</span> IFF Development</h2>
|
|
<div class="outline-text-2" id="text-2">
|
|
</div>
|
|
<div id="outline-container-orgf880cbc" class="outline-3">
|
|
<h3 id="orgf880cbc"><span class="section-number-3">2.1</span> Load Data</h3>
|
|
<div class="outline-text-3" id="text-2-1">
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">id_ol = load('./mat/identification_noise_bis.mat', 'd', 'acc_1', 'acc_2', 'geo_1', 'geo_2', 'f_meas', 'u', 't');
|
|
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-org7359873" class="outline-3">
|
|
<h3 id="org7359873"><span class="section-number-3">2.2</span> Experimental Data</h3>
|
|
<div class="outline-text-3" id="text-2-2">
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">Ts = id_ol.t(2) - id_ol.t(1);
|
|
win = hann(ceil(10/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/Ts); % [V/m]
|
|
[co_fmeas_est, ~] = mscohere( id_ol.u, id_ol.f_meas, win, [], [], 1/Ts);
|
|
</pre>
|
|
</div>
|
|
|
|
|
|
<div id="org312976a" class="figure">
|
|
<p><img src="figs/iff_identification_coh.png" alt="iff_identification_coh.png" />
|
|
</p>
|
|
<p><span class="figure-number">Figure 1: </span>Coherence for the identification of the IFF plant</p>
|
|
</div>
|
|
|
|
|
|
<div id="org7f068ac" class="figure">
|
|
<p><img src="figs/iff_identification_bode_plot.png" alt="iff_identification_bode_plot.png" />
|
|
</p>
|
|
<p><span class="figure-number">Figure 2: </span>Bode plot of the identified IFF plant</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-orgc965f53" class="outline-3">
|
|
<h3 id="orgc965f53"><span class="section-number-3">2.3</span> Model of the IFF Plant</h3>
|
|
<div class="outline-text-3" id="text-2-3">
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">wz = 2*pi*102;
|
|
xi_z = 0.01;
|
|
wp = 2*pi*239.4;
|
|
xi_p = 0.015;
|
|
|
|
Giff = 2.2*(s^2 + 2*xi_z*s*wz + wz^2)/(s^2 + 2*xi_p*s*wp + wp^2) * ... % Dynamics
|
|
10*(s/3/pi/(1 + s/3/pi)) * ... % Low pass filter and gain of the voltage amplifier
|
|
exp(-Ts*s); % Time delay induced by ADC/DAC
|
|
</pre>
|
|
</div>
|
|
|
|
|
|
<div id="org6f3c7b0" class="figure">
|
|
<p><img src="figs/iff_plant_model.png" alt="iff_plant_model.png" />
|
|
</p>
|
|
<p><span class="figure-number">Figure 3: </span>IFF Plant + Model</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org2fd95b1" class="outline-3">
|
|
<h3 id="org2fd95b1"><span class="section-number-3">2.4</span> Root Locus and optimal Controller</h3>
|
|
<div class="outline-text-3" id="text-2-4">
|
|
|
|
<div id="orgbde58f9" class="figure">
|
|
<p><img src="figs/iff_root_locus.png" alt="iff_root_locus.png" />
|
|
</p>
|
|
<p><span class="figure-number">Figure 4: </span>Root Locus for the IFF control</p>
|
|
</div>
|
|
|
|
<p>
|
|
The controller that yield maximum damping is:
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">Kiff_opt = 102/(s + 2*pi*2);
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-orgf96fa1a" class="outline-3">
|
|
<h3 id="orgf96fa1a"><span class="section-number-3">2.5</span> Verification of the achievable damping</h3>
|
|
<div class="outline-text-3" id="text-2-5">
|
|
<p>
|
|
A new identification is performed with the resonance damped.
|
|
It helps to not induce too much motion at the resonance and damage the actuator.
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">id_cl = load('./mat/identification_noise_iff_bis.mat', 'd', 'acc_1', 'acc_2', 'geo_1', 'geo_2', 'f_meas', 'u', 't');
|
|
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>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">[tf_G_ol_est, f] = tfestimate(id_ol.u, id_ol.d, win, [], [], 1/Ts);
|
|
[co_G_ol_est, ~] = mscohere( id_ol.u, id_ol.d, win, [], [], 1/Ts);
|
|
[tf_G_cl_est, ~] = tfestimate(id_cl.u, id_cl.d, win, [], [], 1/Ts);
|
|
[co_G_cl_est, ~] = mscohere( id_cl.u, id_cl.d, win, [], [], 1/Ts);
|
|
</pre>
|
|
</div>
|
|
|
|
|
|
<div id="org912a9e1" class="figure">
|
|
<p><img src="figs/Gd_identification_iff_coherence.png" alt="Gd_identification_iff_coherence.png" />
|
|
</p>
|
|
<p><span class="figure-number">Figure 5: </span>Coherence for the transfer function from F to d, with and without IFF</p>
|
|
</div>
|
|
|
|
<p>
|
|
Don’t really understand the low frequency behavior.
|
|
</p>
|
|
|
|
<div id="orge8a2863" 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 6: </span>Coherence for the transfer function from F to d, with and without IFF</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org7227c6d" class="outline-2">
|
|
<h2 id="org7227c6d"><span class="section-number-2">3</span> Generate the excitation signal</h2>
|
|
<div class="outline-text-2" id="text-3">
|
|
</div>
|
|
<div id="outline-container-orgf511d4a" class="outline-3">
|
|
<h3 id="orgf511d4a"><span class="section-number-3">3.1</span> Requirements</h3>
|
|
<div class="outline-text-3" id="text-3-1">
|
|
<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>
|
|
|
|
<div id="outline-container-org4b67d39" class="outline-3">
|
|
<h3 id="org4b67d39"><span class="section-number-3">3.2</span> Transfer function from excitation signal to displacement</h3>
|
|
<div class="outline-text-3" id="text-3-2">
|
|
<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('./mat/identification_noise_iff_bis.mat', 'd', 'acc_1', 'acc_2', 'geo_1', 'geo_2', 'f_meas', 'u', 't');
|
|
</pre>
|
|
</div>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">Ts = id_cl.t(2) - id_cl.t(1);
|
|
win = hann(ceil(10/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/Ts);
|
|
[co_G_cl_est, ~] = mscohere( id_cl.u, id_cl.d, win, [], [], 1/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 = -5e-6*(2*pi*230)^2/(s^2 + 2*0.3*2*pi*240*s + (2*pi*240)^2);
|
|
</pre>
|
|
</div>
|
|
|
|
|
|
<div id="org7952827" class="figure">
|
|
<p><img src="figs/Gd_plant_estimation.png" alt="Gd_plant_estimation.png" />
|
|
</p>
|
|
<p><span class="figure-number">Figure 7: </span>Estimation of the transfer function from the excitation signal to the generated displacement</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org5ac02de" class="outline-3">
|
|
<h3 id="org5ac02de"><span class="section-number-3">3.3</span> Motion measured during Huddle test</h3>
|
|
<div class="outline-text-3" id="text-3-3">
|
|
<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('./mat/huddle_test.mat', 'd', 'acc_1', 'acc_2', 'geo_1', 'geo_2', 'f_meas', 'u', 't');
|
|
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/Ts);
|
|
[p_acc1, ~] = pwelch(ht.acc_1, win, [], [], 1/Ts);
|
|
[p_acc2, ~] = pwelch(ht.acc_2, win, [], [], 1/Ts);
|
|
[p_geo1, ~] = pwelch(ht.geo_1, win, [], [], 1/Ts);
|
|
[p_geo2, ~] = pwelch(ht.geo_2, win, [], [], 1/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/(1 + s/2/pi/2500); % [V/(m/s2)]
|
|
G_geo = -120*s^2/(s^2 + 2*0.7*2*pi*2*s + (2*pi*2)^2); % [V/(m/s)]
|
|
</pre>
|
|
</div>
|
|
|
|
|
|
<div id="org3f4a313" class="figure">
|
|
<p><img src="figs/huddle_test_psd_motion.png" alt="huddle_test_psd_motion.png" />
|
|
</p>
|
|
<p><span class="figure-number">Figure 8: </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-6/(1 + s/2/pi/2)/(1 + s/2/pi/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/Ts;
|
|
t = 0:Ts:180; % Time Vector [s]
|
|
u = sqrt(Fs/2)*randn(length(t), 1); % Signal with an ASD equal to one
|
|
|
|
y_d = lsim(G_exc, u, t);
|
|
</pre>
|
|
</div>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">[pxx, ~] = pwelch(y_d, win, 0, [], Fs);
|
|
</pre>
|
|
</div>
|
|
|
|
|
|
<div id="org92ac972" 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 9: </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 * ... % from unit PSD to shaped PSD
|
|
(1 + s/2/pi/50) * ... % Inverse of pre-filter included in the Simulink file
|
|
1/G_d_est * ... % Wanted displacement => required voltage
|
|
1/(1 + s/2/pi/5e3), ... % Add some high frequency filtering
|
|
u, t);
|
|
</pre>
|
|
</div>
|
|
|
|
|
|
<div id="org8cc60e8" class="figure">
|
|
<p><img src="figs/optimal_exc_signal_time.png" alt="optimal_exc_signal_time.png" />
|
|
</p>
|
|
<p><span class="figure-number">Figure 10: </span>Generated excitation signal</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org1f3c50f" class="outline-2">
|
|
<h2 id="org1f3c50f"><span class="section-number-2">4</span> Identification of the Inertial Sensors Dynamics</h2>
|
|
<div class="outline-text-2" id="text-4">
|
|
</div>
|
|
<div id="outline-container-org7124079" class="outline-3">
|
|
<h3 id="org7124079"><span class="section-number-3">4.1</span> Load Data</h3>
|
|
<div class="outline-text-3" id="text-4-1">
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">id = load('./mat/identification_noise_opt_iff.mat', 'd', 'acc_1', 'acc_2', 'geo_1', 'geo_2', 'f_meas', 'u', 't');
|
|
ht = load('./mat/huddle_test.mat', 'd', 'acc_1', 'acc_2', 'geo_1', 'geo_2', 'f_meas', 'u', 't');
|
|
</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-orgef508f7" class="outline-3">
|
|
<h3 id="orgef508f7"><span class="section-number-3">4.2</span> Compare PSD during Huddle and and during identification</h3>
|
|
<div class="outline-text-3" id="text-4-2">
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">Ts = ht.t(2) - ht.t(1);
|
|
win = hann(ceil(10/Ts));
|
|
</pre>
|
|
</div>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">[p_id_d, f] = pwelch(id.d, win, [], [], 1/Ts);
|
|
[p_id_acc1, ~] = pwelch(id.acc_1, win, [], [], 1/Ts);
|
|
[p_id_acc2, ~] = pwelch(id.acc_2, win, [], [], 1/Ts);
|
|
[p_id_geo1, ~] = pwelch(id.geo_1, win, [], [], 1/Ts);
|
|
[p_id_geo2, ~] = pwelch(id.geo_2, win, [], [], 1/Ts);
|
|
[p_id_fmeas, ~] = pwelch(id.f_meas, win, [], [], 1/Ts);
|
|
</pre>
|
|
</div>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">[p_ht_d, ~] = pwelch(ht.d, win, [], [], 1/Ts);
|
|
[p_ht_acc1, ~] = pwelch(ht.acc_1, win, [], [], 1/Ts);
|
|
[p_ht_acc2, ~] = pwelch(ht.acc_2, win, [], [], 1/Ts);
|
|
[p_ht_geo1, ~] = pwelch(ht.geo_1, win, [], [], 1/Ts);
|
|
[p_ht_geo2, ~] = pwelch(ht.geo_2, win, [], [], 1/Ts);
|
|
[p_ht_fmeas, ~] = pwelch(ht.f_meas, win, [], [], 1/Ts);
|
|
</pre>
|
|
</div>
|
|
|
|
|
|
<div id="org879ddcc" class="figure">
|
|
<p><img src="figs/comp_psd_huddle_test_identification.png" alt="comp_psd_huddle_test_identification.png" />
|
|
</p>
|
|
<p><span class="figure-number">Figure 11: </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-org3bae91a" class="outline-3">
|
|
<h3 id="org3bae91a"><span class="section-number-3">4.3</span> Compute transfer functions</h3>
|
|
<div class="outline-text-3" id="text-4-3">
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">[tf_acc1_est, f] = tfestimate(id.d, id.acc_1, win, [], [], 1/Ts);
|
|
[co_acc1_est, ~] = mscohere( id.d, id.acc_1, win, [], [], 1/Ts);
|
|
[tf_acc2_est, ~] = tfestimate(id.d, id.acc_2, win, [], [], 1/Ts);
|
|
[co_acc2_est, ~] = mscohere( id.d, id.acc_2, win, [], [], 1/Ts);
|
|
|
|
[tf_geo1_est, ~] = tfestimate(id.d, id.geo_1, win, [], [], 1/Ts);
|
|
[co_geo1_est, ~] = mscohere( id.d, id.geo_1, win, [], [], 1/Ts);
|
|
[tf_geo2_est, ~] = tfestimate(id.d, id.geo_2, win, [], [], 1/Ts);
|
|
[co_geo2_est, ~] = mscohere( id.d, id.geo_2, win, [], [], 1/Ts);
|
|
</pre>
|
|
</div>
|
|
|
|
|
|
<div id="org8c51eef" class="figure">
|
|
<p><img src="figs/id_sensor_dynamics_coherence.png" alt="id_sensor_dynamics_coherence.png" />
|
|
</p>
|
|
<p><span class="figure-number">Figure 12: </span>Coherence for the estimation of the sensor dynamics</p>
|
|
</div>
|
|
|
|
<p>
|
|
Model of the inertial sensors:
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">G_acc = 1/(1 + s/2/pi/2500); % [V/(m/s2)]
|
|
G_geo = -1200*s^2/(s^2 + 2*0.7*2*pi*2*s + (2*pi*2)^2); % [[V/(m/s)]
|
|
</pre>
|
|
</div>
|
|
|
|
|
|
<div id="orge3ae9c0" class="figure">
|
|
<p><img src="figs/id_sensor_dynamics_accelerometers.png" alt="id_sensor_dynamics_accelerometers.png" />
|
|
</p>
|
|
<p><span class="figure-number">Figure 13: </span>Identified dynamics of the accelerometers</p>
|
|
</div>
|
|
|
|
|
|
|
|
<div id="org9f9de26" class="figure">
|
|
<p><img src="figs/id_sensor_dynamics_geophones.png" alt="id_sensor_dynamics_geophones.png" />
|
|
</p>
|
|
<p><span class="figure-number">Figure 14: </span>Identified dynamics of the geophones</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-orgcdb10f4" class="outline-2">
|
|
<h2 id="orgcdb10f4"><span class="section-number-2">5</span> Inertial Sensor Noise and H2 Synthesis</h2>
|
|
<div class="outline-text-2" id="text-5">
|
|
</div>
|
|
<div id="outline-container-orgc528ea2" class="outline-3">
|
|
<h3 id="orgc528ea2"><span class="section-number-3">5.1</span> Load Data</h3>
|
|
<div class="outline-text-3" id="text-5-1">
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">id = load('./mat/identification_noise_opt_iff.mat', 'd', 'acc_1', 'acc_2', 'geo_1', 'geo_2', 'f_meas', 'u', 't');
|
|
</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-org27130c3" class="outline-3">
|
|
<h3 id="org27130c3"><span class="section-number-3">5.2</span> ASD of the Measured displacement</h3>
|
|
<div class="outline-text-3" id="text-5-2">
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">Ts = id.t(2) - id.t(1);
|
|
win = hann(ceil(10/Ts));
|
|
</pre>
|
|
</div>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">[p_id_d, f] = pwelch(id.d, win, [], [], 1/Ts);
|
|
[p_id_acc1, ~] = pwelch(id.acc_1, win, [], [], 1/Ts);
|
|
[p_id_acc2, ~] = pwelch(id.acc_2, win, [], [], 1/Ts);
|
|
[p_id_geo1, ~] = pwelch(id.geo_1, win, [], [], 1/Ts);
|
|
[p_id_geo2, ~] = pwelch(id.geo_2, win, [], [], 1/Ts);
|
|
[p_id_fmeas, ~] = pwelch(id.f_meas, win, [], [], 1/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/(1 + s/2/pi/2500); % [V/(m/s2)]
|
|
G_geo = -1200*s^2/(s^2 + 2*0.7*2*pi*2*s + (2*pi*2)^2); % [[V/(m/s)]
|
|
</pre>
|
|
</div>
|
|
|
|
|
|
<div id="org7010069" class="figure">
|
|
<p><img src="figs/measure_displacement_all_sensors.png" alt="measure_displacement_all_sensors.png" />
|
|
</p>
|
|
<p><span class="figure-number">Figure 15: </span>ASD of the measured displacement as measured by all the sensors</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-orgbfafcfc" class="outline-3">
|
|
<h3 id="orgbfafcfc"><span class="section-number-3">5.3</span> ASD of the Sensor Noise</h3>
|
|
<div class="outline-text-3" id="text-5-3">
|
|
<ul class="org-ul">
|
|
<li class="off"><code>[ ]</code> Add formula to estimate the noise from data</li>
|
|
</ul>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">[coh_acc, ~] = mscohere(id.acc_1, id.acc_2, win, [], [], 1/Ts);
|
|
[coh_geo, ~] = mscohere(id.geo_1, id.geo_2, win, [], [], 1/Ts);
|
|
</pre>
|
|
</div>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">pN_acc = sqrt(p_id_acc1.*(1 - coh_acc)) .* ... % [V/sqrt(Hz)]
|
|
1./abs(squeeze(freqresp(G_acc*s^2, f, 'Hz'))); % [m/V]
|
|
pN_geo = sqrt(p_id_geo1.*(1 - coh_geo)) .* ... % [V/sqrt(Hz)]
|
|
1./abs(squeeze(freqresp(G_geo*s, f, 'Hz'))); % [m/V]
|
|
</pre>
|
|
</div>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">figure;
|
|
hold on;
|
|
plot(f, sqrt(p_id_acc1)./abs(squeeze(freqresp(G_acc*s^2, f, 'Hz'))), ...
|
|
'DisplayName', 'Accelerometer');
|
|
plot(f, sqrt(p_id_geo1)./abs(squeeze(freqresp(G_geo*s, f, 'Hz'))), ...
|
|
'DisplayName', 'Geophone');
|
|
plot(f, pN_acc, '-', 'DisplayName', 'Accelerometers - Noise');
|
|
plot(f, pN_geo, '-', 'DisplayName', 'Geophones - Noise');
|
|
hold off;
|
|
set(gca, 'xscale', 'log'); set(gca, 'yscale', 'log');
|
|
xlabel('Frequency [Hz]'); ylabel('ASD $\left[\frac{m}{\sqrt{Hz}}\right]$');
|
|
xlim([1, 5000]); ylim([1e-13, 1e-5]);
|
|
legend('location', 'northeast');
|
|
</pre>
|
|
</div>
|
|
|
|
|
|
<div id="org8122315" class="figure">
|
|
<p><img src="figs/noise_inertial_sensors_comparison.png" alt="noise_inertial_sensors_comparison.png" />
|
|
</p>
|
|
<p><span class="figure-number">Figure 16: </span>Comparison of the computed ASD of the noise of the two inertial sensors</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org945ed90" class="outline-3">
|
|
<h3 id="org945ed90"><span class="section-number-3">5.4</span> Noise Model</h3>
|
|
<div class="outline-text-3" id="text-5-4">
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">N_acc = 1*(s/(2*pi*2000) + 1)^2/(s + 0.1*2*pi)/(s + 1e3*2*pi); % [m/sqrt(Hz)]
|
|
N_geo = 4e-4*(s/(2*pi*200) + 1)/(s + 1e3*2*pi); % [m/sqrt(Hz)]
|
|
</pre>
|
|
</div>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">freqs = logspace(0, 4, 1000);
|
|
|
|
figure;
|
|
hold on;
|
|
plot(f, pN_acc.*(2*pi*f), '-', 'DisplayName', 'Accelerometers - Noise');
|
|
plot(f, pN_geo.*(2*pi*f), '-', 'DisplayName', 'Geophones - Noise');
|
|
set(gca, 'ColorOrderIndex', 1);
|
|
plot(freqs, abs(squeeze(freqresp(N_acc, freqs, 'Hz'))), '--', 'DisplayName', 'Geophones - Noise Model');
|
|
plot(freqs, abs(squeeze(freqresp(N_geo, freqs, 'Hz'))), '--', 'DisplayName', 'Geophones - Noise Model');
|
|
hold off;
|
|
set(gca, 'xscale', 'log'); set(gca, 'yscale', 'log');
|
|
xlabel('Frequency [Hz]'); ylabel('ASD $\left[\frac{m/s}{\sqrt{Hz}}\right]$');
|
|
xlim([1, 5000]);
|
|
legend('location', 'northeast');
|
|
</pre>
|
|
</div>
|
|
|
|
|
|
<div id="org7326f5a" class="figure">
|
|
<p><img src="figs/noise_models_velocity.png" alt="noise_models_velocity.png" />
|
|
</p>
|
|
<p><span class="figure-number">Figure 17: </span>ASD of the velocity noise measured by the sensors and the noise models</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org940cdd1" class="outline-3">
|
|
<h3 id="org940cdd1"><span class="section-number-3">5.5</span> H2 Synthesis</h3>
|
|
<div class="outline-text-3" id="text-5-5">
|
|
<p>
|
|
The generalize plant is created.
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">P = [0 N_acc 1;
|
|
N_geo -N_acc 0];
|
|
</pre>
|
|
</div>
|
|
|
|
<p>
|
|
And we do the \(\mathcal{H}_2\) synthesis using the <code>h2syn</code> command.
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">[H_geo, ~, gamma] = h2syn(P, 1, 1);
|
|
H_acc = 1 - H_geo;
|
|
</pre>
|
|
</div>
|
|
|
|
|
|
<div id="org6543ef2" class="figure">
|
|
<p><img src="figs/complementary_filters_velocity_H2.png" alt="complementary_filters_velocity_H2.png" />
|
|
</p>
|
|
<p><span class="figure-number">Figure 18: </span>Obtained Complementary Filters</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-orgdbb15bc" class="outline-3">
|
|
<h3 id="orgdbb15bc"><span class="section-number-3">5.6</span> Results</h3>
|
|
<div class="outline-text-3" id="text-5-6">
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">freqs = logspace(0, 4, 1000);
|
|
|
|
figure;
|
|
hold on;
|
|
plot(f, pN_acc.*(2*pi*f), '-', 'DisplayName', 'Accelerometers - Noise');
|
|
plot(f, pN_geo.*(2*pi*f), '-', 'DisplayName', 'Geophones - Noise');
|
|
plot(f, sqrt((pN_acc.*(2*pi*f)).^2.*abs(squeeze(freqresp(H_acc, f, 'Hz'))).^2 + (pN_geo.*(2*pi*f)).^2.*abs(squeeze(freqresp(H_geo, f, 'Hz'))).^2), 'k-', 'DisplayName', 'Super Sensor - Noise');
|
|
hold off;
|
|
set(gca, 'xscale', 'log'); set(gca, 'yscale', 'log');
|
|
xlabel('Frequency [Hz]'); ylabel('ASD $\left[\frac{m/s}{\sqrt{Hz}}\right]$');
|
|
xlim([1, 5000]);
|
|
legend('location', 'northeast');
|
|
</pre>
|
|
</div>
|
|
|
|
|
|
<div id="orgddb2f77" 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 19: </span>ASD of the super sensor noise (velocity)</p>
|
|
</div>
|
|
|
|
|
|
<p>
|
|
Integrate only down to 1Hz.
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">[~, i_1Hz] = min(abs(f - 1));
|
|
</pre>
|
|
</div>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">CPS_acc = 1/pi*flip(-cumtrapz(2*pi*flip(f), flip((pN_acc.*(2*pi*f)).^2)));
|
|
CPS_geo = 1/pi*flip(-cumtrapz(2*pi*flip(f), flip((pN_geo.*(2*pi*f)).^2)));
|
|
CPS_SS = 1/pi*flip(-cumtrapz(2*pi*flip(f), flip((pN_acc.*(2*pi*f)).^2.*abs(squeeze(freqresp(H_acc, f, 'Hz'))).^2 + (pN_geo.*(2*pi*f)).^2.*abs(squeeze(freqresp(H_geo, f, 'Hz'))).^2)));
|
|
</pre>
|
|
</div>
|
|
|
|
|
|
<div id="orgc5717ab" 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 20: </span>Cumulative Power Spectrum of the Sensor Noise (velocity)</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org0cc4adf" class="outline-2">
|
|
<h2 id="org0cc4adf"><span class="section-number-2">6</span> Inertial Sensor Dynamics Uncertainty</h2>
|
|
<div class="outline-text-2" id="text-6">
|
|
</div>
|
|
<div id="outline-container-org571b633" class="outline-3">
|
|
<h3 id="org571b633"><span class="section-number-3">6.1</span> Load Data</h3>
|
|
<div class="outline-text-3" id="text-6-1">
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">id = load('./mat/identification_noise_opt_iff.mat', 'd', 'acc_1', 'acc_2', 'geo_1', 'geo_2', 'f_meas', 'u', 't');
|
|
</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-orgfbf2abd" class="outline-3">
|
|
<h3 id="orgfbf2abd"><span class="section-number-3">6.2</span> Compute the dynamics of both sensors</h3>
|
|
<div class="outline-text-3" id="text-6-2">
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">Ts = id.t(2) - id.t(1);
|
|
win = hann(ceil(10/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/Ts);
|
|
[co_acc1_est, ~] = mscohere( id.d, id.acc_1, win, [], [], 1/Ts);
|
|
[tf_acc2_est, ~] = tfestimate(id.d, id.acc_2, win, [], [], 1/Ts);
|
|
[co_acc2_est, ~] = mscohere( id.d, id.acc_2, win, [], [], 1/Ts);
|
|
|
|
[tf_geo1_est, ~] = tfestimate(id.d, id.geo_1, win, [], [], 1/Ts);
|
|
[co_geo1_est, ~] = mscohere( id.d, id.geo_1, win, [], [], 1/Ts);
|
|
[tf_geo2_est, ~] = tfestimate(id.d, id.geo_2, win, [], [], 1/Ts);
|
|
[co_geo2_est, ~] = mscohere( id.d, id.geo_2, win, [], [], 1/Ts);
|
|
</pre>
|
|
</div>
|
|
|
|
<p>
|
|
Model of the inertial sensors:
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">G_acc = 1/(1 + s/2/pi/2500); % [V/(m/s2)]
|
|
G_geo = -1200*s^2/(s^2 + 2*0.7*2*pi*2*s + (2*pi*2)^2); % [[V/(m/s)]
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org3f7a50b" class="outline-3">
|
|
<h3 id="org3f7a50b"><span class="section-number-3">6.3</span> Dynamics uncertainty estimation</h3>
|
|
<div class="outline-text-3" id="text-6-3">
|
|
<ul class="org-ul">
|
|
<li class="off"><code>[ ]</code> Create a weight for both sensors and a nominal model</li>
|
|
<li class="off"><code>[ ]</code> Make sure the dynamics measured are inside the uncertain model</li>
|
|
<li class="off"><code>[ ]</code> Compare the uncertainties</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org684503c" class="outline-3">
|
|
<h3 id="org684503c"><span class="section-number-3">6.4</span> Dynamical Uncertainty</h3>
|
|
<div class="outline-text-3" id="text-6-4">
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">[T_acc, ~] = tfestimate(id.acc_1, id.acc_2, win, [], [], Fs);
|
|
[T_geo, ~] = tfestimate(id.geo_1, id.geo_2, win, [], [], Fs);
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-orgd62ede5" class="outline-2">
|
|
<h2 id="orgd62ede5"><span class="section-number-2">7</span> To Order</h2>
|
|
<div class="outline-text-2" id="text-7">
|
|
</div>
|
|
<div id="outline-container-orgd3f8d60" class="outline-3">
|
|
<h3 id="orgd3f8d60"><span class="section-number-3">7.1</span> Huddle Test</h3>
|
|
<div class="outline-text-3" id="text-7-1">
|
|
<p>
|
|
The goal here is to measure the noise of the inertial sensors.
|
|
Is also permits to measure the motion level when nothing is actuated.
|
|
</p>
|
|
</div>
|
|
|
|
<div id="outline-container-org4accd5c" class="outline-4">
|
|
<h4 id="org4accd5c"><span class="section-number-4">7.1.1</span> Load Data</h4>
|
|
<div class="outline-text-4" id="text-7-1-1">
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">ht = load('./mat/huddle_test.mat', 'd', 'acc_1', 'acc_2', 'geo_1', 'geo_2', 'f_meas', 'u', 't');
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org18b0b17" class="outline-4">
|
|
<h4 id="org18b0b17"><span class="section-number-4">7.1.2</span> Detrend Data</h4>
|
|
<div class="outline-text-4" id="text-7-1-2">
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">ht.d = detrend(ht.d, 0); % [m]
|
|
ht.acc_1 = detrend(ht.acc_1, 0); % [V]
|
|
ht.acc_2 = detrend(ht.acc_2, 0); % [V]
|
|
ht.geo_1 = detrend(ht.geo_1, 0); % [V]
|
|
ht.geo_2 = detrend(ht.geo_2, 0); % [V]
|
|
ht.f_meas = detrend(ht.f_meas, 0); % [V]
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org1a4f678" class="outline-4">
|
|
<h4 id="org1a4f678"><span class="section-number-4">7.1.3</span> Compute PSD</h4>
|
|
<div class="outline-text-4" id="text-7-1-3">
|
|
<p>
|
|
We first define the parameters for the frequency domain analysis.
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">Ts = ht.t(2) - ht.t(1); % [s]
|
|
Fs = 1/Ts; % [Hz]
|
|
|
|
win = hanning(ceil(1*Fs));
|
|
</pre>
|
|
</div>
|
|
|
|
<p>
|
|
Then we compute the Power Spectral Density using <code>pwelch</code> function.
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">[p_d, f] = pwelch(ht.d, win, [], [], 1/Ts);
|
|
[p_acc1, ~] = pwelch(ht.acc_1, win, [], [], 1/Ts);
|
|
[p_acc2, ~] = pwelch(ht.acc_2, win, [], [], 1/Ts);
|
|
[p_geo1, ~] = pwelch(ht.geo_1, win, [], [], 1/Ts);
|
|
[p_geo2, ~] = pwelch(ht.geo_2, win, [], [], 1/Ts);
|
|
[p_fmeas, ~] = pwelch(ht.f_meas, win, [], [], 1/Ts);
|
|
</pre>
|
|
</div>
|
|
|
|
|
|
<div id="org8f7a1ba" class="figure">
|
|
<p><img src="figs/huddle_test_measured_voltage_inertial_sensors.png" alt="huddle_test_measured_voltage_inertial_sensors.png" />
|
|
</p>
|
|
<p><span class="figure-number">Figure 21: </span>ASD of the measured voltage from the inertial sensors during the Huddle test</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org8c000ad" class="outline-4">
|
|
<h4 id="org8c000ad"><span class="section-number-4">7.1.4</span> Sensor Noise in Volts</h4>
|
|
<div class="outline-text-4" id="text-7-1-4">
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">[coh_acc, ~] = mscohere(ht.acc_1, ht.acc_2, win, [], [], Fs);
|
|
[coh_geo, ~] = mscohere(ht.geo_1, ht.geo_2, win, [], [], Fs);
|
|
</pre>
|
|
</div>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">pN_acc = p_acc1.*(1 - coh_acc);
|
|
pN_geo = p_geo1.*(1 - coh_geo);
|
|
</pre>
|
|
</div>
|
|
|
|
<p>
|
|
PSD of the ADC quantization noise.
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">Sq = (20/2^16)^2/(12*Fs);
|
|
</pre>
|
|
</div>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">figure;
|
|
hold on;
|
|
plot(f, sqrt(pN_acc), '-', 'DisplayName', 'Accelerometers');
|
|
plot(f, sqrt(pN_geo), '-', 'DisplayName', 'Geophones');
|
|
plot(f, ones(size(f))*sqrt(Sq), '-', 'DisplayName', 'ADC');
|
|
hold off;
|
|
set(gca, 'xscale', 'log'); set(gca, 'yscale', 'log');
|
|
xlabel('Frequency [Hz]'); ylabel('ASD of the Measurement Noise $[V/\sqrt{Hz}]$');
|
|
xlim([1, 5000]);
|
|
legend('location', 'northeast');
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-orgabcd36b" class="outline-3">
|
|
<h3 id="orgabcd36b"><span class="section-number-3">7.2</span> Sensor Dynamics</h3>
|
|
<div class="outline-text-3" id="text-7-2">
|
|
<p>
|
|
Thanks to the interferometer, it is possible to compute the transfer function from the mass displacement to the voltage generated by the inertial sensors.
|
|
This permits to estimate the sensor dynamics and to calibrate the sensors.
|
|
</p>
|
|
</div>
|
|
|
|
<div id="outline-container-orgf77e556" class="outline-4">
|
|
<h4 id="orgf77e556"><span class="section-number-4">7.2.1</span> Time Domain Signals</h4>
|
|
<div class="outline-text-4" id="text-7-2-1">
|
|
<p>
|
|
Excitation signal: noise.
|
|
</p>
|
|
|
|
|
|
<div id="org574a889" class="figure">
|
|
<p><img src="figs/first_exc_signal_time.png" alt="first_exc_signal_time.png" />
|
|
</p>
|
|
<p><span class="figure-number">Figure 22: </span>Excitation signal used for the first identification</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-orgb7a4097" class="outline-3">
|
|
<h3 id="orgb7a4097"><span class="section-number-3">7.3</span> H-2 Synthesis - Position</h3>
|
|
<div class="outline-text-3" id="text-7-3">
|
|
</div>
|
|
<div id="outline-container-orgdf8eee9" class="outline-4">
|
|
<h4 id="orgdf8eee9"><span class="section-number-4">7.3.1</span> Noise Model</h4>
|
|
<div class="outline-text-4" id="text-7-3-1">
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">N_acc = 1e-4*(s/(2*pi*2000) + 1)^2/(s + 0.1*2*pi)^2; % [m/sqrt(Hz)]
|
|
N_geo = 7e-8*(s/(2*pi*200) + 1)/(s + 0.1*2*pi); % [m/sqrt(Hz)]
|
|
</pre>
|
|
</div>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">freqs = logspace(0, 4, 1000);
|
|
|
|
figure;
|
|
hold on;
|
|
plot(f, pN_acc, '-', 'DisplayName', 'Accelerometers - Noise');
|
|
plot(f, pN_geo, '-', 'DisplayName', 'Geophones - Noise');
|
|
set(gca, 'ColorOrderIndex', 1);
|
|
plot(freqs, abs(squeeze(freqresp(N_acc, freqs, 'Hz'))), '--', 'DisplayName', 'Geophones - Noise Model');
|
|
plot(freqs, abs(squeeze(freqresp(N_geo, freqs, 'Hz'))), '--', 'DisplayName', 'Geophones - Noise Model');
|
|
hold off;
|
|
set(gca, 'xscale', 'log'); set(gca, 'yscale', 'log');
|
|
xlabel('Frequency [Hz]'); ylabel('ASD $\left[\frac{m}{\sqrt{Hz}}\right]$');
|
|
xlim([1, 5000]); ylim([1e-13, 1e-5]);
|
|
legend('location', 'northeast');
|
|
</pre>
|
|
</div>
|
|
|
|
|
|
<div id="orgf7f5d89" class="figure">
|
|
<p><img src="figs/inertial_sensor_noise_model.png" alt="inertial_sensor_noise_model.png" />
|
|
</p>
|
|
<p><span class="figure-number">Figure 23: </span>Measured ASD of the inertial sensor noise and generated noise weighting filters</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org74eb59d" class="outline-4">
|
|
<h4 id="org74eb59d"><span class="section-number-4">7.3.2</span> H2 Synthesis</h4>
|
|
<div class="outline-text-4" id="text-7-3-2">
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">P = [0 N_acc 1;
|
|
N_geo -N_acc 0];
|
|
</pre>
|
|
</div>
|
|
|
|
<p>
|
|
And we do the \(\mathcal{H}_2\) synthesis using the <code>h2syn</code> command.
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">[H_geo, ~, gamma] = h2syn(P, 1, 1);
|
|
H_acc = 1 - H_geo;
|
|
</pre>
|
|
</div>
|
|
|
|
|
|
<div id="org4bd9e3b" class="figure">
|
|
<p><img src="figs/opt_complementary_filters.png" alt="opt_complementary_filters.png" />
|
|
</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org22882c1" class="outline-4">
|
|
<h4 id="org22882c1"><span class="section-number-4">7.3.3</span> Results</h4>
|
|
<div class="outline-text-4" id="text-7-3-3">
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">freqs = logspace(0, 4, 1000);
|
|
|
|
figure;
|
|
hold on;
|
|
plot(f, pN_acc, '-', 'DisplayName', 'Accelerometers - Noise');
|
|
plot(f, pN_geo, '-', 'DisplayName', 'Geophones - Noise');
|
|
plot(f, sqrt(pN_acc.^2.*abs(squeeze(freqresp(H_acc, f, 'Hz'))).^2 + pN_geo.^2.*abs(squeeze(freqresp(H_geo, f, 'Hz'))).^2), 'k-', 'DisplayName', 'Super Sensor - Noise');
|
|
hold off;
|
|
set(gca, 'xscale', 'log'); set(gca, 'yscale', 'log');
|
|
xlabel('Frequency [Hz]'); ylabel('ASD $\left[\frac{m}{\sqrt{Hz}}\right]$');
|
|
xlim([1, 5000]); ylim([1e-13, 1e-5]);
|
|
legend('location', 'northeast');
|
|
</pre>
|
|
</div>
|
|
|
|
<p>
|
|
Integrate only down to 1Hz.
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">[~, i_1Hz] = min(abs(f - 1));
|
|
</pre>
|
|
</div>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">CPS_acc = 1/pi*flip(-cumtrapz(2*pi*flip(f), flip(pN_acc.^2)));
|
|
CPS_geo = 1/pi*flip(-cumtrapz(2*pi*flip(f), flip(pN_geo.^2)));
|
|
CPS_SS = 1/pi*flip(-cumtrapz(2*pi*flip(f), flip(pN_acc.^2.*abs(squeeze(freqresp(H_acc, f, 'Hz'))).^2 + pN_geo.^2.*abs(squeeze(freqresp(H_geo, f, 'Hz'))).^2)));
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-orgc4b0ee7" class="outline-3">
|
|
<h3 id="orgc4b0ee7"><span class="section-number-3">7.4</span> Compare Time domain Estimation of the displacement</h3>
|
|
<div class="outline-text-3" id="text-7-4">
|
|
<p>
|
|
Let’s compare the measured accelerations instead of displacement (no integration).
|
|
</p>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">G_lpf = 1/(1 + s/2/pi/5e3);
|
|
|
|
acc1_a = lsim(1/G_acc*G_lpf, id.acc_1, id.t);
|
|
acc2_a = lsim(1/G_acc*G_lpf, id.acc_2, id.t);
|
|
</pre>
|
|
</div>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">geo1_a = lsim(1/G_geo*s*G_lpf, id.geo_1, id.t);
|
|
geo2_a = lsim(1/G_geo*s*G_lpf, id.geo_2, id.t);
|
|
</pre>
|
|
</div>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">int_a = lsim(s^2*G_lpf*G_lpf, id.d, id.t);
|
|
</pre>
|
|
</div>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">figure;
|
|
hold on;
|
|
plot(id.t, int_a);
|
|
plot(id.t, acc1_a);
|
|
plot(id.t, acc2_a);
|
|
plot(id.t, geo1_a);
|
|
plot(id.t, geo2_a);
|
|
hold off;
|
|
xlabel('Time [s]'); ylabel('Acceleration [m]');
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div id="postamble" class="status">
|
|
<p class="author">Author: Dehaeze Thomas</p>
|
|
<p class="date">Created: 2020-09-14 lun. 09:51</p>
|
|
</div>
|
|
</body>
|
|
</html>
|