Add flexible hexapod initialized in the wanted configuration
Change the tomography experiment simulation Add simulink "matlab function" to compute the position error
This commit is contained in:
parent
b4180feded
commit
65e246ff4c
@ -61,10 +61,10 @@ The simulink file to do tomography experiments is =sim_nano_station_tomo.slx=.
|
|||||||
open('experiment_tomography/matlab/sim_nano_station_tomo.slx')
|
open('experiment_tomography/matlab/sim_nano_station_tomo.slx')
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
We load the shared simulink configuration and we set a small =StopTime=.
|
We load the shared simulink configuration and we set the =StopTime=.
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
load('mat/conf_simscape.mat');
|
load('mat/conf_simscape.mat');
|
||||||
set_param(conf_simscape, 'StopTime', '10');
|
set_param(conf_simscape, 'StopTime', '5');
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
We first initialize all the stages.
|
We first initialize all the stages.
|
||||||
@ -81,14 +81,15 @@ We first initialize all the stages.
|
|||||||
initializeSample(struct('mass', 1));
|
initializeSample(struct('mass', 1));
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
|
* Tomography Experiment with no disturbances
|
||||||
|
** Simulation Setup
|
||||||
We initialize the reference path for all the stages.
|
We initialize the reference path for all the stages.
|
||||||
All stage is set to its zero position except the Spindle which is rotating at 60rpm.
|
All stage is set to its zero position except the Spindle which is rotating at 60rpm.
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
initializeReferences(struct('Rz_type', 'rotating', 'Rz_period', 1));
|
initializeReferences(struct('Rz_type', 'rotating', 'Rz_period', 1));
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
* Tomography Experiment with no disturbances
|
And we initialize the disturbances to be equal to zero.
|
||||||
And we initialize the disturbances to zero.
|
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
opts = struct(...
|
opts = struct(...
|
||||||
'Dwx', false, ... % Ground Motion - X direction
|
'Dwx', false, ... % Ground Motion - X direction
|
||||||
@ -101,21 +102,36 @@ And we initialize the disturbances to zero.
|
|||||||
initDisturbances(opts);
|
initDisturbances(opts);
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
|
We simulate the model.
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
sim('sim_nano_station_tomo')
|
sim('sim_nano_station_tomo');
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
|
And we save the obtained data.
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
Dsm_without_dist = Dsm;
|
MTr_alig_no_dist = MTr;
|
||||||
|
save('experiment_tomography/mat/experiment.mat', 'MTr_alig_no_dist', '-append');
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
|
** Analysis
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
|
Edx = squeeze(MTr(1, 4, :));
|
||||||
|
Edy = squeeze(MTr(2, 4, :));
|
||||||
|
Edz = squeeze(MTr(3, 4, :));
|
||||||
|
% The angles obtained are u-v-w Euler angles (rotations in the moving frame)
|
||||||
|
Ery = atan2( squeeze(MTr(1, 3, :)), squeeze(sqrt(MTr(1, 1, :).^2 + MTr(1, 2, :).^2)));
|
||||||
|
Erx = atan2(-squeeze(MTr(2, 3, :))./cos(Ery), squeeze(MTr(3, 3, :))./cos(Ery));
|
||||||
|
Erz = atan2(-squeeze(MTr(1, 2, :))./cos(Ery), squeeze(MTr(1, 1, :))./cos(Ery));
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+begin_src matlab :exports none
|
||||||
figure;
|
figure;
|
||||||
hold on;
|
hold on;
|
||||||
plot(Dsm_without_dist.x.Time, Dsm_without_dist.x.Data, 'DisplayName', 'x')
|
plot(t, Edx, 'DisplayName', '$\epsilon_{x}$')
|
||||||
plot(Dsm_without_dist.y.Time, Dsm_without_dist.y.Data, 'DisplayName', 'y')
|
plot(t, Edy, 'DisplayName', '$\epsilon_{y}$')
|
||||||
plot(Dsm_without_dist.z.Time, Dsm_without_dist.z.Data, 'DisplayName', 'z')
|
plot(t, Edz, 'DisplayName', '$\epsilon_{z}$')
|
||||||
hold off;
|
hold off;
|
||||||
|
xlabel('Time [s]'); ylabel('Displacement [m]');
|
||||||
xlim([2, inf]);
|
xlim([2, inf]);
|
||||||
legend('location', 'northeast');
|
legend('location', 'northeast');
|
||||||
#+end_src
|
#+end_src
|
||||||
@ -129,11 +145,30 @@ And we initialize the disturbances to zero.
|
|||||||
#+CAPTION: X-Y-Z translation of the sample w.r.t. granite when performing tomography experiment with no disturbances ([[./figs/exp_tomo_without_dist_trans.png][png]], [[./figs/exp_tomo_without_dist_trans.pdf][pdf]])
|
#+CAPTION: X-Y-Z translation of the sample w.r.t. granite when performing tomography experiment with no disturbances ([[./figs/exp_tomo_without_dist_trans.png][png]], [[./figs/exp_tomo_without_dist_trans.pdf][pdf]])
|
||||||
[[file:figs/exp_tomo_without_dist_trans.png]]
|
[[file:figs/exp_tomo_without_dist_trans.png]]
|
||||||
|
|
||||||
|
#+begin_src matlab :exports none
|
||||||
|
figure;
|
||||||
|
hold on;
|
||||||
|
plot(t, Erx, 'DisplayName', '$\epsilon_{\theta x}$')
|
||||||
|
plot(t, Ery, 'DisplayName', '$\epsilon_{\theta y}$')
|
||||||
|
plot(t, Erz, 'DisplayName', '$\epsilon_{\theta z}$')
|
||||||
|
hold off;
|
||||||
|
xlabel('Time [s]'); ylabel('Rotation [rad]');
|
||||||
|
xlim([2, inf]);
|
||||||
|
legend('location', 'northeast');
|
||||||
|
#+end_src
|
||||||
|
|
||||||
Rotations.
|
#+HEADER: :tangle no :exports results :results none :noweb yes
|
||||||
Think of the good way to plot these rotations with respect to time.
|
#+begin_src matlab :var filepath="figs/exp_tomo_without_dist_rot.pdf" :var figsize="wide-normal" :post pdf2svg(file=*this*, ext="png")
|
||||||
|
<<plt-matlab>>
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+NAME: fig:exp_tomo_without_dist_rot
|
||||||
|
#+CAPTION: X-Y-Z rotations of the sample w.r.t. granite when performing tomography experiment with no disturbances ([[./figs/exp_tomo_without_dist_rot.png][png]], [[./figs/exp_tomo_without_dist_rot.pdf][pdf]])
|
||||||
|
[[file:figs/exp_tomo_without_dist_rot.png]]
|
||||||
|
|
||||||
* With Perturbations
|
* With Perturbations
|
||||||
|
** Simulation Setup
|
||||||
|
We now activate the disturbances.
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
opts = struct(...
|
opts = struct(...
|
||||||
'Dwx', true, ... % Ground Motion - X direction
|
'Dwx', true, ... % Ground Motion - X direction
|
||||||
@ -146,23 +181,42 @@ Think of the good way to plot these rotations with respect to time.
|
|||||||
initDisturbances(opts);
|
initDisturbances(opts);
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
|
We simulate the model.
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
sim('sim_nano_station_tomo')
|
sim('sim_nano_station_tomo');
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
|
And we save the obtained data.
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
|
MTr_alig_dist = MTr;
|
||||||
|
save('experiment_tomography/mat/experiment.mat', 'MTr_alig_dist', '-append');
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
** Analysis
|
||||||
|
#+begin_src matlab
|
||||||
|
Edx = squeeze(MTr(1, 4, :));
|
||||||
|
Edy = squeeze(MTr(2, 4, :));
|
||||||
|
Edz = squeeze(MTr(3, 4, :));
|
||||||
|
% The angles obtained are u-v-w Euler angles (rotations in the moving frame)
|
||||||
|
Ery = atan2( squeeze(MTr(1, 3, :)), squeeze(sqrt(MTr(1, 1, :).^2 + MTr(1, 2, :).^2)));
|
||||||
|
Erx = atan2(-squeeze(MTr(2, 3, :))./cos(Ery), squeeze(MTr(3, 3, :))./cos(Ery));
|
||||||
|
Erz = atan2(-squeeze(MTr(1, 2, :))./cos(Ery), squeeze(MTr(1, 1, :))./cos(Ery));
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+begin_src matlab :exports none
|
||||||
figure;
|
figure;
|
||||||
hold on;
|
hold on;
|
||||||
plot(Dsm.x.Time, Dsm.x.Data, 'DisplayName', 'x')
|
plot(t, Edx, 'DisplayName', '$\epsilon_{x}$')
|
||||||
plot(Dsm.y.Time, Dsm.y.Data, 'DisplayName', 'y')
|
plot(t, Edy, 'DisplayName', '$\epsilon_{y}$')
|
||||||
plot(Dsm.z.Time, Dsm.z.Data, 'DisplayName', 'z')
|
plot(t, Edz, 'DisplayName', '$\epsilon_{z}$')
|
||||||
hold off;
|
hold off;
|
||||||
|
xlabel('Time [s]'); ylabel('Displacement [m]');
|
||||||
xlim([2, inf]);
|
xlim([2, inf]);
|
||||||
legend('location', 'northeast');
|
legend('location', 'northeast');
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+HEADER: :tangle no :exports results :results none :noweb yes
|
#+HEADER: :tangle no :exports results :results none :noweb yes
|
||||||
#+begin_src matlab :var filepath="figs/exp_tomo_dist_trans.pdf" :var figsize="wide-tall" :post pdf2svg(file=*this*, ext="png")
|
#+begin_src matlab :var filepath="figs/exp_tomo_dist_trans.pdf" :var figsize="wide-normal" :post pdf2svg(file=*this*, ext="png")
|
||||||
<<plt-matlab>>
|
<<plt-matlab>>
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
@ -170,6 +224,121 @@ Think of the good way to plot these rotations with respect to time.
|
|||||||
#+CAPTION: X-Y-Z translation of the sample w.r.t. the granite when performing tomography experiment with disturbances ([[./figs/exp_tomo_dist_trans.png][png]], [[./figs/exp_tomo_dist_trans.pdf][pdf]])
|
#+CAPTION: X-Y-Z translation of the sample w.r.t. the granite when performing tomography experiment with disturbances ([[./figs/exp_tomo_dist_trans.png][png]], [[./figs/exp_tomo_dist_trans.pdf][pdf]])
|
||||||
[[file:figs/exp_tomo_dist_trans.png]]
|
[[file:figs/exp_tomo_dist_trans.png]]
|
||||||
|
|
||||||
|
#+begin_src matlab :exports none
|
||||||
|
figure;
|
||||||
|
hold on;
|
||||||
|
plot(t, Erx, 'DisplayName', '$\epsilon_{\theta x}$')
|
||||||
|
plot(t, Ery, 'DisplayName', '$\epsilon_{\theta y}$')
|
||||||
|
plot(t, Erz, 'DisplayName', '$\epsilon_{\theta z}$')
|
||||||
|
hold off;
|
||||||
|
xlabel('Time [s]'); ylabel('Rotation [rad]');
|
||||||
|
xlim([2, inf]);
|
||||||
|
legend('location', 'northeast');
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+HEADER: :tangle no :exports results :results none :noweb yes
|
||||||
|
#+begin_src matlab :var filepath="figs/exp_tomo_dist_rot.pdf" :var figsize="wide-normal" :post pdf2svg(file=*this*, ext="png")
|
||||||
|
<<plt-matlab>>
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+NAME: fig:exp_tomo_dist_rot
|
||||||
|
#+CAPTION: X-Y-Z rotations of the sample w.r.t. the granite when performing tomography experiment with disturbances ([[./figs/exp_tomo_dist_rot.png][png]], [[./figs/exp_tomo_dist_rot.pdf][pdf]])
|
||||||
|
[[file:figs/exp_tomo_dist_rot.png]]
|
||||||
|
|
||||||
|
* Tomography
|
||||||
|
** Simulation Setup
|
||||||
|
We first set the wanted translation of the Micro Hexapod.
|
||||||
|
#+begin_src matlab
|
||||||
|
P_micro_hexapod = [0.01; 0; 0]; % [m]
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
We initialize the reference path.
|
||||||
|
#+begin_src matlab
|
||||||
|
initializeReferences(struct('Dh_pos', [P_micro_hexapod; 0; 0; 0], 'Rz_type', 'rotating', 'Rz_period', 1));
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
We initialize the stages.
|
||||||
|
#+begin_src matlab
|
||||||
|
initializeMicroHexapod(struct('AP', P_micro_hexapod));
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
And we initialize the disturbances to zero.
|
||||||
|
#+begin_src matlab
|
||||||
|
opts = struct(...
|
||||||
|
'Dwx', false, ... % Ground Motion - X direction
|
||||||
|
'Dwy', false, ... % Ground Motion - Y direction
|
||||||
|
'Dwz', false, ... % Ground Motion - Z direction
|
||||||
|
'Fty_x', false, ... % Translation Stage - X direction
|
||||||
|
'Fty_z', false, ... % Translation Stage - Z direction
|
||||||
|
'Frz_z', false ... % Spindle - Z direction
|
||||||
|
);
|
||||||
|
initDisturbances(opts);
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
We simulate the model.
|
||||||
|
#+begin_src matlab
|
||||||
|
sim('sim_nano_station_tomo');
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
And we save the obtained data.
|
||||||
|
#+begin_src matlab
|
||||||
|
MTr_not_alig = MTr;
|
||||||
|
save('experiment_tomography/mat/experiment.mat', 'MTr_not_alig', '-append');
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
** Analysis
|
||||||
|
#+begin_src matlab
|
||||||
|
Edx = squeeze(MTr(1, 4, :));
|
||||||
|
Edy = squeeze(MTr(2, 4, :));
|
||||||
|
Edz = squeeze(MTr(3, 4, :));
|
||||||
|
% The angles obtained are u-v-w Euler angles (rotations in the moving frame)
|
||||||
|
Ery = atan2( squeeze(MTr(1, 3, :)), squeeze(sqrt(MTr(1, 1, :).^2 + MTr(1, 2, :).^2)));
|
||||||
|
Erx = atan2(-squeeze(MTr(2, 3, :))./cos(Ery), squeeze(MTr(3, 3, :))./cos(Ery));
|
||||||
|
Erz = atan2(-squeeze(MTr(1, 2, :))./cos(Ery), squeeze(MTr(1, 1, :))./cos(Ery));
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+begin_src matlab :exports none
|
||||||
|
figure;
|
||||||
|
hold on;
|
||||||
|
plot(t, Edx, 'DisplayName', '$\epsilon_{x}$')
|
||||||
|
plot(t, Edy, 'DisplayName', '$\epsilon_{y}$')
|
||||||
|
plot(t, Edz, 'DisplayName', '$\epsilon_{z}$')
|
||||||
|
hold off;
|
||||||
|
xlabel('Time [s]'); ylabel('Displacement [m]');
|
||||||
|
xlim([2, inf]);
|
||||||
|
legend('location', 'northeast');
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+HEADER: :tangle no :exports results :results none :noweb yes
|
||||||
|
#+begin_src matlab :var filepath="figs/exp_tomo_offset_trans.pdf" :var figsize="wide-normal" :post pdf2svg(file=*this*, ext="png")
|
||||||
|
<<plt-matlab>>
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+NAME: fig:exp_tomo_offset_trans
|
||||||
|
#+CAPTION: X-Y-Z translation of the sample w.r.t. granite when performing tomography experiment with no disturbances ([[./figs/exp_tomo_offset_trans.png][png]], [[./figs/exp_tomo_offset_trans.pdf][pdf]])
|
||||||
|
[[file:figs/exp_tomo_offset_trans.png]]
|
||||||
|
|
||||||
|
#+begin_src matlab :exports none
|
||||||
|
figure;
|
||||||
|
hold on;
|
||||||
|
plot(t, Erx, 'DisplayName', '$\epsilon_{\theta x}$')
|
||||||
|
plot(t, Ery, 'DisplayName', '$\epsilon_{\theta y}$')
|
||||||
|
plot(t, Erz, 'DisplayName', '$\epsilon_{\theta z}$')
|
||||||
|
hold off;
|
||||||
|
xlabel('Time [s]'); ylabel('Rotation [rad]');
|
||||||
|
xlim([2, inf]);
|
||||||
|
legend('location', 'northeast');
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+HEADER: :tangle no :exports results :results none :noweb yes
|
||||||
|
#+begin_src matlab :var filepath="figs/exp_tomo_offset_rot.pdf" :var figsize="wide-normal" :post pdf2svg(file=*this*, ext="png")
|
||||||
|
<<plt-matlab>>
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+NAME: fig:exp_tomo_offset_rot
|
||||||
|
#+CAPTION: X-Y-Z rotations of the sample w.r.t. granite when performing tomography experiment with no disturbances ([[./figs/exp_tomo_offset_rot.png][png]], [[./figs/exp_tomo_offset_rot.pdf][pdf]])
|
||||||
|
[[file:figs/exp_tomo_offset_rot.png]]
|
||||||
|
|
||||||
* TODO Tests on the transformation from reference to wanted position :noexport:
|
* TODO Tests on the transformation from reference to wanted position :noexport:
|
||||||
:PROPERTIES:
|
:PROPERTIES:
|
||||||
:header-args:matlab+: :eval no
|
:header-args:matlab+: :eval no
|
||||||
|
BIN
experiment_tomography/mat/experiment.mat
Normal file
BIN
experiment_tomography/mat/experiment.mat
Normal file
Binary file not shown.
Binary file not shown.
@ -42,6 +42,9 @@
|
|||||||
:END:
|
:END:
|
||||||
|
|
||||||
* Functions
|
* Functions
|
||||||
|
:PROPERTIES:
|
||||||
|
:ID: 8b6ae566-b1a0-448c-8cb1-9d5b3b846ed4
|
||||||
|
:END:
|
||||||
<<sec:functions>>
|
<<sec:functions>>
|
||||||
** TODO computePsdDispl
|
** TODO computePsdDispl
|
||||||
:PROPERTIES:
|
:PROPERTIES:
|
||||||
@ -405,3 +408,34 @@ This Matlab function is accessible [[file:src/computeReferencePose.m][here]].
|
|||||||
WTr = Rty*Rry*Rrz*Rh*Rn;
|
WTr = Rty*Rry*Rrz*Rh*Rn;
|
||||||
end
|
end
|
||||||
#+end_src
|
#+end_src
|
||||||
|
** Compute the Sample Position Error w.r.t. the NASS
|
||||||
|
:PROPERTIES:
|
||||||
|
:header-args:matlab+: :tangle ../src/computeSampleError.m
|
||||||
|
:header-args:matlab+: :comments none :mkdirp yes :eval no
|
||||||
|
:END:
|
||||||
|
<<sec:computeSampleError>>
|
||||||
|
|
||||||
|
This Matlab function is accessible [[file:src/computeSampleError.m][here]].
|
||||||
|
|
||||||
|
#+begin_src matlab
|
||||||
|
function [MTr] = computeSampleError(WTm, WTr)
|
||||||
|
% computeSampleError -
|
||||||
|
%
|
||||||
|
% Syntax: [MTr] = computeSampleError(WTm, WTr)
|
||||||
|
%
|
||||||
|
% Inputs:
|
||||||
|
% - WTm - Homoegeneous transformation that represent the
|
||||||
|
% wanted pose of the sample with respect to the granite
|
||||||
|
% - WTr - Homoegeneous transformation that represent the
|
||||||
|
% measured pose of the sample with respect to the granite
|
||||||
|
%
|
||||||
|
% Outputs:
|
||||||
|
% - MTr - Homoegeneous transformation that represent the
|
||||||
|
% wanted pose of the sample expressed in a frame
|
||||||
|
% attached to the top platform of the nano-hexapod
|
||||||
|
|
||||||
|
MTr = zeros(4,4);
|
||||||
|
|
||||||
|
MTr = [WTm(1:3,1:3)', -WTm(1:3,1:3)'*WTm(1:3,4) ; 0 0 0 1]*WTr;
|
||||||
|
end
|
||||||
|
#+end_src
|
||||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading…
Reference in New Issue
Block a user