2020-08-31 16:10:13 +02:00
<?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-03 10:53:34 +01:00
<!-- 2020 - 09 - 14 lun. 09:51 -->
2020-08-31 16:10:13 +02:00
< 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 >
2020-09-09 21:13:39 +02:00
< script > M a t h J a x = {
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 >
2020-08-31 16:10:13 +02:00
< / 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 >
2020-11-03 10:53:34 +01:00
< li > < a href = "#org639e493" > 1. Experimental Setup< / a > < / li >
< li > < a href = "#org1f78673" > 2. IFF Development< / a >
2020-08-31 16:10:13 +02:00
< ul >
2020-11-03 10:53:34 +01:00
< 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 >
2020-09-09 21:13:39 +02:00
< / ul >
< / li >
2020-11-03 10:53:34 +01:00
< li > < a href = "#org7227c6d" > 3. Generate the excitation signal< / a >
2020-09-09 21:13:39 +02:00
< ul >
2020-11-03 10:53:34 +01:00
< 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 >
2020-09-09 21:13:39 +02:00
< / ul >
< / li >
2020-11-03 10:53:34 +01:00
< li > < a href = "#org1f3c50f" > 4. Identification of the Inertial Sensors Dynamics< / a >
2020-09-09 21:13:39 +02:00
< ul >
2020-11-03 10:53:34 +01:00
< 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 >
2020-09-09 21:13:39 +02:00
< ul >
2020-11-03 10:53:34 +01:00
< 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 >
2020-09-09 21:13:39 +02:00
< / ul >
< / li >
2020-11-03 10:53:34 +01:00
< li > < a href = "#orgd62ede5" > 7. To Order< / a >
< ul >
< li > < a href = "#orgd3f8d60" > 7.1. Huddle Test< / a >
2020-09-09 21:13:39 +02:00
< ul >
2020-11-03 10:53:34 +01:00
< 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 >
2020-09-09 21:13:39 +02:00
< / ul >
< / li >
2020-11-03 10:53:34 +01:00
< li > < a href = "#orgabcd36b" > 7.2. Sensor Dynamics< / a >
2020-09-09 21:13:39 +02:00
< ul >
2020-11-03 10:53:34 +01:00
< li > < a href = "#orgf77e556" > 7.2.1. Time Domain Signals< / a > < / li >
2020-09-09 21:13:39 +02:00
< / ul >
< / li >
2020-11-03 10:53:34 +01:00
< li > < a href = "#orgb7a4097" > 7.3. H-2 Synthesis - Position< / a >
2020-09-09 21:13:39 +02:00
< ul >
2020-11-03 10:53:34 +01:00
< 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 >
2020-09-09 21:13:39 +02:00
< / ul >
< / li >
2020-11-03 10:53:34 +01:00
< li > < a href = "#orgc4b0ee7" > 7.4. Compare Time domain Estimation of the displacement< / a > < / li >
2020-08-31 16:10:13 +02:00
< / ul >
< / li >
< / ul >
< / div >
< / div >
2020-11-03 10:53:34 +01:00
< div id = "outline-container-org639e493" class = "outline-2" >
< h2 id = "org639e493" > < span class = "section-number-2" > 1< / span > Experimental Setup< / h2 >
2020-08-31 16:10:13 +02:00
< div class = "outline-text-2" id = "text-1" >
2020-09-09 21:13:39 +02:00
< p >
The goal of this experimental setup is to experimentally merge inertial sensors.
< / p >
2020-08-31 16:10:13 +02:00
2020-09-09 21:13:39 +02:00
< p >
To merge the sensors, optimal and robust complementary filters are designed.
< / p >
< p >
The inertial sensors used are shown in Table
< / p >
2020-11-03 10:53:34 +01:00
< table id = "orga74f0d0" border = "2" cellspacing = "0" cellpadding = "6" rules = "groups" frame = "hsides" >
2020-09-09 21:13:39 +02:00
< caption class = "t-above" > < span class = "table-number" > Table 1:< / span > Inertial Sensors used< / caption >
2020-08-31 16:10:13 +02:00
< colgroup >
< col class = "org-left" / >
< col class = "org-left" / >
< / colgroup >
< thead >
< tr >
2020-09-09 21:13:39 +02:00
< th scope = "col" class = "org-left" > < b > Type< / b > < / th >
< th scope = "col" class = "org-left" > < b > Model< / b > < / th >
2020-08-31 16:10:13 +02:00
< / 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 >
2020-09-09 21:13:39 +02:00
< td class = "org-left" > Mark Product L-22 - Vertical< / td >
2020-08-31 16:10:13 +02:00
< / tr >
< / tbody >
< / table >
2020-09-09 21:13:39 +02:00
2020-11-03 10:53:34 +01:00
< table id = "org99f2062" border = "2" cellspacing = "0" cellpadding = "6" rules = "groups" frame = "hsides" >
2020-09-09 21:13:39 +02:00
< 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 >
2020-11-03 10:53:34 +01:00
< table id = "org20ed040" border = "2" cellspacing = "0" cellpadding = "6" rules = "groups" frame = "hsides" >
2020-09-09 21:13:39 +02:00
< 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 >
2020-08-31 16:10:13 +02:00
< / div >
< / div >
2020-11-03 10:53:34 +01:00
< div id = "outline-container-org1f78673" class = "outline-2" >
< h2 id = "org1f78673" > < span class = "section-number-2" > 2< / span > IFF Development< / h2 >
2020-08-31 16:10:13 +02:00
< div class = "outline-text-2" id = "text-2" >
< / div >
2020-11-03 10:53:34 +01:00
< div id = "outline-container-orgf880cbc" class = "outline-3" >
< h3 id = "orgf880cbc" > < span class = "section-number-3" > 2.1< / span > Load Data< / h3 >
2020-08-31 16:10:13 +02:00
< div class = "outline-text-3" id = "text-2-1" >
< div class = "org-src-container" >
2020-11-03 10:53:34 +01:00
< 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);
2020-08-31 16:10:13 +02:00
< / pre >
< / div >
< / div >
< / div >
2020-11-03 10:53:34 +01:00
< div id = "outline-container-org7359873" class = "outline-3" >
< h3 id = "org7359873" > < span class = "section-number-3" > 2.2< / span > Experimental Data< / h3 >
2020-08-31 16:10:13 +02:00
< div class = "outline-text-3" id = "text-2-2" >
< div class = "org-src-container" >
2020-11-03 10:53:34 +01:00
< pre class = "src src-matlab" > Ts = id_ol.t(2) - id_ol.t(1);
2020-09-09 21:13:39 +02:00
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 >
2020-11-03 10:53:34 +01:00
< div id = "org312976a" class = "figure" >
2020-09-09 21:13:39 +02:00
< p > < img src = "figs/iff_identification_coh.png" alt = "iff_identification_coh.png" / >
< / p >
2020-11-03 10:53:34 +01:00
< p > < span class = "figure-number" > Figure 1: < / span > Coherence for the identification of the IFF plant< / p >
2020-09-09 21:13:39 +02:00
< / div >
2020-11-03 10:53:34 +01:00
< div id = "org7f068ac" class = "figure" >
2020-09-09 21:13:39 +02:00
< p > < img src = "figs/iff_identification_bode_plot.png" alt = "iff_identification_bode_plot.png" / >
< / p >
2020-11-03 10:53:34 +01:00
< p > < span class = "figure-number" > Figure 2: < / span > Bode plot of the identified IFF plant< / p >
2020-09-09 21:13:39 +02:00
< / div >
< / div >
< / div >
2020-11-03 10:53:34 +01:00
< 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" >
2020-09-09 21:13:39 +02:00
< 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 >
2020-11-03 10:53:34 +01:00
< div id = "org6f3c7b0" class = "figure" >
2020-09-09 21:13:39 +02:00
< p > < img src = "figs/iff_plant_model.png" alt = "iff_plant_model.png" / >
< / p >
2020-11-03 10:53:34 +01:00
< p > < span class = "figure-number" > Figure 3: < / span > IFF Plant + Model< / p >
2020-09-09 21:13:39 +02:00
< / div >
< / div >
< / div >
2020-11-03 10:53:34 +01:00
< 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" >
2020-09-09 21:13:39 +02:00
2020-11-03 10:53:34 +01:00
< div id = "orgbde58f9" class = "figure" >
2020-09-09 21:13:39 +02:00
< p > < img src = "figs/iff_root_locus.png" alt = "iff_root_locus.png" / >
< / p >
2020-11-03 10:53:34 +01:00
< p > < span class = "figure-number" > Figure 4: < / span > Root Locus for the IFF control< / p >
2020-09-09 21:13:39 +02:00
< / 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 >
2020-11-03 10:53:34 +01:00
< 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" >
2020-09-09 21:13:39 +02:00
< 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');
2020-11-03 10:53:34 +01:00
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);
2020-09-09 21:13:39 +02:00
< / 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 >
2020-11-03 10:53:34 +01:00
< div id = "org912a9e1" class = "figure" >
2020-09-09 21:13:39 +02:00
< p > < img src = "figs/Gd_identification_iff_coherence.png" alt = "Gd_identification_iff_coherence.png" / >
< / p >
2020-11-03 10:53:34 +01:00
< p > < span class = "figure-number" > Figure 5: < / span > Coherence for the transfer function from F to d, with and without IFF< / p >
2020-09-09 21:13:39 +02:00
< / div >
< p >
Don’ t really understand the low frequency behavior.
< / p >
2020-11-03 10:53:34 +01:00
< div id = "orge8a2863" class = "figure" >
2020-09-09 21:13:39 +02:00
< p > < img src = "figs/Gd_identification_iff_bode_plot.png" alt = "Gd_identification_iff_bode_plot.png" / >
< / p >
2020-11-03 10:53:34 +01:00
< p > < span class = "figure-number" > Figure 6: < / span > Coherence for the transfer function from F to d, with and without IFF< / p >
2020-09-09 21:13:39 +02:00
< / div >
< / div >
< / div >
< / div >
2020-11-03 10:53:34 +01:00
< 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" >
2020-09-09 21:13:39 +02:00
< / div >
2020-11-03 10:53:34 +01:00
< 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" >
2020-09-09 21:13:39 +02:00
< 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 >
2020-11-03 10:53:34 +01:00
< 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" >
2020-09-09 21:13:39 +02:00
< 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" >
2020-11-03 10:53:34 +01:00
< pre class = "src src-matlab" > Ts = id_cl.t(2) - id_cl.t(1);
win = hann(ceil(10/Ts));
< / pre >
< / div >
2020-09-09 21:13:39 +02:00
2020-11-03 10:53:34 +01:00
< 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);
2020-09-09 21:13:39 +02:00
[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 >
2020-11-03 10:53:34 +01:00
< div id = "org7952827" class = "figure" >
2020-09-09 21:13:39 +02:00
< p > < img src = "figs/Gd_plant_estimation.png" alt = "Gd_plant_estimation.png" / >
< / p >
2020-11-03 10:53:34 +01:00
< p > < span class = "figure-number" > Figure 7: < / span > Estimation of the transfer function from the excitation signal to the generated displacement< / p >
2020-09-09 21:13:39 +02:00
< / div >
< / div >
< / div >
2020-11-03 10:53:34 +01:00
< 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" >
2020-09-09 21:13:39 +02:00
< 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');
2020-11-03 10:53:34 +01:00
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);
2020-09-09 21:13:39 +02:00
< / 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 >
2020-11-03 10:53:34 +01:00
< div id = "org3f4a313" class = "figure" >
2020-09-09 21:13:39 +02:00
< p > < img src = "figs/huddle_test_psd_motion.png" alt = "huddle_test_psd_motion.png" / >
< / p >
2020-11-03 10:53:34 +01:00
< p > < span class = "figure-number" > Figure 8: < / span > ASD of the motion measured by the sensors< / p >
2020-09-09 21:13:39 +02:00
< / 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 >
2020-11-03 10:53:34 +01:00
< div id = "org92ac972" class = "figure" >
2020-09-09 21:13:39 +02:00
< p > < img src = "figs/comp_huddle_test_excited_motion_psd.png" alt = "comp_huddle_test_excited_motion_psd.png" / >
< / p >
2020-11-03 10:53:34 +01:00
< p > < span class = "figure-number" > Figure 9: < / span > Comparison of the ASD of the motion during Huddle and the wanted generated motion< / p >
2020-09-09 21:13:39 +02:00
< / 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 >
2020-11-03 10:53:34 +01:00
< div id = "org8cc60e8" class = "figure" >
2020-09-09 21:13:39 +02:00
< p > < img src = "figs/optimal_exc_signal_time.png" alt = "optimal_exc_signal_time.png" / >
< / p >
2020-11-03 10:53:34 +01:00
< p > < span class = "figure-number" > Figure 10: < / span > Generated excitation signal< / p >
2020-09-09 21:13:39 +02:00
< / div >
< / div >
< / div >
< / div >
2020-11-03 10:53:34 +01:00
< 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" >
2020-09-09 21:13:39 +02:00
< / div >
2020-11-03 10:53:34 +01:00
< 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" >
2020-09-09 21:13:39 +02:00
< 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 >
2020-11-03 10:53:34 +01:00
< 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" >
2020-09-09 21:13:39 +02:00
< 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 >
2020-11-03 10:53:34 +01:00
< div id = "org879ddcc" class = "figure" >
2020-09-09 21:13:39 +02:00
< p > < img src = "figs/comp_psd_huddle_test_identification.png" alt = "comp_psd_huddle_test_identification.png" / >
< / p >
2020-11-03 10:53:34 +01:00
< 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 >
2020-09-09 21:13:39 +02:00
< / div >
< / div >
< / div >
2020-11-03 10:53:34 +01:00
< 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" >
2020-09-09 21:13:39 +02:00
< 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 >
2020-11-03 10:53:34 +01:00
< div id = "org8c51eef" class = "figure" >
2020-09-09 21:13:39 +02:00
< p > < img src = "figs/id_sensor_dynamics_coherence.png" alt = "id_sensor_dynamics_coherence.png" / >
< / p >
2020-11-03 10:53:34 +01:00
< p > < span class = "figure-number" > Figure 12: < / span > Coherence for the estimation of the sensor dynamics< / p >
2020-09-09 21:13:39 +02:00
< / 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 >
2020-11-03 10:53:34 +01:00
< div id = "orge3ae9c0" class = "figure" >
2020-09-09 21:13:39 +02:00
< p > < img src = "figs/id_sensor_dynamics_accelerometers.png" alt = "id_sensor_dynamics_accelerometers.png" / >
< / p >
2020-11-03 10:53:34 +01:00
< p > < span class = "figure-number" > Figure 13: < / span > Identified dynamics of the accelerometers< / p >
2020-09-09 21:13:39 +02:00
< / div >
2020-11-03 10:53:34 +01:00
< div id = "org9f9de26" class = "figure" >
2020-09-09 21:13:39 +02:00
< p > < img src = "figs/id_sensor_dynamics_geophones.png" alt = "id_sensor_dynamics_geophones.png" / >
< / p >
2020-11-03 10:53:34 +01:00
< 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 >
2020-09-09 21:13:39 +02:00
< / div >
< / div >
< / div >
< / div >
2020-11-03 10:53:34 +01:00
< 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" >
2020-09-09 21:13:39 +02:00
< 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 >
2020-08-31 16:10:13 +02:00
< / div >
< div id = "postamble" class = "status" >
< p class = "author" > Author: Dehaeze Thomas< / p >
2020-11-03 10:53:34 +01:00
< p class = "date" > Created: 2020-09-14 lun. 09:51< / p >
2020-08-31 16:10:13 +02:00
< / div >
< / body >
< / html >