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-09-09 21:13:39 +02:00
<!-- 2020 - 09 - 09 mer. 20:38 -->
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-09-09 21:13:39 +02:00
< li > < a href = "#org2a3a045" > 1. Experimental Setup< / a > < / li >
< li > < a href = "#orgdfc8362" > 2. Huddle Test< / a >
2020-08-31 16:10:13 +02:00
< ul >
2020-09-09 21:13:39 +02:00
< li > < a href = "#orgb1de447" > 2.1. Load Data< / a > < / li >
< li > < a href = "#orgc9f65e6" > 2.2. Detrend Data< / a > < / li >
< li > < a href = "#orgfae408b" > 2.3. Compute PSD< / a > < / li >
< li > < a href = "#orgfb0a50d" > 2.4. Sensor Noise in Volts< / a > < / li >
< / ul >
< / li >
< li > < a href = "#org835a98a" > 3. After identification< / a >
< ul >
< li > < a href = "#org656f89a" > 3.1. Scale Data< / a > < / li >
< li > < a href = "#org9468f55" > 3.2. sdlkfj< / a > < / li >
< li > < a href = "#org0686d3d" > 3.3. Compare Time Domain Signals< / a > < / li >
< li > < a href = "#orgb43afdf" > 3.4. Compute PSD< / a > < / li >
< li > < a href = "#org02730d1" > 3.5. Dynamical Uncertainty< / a > < / li >
< li > < a href = "#orga6b7413" > 3.6. ADC Noise< / a > < / li >
< li > < a href = "#orge64b357" > 3.7. Sensor Noise< / a > < / li >
< / ul >
< / li >
< li > < a href = "#orgec75d07" > 4. Sensor Dynamics< / a >
< ul >
< li > < a href = "#org0fb20c4" > 4.1. Load Data< / a > < / li >
< li > < a href = "#orgbeb67bf" > 4.2. Time Domain Signals< / a > < / li >
< li > < a href = "#orge8d90a4" > 4.3. Identification of the IFF Plant< / a >
< ul >
< li > < a href = "#orge57cb88" > 4.3.1. Experimental Data< / a > < / li >
< li > < a href = "#orgaa77ceb" > 4.3.2. Model of the IFF Plant< / a > < / li >
< li > < a href = "#org5109d47" > 4.3.3. Root Locus and optimal Controller< / a > < / li >
< / ul >
< / li >
< li > < a href = "#orgdd6e477" > 4.4. Identification of Sensor Dynamics with IFF activated< / a >
< ul >
< li > < a href = "#orgb129175" > 4.4.1. Signals< / a > < / li >
< li > < a href = "#org16c5098" > 4.4.2. Verification of the achievable damping< / a > < / li >
< / ul >
< / li >
< li > < a href = "#org7c6b6b8" > 4.5. Generate the excitation signal< / a >
< ul >
< li > < a href = "#org0a29bfb" > 4.5.1. Requirements< / a > < / li >
< li > < a href = "#org70f432a" > 4.5.2. Transfer function from excitation signal to displacement< / a > < / li >
< li > < a href = "#orgb35f216" > 4.5.3. Motion measured during Huddle test< / a > < / li >
< / ul >
< / li >
< li > < a href = "#org5b6add7" > 4.6. Identification of the Inertial Sensors Dynamics< / a >
< ul >
< li > < a href = "#org00b0fdd" > 4.6.1. Load Data< / a > < / li >
< li > < a href = "#org7eb216e" > 4.6.2. Compare PSD during Huddle and and during identification< / a > < / li >
< li > < a href = "#org9e50b3e" > 4.6.3. Compute transfer functions< / a > < / li >
< / ul >
< / li >
< li > < a href = "#org12ea408" > 4.7. Compare Time domain Estimation of the displacement< / a > < / li >
2020-08-31 16:10:13 +02:00
< / ul >
< / li >
< / ul >
< / div >
< / div >
2020-09-09 21:13:39 +02:00
< div id = "outline-container-org2a3a045" class = "outline-2" >
< h2 id = "org2a3a045" > < 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 >
< table id = "orgf5d7fb1" 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 >
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
< table id = "org9b7266a" 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 = "orgf054360" 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 >
2020-08-31 16:10:13 +02:00
< / div >
< / div >
2020-09-09 21:13:39 +02:00
< div id = "outline-container-orgdfc8362" class = "outline-2" >
< h2 id = "orgdfc8362" > < span class = "section-number-2" > 2< / span > Huddle Test< / h2 >
2020-08-31 16:10:13 +02:00
< div class = "outline-text-2" id = "text-2" >
2020-09-09 21:13:39 +02:00
< 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 >
2020-08-31 16:10:13 +02:00
< / div >
2020-09-09 21:13:39 +02:00
< div id = "outline-container-orgb1de447" class = "outline-3" >
< h3 id = "orgb1de447" > < 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-09-09 21:13:39 +02:00
< 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-08-31 16:10:13 +02:00
< / pre >
< / div >
< / div >
< / div >
2020-09-09 21:13:39 +02:00
< div id = "outline-container-orgc9f65e6" class = "outline-3" >
< h3 id = "orgc9f65e6" > < span class = "section-number-3" > 2.2< / span > Detrend 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-09-09 21:13:39 +02:00
< 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]
2020-08-31 16:10:13 +02:00
< / pre >
< / div >
< / div >
< / div >
2020-09-09 21:13:39 +02:00
< div id = "outline-container-orgfae408b" class = "outline-3" >
< h3 id = "orgfae408b" > < span class = "section-number-3" > 2.3< / span > Compute PSD< / h3 >
2020-08-31 16:10:13 +02:00
< div class = "outline-text-3" id = "text-2-3" >
< p >
2020-09-09 21:13:39 +02:00
We first define the parameters for the frequency domain analysis.
< / p >
< div class = "org-src-container" >
< pre class = "src src-matlab" > Ts = t(2) - 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 >
< / div >
< div id = "outline-container-orgfb0a50d" class = "outline-3" >
< h3 id = "orgfb0a50d" > < span class = "section-number-3" > 2.4< / span > Sensor Noise in Volts< / h3 >
< div class = "outline-text-3" id = "text-2-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.
2020-08-31 16:10:13 +02:00
< / p >
2020-09-09 21:13:39 +02:00
< div class = "org-src-container" >
< pre class = "src src-matlab" > Sq = (20/2^16)^2/(12*Fs);
< / pre >
< / div >
2020-08-31 16:10:13 +02:00
< div class = "org-src-container" >
2020-09-09 21:13:39 +02:00
< 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 >
2020-08-31 16:10:13 +02:00
2020-09-09 21:13:39 +02:00
< div id = "outline-container-org835a98a" class = "outline-2" >
< h2 id = "org835a98a" > < span class = "section-number-2" > 3< / span > After identification< / h2 >
< div class = "outline-text-2" id = "text-3" >
< / div >
< div id = "outline-container-org656f89a" class = "outline-3" >
< h3 id = "org656f89a" > < span class = "section-number-3" > 3.1< / span > Scale Data< / h3 >
< div class = "outline-text-3" id = "text-3-1" >
< 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)]
2020-08-31 16:10:13 +02:00
< / pre >
< / div >
< div class = "org-src-container" >
2020-09-09 21:13:39 +02:00
< pre class = "src src-matlab" > G_geo = 120*s^2/(s^2 + 2*0.7*2*pi*2*s + (2*pi*2)^2); % [V/(m/s)]
< / pre >
< / div >
2020-08-31 16:10:13 +02:00
2020-09-09 21:13:39 +02:00
< div class = "org-src-container" >
< pre class = "src src-matlab" > figure;
hold on;
set(gca, 'ColorOrderIndex', 1);
plot(f, sqrt(p_acc1)./abs(squeeze(freqresp(G_acc*s^2, f, 'Hz'))), ...
'DisplayName', 'Accelerometer');
set(gca, 'ColorOrderIndex', 1);
plot(f, sqrt(p_acc2)./abs(squeeze(freqresp(G_acc*s^2, f, 'Hz'))), ...
'HandleVisibility', 'off');
set(gca, 'ColorOrderIndex', 2);
plot(f, sqrt(p_geo1)./abs(squeeze(freqresp(G_geo*s, f, 'Hz'))), ...
'DisplayName', 'Geophone');
set(gca, 'ColorOrderIndex', 2);
plot(f, sqrt(p_geo2)./abs(squeeze(freqresp(G_geo*s, f, 'Hz'))), ...
'HandleVisibility', 'off');
set(gca, 'ColorOrderIndex', 3);
plot(f, sqrt(p_d), 'DisplayName', 'Interferometer');
hold off;
set(gca, 'Xscale', 'log'); set(gca, 'Yscale', 'log');
ylabel('ASD [$m/\sqrt{Hz}$]'); xlabel('Frequency [Hz]');
title('Huddle Test')
legend();
2020-08-31 16:10:13 +02:00
< / pre >
< / div >
2020-09-09 21:13:39 +02:00
< / div >
< / div >
2020-08-31 16:10:13 +02:00
2020-09-09 21:13:39 +02:00
< div id = "outline-container-org9468f55" class = "outline-3" >
< h3 id = "org9468f55" > < span class = "section-number-3" > 3.2< / span > sdlkfj< / h3 >
< div class = "outline-text-3" id = "text-3-2" >
2020-08-31 16:10:13 +02:00
< div class = "org-src-container" >
2020-09-09 21:13:39 +02:00
< pre class = "src src-matlab" > acc_1 = lsim(inv(G_acc), ht.acc_1, ht.t);
acc_2 = lsim(inv(G_acc), ht.acc_2, ht.t);
geo_1 = lsim(inv(G_geo), ht.geo_1, ht.t);
geo_2 = lsim(inv(G_geo), ht.geo_2, ht.t);
2020-08-31 16:10:13 +02:00
< / pre >
< / div >
< / div >
< / div >
2020-09-09 21:13:39 +02:00
< div id = "outline-container-org0686d3d" class = "outline-3" >
< h3 id = "org0686d3d" > < span class = "section-number-3" > 3.3< / span > Compare Time Domain Signals< / h3 >
< div class = "outline-text-3" id = "text-3-3" >
2020-08-31 16:10:13 +02:00
< div class = "org-src-container" >
< pre class = "src src-matlab" > figure;
hold on;
plot(t, acc_1);
plot(t, acc_2);
plot(t, geo_1);
plot(t, geo_2);
hold off;
< / pre >
< / div >
< / div >
< / div >
2020-09-09 21:13:39 +02:00
< div id = "outline-container-orgb43afdf" class = "outline-3" >
< h3 id = "orgb43afdf" > < span class = "section-number-3" > 3.4< / span > Compute PSD< / h3 >
< div class = "outline-text-3" id = "text-3-4" >
2020-08-31 16:10:13 +02:00
< p >
We first define the parameters for the frequency domain analysis.
< / p >
< div class = "org-src-container" >
< pre class = "src src-matlab" > Fs = 1/dt; % [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_acc_1, f] = pwelch(acc_1, win, [], [], Fs);
[p_acc_2, ~] = pwelch(acc_2, win, [], [], Fs);
[p_geo_1, ~] = pwelch(geo_1, win, [], [], Fs);
[p_geo_2, ~] = pwelch(geo_2, win, [], [], Fs);
< / pre >
< / div >
< div class = "org-src-container" >
< pre class = "src src-matlab" > figure;
hold on;
plot(f, sqrt(p_acc_1));
plot(f, sqrt(p_acc_2));
hold off;
set(gca, 'xscale', 'log');
set(gca, 'yscale', 'log');
xlabel('Frequency [Hz]'); ylabel('ASD Accelerometers $\left[\frac{m/s}{\sqrt{Hz}}\right]$')
xlim([1, 5000]);
< / pre >
< / div >
< div class = "org-src-container" >
< pre class = "src src-matlab" > figure;
hold on;
plot(f, sqrt(p_geo_1));
plot(f, sqrt(p_geo_2));
hold off;
set(gca, 'xscale', 'log');
set(gca, 'yscale', 'log');
xlabel('Frequency [Hz]'); ylabel('ASD Geophones $\left[\frac{m/s}{\sqrt{Hz}}\right]$')
xlim([1, 5000]);
< / pre >
< / div >
< / div >
< / div >
2020-09-09 21:13:39 +02:00
< div id = "outline-container-org02730d1" class = "outline-3" >
< h3 id = "org02730d1" > < span class = "section-number-3" > 3.5< / span > Dynamical Uncertainty< / h3 >
< div class = "outline-text-3" id = "text-3-5" >
2020-08-31 16:10:13 +02:00
< div class = "org-src-container" >
< pre class = "src src-matlab" > [T_acc, ~] = tfestimate(acc_1, acc_2, win, [], [], Fs);
[T_geo, ~] = tfestimate(geo_1, geo_2, win, [], [], Fs);
< / pre >
< / div >
< / div >
< / div >
2020-09-09 21:13:39 +02:00
< div id = "outline-container-orga6b7413" class = "outline-3" >
< h3 id = "orga6b7413" > < span class = "section-number-3" > 3.6< / span > ADC Noise< / h3 >
< div class = "outline-text-3" id = "text-3-6" >
< p >
Let’ s note:
< / p >
< ul class = "org-ul" >
< li > \(\Delta V\) the ADC range in [V]< / li >
< li > \(n\) the number of bits< / li >
< li > \(q = \frac{\Delta V}{2^n}\) the quantization in [V]< / li >
< li > \(f_N\) the sampling frequency in [Hz]< / li >
< / ul >
< p >
The Power Spectral Density of the quantization noise is then:
< / p >
\begin{equation}
S_Q = \frac{q^2}{12 f_N} \quad [V^2/Hz]
\end{equation}
< div class = "org-src-container" >
< pre class = "src src-matlab" > Fs = 1/dt;
Sq = (20/2^16)^2/(12*Fs);
< / pre >
< / div >
< / div >
< / div >
< div id = "outline-container-orge64b357" class = "outline-3" >
< h3 id = "orge64b357" > < span class = "section-number-3" > 3.7< / span > Sensor Noise< / h3 >
< div class = "outline-text-3" id = "text-3-7" >
2020-08-31 16:10:13 +02:00
< div class = "org-src-container" >
< pre class = "src src-matlab" > [coh_acc, ~] = mscohere(acc_1, acc_2, win, [], [], Fs);
[coh_geo, ~] = mscohere(geo_1, geo_2, win, [], [], Fs);
< / pre >
< / div >
< div class = "org-src-container" >
< pre class = "src src-matlab" > pN_acc = p_acc_1.*(1 - coh_acc);
pN_geo = p_geo_1.*(1 - coh_geo);
< / pre >
< / div >
< div class = "org-src-container" >
< pre class = "src src-matlab" > figure;
hold on;
plot(f, pN_acc, '-', 'DisplayName', 'Accelerometers');
plot(f, pN_geo, '-', 'DisplayName', 'Geophones');
hold off;
set(gca, 'xscale', 'log'); set(gca, 'yscale', 'log');
xlabel('Frequency [Hz]'); ylabel('ASD of the Measurement Noise $\left[\frac{m/s}{\sqrt{Hz}}\right]$');
xlim([1, 5000]);
legend('location', 'northeast');
< / pre >
< / div >
< / div >
< / div >
< / div >
2020-09-09 21:13:39 +02:00
< div id = "outline-container-orgec75d07" class = "outline-2" >
< h2 id = "orgec75d07" > < span class = "section-number-2" > 4< / span > Sensor Dynamics< / h2 >
< div class = "outline-text-2" id = "text-4" >
< 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-org0fb20c4" class = "outline-3" >
< h3 id = "org0fb20c4" > < 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" > ht = load('./mat/huddle_test.mat', 'd', 'acc_1', 'acc_2', 'geo_1', 'geo_2', 'f_meas', 'u', 't');
id_ol = load('./mat/identification_noise_bis.mat', 'd', 'acc_1', 'acc_2', 'geo_1', 'geo_2', 'f_meas', 'u', 't');
< / pre >
< / div >
< / div >
< / div >
< div id = "outline-container-orgbeb67bf" class = "outline-3" >
< h3 id = "orgbeb67bf" > < span class = "section-number-3" > 4.2< / span > Time Domain Signals< / h3 >
< div class = "outline-text-3" id = "text-4-2" >
< p >
Excitation signal: noise.
< / p >
< div id = "org320dc7d" class = "figure" >
< p > < img src = "figs/first_exc_signal_time.png" alt = "first_exc_signal_time.png" / >
< / p >
< p > < span class = "figure-number" > Figure 1: < / span > Excitation signal used for the first identification< / p >
< / div >
< / div >
< / div >
< div id = "outline-container-orge8d90a4" class = "outline-3" >
< h3 id = "orge8d90a4" > < span class = "section-number-3" > 4.3< / span > Identification of the IFF Plant< / h3 >
< div class = "outline-text-3" id = "text-4-3" >
< / div >
< div id = "outline-container-orge57cb88" class = "outline-4" >
< h4 id = "orge57cb88" > < span class = "section-number-4" > 4.3.1< / span > Experimental Data< / h4 >
< div class = "outline-text-4" id = "text-4-3-1" >
< 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" > [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 = "org16469a6" class = "figure" >
< p > < img src = "figs/iff_identification_coh.png" alt = "iff_identification_coh.png" / >
< / p >
< p > < span class = "figure-number" > Figure 2: < / span > Coherence for the identification of the IFF plant< / p >
< / div >
< div id = "orge81e76a" class = "figure" >
< p > < img src = "figs/iff_identification_bode_plot.png" alt = "iff_identification_bode_plot.png" / >
< / p >
< p > < span class = "figure-number" > Figure 3: < / span > Bode plot of the identified IFF plant< / p >
< / div >
< / div >
< / div >
< div id = "outline-container-orgaa77ceb" class = "outline-4" >
< h4 id = "orgaa77ceb" > < span class = "section-number-4" > 4.3.2< / span > Model of the IFF Plant< / h4 >
< div class = "outline-text-4" id = "text-4-3-2" >
< 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 = "org04c5d91" class = "figure" >
< p > < img src = "figs/iff_plant_model.png" alt = "iff_plant_model.png" / >
< / p >
< p > < span class = "figure-number" > Figure 4: < / span > IFF Plant + Model< / p >
< / div >
< / div >
< / div >
< div id = "outline-container-org5109d47" class = "outline-4" >
< h4 id = "org5109d47" > < span class = "section-number-4" > 4.3.3< / span > Root Locus and optimal Controller< / h4 >
< div class = "outline-text-4" id = "text-4-3-3" >
< div id = "org6f813e3" class = "figure" >
< p > < img src = "figs/iff_root_locus.png" alt = "iff_root_locus.png" / >
< / p >
< p > < span class = "figure-number" > Figure 5: < / 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 >
< div id = "outline-container-orgdd6e477" class = "outline-3" >
< h3 id = "orgdd6e477" > < span class = "section-number-3" > 4.4< / span > Identification of Sensor Dynamics with IFF activated< / h3 >
< div class = "outline-text-3" id = "text-4-4" >
< / div >
< div id = "outline-container-orgb129175" class = "outline-4" >
< h4 id = "orgb129175" > < span class = "section-number-4" > 4.4.1< / span > Signals< / h4 >
< div class = "outline-text-4" id = "text-4-4-1" >
< 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');
< / pre >
< / div >
< / div >
< / div >
< div id = "outline-container-org16c5098" class = "outline-4" >
< h4 id = "org16c5098" > < span class = "section-number-4" > 4.4.2< / span > Verification of the achievable damping< / h4 >
< div class = "outline-text-4" id = "text-4-4-2" >
< 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 = "org9566953" class = "figure" >
< p > < img src = "figs/Gd_identification_iff_coherence.png" alt = "Gd_identification_iff_coherence.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 >
< p >
Don’ t really understand the low frequency behavior.
< / p >
< div id = "org341e00c" 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 7: < / span > Coherence for the transfer function from F to d, with and without IFF< / p >
< / div >
< / div >
< / div >
< / div >
< div id = "outline-container-org7c6b6b8" class = "outline-3" >
< h3 id = "org7c6b6b8" > < span class = "section-number-3" > 4.5< / span > Generate the excitation signal< / h3 >
< div class = "outline-text-3" id = "text-4-5" >
< / div >
< div id = "outline-container-org0a29bfb" class = "outline-4" >
< h4 id = "org0a29bfb" > < span class = "section-number-4" > 4.5.1< / span > Requirements< / h4 >
< div class = "outline-text-4" id = "text-4-5-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-org70f432a" class = "outline-4" >
< h4 id = "org70f432a" > < span class = "section-number-4" > 4.5.2< / span > Transfer function from excitation signal to displacement< / h4 >
< div class = "outline-text-4" id = "text-4-5-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" > win = hann(ceil(10/Ts));
[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 = "org5d992d5" class = "figure" >
< p > < img src = "figs/Gd_plant_estimation.png" alt = "Gd_plant_estimation.png" / >
< / p >
< p > < span class = "figure-number" > Figure 8: < / span > Estimation of the transfer function from the excitation signal to the generated displacement< / p >
< / div >
< / div >
< / div >
< div id = "outline-container-orgb35f216" class = "outline-4" >
< h4 id = "orgb35f216" > < span class = "section-number-4" > 4.5.3< / span > Motion measured during Huddle test< / h4 >
< div class = "outline-text-4" id = "text-4-5-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');
< / 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 = "org8dac243" class = "figure" >
< p > < img src = "figs/huddle_test_psd_motion.png" alt = "huddle_test_psd_motion.png" / >
< / p >
< p > < span class = "figure-number" > Figure 9: < / 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 = "orgc88e114" 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 10: < / 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 = "org6993d4b" class = "figure" >
< p > < img src = "figs/optimal_exc_signal_time.png" alt = "optimal_exc_signal_time.png" / >
< / p >
< p > < span class = "figure-number" > Figure 11: < / span > Generated excitation signal< / p >
< / div >
< / div >
< / div >
< / div >
< div id = "outline-container-org5b6add7" class = "outline-3" >
< h3 id = "org5b6add7" > < span class = "section-number-3" > 4.6< / span > Identification of the Inertial Sensors Dynamics< / h3 >
< div class = "outline-text-3" id = "text-4-6" >
< / div >
< div id = "outline-container-org00b0fdd" class = "outline-4" >
< h4 id = "org00b0fdd" > < span class = "section-number-4" > 4.6.1< / span > Load Data< / h4 >
< div class = "outline-text-4" id = "text-4-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');
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-org7eb216e" class = "outline-4" >
< h4 id = "org7eb216e" > < span class = "section-number-4" > 4.6.2< / span > Compare PSD during Huddle and and during identification< / h4 >
< div class = "outline-text-4" id = "text-4-6-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 = "orgc6b8899" 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 12: < / 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-org9e50b3e" class = "outline-4" >
< h4 id = "org9e50b3e" > < span class = "section-number-4" > 4.6.3< / span > Compute transfer functions< / h4 >
< div class = "outline-text-4" id = "text-4-6-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 = "org717ec64" class = "figure" >
< p > < img src = "figs/id_sensor_dynamics_coherence.png" alt = "id_sensor_dynamics_coherence.png" / >
< / p >
< p > < span class = "figure-number" > Figure 13: < / 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 = "org1eddb61" class = "figure" >
< p > < img src = "figs/id_sensor_dynamics_accelerometers.png" alt = "id_sensor_dynamics_accelerometers.png" / >
< / p >
< p > < span class = "figure-number" > Figure 14: < / span > Identified dynamics of the accelerometers< / p >
< / div >
< div id = "org5b7e09e" class = "figure" >
< p > < img src = "figs/id_sensor_dynamics_geophones.png" alt = "id_sensor_dynamics_geophones.png" / >
< / p >
< p > < span class = "figure-number" > Figure 15: < / span > Identified dynamics of the geophones< / p >
< / div >
< / div >
< / div >
< / div >
< div id = "outline-container-org12ea408" class = "outline-3" >
< h3 id = "org12ea408" > < span class = "section-number-3" > 4.7< / span > Compare Time domain Estimation of the displacement< / h3 >
< div class = "outline-text-3" id = "text-4-7" >
< 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-09-09 21:13:39 +02:00
< p class = "date" > Created: 2020-09-09 mer. 20:38< / p >
2020-08-31 16:10:13 +02:00
< / div >
< / body >
< / html >