2021-06-07 19:00:29 +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 >
2021-06-08 22:39:35 +02:00
<!-- 2021 - 06 - 08 mar. 22:38 -->
2021-06-07 19:00:29 +02:00
< meta http-equiv = "Content-Type" content = "text/html;charset=utf-8" / >
< title > Nano-Hexapod - Test Bench< / title >
< meta name = "author" content = "Dehaeze Thomas" / >
< meta name = "generator" content = "Org Mode" / >
< link rel = "stylesheet" type = "text/css" href = "https://research.tdehaeze.xyz/css/style.css" / >
< script type = "text/javascript" src = "https://research.tdehaeze.xyz/js/script.js" > < / script >
2021-06-08 22:39:35 +02:00
< script >
MathJax = {
svg: {
scale: 1,
fontCache: "global"
},
tex: {
tags: "ams",
multlineWidth: "%MULTLINEWIDTH",
tagSide: "right",
macros: {bm: ["\\boldsymbol{#1}",1],},
tagIndent: ".8em"
}
};
< / script >
< script id = "MathJax-script" async
src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-svg.js">< / script >
2021-06-07 19:00:29 +02:00
< / head >
< body >
< div id = "org-div-home-and-up" >
< a accesskey = "h" href = "../index.html" > UP < / a >
|
< a accesskey = "H" href = "../index.html" > HOME < / a >
< / div > < div id = "content" >
< h1 class = "title" > Nano-Hexapod - Test Bench< / h1 >
< div id = "table-of-contents" >
< h2 > Table of Contents< / h2 >
< div id = "text-table-of-contents" >
< ul >
2021-06-08 22:39:35 +02:00
< li > < a href = "#orgd7e7f5e" > 1. Encoders fixed to the Struts< / a >
2021-06-08 22:14:48 +02:00
< ul >
2021-06-08 22:39:35 +02:00
< li > < a href = "#org00dcf35" > 1.1. Introduction< / a > < / li >
< li > < a href = "#orgb763144" > 1.2. Load Data< / a > < / li >
< li > < a href = "#orgb853f20" > 1.3. Spectral Analysis - Setup< / a > < / li >
< li > < a href = "#orge1489cc" > 1.4. DVF Plant< / a > < / li >
< li > < a href = "#org0c1cf8a" > 1.5. IFF Plant< / a > < / li >
< li > < a href = "#orgc6ecc36" > 1.6. Jacobian< / a >
2021-06-08 22:15:02 +02:00
< ul >
2021-06-08 22:39:35 +02:00
< li > < a href = "#org1c3941e" > 1.6.1. DVF Plant< / a > < / li >
< li > < a href = "#org31caf05" > 1.6.2. IFF Plant< / a > < / li >
2021-06-08 22:15:02 +02:00
< / ul >
< / li >
2021-06-08 22:14:48 +02:00
< / ul >
< / li >
2021-06-07 19:00:29 +02:00
< / ul >
< / div >
< / div >
< hr >
< p > This report is also available as a < a href = "./test-bench-nano-hexapod.pdf" > pdf< / a > .< / p >
< hr >
2021-06-08 22:39:35 +02:00
< div class = "note" id = "orgf7b18a3" >
2021-06-07 19:00:29 +02:00
< p >
Here are the documentation of the equipment used for this test bench:
< / p >
< ul class = "org-ul" >
< li > Voltage Amplifier: PiezoDrive < a href = "doc/PD200-V7-R1.pdf" > PD200< / a > < / li >
< li > Amplified Piezoelectric Actuator: Cedrat < a href = "doc/APA300ML.pdf" > APA300ML< / a > < / li >
< li > DAC/ADC: Speedgoat < a href = "doc/IO131-OEM-Datasheet.pdf" > IO313< / a > < / li >
< li > Encoder: Renishaw < a href = "doc/L-9517-9678-05-A_Data_sheet_VIONiC_series_en.pdf" > Vionic< / a > and used < a href = "doc/L-9517-9862-01-C_Data_sheet_RKLC_EN.pdf" > Ruler< / a > < / li >
< li > Interferometers: Attocube< / li >
< / ul >
< / div >
2021-06-08 22:14:48 +02:00
2021-06-08 22:39:35 +02:00
< div id = "org2a6b667" class = "figure" >
2021-06-08 22:14:48 +02:00
< p > < img src = "figs/IMG_20210608_152917.jpg" alt = "IMG_20210608_152917.jpg" / >
< / p >
< p > < span class = "figure-number" > Figure 1: < / span > Nano-Hexapod< / p >
< / div >
2021-06-08 22:39:35 +02:00
< div id = "org7b600dc" class = "figure" >
2021-06-08 22:14:48 +02:00
< p > < img src = "figs/IMG_20210608_154722.jpg" alt = "IMG_20210608_154722.jpg" / >
< / p >
< p > < span class = "figure-number" > Figure 2: < / span > Nano-Hexapod and the control electronics< / p >
< / div >
2021-06-08 22:39:35 +02:00
< div id = "outline-container-orgd7e7f5e" class = "outline-2" >
< h2 id = "orgd7e7f5e" > < span class = "section-number-2" > 1< / span > Encoders fixed to the Struts< / h2 >
2021-06-08 22:15:02 +02:00
< div class = "outline-text-2" id = "text-1" >
2021-06-08 22:14:48 +02:00
< / div >
2021-06-08 22:39:35 +02:00
< div id = "outline-container-org00dcf35" class = "outline-3" >
< h3 id = "org00dcf35" > < span class = "section-number-3" > 1.1< / span > Introduction< / h3 >
< div class = "outline-text-3" id = "text-1-1" >
< p >
In this section, the encoders are fixed to the struts.
< / p >
< / div >
2021-06-08 22:14:48 +02:00
< / div >
2021-06-08 22:39:35 +02:00
< div id = "outline-container-orgb763144" class = "outline-3" >
< h3 id = "orgb763144" > < span class = "section-number-3" > 1.2< / span > Load Data< / h3 >
2021-06-08 22:15:02 +02:00
< div class = "outline-text-3" id = "text-1-2" >
2021-06-08 22:14:48 +02:00
< div class = "org-src-container" >
< pre class = "src src-matlab" > meas_data_lf = {};
< span class = "org-keyword" > for< / span > < span class = "org-variable-name" > < span class = "org-constant" > i< / span > < / span > = < span class = "org-constant" > 1:6< / span >
meas_data_lf(< span class = "org-constant" > i< / span > ) = {load(sprintf(< span class = "org-string" > 'mat/frf_data_exc_strut_%i_noise_lf.mat'< / span > , < span class = "org-constant" > i< / span > ), < span class = "org-string" > 't'< / span > , < span class = "org-string" > 'Va'< / span > , < span class = "org-string" > 'Vs'< / span > , < span class = "org-string" > 'de'< / span > )};
meas_data_hf(< span class = "org-constant" > i< / span > ) = {load(sprintf(< span class = "org-string" > 'mat/frf_data_exc_strut_%i_noise_hf.mat'< / span > , < span class = "org-constant" > i< / span > ), < span class = "org-string" > 't'< / span > , < span class = "org-string" > 'Va'< / span > , < span class = "org-string" > 'Vs'< / span > , < span class = "org-string" > 'de'< / span > )};
< span class = "org-keyword" > end< / span >
< / pre >
< / div >
< / div >
< / div >
2021-06-08 22:39:35 +02:00
< div id = "outline-container-orgb853f20" class = "outline-3" >
< h3 id = "orgb853f20" > < span class = "section-number-3" > 1.3< / span > Spectral Analysis - Setup< / h3 >
2021-06-08 22:15:02 +02:00
< div class = "outline-text-3" id = "text-1-3" >
2021-06-08 22:14:48 +02:00
< div class = "org-src-container" >
< pre class = "src src-matlab" > < span class = "org-comment" > % Sampling Time [s]< / span >
Ts = (meas_data_lf{1}.t(end) < span class = "org-type" > -< / span > (meas_data_lf{1}.t(1)))< span class = "org-type" > /< / span > (length(meas_data_lf{1}.t)< span class = "org-type" > -< / span > 1);
< span class = "org-comment" > % Sampling Frequency [Hz]< / span >
Fs = 1< span class = "org-type" > /< / span > Ts;
< span class = "org-comment" > % Hannning Windows< / span >
win = hanning(ceil(1< span class = "org-type" > *< / span > Fs));
< / pre >
< / div >
< p >
And we get the frequency vector.
< / p >
< div class = "org-src-container" >
< pre class = "src src-matlab" > [< span class = "org-type" > ~< / span > , f] = tfestimate(meas_data_lf{1}.Va, meas_data_lf{1}.de, win, [], [], 1< span class = "org-type" > /< / span > Ts);
< / pre >
< / div >
< div class = "org-src-container" >
< pre class = "src src-matlab" > i_lf = f < span class = "org-type" > < < / span > 250; < span class = "org-comment" > % Points for low frequency excitation< / span >
i_hf = f < span class = "org-type" > > < / span > 250; < span class = "org-comment" > % Points for high frequency excitation< / span >
< / pre >
< / div >
< / div >
< / div >
2021-06-08 22:39:35 +02:00
< div id = "outline-container-orge1489cc" class = "outline-3" >
< h3 id = "orge1489cc" > < span class = "section-number-3" > 1.4< / span > DVF Plant< / h3 >
2021-06-08 22:15:02 +02:00
< div class = "outline-text-3" id = "text-1-4" >
2021-06-08 22:14:48 +02:00
< p >
2021-06-08 22:39:35 +02:00
First, let’ s compute the coherence from the excitation voltage and the displacement as measured by the encoders (Figure < a href = "#orgdf189a0" > 3< / a > ).
2021-06-08 22:14:48 +02:00
< / p >
< div class = "org-src-container" >
< pre class = "src src-matlab" > < span class = "org-matlab-cellbreak" > < span class = "org-comment" > %% Coherence< / span > < / span >
coh_dvf_lf = zeros(length(f), 6, 6);
coh_dvf_hf = zeros(length(f), 6, 6);
< span class = "org-keyword" > for< / span > < span class = "org-variable-name" > < span class = "org-constant" > i< / span > < / span > = < span class = "org-constant" > 1:6< / span >
coh_dvf_lf(< span class = "org-type" > :< / span > , < span class = "org-type" > :< / span > , < span class = "org-constant" > i< / span > ) = mscohere(meas_data_lf{< span class = "org-constant" > i< / span > }.Va, meas_data_lf{< span class = "org-constant" > i< / span > }.de, win, [], [], 1< span class = "org-type" > /< / span > Ts);
coh_dvf_hf(< span class = "org-type" > :< / span > , < span class = "org-type" > :< / span > , < span class = "org-constant" > i< / span > ) = mscohere(meas_data_hf{< span class = "org-constant" > i< / span > }.Va, meas_data_hf{< span class = "org-constant" > i< / span > }.de, win, [], [], 1< span class = "org-type" > /< / span > Ts);
< span class = "org-keyword" > end< / span >
< / pre >
< / div >
2021-06-08 22:39:35 +02:00
< div id = "orgdf189a0" class = "figure" >
2021-06-08 22:14:48 +02:00
< p > < img src = "figs/enc_struts_dvf_coh.png" alt = "enc_struts_dvf_coh.png" / >
< / p >
< p > < span class = "figure-number" > Figure 3: < / span > Obtained coherence for the DVF plant< / p >
< / div >
< p >
2021-06-08 22:39:35 +02:00
Then the 6x6 transfer function matrix is estimated (Figure < a href = "#orgce0ab32" > 4< / a > ).
2021-06-08 22:14:48 +02:00
< / p >
< div class = "org-src-container" >
< pre class = "src src-matlab" > < span class = "org-matlab-cellbreak" > < span class = "org-comment" > %% DVF Plant< / span > < / span >
G_dvf_lf = zeros(length(f), 6, 6);
G_dvf_hf = zeros(length(f), 6, 6);
< span class = "org-keyword" > for< / span > < span class = "org-variable-name" > < span class = "org-constant" > i< / span > < / span > = < span class = "org-constant" > 1:6< / span >
G_dvf_lf(< span class = "org-type" > :< / span > , < span class = "org-type" > :< / span > , < span class = "org-constant" > i< / span > ) = tfestimate(meas_data_lf{< span class = "org-constant" > i< / span > }.Va, meas_data_lf{< span class = "org-constant" > i< / span > }.de, win, [], [], 1< span class = "org-type" > /< / span > Ts);
G_dvf_hf(< span class = "org-type" > :< / span > , < span class = "org-type" > :< / span > , < span class = "org-constant" > i< / span > ) = tfestimate(meas_data_hf{< span class = "org-constant" > i< / span > }.Va, meas_data_hf{< span class = "org-constant" > i< / span > }.de, win, [], [], 1< span class = "org-type" > /< / span > Ts);
< span class = "org-keyword" > end< / span >
< / pre >
< / div >
2021-06-08 22:39:35 +02:00
< div id = "orgce0ab32" class = "figure" >
2021-06-08 22:14:48 +02:00
< p > < img src = "figs/enc_struts_dvf_frf.png" alt = "enc_struts_dvf_frf.png" / >
< / p >
< p > < span class = "figure-number" > Figure 4: < / span > Measured FRF for the DVF plant< / p >
< / div >
< / div >
< / div >
2021-06-08 22:39:35 +02:00
< div id = "outline-container-org0c1cf8a" class = "outline-3" >
< h3 id = "org0c1cf8a" > < span class = "section-number-3" > 1.5< / span > IFF Plant< / h3 >
2021-06-08 22:15:02 +02:00
< div class = "outline-text-3" id = "text-1-5" >
2021-06-08 22:14:48 +02:00
< p >
2021-06-08 22:39:35 +02:00
First, let’ s compute the coherence from the excitation voltage and the displacement as measured by the encoders (Figure < a href = "#org1ba438b" > 5< / a > ).
2021-06-08 22:14:48 +02:00
< / p >
< div class = "org-src-container" >
< pre class = "src src-matlab" > < span class = "org-matlab-cellbreak" > < span class = "org-comment" > %% Coherence< / span > < / span >
coh_iff_lf = zeros(length(f), 6, 6);
coh_iff_hf = zeros(length(f), 6, 6);
< span class = "org-keyword" > for< / span > < span class = "org-variable-name" > < span class = "org-constant" > i< / span > < / span > = < span class = "org-constant" > 1:6< / span >
coh_iff_lf(< span class = "org-type" > :< / span > , < span class = "org-type" > :< / span > , < span class = "org-constant" > i< / span > ) = mscohere(meas_data_lf{< span class = "org-constant" > i< / span > }.Va, meas_data_lf{< span class = "org-constant" > i< / span > }.Vs, win, [], [], 1< span class = "org-type" > /< / span > Ts);
coh_iff_hf(< span class = "org-type" > :< / span > , < span class = "org-type" > :< / span > , < span class = "org-constant" > i< / span > ) = mscohere(meas_data_hf{< span class = "org-constant" > i< / span > }.Va, meas_data_hf{< span class = "org-constant" > i< / span > }.Vs, win, [], [], 1< span class = "org-type" > /< / span > Ts);
< span class = "org-keyword" > end< / span >
< / pre >
< / div >
2021-06-08 22:39:35 +02:00
< div id = "org1ba438b" class = "figure" >
2021-06-08 22:14:48 +02:00
< p > < img src = "figs/enc_struts_iff_coh.png" alt = "enc_struts_iff_coh.png" / >
< / p >
< p > < span class = "figure-number" > Figure 5: < / span > Obtained coherence for the IFF plant< / p >
< / div >
< p >
2021-06-08 22:39:35 +02:00
Then the 6x6 transfer function matrix is estimated (Figure < a href = "#orge2cbf29" > 6< / a > ).
2021-06-08 22:14:48 +02:00
< / p >
< div class = "org-src-container" >
< pre class = "src src-matlab" > < span class = "org-matlab-cellbreak" > < span class = "org-comment" > %% IFF Plant< / span > < / span >
G_iff_lf = zeros(length(f), 6, 6);
G_iff_hf = zeros(length(f), 6, 6);
< span class = "org-keyword" > for< / span > < span class = "org-variable-name" > < span class = "org-constant" > i< / span > < / span > = < span class = "org-constant" > 1:6< / span >
G_iff_lf(< span class = "org-type" > :< / span > , < span class = "org-type" > :< / span > , < span class = "org-constant" > i< / span > ) = tfestimate(meas_data_lf{< span class = "org-constant" > i< / span > }.Va, meas_data_lf{< span class = "org-constant" > i< / span > }.Vs, win, [], [], 1< span class = "org-type" > /< / span > Ts);
G_iff_hf(< span class = "org-type" > :< / span > , < span class = "org-type" > :< / span > , < span class = "org-constant" > i< / span > ) = tfestimate(meas_data_hf{< span class = "org-constant" > i< / span > }.Va, meas_data_hf{< span class = "org-constant" > i< / span > }.Vs, win, [], [], 1< span class = "org-type" > /< / span > Ts);
< span class = "org-keyword" > end< / span >
< / pre >
< / div >
2021-06-08 22:39:35 +02:00
< div id = "orge2cbf29" class = "figure" >
2021-06-08 22:14:48 +02:00
< p > < img src = "figs/enc_struts_iff_frf.png" alt = "enc_struts_iff_frf.png" / >
< / p >
< p > < span class = "figure-number" > Figure 6: < / span > Measured FRF for the IFF plant< / p >
< / div >
< / div >
< / div >
2021-06-08 22:39:35 +02:00
< div id = "outline-container-orgc6ecc36" class = "outline-3" >
< h3 id = "orgc6ecc36" > < span class = "section-number-3" > 1.6< / span > Jacobian< / h3 >
2021-06-08 22:15:02 +02:00
< div class = "outline-text-3" id = "text-1-6" >
2021-06-08 22:39:35 +02:00
< p >
The Jacobian is used to transform the excitation force in the cartesian frame as well as the displacements.
< / p >
< p >
Consider the plant shown in Figure < a href = "#org573cce0" > 7< / a > with:
< / p >
< ul class = "org-ul" >
< li > \(\tau\) the 6 input voltages (going to the PD200 amplifier and then to the APA)< / li >
< li > \(d\mathcal{L}\) the relative motion sensor outputs (encoders)< / li >
< li > \(\bm{\tau}_m\) the generated voltage of the force sensor stacks< / li >
< li > \(J_a\) and \(J_s\) the Jacobians for the actuators and sensors< / li >
< / ul >
< div id = "org573cce0" class = "figure" >
< p > < img src = "figs/schematic_jacobian_in_out.png" alt = "schematic_jacobian_in_out.png" / >
< / p >
< p > < span class = "figure-number" > Figure 7: < / span > Plant in the cartesian Frame< / p >
< / div >
< p >
First, we load the Jacobian matrix (same for the actuators and sensors).
< / p >
2021-06-08 22:14:48 +02:00
< div class = "org-src-container" >
< pre class = "src src-matlab" > load(< span class = "org-string" > 'jacobian.mat'< / span > , < span class = "org-string" > 'J'< / span > );
< / pre >
< / div >
2021-06-08 22:15:02 +02:00
< / div >
2021-06-08 22:39:35 +02:00
< div id = "outline-container-org1c3941e" class = "outline-4" >
< h4 id = "org1c3941e" > < span class = "section-number-4" > 1.6.1< / span > DVF Plant< / h4 >
2021-06-08 22:15:02 +02:00
< div class = "outline-text-4" id = "text-1-6-1" >
2021-06-08 22:39:35 +02:00
< p >
The transfer function from \(\bm{\mathcal{F}}\) to \(d\bm{\mathcal{X}}\) is computed and shown in Figure < a href = "#org92f038e" > 8< / a > .
< / p >
2021-06-08 22:14:48 +02:00
< div class = "org-src-container" >
2021-06-08 22:15:02 +02:00
< pre class = "src src-matlab" > G_dvf_J_lf = permute(pagemtimes(inv(J), pagemtimes(permute(G_dvf_lf, [2 3 1]), inv(J< span class = "org-type" > '< / span > ))), [3 1 2]);
G_dvf_J_hf = permute(pagemtimes(inv(J), pagemtimes(permute(G_dvf_hf, [2 3 1]), inv(J< span class = "org-type" > '< / span > ))), [3 1 2]);
2021-06-08 22:14:48 +02:00
< / pre >
< / div >
2021-06-08 22:39:35 +02:00
< div id = "org92f038e" class = "figure" >
< p > < img src = "figs/enc_struts_dvf_cart_frf.png" alt = "enc_struts_dvf_cart_frf.png" / >
< / p >
< p > < span class = "figure-number" > Figure 8: < / span > Measured FRF for the DVF plant in the cartesian frame< / p >
< / div >
2021-06-08 22:15:02 +02:00
< / div >
< / div >
2021-06-08 22:14:48 +02:00
2021-06-08 22:39:35 +02:00
< div id = "outline-container-org31caf05" class = "outline-4" >
< h4 id = "org31caf05" > < span class = "section-number-4" > 1.6.2< / span > IFF Plant< / h4 >
2021-06-08 22:15:02 +02:00
< div class = "outline-text-4" id = "text-1-6-2" >
2021-06-08 22:39:35 +02:00
< p >
The transfer function from \(\bm{\mathcal{F}}\) to \(\bm{\mathcal{F}}_m\) is computed and shown in Figure < a href = "#orge1b3404" > 9< / a > .
< / p >
2021-06-08 22:15:02 +02:00
< div class = "org-src-container" >
< pre class = "src src-matlab" > G_iff_J_lf = permute(pagemtimes(inv(J), pagemtimes(permute(G_iff_lf, [2 3 1]), inv(J< span class = "org-type" > '< / span > ))), [3 1 2]);
G_iff_J_hf = permute(pagemtimes(inv(J), pagemtimes(permute(G_iff_hf, [2 3 1]), inv(J< span class = "org-type" > '< / span > ))), [3 1 2]);
< / pre >
< / div >
2021-06-08 22:39:35 +02:00
< div id = "orge1b3404" class = "figure" >
< p > < img src = "figs/enc_struts_iff_cart_frf.png" alt = "enc_struts_iff_cart_frf.png" / >
< / p >
< p > < span class = "figure-number" > Figure 9: < / span > Measured FRF for the IFF plant in the cartesian frame< / p >
< / div >
2021-06-08 22:15:02 +02:00
< / div >
2021-06-08 22:14:48 +02:00
< / div >
2021-06-07 19:00:29 +02:00
< / div >
< / div >
< / div >
< div id = "postamble" class = "status" >
< p class = "author" > Author: Dehaeze Thomas< / p >
2021-06-08 22:39:35 +02:00
< p class = "date" > Created: 2021-06-08 mar. 22:38< / p >
2021-06-07 19:00:29 +02:00
< / div >
< / body >
< / html >