nass-simscape/tomo-exp/index.org

11 KiB

Tomography Experiment

Initialize Experiment

We first initialize all the stages.

  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.

  initializeReferences(struct('Rz_type', 'rotating', 'Rz_period', 1));

And we initialize the disturbances.

  initDisturbances();

Run the Tomography Experiment

We first load the simulation configuration

  load('simscape/conf_simscape.mat');
  set_param(conf_simscape, 'StopTime', '1');
  set_param('sim_nano_station_tomo', 'SimulationCommand', 'start');

TODO Tests on the transformation from reference to wanted position

  • Are the rotation matrix commutable? => no
  • 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

Introduction   ignore

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:

  • $\{W\}$ the frame that is fixed to the granite and its origin at the theoretical meeting point between the X-ray and the spindle axis.
  • $\{S\}$ the frame attached to the sample (in reality attached to the top platform of the nano-hexapod) with its origin at 175mm above the top platform of the nano-hexapod. Its origin is $O_S$.
  • $\{T\}$ the theoretical wanted frame that correspond to the wanted pose of the frame $\{S\}$. $\{T\}$ is computed from the wanted position of each stage. It is thus theoretical and does not correspond to a real position. The origin of $T$ is $O_T$ and is the wanted position of the sample.

Thus:

  • the measurement of the position of the sample corresponds to ${}^W O_S = \begin{bmatrix} {}^WP_{x,m} & {}^WP_{y,m} & {}^WP_{z,m} \end{bmatrix}^T$ in translation and to $\theta_m {}^W\bm{s}_m = \theta_m \cdot \begin{bmatrix} {}^Ws_{x,m} & {}^Ws_{y,m} & {}^Ws_{z,m} \end{bmatrix}^T$ in rotations
  • the wanted position of the sample expressed w.r.t. the granite is ${}^W O_T = \begin{bmatrix} {}^WP_{x,r} & {}^WP_{y,r} & {}^WP_{z,r} \end{bmatrix}^T$ in translation and to $\theta_r {}^W\bm{s}_r = \theta_r \cdot \begin{bmatrix} {}^Ws_{x,r} & {}^Ws_{y,r} & {}^Ws_{z,r} \end{bmatrix}^T$ in rotations

Wanted Position of the Sample with respect to the Granite

Let's define the wanted position of each stage.

  Ty = 0; % [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.

Translation.

  WOr = Ttot*[0;0;0;1];
  WOr = WOr(1:3);

Rotation.

  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
  WPr = [WOr ; WSr];

Measured Position of the Sample with respect to the Granite

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 = 0; % [m]
  Dzm = 0; % [m]

  Rxm = 0*pi/180; % [rad]
  Rym = 0*pi/180; % [rad]
  Rzm = 180*pi/180; % [rad]

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:

  • $\theta_m = \cos^{-1} \frac{\text{Tr}(R) - 1}{2}$
  • ${}^W\bm{s}_m$ is the eigen vector of the rotation matrix $R$ corresponding to the eigen value $\lambda = 1$
  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];

Positioning Error with respect to the Granite

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.

Position Error Expressed in the Nano-Hexapod Frame

We now want the position error to be expressed in $\{S\}$ (the frame attach to the sample) for control: \[ {}^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); 0];
  SEm = SEm(1:3);

Rotation Error.

  SEr = STw * [WPe(4:6); 0];
  SEr = SEr(1:3);
  Etot = [SEm ; SEr]

Another try

Let's denote:

  • $\{W\}$ the initial fixed frame
  • $\{R\}$ the reference frame corresponding to the wanted pose of the sample
  • $\{M\}$ the frame corresponding to the measured pose of the sample

We have then computed:

  • ${}^WT_R$
  • ${}^WT_M$

We have:

\begin{align} {}^MT_R &= {}^MT_W {}^WT_R \\ &= {}^WT_M^t {}^WT_R \end{align}
  MTr = STw'*Ttot;

Position error:

  MTr(1:3, 1:4)*[0; 0; 0; 1]

Orientation error:

  MTr(1:3, 1:3)

Verification

How can we verify that the computation is correct? Options:

  • Test with simscape multi-body

    • Impose motion on each stage
    • Measure the position error w.r.t. the NASS
    • Compare with the computation