diff --git a/experiment_tomography/index.html b/experiment_tomography/index.html index 89cb126..029e490 100644 --- a/experiment_tomography/index.html +++ b/experiment_tomography/index.html @@ -3,7 +3,7 @@ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
- +
+The simulink file to do tomography experiments is sim_nano_station_tomo.slx
.
+
open('experiment_tomography/matlab/sim_nano_station_tomo.slx') ++
+We load the shared simulink configuration and we set a small StopTime
.
+
load('mat/conf_simscape.mat'); +set_param(conf_simscape, 'StopTime', '10'); ++
We first initialize all the stages.
initializeGround();
-initializeGranite();
-initializeTy();
-initializeRy();
-initializeRz();
-initializeMicroHexapod();
-initializeAxisc();
-initializeMirror();
-initializeNanoHexapod(struct('actuator', 'piezo'));
-initializeSample(struct('mass', 1));
+initializeGround(); +initializeGranite(); +initializeTy(); +initializeRy(); +initializeRz(); +initializeMicroHexapod(); +initializeAxisc(); +initializeMirror(); +initializeNanoHexapod(struct('actuator', 'piezo')); +initializeSample(struct('mass', 1));
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.
initializeReferences(struct('Rz_type', 'rotating', 'Rz_period', 1));
-
--And we initialize the disturbances. -
-initDisturbances();
+initializeReferences(struct('Rz_type', 'rotating', 'Rz_period', 1));
-We first load the simulation configuration +And we initialize the disturbances to zero.
load('simscape/conf_simscape.mat');
+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);
set_param(conf_simscape, 'StopTime', '1');
+sim('sim_nano_station_tomo')
set_param('sim_nano_station_tomo', 'SimulationCommand', 'start');
+Dsm_without_dist = Dsm;
figure; +hold on; +plot(Dsm_without_dist.x.Time, Dsm_without_dist.x.Data, 'DisplayName', 'x') +plot(Dsm_without_dist.y.Time, Dsm_without_dist.y.Data, 'DisplayName', 'y') +plot(Dsm_without_dist.z.Time, Dsm_without_dist.z.Data, 'DisplayName', 'z') +hold off; +xlim([2, inf]); +legend('location', 'northeast'); ++
+
+Figure 1: X-Y-Z translation of the sample w.r.t. granite when performing tomography experiment with no disturbances (png, pdf)
++Rotations. +Think of the good way to plot these rotations with respect to time. +
[X]
Are the rotation matrix commutable? => no[X]
How to express the measured rotation errors? => screw axis coordinate seems nice (used in Taghirad's book)[ ]
Should ask Veijo how he specifies the position of the Symetrie Hexapod[ ]
Create functions for all distinct part and then include that in Simulink[ ]
How the express the orientation error?[ ]
If we use screw coordinate, can we add/subtract them?[ ]
Do some simple tests to verify that the algorithm is working fine-- --Rx = [1 0 0; - 0 cos(t) -sin(t); - 0 sin(t) cos(t)]; -
- --Ry = [ cos(t) 0 sin(t); - 0 1 0; - -sin(t) 0 cos(t)]; -
- --Rz = [cos(t) -sin(t) 0; - sin(t) cos(t) 0; - 0 0 1]; -
-
-Let's define the following frames: -
--Thus: -
--Let's define the wanted position of each stage. -
-Ty = 1; % [m]
-Ry = 3*pi/180; % [rad]
-Rz = 180*pi/180; % [rad]
--
% Hexapod (first consider only translations)
-Thx = 0; % [m]
-Thy = 0; % [m]
-Thz = 0; % [m]
-
-Now, we compute the corresponding wanted translation and rotation of the sample with respect to the granite frame \(\{W\}\). -This corresponds to \({}^WO_T\) and \(\theta_m {}^Ws_m\). -
- --To do so, we have to define the homogeneous transformation for each stage. -
--% Translation Stage
-Rty = [1 0 0 0;
-0 1 0 Ty;
-0 0 1 0;
-0 0 0 1];
--
% Tilt Stage - Pure rotating aligned with Ob
-Rry = [ cos(Ry) 0 sin(Ry) 0;
-0 1 0 0;
--sin(Ry) 0 cos(Ry) 0;
-0 0 0 1];
--
% Spindle - Rotation along the Z axis
-Rrz = [cos(Rz) -sin(Rz) 0 0 ;
-sin(Rz) cos(Rz) 0 0 ;
-0 0 1 0 ;
-0 0 0 1 ];
--
% Micro-Hexapod (only rotations first)
-Rh = [1 0 0 Thx ;
-0 1 0 Thy ;
-0 0 1 Thz ;
-0 0 0 1 ];
-
-We combine the individual homogeneous transformations into one homogeneous transformation for all the station. -
-Ttot = Rty*Rry*Rrz*Rh;
-
--Using this homogeneous transformation, we can compute the wanted position and orientation of the sample with respect to the granite. -
-WOr = Ttot*[0;0;0;1];
-WOr = WOr(1:3);
+opts = struct(... + 'Dwx', true, ... % Ground Motion - X direction + 'Dwy', true, ... % Ground Motion - Y direction + 'Dwz', true, ... % Ground Motion - Z direction + 'Fty_x', true, ... % Translation Stage - X direction + 'Fty_z', true, ... % Translation Stage - Z direction + 'Frz_z', true ... % Spindle - Z direction +); +initDisturbances(opts);
thetar = acos((trace(Ttot(1:3, 1:3))-1)/2)
-if thetar == 0
-WSr = [0; 0; 0];
-else
-[V, D] = eig(Ttot(1:3, 1:3));
-WSr = thetar*V(:, abs(diag(D) - 1) < eps(1));
-end
+sim('sim_nano_station_tomo')
WPr = [WOr ; WSr];
-
--The measurement of the position of the sample using the metrology system gives the position and orientation of the sample with respect to the granite. -
-% Measurements: Xm, Ym, Zm, Rx, Ry, Rz
-Dxm = 0; % [m]
-Dym = 1; % [m]
-Dzm = 0; % [m]
--
Rxm = 0*pi/180; % [rad]
-Rym = 3*pi/180; % [rad]
-Rzm = 0*pi/180; % [rad]
+figure; +hold on; +plot(Dsm.x.Time, Dsm.x.Data, 'DisplayName', 'x') +plot(Dsm.y.Time, Dsm.y.Data, 'DisplayName', 'y') +plot(Dsm.z.Time, Dsm.z.Data, 'DisplayName', 'z') +hold off; +xlim([2, inf]); +legend('location', 'northeast');
-Let's compute the corresponding orientation using screw axis. + +
-
-Trxm = [1 0 0;
-0 cos(Rxm) -sin(Rxm);
-0 sin(Rxm) cos(Rxm)];
-Trym = [ cos(Rym) 0 sin(Rym);
-0 1 0;
--sin(Rym) 0 cos(Rym)];
-Trzm = [cos(Rzm) -sin(Rzm) 0;
-sin(Rzm) cos(Rzm) 0;
-0 0 1];
--
STw = [[ Trym*Trxm*Trzm , [Dxm; Dym; Dzm]]; 0 0 0 1];
-
-We then obtain the orientation measurement in the form of screw coordinate \(\theta_m ({}^Ws_{x,m},\ {}^Ws_{y,m},\ {}^Ws_{z,m})^T\) where: -
--thetam = acos((trace(STw(1:3, 1:3))-1)/2); % [rad]
-if thetam == 0
-WSm = [0; 0; 0];
-else
-[V, D] = eig(STw(1:3, 1:3));
-WSm = thetam*V(:, abs(diag(D) - 1) < eps(1));
-end
-
WPm = [Dxm ; Dym ; Dzm ; WSm];
-
--The wanted position expressed with respect to the granite is \({}^WO_T\) and the measured position with respect to the granite is \({}^WO_S\), thus the position error expressed in \(\{W\}\) is -\[ {}^W E = {}^W O_T - {}^W O_S \] -The same is true for rotations: -\[ \theta_\epsilon {}^W\bm{s}_\epsilon = \theta_r {}^W\bm{s}_r - \theta_m {}^W\bm{s}_m \] -
- -WPe = WPr - WPm;
-
----Now we want to express this error in a frame attached to the base of the nano-hexapod with its origin at the same point where the Jacobian of the nano-hexapod is computed (175mm above the top platform + 90mm of total height of the nano-hexapod). -
- --Or maybe should we want to express this error with respect to the top platform of the nano-hexapod? -We are measuring the position of the top-platform, and we don't know exactly the position of the bottom platform. -We could compute the position of the bottom platform in two ways: -
--
- -- from the encoders of each stage
-- from the measurement of the nano-hexapod top platform + the internal metrology in the nano-hexapod (capacitive sensors e.g)
--A third option is to say that the maximum stroke of the nano-hexapod is so small that the error should no change to much by the change of base. -
-
-We now want the position error to be expressed in \(\{S\}\) (the frame attach to the sample): -\[ {}^S E = {}^S T_W \cdot {}^W E \] -
- --Thus we need to compute the homogeneous transformation \({}^ST_W\). -Fortunately, this homogeneous transformation can be computed from the measurement of the sample position and orientation with respect to the granite. -
--Trxm = [1 0 0;
-0 cos(Rxm) -sin(Rxm);
-0 sin(Rxm) cos(Rxm)];
-Trym = [ cos(Rym) 0 sin(Rym);
-0 1 0;
--sin(Rym) 0 cos(Rym)];
-Trzm = [cos(Rzm) -sin(Rzm) 0;
-sin(Rzm) cos(Rzm) 0;
-0 0 1];
--
STw = [[ Trym*Trxm*Trzm , [Dxm; Dym; Dzm]]; 0 0 0 1];
-
-Translation Error. -
--SEm = STw * [WPe(1:3); 1];
-SEm = SEm(1:3);
-
-Rotation Error. -
--SEr = STw * [WPe(4:6); 0];
-SEr = SEr(1:3);
-
Etot = [SEm ; SEr]
-
-Figure 2: X-Y-Z translation of the sample w.r.t. the granite when performing tomography experiment with disturbances (png, pdf)
The project is managed with a Simulink Project. @@ -286,8 +287,8 @@ Such project is briefly presented here
The model of the NASS is based on Simulink and Simscape Multi-Body. @@ -296,8 +297,8 @@ Such toolbox is presented here.
The model is decomposed of multiple subsystems. @@ -311,8 +312,8 @@ All these subsystems are described he
First, we consider perfectly rigid elements and joints and we just study the kinematic of the station. @@ -322,8 +323,8 @@ This is detailed here.
From the measurement of the position of the sample with respect to the granite and from the wanted position of each stage, we can compute the positioning error of the sample with respect to the nano-hexapod. @@ -341,8 +342,8 @@ This is done here.
From dynamical measurements perform on the real positioning station, we tune the parameters of the simscape model to have similar dynamics. @@ -354,8 +355,8 @@ This is explained here.
The effect of disturbances on the position of the micro-station have been measured. @@ -372,8 +373,8 @@ We also discuss how the disturbances are implemented in the model.
Now that the dynamics of the Model have been tuned and the Disturbances have included, we can simulate experiments.
@@ -385,10 +386,19 @@ Tomography experiments are simulated and the results are presented
-
+Active damping techniques are applied to the Simscape model.
+
Many matlab functions are shared among all the files of the projects.
10 Useful Matlab Functions (link)
+10 Active Damping Techniques (link)
11 Useful Matlab Functions (link)
+