Finish first version

This commit is contained in:
Thomas Dehaeze 2025-02-04 13:01:24 +01:00
parent 1c31574926
commit e08bdaf4fa
3 changed files with 423 additions and 427 deletions

View File

@ -1,4 +1,4 @@
#+TITLE: Nano-Hexapod on the micro-station #+TITLE: Experimental Validation on the ID31 Beamline
:DRAWER: :DRAWER:
#+LANGUAGE: en #+LANGUAGE: en
#+EMAIL: dehaeze.thomas@gmail.com #+EMAIL: dehaeze.thomas@gmail.com
@ -454,17 +454,23 @@ CLOSED: [2024-11-12 Tue 16:03]
* Introduction :ignore: * Introduction :ignore:
Now that the nano-hexapod is mounted and that the the multi-body model of the nano-hexapod could be validated based on dynamics measurements, the complete NASS is mounted as shown in Figure ref:fig:test_id31_micro_station_nano_hexapod and the performances are evaluated on the ID31 beamline. The nano-hexapod's mounting and validation through dynamics measurements marks a crucial milestone in the development of the Nano Active Stabilization System (NASS).
This chapter presents a comprehensive experimental evaluation of the complete system's performance on the ID31 beamline, focusing on its ability to maintain precise sample positioning during various experimental conditions.
At the beginning of the project, it was planned to develop a long stroke 5-DoF metrology system to measure the pose of the sample with respect to the granite. Initially, the project planned to develop a long-stroke ($\approx 1 \, cm^3$) 5-DoF metrology system to measure sample position relative to the granite base.
The development of such system was complex, and was not completed at the time of the experimental tests on ID31. However, the complexity of this development prevented its completion before the experimental testing phase on ID31.
To still be able to validate the developed nano active platform and the associated instrumentation and control architecture, a 5-DoF short stroke metrology system is developed and presented in Section ref:sec:test_id31_metrology. To proceed with validation of the nano active platform and its associated control architecture, an alternative short-stroke ($> 100\,\mu m^3$) metrology system was developed, which is presented in Section ref:sec:test_id31_metrology.
The identify dynamics of the nano-hexapod fixed on top of the micro-station is identified for different experimental conditions (payload masses, rotational velocities) and compared with the multi-body model in Section ref:sec:test_id31_open_loop_plant. Then, several key aspects of the system validation are examined.
Section ref:sec:test_id31_open_loop_plant analyzes the identified dynamics of the nano-hexapod mounted on the micro-station under various experimental conditions, including different payload masses and rotational velocities.
These measurements are compared with predictions from the multi-body model to verify its accuracy and applicability for control design.
In order to apply the developed HAC-LAC architecture, decentralized Integral Force Feedback is first applied to actively damp the plant in a robust way (Section ref:sec:test_id31_iff), and the high authority controller is then implemented (Section ref:sec:test_id31_hac). Sections ref:sec:test_id31_iff and ref:sec:test_id31_hac focus on the implementation and validation of the HAC-LAC control architecture.
First, Section ref:sec:test_id31_iff demonstrates the application of decentralized Integral Force Feedback for robust active damping of the nano-hexapod's suspension modes.
This is followed in Section ref:sec:test_id31_hac by the implementation of the high authority controller, which addresses low-frequency disturbances and completes the control system design.
Finally, the positioning accuracy of the NASS is evaluated by performing scans corresponding to several scientific experiments (Section ref:sec:test_id31_experiments) Finally, Section ref:sec:test_id31_experiments evaluates the NASS's positioning performances through a comprehensive series of experiments that mirror typical scientific applications.
These include tomography scans at various speeds and with different payload masses, reflectivity measurements, and combined motion sequences that test the system's full capabilities.
#+name: fig:test_id31_micro_station_nano_hexapod #+name: fig:test_id31_micro_station_nano_hexapod
#+caption: Picture of the micro-station without the nano-hexapod (\subref{fig:test_id31_micro_station_cables}) and with the nano-hexapod (\subref{fig:test_id31_fixed_nano_hexapod}) #+caption: Picture of the micro-station without the nano-hexapod (\subref{fig:test_id31_micro_station_cables}) and with the nano-hexapod (\subref{fig:test_id31_fixed_nano_hexapod})
@ -761,7 +767,7 @@ exportFig('figs/test_id31_metrology_align_dx_dy.pdf', 'width', 'half', 'height',
<<ssec:test_id31_metrology_acceptance>> <<ssec:test_id31_metrology_acceptance>>
Because the interferometers are pointing to spheres and not flat surfaces, the lateral acceptance is limited. Because the interferometers are pointing to spheres and not flat surfaces, the lateral acceptance is limited.
In order to estimate the metrology acceptance, the micro-hexapod is used to perform three accurate scans of $\pm 1\,mm$, respectively along the the $x$, $y$ and $z$ axes. In order to estimate the metrology acceptance, the micro-hexapod is used to perform three accurate scans of $\pm 1\,mm$, respectively along the $x$, $y$ and $z$ axes.
During these scans, the 5 interferometers are recorded individually, and the ranges in which each interferometer has enough coupling efficiency to be able to measure the displacement are estimated. During these scans, the 5 interferometers are recorded individually, and the ranges in which each interferometer has enough coupling efficiency to be able to measure the displacement are estimated.
Results are summarized in Table ref:tab:test_id31_metrology_acceptance. Results are summarized in Table ref:tab:test_id31_metrology_acceptance.
The obtained lateral acceptance for pure displacements in any direction is estimated to be around $+/-0.5\,mm$, which is enough for the current application as it is well above the micro-station errors to be actively corrected by the NASS. The obtained lateral acceptance for pure displacements in any direction is estimated to be around $+/-0.5\,mm$, which is enough for the current application as it is well above the micro-station errors to be actively corrected by the NASS.
@ -3495,26 +3501,26 @@ These results demonstrate both the effectiveness and limitations of implementing
<<sec:test_id31_experiments>> <<sec:test_id31_experiments>>
** Introduction :ignore: ** Introduction :ignore:
In this section, the goal is to evaluate the performances of the NASS and validate its use for real work scientific experiments. In this section, the goal is to evaluate the performances of the NASS and validate its use for typical scientific experiments.
However, the online metrology prototype (presented in Section ref:sec:test_id31_metrology) does not allow samples to be placed on top of the nano-hexapod while being illuminated by the x-ray beam. However, the online metrology prototype (presented in Section ref:sec:test_id31_metrology) does not allow samples to be placed on top of the nano-hexapod while being illuminated by the x-ray beam.
Nevertheless, in order to fully validate the NASS, typical motion performed during scientific experiments can be mimicked, and the positioning performances can be evaluated. Nevertheless, in order to fully validate the NASS, typical motion performed during scientific experiments can be mimicked, and the positioning performances can be evaluated.
Several scientific experiments are mimicked, such as: Several scientific experiments are here replicated, such as:
- Tomography scans: continuous rotation of the Spindle along the vertical axis (Section ref:ssec:test_id31_scans_tomography) - Tomography scans: continuous rotation of the Spindle along the vertical axis (Section ref:ssec:test_id31_scans_tomography)
- Reflectivity scans: $R_y$ rotations using the tilt-stage (Section ref:ssec:test_id31_scans_reflectivity) - Reflectivity scans: $R_y$ rotations using the tilt-stage (Section ref:ssec:test_id31_scans_reflectivity)
- Vertical layer scans: the nano-hexapod is used to perform $D_z$ step motion or ramp scans (Section ref:ssec:test_id31_scans_dz) - Vertical layer scans: $D_z$ step motion or ramp scans using the nano-hexapod (Section ref:ssec:test_id31_scans_dz)
- Lateral scans: $D_y$ scans using the $T_y$ translation stage (Section ref:ssec:test_id31_scans_dy) - Lateral scans: $D_y$ scans using the $T_y$ translation stage (Section ref:ssec:test_id31_scans_dy)
- Diffraction Tomography: the Spindle is performing continuous $R_z$ rotation while the translation stage is performing lateral $D_y$ scans at the same time. - Diffraction Tomography:continuous $R_z$ rotation using the Spindle and lateral $D_y$ scans performed at the same time using the translation stage.
This is the experiment with the most stringent requirements (Section ref:ssec:test_id31_scans_diffraction_tomo) This is the experiment with the most stringent requirements (Section ref:ssec:test_id31_scans_diffraction_tomo)
Unless explicitly stated, all the closed-loop experiments are performed using the robust (i.e. conservative) high authority controller designed in Section ref:ssec:test_id31_iff_hac_controller. Unless explicitly stated, all the closed-loop experiments are performed using the robust (i.e. conservative) high authority controller designed in Section ref:ssec:test_id31_iff_hac_controller.
For each experiment, the obtained performances are compared to the specifications for the most depending case in which nano-focusing optics are used to focus the beam down to $200\,nm\times 100\,nm$. For each experiment, the obtained performances are compared to the specifications for the most depending case in which nano-focusing optics are used to focus the beam down to $200\,nm\times 100\,nm$.
In that case the goal is to keep the sample's point of interested in the beam, and therefore the $D_y$ and $D_z$ positioning errors should be less than $200\,nm$ and $100\,nm$ peak-to-peak respectively. In this case, the goal is to keep the sample's point of interested in the beam, and therefore the $D_y$ and $D_z$ positioning errors should be less than $200\,nm$ and $100\,nm$ peak-to-peak respectively.
The $R_y$ error should be less than $1.7\,\mu\text{rad}$ peak-to-peak. The $R_y$ error should be less than $1.7\,\mu\text{rad}$ peak-to-peak.
In terms of RMS errors, this corresponds to $30\,nm$ in $D_y$, $15\,nm$ in $D_z$ and $250\,\text{nrad}$ in $R_y$ (a summary of the specifications is given in Table ref:tab:test_id31_experiments_specifications). In terms of RMS errors, this corresponds to $30\,nm$ in $D_y$, $15\,nm$ in $D_z$ and $250\,\text{nrad}$ in $R_y$ (a summary of the specifications is given in Table ref:tab:test_id31_experiments_specifications).
Obtained results for all the experiments are summarized and compared with the specifications in Section ref:ssec:test_id31_scans_conclusion. Results obtained for all the experiments are summarized and compared to the specifications in Section ref:ssec:test_id31_scans_conclusion.
#+name: tab:test_id31_experiments_specifications #+name: tab:test_id31_experiments_specifications
#+caption: Specifications for the Nano-Active-Stabilization-System #+caption: Specifications for the Nano-Active-Stabilization-System
@ -3551,13 +3557,13 @@ Obtained results for all the experiments are summarized and compared with the sp
**** Slow Tomography scans **** Slow Tomography scans
First, tomography scans are performed with a rotational velocity of $6\,\text{deg/s}$ for all considered payload masses (shown in Figure ref:fig:test_id31_picture_masses). First, tomography scans are performed with a rotational velocity of $6\,\text{deg/s}$ for all considered payload masses (shown in Figure ref:fig:test_id31_picture_masses).
For each experiment, a complete spindle rotation was first performed in open-loop, and then the loop was closed during another full spindle rotation. Each experimental sequence consisted of two complete spindle rotations: an initial open-loop rotation followed by a closed-loop rotation.
The experimental results for the $26\,\text{kg}$ payload are presented in Figure ref:fig:test_id31_tomo_m2_1rpm_robust_hac_iff_fit.
Results with the $26\,\text{kg}$ payload is shown in Figure ref:fig:test_id31_tomo_m2_1rpm_robust_hac_iff_fit. Due to static deformation of the micro-station stages under payload loading, a significant eccentricity was observed between the point of interest and the spindle rotation axis.
The eccentricity between the "point of interest" and the spindle rotation axis is quite large as the added payload mass statically deforms the micro-station stages. To establish a theoretical lower bound for open-loop errors, an ideal scenario was assumed where the point of interest perfectly aligns with the spindle rotation axis.
To estimate the open-loop errors, it is here supposed that the "point of interest" can be perfectly aligned with the spindle rotation axis. This idealized case was simulated by first calculating the eccentricity through circular fitting (represented by the dashed black circle in Figure ref:fig:test_id31_tomo_m2_1rpm_robust_hac_iff_fit), and then subtracting it from the measured data, as shown in Figure ref:fig:test_id31_tomo_m2_1rpm_robust_hac_iff_fit_removed.
To simulate this case, the eccentricity is first estimated by performing a circular fit (dashed black circle in Figure ref:fig:test_id31_tomo_m2_1rpm_robust_hac_iff_fit), and is then subtracted from the data in Figure ref:fig:test_id31_tomo_m2_1rpm_robust_hac_iff_fit_removed. While this approach likely underestimates actual open-loop errors, as perfect alignment is practically unattainable, it enables a more balanced comparison with closed-loop performance.
This underestimate the real open-loop errors as it is difficult to obtain a perfect alignment in practice, but it provides a more equitable comparison with the closed-loop case.
#+begin_src matlab #+begin_src matlab
%% Load Tomography scans with robust controller %% Load Tomography scans with robust controller
@ -3663,9 +3669,9 @@ exportFig('figs/test_id31_tomo_m2_1rpm_robust_hac_iff_fit_removed.pdf', 'width',
#+end_subfigure #+end_subfigure
#+end_figure #+end_figure
After removing the eccentricity for each experiment, the remaining measured motion are shown in the $Y-Z$ plane and compared with the smallest beam size in Figure ref:fig:test_id31_tomo_Wz36_results. After eccentricity compensation for each experiment, the residual motion in the $Y-Z$ is compared against the minimum beam size, as illustrated in Figure ref:fig:test_id31_tomo_Wz36_results.
Results are indicating the NASS succeeds in keeping the sample's point of interests on the beam, except for the highest mass of $39\,\text{kg}$ for which the lateral motion is a bit too high. Results are indicating the NASS succeeds in keeping the sample's point of interests on the beam, except for the highest mass of $39\,\text{kg}$ for which the lateral motion is a bit too high.
This confirms what was found during the tomography simulations performed in Section ref:ssec:test_id31_iff_hac_robustness. These experimental findings align with the predictions from the tomography simulations presented in Section ref:ssec:test_id31_iff_hac_robustness.
#+begin_src matlab :exports none :results none #+begin_src matlab :exports none :results none
%% Tomography experiment at 1rpm - Results in the YZ - All masses tested %% Tomography experiment at 1rpm - Results in the YZ - All masses tested
@ -3745,9 +3751,9 @@ exportFig('figs/test_id31_tomo_Wz36_results.pdf', 'width', 'full', 'height', 'no
#+begin_src matlab #+begin_src matlab
%% Estimate RMS of the errors while in closed-loop and open-loop - Tomography at 6deg/s %% Estimate RMS of the errors while in closed-loop and open-loop - Tomography at 6deg/s
% No mass % No mass
data_tomo_m0_Wz6.Dy_rms_cl = rms(detrend(data_tomo_m0_Wz6.Dy_int(i_m0+50000:end), 0)); data_tomo_m0_Wz6.Dy_rms_cl = rms(detrend(data_tomo_m0_Wz6.Dy_int(i_m0+1e4:end), 0));
data_tomo_m0_Wz6.Dz_rms_cl = rms(detrend(data_tomo_m0_Wz6.Dz_int(i_m0+50000:end), 0)); data_tomo_m0_Wz6.Dz_rms_cl = rms(detrend(data_tomo_m0_Wz6.Dz_int(i_m0+1e4:end), 0));
data_tomo_m0_Wz6.Ry_rms_cl = rms(detrend(data_tomo_m0_Wz6.Ry_int(i_m0+50000:end), 0)); data_tomo_m0_Wz6.Ry_rms_cl = rms(detrend(data_tomo_m0_Wz6.Ry_int(i_m0+1e4:end), 0));
% Remove eccentricity for OL errors % Remove eccentricity for OL errors
data_tomo_m0_Wz6.Dy_rms_ol = rms(data_tomo_m0_Wz6.Dy_int(1:i_m0) - (y_m0 + R_m0*sin(data_tomo_m0_Wz6.Rz(1:i_m0)+delta_theta_m0))); data_tomo_m0_Wz6.Dy_rms_ol = rms(data_tomo_m0_Wz6.Dy_int(1:i_m0) - (y_m0 + R_m0*sin(data_tomo_m0_Wz6.Rz(1:i_m0)+delta_theta_m0)));
@ -3759,9 +3765,9 @@ delta_theta = fminsearch(fun, 0);
data_tomo_m0_Wz6.Ry_rms_ol = rms(data_tomo_m0_Wz6.Ry_int(1:i_m0) - (y0 + R*sin(data_tomo_m0_Wz6.Rz(1:i_m0)+delta_theta))); data_tomo_m0_Wz6.Ry_rms_ol = rms(data_tomo_m0_Wz6.Ry_int(1:i_m0) - (y0 + R*sin(data_tomo_m0_Wz6.Rz(1:i_m0)+delta_theta)));
% 1 "layer mass" % 1 "layer mass"
data_tomo_m1_Wz6.Dy_rms_cl = rms(detrend(data_tomo_m1_Wz6.Dy_int(i_m1+50000:end), 0)); data_tomo_m1_Wz6.Dy_rms_cl = rms(detrend(data_tomo_m1_Wz6.Dy_int(i_m1+1e4:end), 0));
data_tomo_m1_Wz6.Dz_rms_cl = rms(detrend(data_tomo_m1_Wz6.Dz_int(i_m1+50000:end), 0)); data_tomo_m1_Wz6.Dz_rms_cl = rms(detrend(data_tomo_m1_Wz6.Dz_int(i_m1+1e4:end), 0));
data_tomo_m1_Wz6.Ry_rms_cl = rms(detrend(data_tomo_m1_Wz6.Ry_int(i_m1+50000:end), 0)); data_tomo_m1_Wz6.Ry_rms_cl = rms(detrend(data_tomo_m1_Wz6.Ry_int(i_m1+1e4:end), 0));
% Remove eccentricity for OL errors % Remove eccentricity for OL errors
data_tomo_m1_Wz6.Dy_rms_ol = rms(data_tomo_m1_Wz6.Dy_int(1:i_m1) - (y_m1 + R_m1*sin(data_tomo_m1_Wz6.Rz(1:i_m1)+delta_theta_m1))); data_tomo_m1_Wz6.Dy_rms_ol = rms(data_tomo_m1_Wz6.Dy_int(1:i_m1) - (y_m1 + R_m1*sin(data_tomo_m1_Wz6.Rz(1:i_m1)+delta_theta_m1)));
@ -3773,9 +3779,9 @@ delta_theta = fminsearch(fun, 0);
data_tomo_m1_Wz6.Ry_rms_ol = rms(data_tomo_m1_Wz6.Ry_int(1:i_m1) - (y0 + R*sin(data_tomo_m1_Wz6.Rz(1:i_m1)+delta_theta))); data_tomo_m1_Wz6.Ry_rms_ol = rms(data_tomo_m1_Wz6.Ry_int(1:i_m1) - (y0 + R*sin(data_tomo_m1_Wz6.Rz(1:i_m1)+delta_theta)));
% 2 "layer masses" % 2 "layer masses"
data_tomo_m2_Wz6.Dy_rms_cl = rms(detrend(data_tomo_m2_Wz6.Dy_int(i_m2+50000:end), 0)); data_tomo_m2_Wz6.Dy_rms_cl = rms(detrend(data_tomo_m2_Wz6.Dy_int(i_m2+1e4:end), 0));
data_tomo_m2_Wz6.Dz_rms_cl = rms(detrend(data_tomo_m2_Wz6.Dz_int(i_m2+50000:end), 0)); data_tomo_m2_Wz6.Dz_rms_cl = rms(detrend(data_tomo_m2_Wz6.Dz_int(i_m2+1e4:end), 0));
data_tomo_m2_Wz6.Ry_rms_cl = rms(detrend(data_tomo_m2_Wz6.Ry_int(i_m2+50000:end), 0)); data_tomo_m2_Wz6.Ry_rms_cl = rms(detrend(data_tomo_m2_Wz6.Ry_int(i_m2+1e4:end), 0));
% Remove eccentricity for OL errors % Remove eccentricity for OL errors
data_tomo_m2_Wz6.Dy_rms_ol = rms(data_tomo_m2_Wz6.Dy_int(1:i_m2) - (y_m2 + R_m2*sin(data_tomo_m2_Wz6.Rz(1:i_m2)+delta_theta_m2))); data_tomo_m2_Wz6.Dy_rms_ol = rms(data_tomo_m2_Wz6.Dy_int(1:i_m2) - (y_m2 + R_m2*sin(data_tomo_m2_Wz6.Rz(1:i_m2)+delta_theta_m2)));
@ -3787,9 +3793,9 @@ delta_theta = fminsearch(fun, 0);
data_tomo_m2_Wz6.Ry_rms_ol = rms(data_tomo_m2_Wz6.Ry_int(1:i_m2) - (y0 + R*sin(data_tomo_m2_Wz6.Rz(1:i_m2)+delta_theta))); data_tomo_m2_Wz6.Ry_rms_ol = rms(data_tomo_m2_Wz6.Ry_int(1:i_m2) - (y0 + R*sin(data_tomo_m2_Wz6.Rz(1:i_m2)+delta_theta)));
% 3 "layer masses" % 3 "layer masses"
data_tomo_m3_Wz6.Dy_rms_cl = rms(detrend(data_tomo_m3_Wz6.Dy_int(i_m3+50000:end), 0)); data_tomo_m3_Wz6.Dy_rms_cl = rms(detrend(data_tomo_m3_Wz6.Dy_int(i_m3+1e4:end), 0));
data_tomo_m3_Wz6.Dz_rms_cl = rms(detrend(data_tomo_m3_Wz6.Dz_int(i_m3+50000:end), 0)); data_tomo_m3_Wz6.Dz_rms_cl = rms(detrend(data_tomo_m3_Wz6.Dz_int(i_m3+1e4:end), 0));
data_tomo_m3_Wz6.Ry_rms_cl = rms(detrend(data_tomo_m3_Wz6.Ry_int(i_m3+50000:end), 0)); data_tomo_m3_Wz6.Ry_rms_cl = rms(detrend(data_tomo_m3_Wz6.Ry_int(i_m3+1e4:end), 0));
% Remove eccentricity for OL errors % Remove eccentricity for OL errors
data_tomo_m3_Wz6.Dy_rms_ol = rms(data_tomo_m3_Wz6.Dy_int(1:i_m3) - (y_m3 + R_m3*sin(data_tomo_m3_Wz6.Rz(1:i_m3)+delta_theta_m3))); data_tomo_m3_Wz6.Dy_rms_ol = rms(data_tomo_m3_Wz6.Dy_int(1:i_m3) - (y_m3 + R_m3*sin(data_tomo_m3_Wz6.Rz(1:i_m3)+delta_theta_m3)));
@ -3804,12 +3810,12 @@ data_tomo_m3_Wz6.Ry_rms_ol = rms(data_tomo_m3_Wz6.Ry_int(1:i_m3) - (y0 + R*sin(d
**** Fast Tomography scans **** Fast Tomography scans
A tomography experiment was then performed with the highest rotational velocity of the Spindle: $180\,\text{deg/s}$[fn:7]. A tomography experiment was then performed with the highest rotational velocity of the Spindle: $180\,\text{deg/s}$[fn:7].
The measured position of the "point of interest" during the experiment is shown in Figure ref:fig:test_id31_tomo_m0_30rpm_robust_hac_iff_exp. The trajectory of the point of interest during this fast tomography scan is shown in Figure ref:fig:test_id31_tomo_m0_30rpm_robust_hac_iff_exp.
Obtained results are similar to the simulated ones (Figure ref:fig:test_id31_tomo_m0_30rpm_robust_hac_iff_sim) even though performances are a bit worse experimentally. While the experimental results closely mirror the simulation results (Figure ref:fig:test_id31_tomo_m0_30rpm_robust_hac_iff_sim), the actual performance are slightly lower than predicted.
Results obtained with this robust (i.e. conservative) HAC are already close to the specifications. Nevertheless, even with this robust (conservative) HAC implementation, the system performance approaches the specified requirements.
#+begin_src matlab #+begin_src matlab
%% Experimental Results for Tomography at 30RPM, no payload %% Experimental Results for Tomography at 180deg/s, no payload
data_tomo_m0_Wz180 = load('2023-08-17_15-26_tomography_30rpm_m0_robust.mat'); data_tomo_m0_Wz180 = load('2023-08-17_15-26_tomography_30rpm_m0_robust.mat');
[~, i_m0] = find(data_tomo_m0_Wz180.hac_status == 1); [~, i_m0] = find(data_tomo_m0_Wz180.hac_status == 1);
@ -3899,9 +3905,9 @@ exportFig('figs/test_id31_tomo_m0_30rpm_robust_hac_iff_exp_yz.pdf', 'width', 'ha
#+begin_src matlab #+begin_src matlab
%% Estimate RMS of the errors while in closed-loop and open-loop - Tomography at 180deg/s %% Estimate RMS of the errors while in closed-loop and open-loop - Tomography at 180deg/s
% No mass % No mass
data_tomo_m0_Wz180.Dy_rms_cl = rms(detrend(data_tomo_m0_Wz180.Dy_int(i_m0+50000:end), 0)); data_tomo_m0_Wz180.Dy_rms_cl = rms(detrend(data_tomo_m0_Wz180.Dy_int(i_m0+1e4:end), 0));
data_tomo_m0_Wz180.Dz_rms_cl = rms(detrend(data_tomo_m0_Wz180.Dz_int(i_m0+50000:end), 0)); data_tomo_m0_Wz180.Dz_rms_cl = rms(detrend(data_tomo_m0_Wz180.Dz_int(i_m0+1e4:end), 0));
data_tomo_m0_Wz180.Ry_rms_cl = rms(detrend(data_tomo_m0_Wz180.Ry_int(i_m0+50000:end), 0)); data_tomo_m0_Wz180.Ry_rms_cl = rms(detrend(data_tomo_m0_Wz180.Ry_int(i_m0+1e4:end), 0));
% Remove eccentricity for OL errors % Remove eccentricity for OL errors
data_tomo_m0_Wz180.Dy_rms_ol = rms(data_tomo_m0_Wz180.Dy_int(1:i_m0) - (y_m0 + R_m0*sin(data_tomo_m0_Wz180.Rz(1:i_m0)+delta_theta_m0))); data_tomo_m0_Wz180.Dy_rms_ol = rms(data_tomo_m0_Wz180.Dy_int(1:i_m0) - (y_m0 + R_m0*sin(data_tomo_m0_Wz180.Rz(1:i_m0)+delta_theta_m0)));
@ -3915,27 +3921,32 @@ data_tomo_m0_Wz180.Ry_rms_ol = rms(data_tomo_m0_Wz180.Ry_int(1:i_m0) - (y0 + R*s
**** Cumulative Amplitude Spectra **** Cumulative Amplitude Spectra
In order to see how the HAC-LAC strategy reduces the positioning errors, three tomography scans with a rotational velocity of $180\,\text{deg/s}$ are performed: in open-loop, with the decentralized IFF, and with the HAC-LAC strategy. A comparative analysis was conducted using three tomography scans at $180,\text{deg/s}$ to evaluate the effectiveness of the HAC-LAC strategy in reducing positioning errors.
For this particular measurement, a slightly more aggressive high authority controller was designed to work specifically with low payload masses in order to fulfill the requirements. The scans were performed under three conditions: open-loop, with decentralized IFF control, and with the complete HAC-LAC strategy.
For these specific measurements, an enhanced high authority controller was optimized for low payload masses to meet performance requirements.
Cumulative amplitude spectra of the measured position errors are computed for the three cases and are compared in Figure ref:fig:test_id31_hac_cas_cl. Figure ref:fig:test_id31_hac_cas_cl presents the cumulative amplitude spectra of the position errors for all three cases.
It can be observed that the decentralized IFF decreases the vibrations around the suspension modes of the nano-hexapod (that would not be possible to do with a HAC alone), and then the high authority controller reduces the low frequency vibrations that are mainly due to guiding errors of the Spindle. The results reveal two distinct control contributions: the decentralized IFF effectively attenuates vibrations near the nano-hexapod suspension modes (an achievement not possible with HAC alone), while the high authority controller suppresses low-frequency vibrations primarily arising from Spindle guiding errors.
It is interesting to see the similarity of Figure ref:fig:test_id31_hac_cas_cl with the cumulative amplitude spectra computed very early in the project. Notably, the spectral patterns in Figure ref:fig:test_id31_hac_cas_cl closely resemble the cumulative amplitude spectra computed in the project's early stages.
This experiment also shows that designing a controller for specific experimental conditions (especially payload inertia) can lead to better performances. This experiment also illustrates that when needed, performance can be enhanced by designing controllers for specific experimental conditions, rather than relying solely on robust controllers that accommodate all payload ranges.
#+begin_src matlab #+begin_src matlab
%% Load measured vibrations in Open-Loop %% Jacobian to compute the motion in the X-Y-Z-Rx-Ry directions
data_ol_Wz0 = load('2023-08-11_16-51_m0_lac_off.mat'); % no rotation
%% Compute the motion in the X-Y-Z-Rx-Ry directions
% Coordinate transform
J_int_to_X = [ 0 0 -0.787401574803149 -0.212598425196851 0; J_int_to_X = [ 0 0 -0.787401574803149 -0.212598425196851 0;
0.78740157480315 0.21259842519685 0 0 0; 0.78740157480315 0.21259842519685 0 0 0;
0 0 0 0 -1; 0 0 0 0 -1;
-13.1233595800525 13.1233595800525 0 0 0; -13.1233595800525 13.1233595800525 0 0 0;
0 0 -13.1233595800525 13.1233595800525 0]; 0 0 -13.1233595800525 13.1233595800525 0];
%% Parameters for frequency analysis computation
Nfft = floor(20.0/Ts);
win = hanning(Nfft);
Noverlap = floor(Nfft/2);
%% Open-Loop measurement
data_ol_Wz180 = load('2023-08-11_16-51_m0_lac_off.mat'); % no rotation
a = J_int_to_X*[data_ol_Wz180.d1; data_ol_Wz180.d2; data_ol_Wz180.d3; data_ol_Wz180.d4; data_ol_Wz180.d5]; a = J_int_to_X*[data_ol_Wz180.d1; data_ol_Wz180.d2; data_ol_Wz180.d3; data_ol_Wz180.d4; data_ol_Wz180.d5];
data_ol_Wz180.Dx_int = a(1,:); data_ol_Wz180.Dx_int = a(1,:);
data_ol_Wz180.Dy_int = a(2,:); data_ol_Wz180.Dy_int = a(2,:);
@ -3943,12 +3954,6 @@ data_ol_Wz180.Dz_int = a(3,:);
data_ol_Wz180.Rx_int = a(4,:); data_ol_Wz180.Rx_int = a(4,:);
data_ol_Wz180.Ry_int = a(5,:); data_ol_Wz180.Ry_int = a(5,:);
%% Computed the power spectral density of the measured motion
% Hannning Windows
Nfft = floor(20.0/Ts);
win = hanning(Nfft);
Noverlap = floor(Nfft/2);
[data_ol_Wz180.pxx_Dx, data_ol_Wz180.f] = pwelch(detrend(data_ol_Wz180.Dx_int, 0), win, Noverlap, Nfft, 1/Ts); [data_ol_Wz180.pxx_Dx, data_ol_Wz180.f] = pwelch(detrend(data_ol_Wz180.Dx_int, 0), win, Noverlap, Nfft, 1/Ts);
[data_ol_Wz180.pxx_Dy, ~ ] = pwelch(detrend(data_ol_Wz180.Dy_int, 0), win, Noverlap, Nfft, 1/Ts); [data_ol_Wz180.pxx_Dy, ~ ] = pwelch(detrend(data_ol_Wz180.Dy_int, 0), win, Noverlap, Nfft, 1/Ts);
[data_ol_Wz180.pxx_Dz, ~ ] = pwelch(detrend(data_ol_Wz180.Dz_int, 0), win, Noverlap, Nfft, 1/Ts); [data_ol_Wz180.pxx_Dz, ~ ] = pwelch(detrend(data_ol_Wz180.Dz_int, 0), win, Noverlap, Nfft, 1/Ts);
@ -3956,8 +3961,6 @@ Noverlap = floor(Nfft/2);
[data_ol_Wz180.pxx_Ry, ~ ] = pwelch(detrend(data_ol_Wz180.Ry_int, 0), win, Noverlap, Nfft, 1/Ts); [data_ol_Wz180.pxx_Ry, ~ ] = pwelch(detrend(data_ol_Wz180.Ry_int, 0), win, Noverlap, Nfft, 1/Ts);
%% Effect of LAC - 180 deg/s %% Effect of LAC - 180 deg/s
% Load measured noise
data_lac_Wz180 = load('2023-08-11_17-36_m0_lac_on_30rpm.mat'); data_lac_Wz180 = load('2023-08-11_17-36_m0_lac_on_30rpm.mat');
a = J_int_to_X*[data_lac_Wz180.d1; data_lac_Wz180.d2; data_lac_Wz180.d3; data_lac_Wz180.d4; data_lac_Wz180.d5]; a = J_int_to_X*[data_lac_Wz180.d1; data_lac_Wz180.d2; data_lac_Wz180.d3; data_lac_Wz180.d4; data_lac_Wz180.d5];
@ -3974,7 +3977,6 @@ data_lac_Wz180.Ry_int = a(5,:);
[data_lac_Wz180.pxx_Ry, ~ ] = pwelch(detrend(data_lac_Wz180.Ry_int, 0), win, Noverlap, Nfft, 1/Ts); [data_lac_Wz180.pxx_Ry, ~ ] = pwelch(detrend(data_lac_Wz180.Ry_int, 0), win, Noverlap, Nfft, 1/Ts);
%% Effect of HAC - 180 deg/s %% Effect of HAC - 180 deg/s
% Load measured noise
data_hac_Wz180 = load('2023-08-11_16-49_m0_hac_on.mat'); data_hac_Wz180 = load('2023-08-11_16-49_m0_hac_on.mat');
a = J_int_to_X*[data_hac_Wz180.d1; data_hac_Wz180.d2; data_hac_Wz180.d3; data_hac_Wz180.d4; data_hac_Wz180.d5]; a = J_int_to_X*[data_hac_Wz180.d1; data_hac_Wz180.d2; data_hac_Wz180.d3; data_hac_Wz180.d4; data_hac_Wz180.d5];
@ -3989,6 +3991,11 @@ data_hac_Wz180.Ry_int = a(5,:);
[data_hac_Wz180.pxx_Dz, ~ ] = pwelch(detrend(data_hac_Wz180.Dz_int, 0), win, Noverlap, Nfft, 1/Ts); [data_hac_Wz180.pxx_Dz, ~ ] = pwelch(detrend(data_hac_Wz180.Dz_int, 0), win, Noverlap, Nfft, 1/Ts);
[data_hac_Wz180.pxx_Rx, ~ ] = pwelch(detrend(data_hac_Wz180.Rx_int, 0), win, Noverlap, Nfft, 1/Ts); [data_hac_Wz180.pxx_Rx, ~ ] = pwelch(detrend(data_hac_Wz180.Rx_int, 0), win, Noverlap, Nfft, 1/Ts);
[data_hac_Wz180.pxx_Ry, ~ ] = pwelch(detrend(data_hac_Wz180.Ry_int, 0), win, Noverlap, Nfft, 1/Ts); [data_hac_Wz180.pxx_Ry, ~ ] = pwelch(detrend(data_hac_Wz180.Ry_int, 0), win, Noverlap, Nfft, 1/Ts);
% Compute closed-loop RMS errors
data_hac_Wz180.Dy_rms_cl = rms(detrend(data_hac_Wz180.Dy_int(1e4:end), 0));
data_hac_Wz180.Dz_rms_cl = rms(detrend(data_hac_Wz180.Dz_int(1e4:end), 0));
data_hac_Wz180.Ry_rms_cl = rms(detrend(data_hac_Wz180.Ry_int(1e4:end), 0));
#+end_src #+end_src
#+begin_src matlab :exports none :results none #+begin_src matlab :exports none :results none
@ -4084,14 +4091,19 @@ exportFig('figs/test_id31_hac_cas_cl_ry.pdf', 'width', 'third', 'height', 'norma
** Reflectivity Scans ** Reflectivity Scans
<<ssec:test_id31_scans_reflectivity>> <<ssec:test_id31_scans_reflectivity>>
X-ray reflectivity consists of scanning the $R_y$ angle of thin structures (typically solid/liquid interfaces) through the beam. X-ray reflectivity measurements involve scanning thin structures, particularly solid/liquid interfaces, through the beam by varying the $R_y$ angle.
Here, a $R_y$ scan is performed with a rotational velocity of $100\,\mu rad/s$ and the positioning errors in closed-loop are recorded (Figure ref:fig:test_id31_reflectivity). In this experiment, a $R_y$ scan was executed at a rotational velocity of $100,\mu rad/s$, and the closed-loop positioning errors were monitored (Figure ref:fig:test_id31_reflectivity).
It is shown that the NASS is able to keep the point of interest in the beam within specifications. The results confirm that the NASS successfully maintains the point of interest within the specified beam parameters throughout the scanning process.
#+begin_src matlab #+begin_src matlab
%% Load data for the reflectivity scan %% Load data for the reflectivity scan
data_ry = load("2023-08-18_15-24_first_reflectivity_m0.mat"); data_ry = load("2023-08-18_15-24_first_reflectivity_m0.mat");
data_ry.time = Ts*[0:length(data_ry.Ry_int)-1]; data_ry.time = Ts*[0:length(data_ry.Ry_int)-1];
% Compute closed-loop errors
data_ry.Dy_rms_cl = rms(detrend(data_ry.e_dy,0)); % [m RMS]
data_ry.Dz_rms_cl = rms(detrend(data_ry.e_dz,0)); % [m RMS]
data_ry.Ry_rms_cl = rms(detrend(data_ry.e_ry,0)); % [rad RMS]
#+end_src #+end_src
#+begin_src matlab :exports none :results none #+begin_src matlab :exports none :results none
@ -4191,18 +4203,17 @@ exportFig('figs/test_id31_reflectivity_ry.pdf', 'width', 'third', 'height', 'nor
<<ssec:test_id31_scans_dz>> <<ssec:test_id31_scans_dz>>
**** Introduction :ignore: **** Introduction :ignore:
In some cases, samples are composed of several atomic "layers" that are first aligned in the horizontal plane with precise $R_x$ and $R_y$ positioning and that are then scanned vertically with accurate $D_z$ motion. In some cases, samples are composed of several atomic "layers" that are first aligned in the horizontal plane through $R_x$ and $R_y$ positioning, followed by vertical scanning with precise $D_z$ motion.
The vertical scans can be performed continuously of using step-by-step motion. These vertical scans can be executed either continuously or in a step-by-step manner.
**** Step by Step $D_z$ motion **** Step by Step $D_z$ motion
Vertical steps are here performed using the nano-hexapod only. The vertical step motion is performed exclusively with the nano-hexapod.
Step sizes from $10\,nm$ to $1\,\mu m$ are tested, and the results are shown in Figure ref:fig:test_id31_dz_mim_steps. Testing was conducted across step sizes ranging from $10,nm$ to $1,\mu m$, with results presented in Figure ref:fig:test_id31_dz_mim_steps. The system successfully resolves 10nm steps when detectors integrate over a 50ms period (illustrated by the red curve in Figure ref:fig:test_id31_dz_mim_10nm_steps), which is compatible with many experimental requirements.
10nm steps can be resolved if detectors are integrating over 50ms (see red curve in Figure ref:fig:test_id31_dz_mim_10nm_steps), which is reasonable for many experiments.
When doing step-by-step scans, the time to reach the next value is quite critical as long settling time can render the total experiment excessively long. In step-by-step scanning procedures, settling time is a critical parameter as it significantly impacts the total experiment duration.
The response time to reach the wanted value (to within $\pm 20\,nm$) is around $70\,ms$ as shown with the $1\,\mu m$ step response in Figure ref:fig:test_id31_dz_mim_1000nm_steps. The system achieves a response time of approximately $70,ms$ to reach the target position (within $\pm 20,nm$), as demonstrated by the $1,\mu m$ step response in Figure ref:fig:test_id31_dz_mim_1000nm_steps.
This is typically shorted for smaller steps. This settling duration typically decreases for smaller step sizes.
#+begin_src matlab #+begin_src matlab
%% Load Dz steps data %% Load Dz steps data
@ -4309,10 +4320,10 @@ exportFig('figs/test_id31_dz_mim_1000nm_steps.pdf', 'width', 'third', 'height',
**** Continuous $D_z$ motion: Dirty Layer Scans **** Continuous $D_z$ motion: Dirty Layer Scans
In this section and for the following experiments, the NASS is used to performs "ramp scans" (i.e. constant velocity scans). For these and subsequent experiments, the NASS performs "ramp scans" (constant velocity scans).
To have no tracking errors, two integrators needs to be present in the feedback loop, and as the plant does not have integral action at low frequency, two integrators are included in the controller. To eliminate tracking errors, the feedback controller incorporates two integrators, compensating for the plant's lack of integral action at low frequencies.
The first test is a scan at $10\,\mu m/s$, and the errors shown in Figure ref:fig:test_id31_dz_scan_10ums are well into the specifications (shown by the dashed lines). Initial testing at $10,\mu m/s$ demonstrates positioning errors well within specifications (indicated by dashed lines in Figure ref:fig:test_id31_dz_scan_10ums).
#+begin_src matlab #+begin_src matlab
%% Dirty layer scans - 10um/s %% Dirty layer scans - 10um/s
@ -4331,14 +4342,14 @@ i_dz_10ums = abs(diff(data_dz_10ums.m_hexa_dz)/Ts-10e-6) < 10*eps;
% i_dz_10ums = data_dz_10ums.m_hexa_dz>data_dz_10ums.m_hexa_dz(1) & data_dz_10ums.m_hexa_dz<data_dz_10ums.m_hexa_dz(end); % i_dz_10ums = data_dz_10ums.m_hexa_dz>data_dz_10ums.m_hexa_dz(1) & data_dz_10ums.m_hexa_dz<data_dz_10ums.m_hexa_dz(end);
% Peak to Peak errors % Peak to Peak errors
dz_10ums_dy_peak = 1e9*(max(detrend(data_dz_10ums.e_dy(i_dz_10ums), 0))-min(detrend(data_dz_10ums.e_dy(i_dz_10ums), 0)))/2; dz_10ums_dy_peak = (max(detrend(data_dz_10ums.e_dy(i_dz_10ums), 0))-min(detrend(data_dz_10ums.e_dy(i_dz_10ums), 0)))/2;
dz_10ums_dz_peak = 1e9*(max(detrend(data_dz_10ums.e_dz(i_dz_10ums), 0))-min(detrend(data_dz_10ums.e_dz(i_dz_10ums), 0)))/2; dz_10ums_dz_peak = (max(detrend(data_dz_10ums.e_dz(i_dz_10ums), 0))-min(detrend(data_dz_10ums.e_dz(i_dz_10ums), 0)))/2;
dz_10ums_ry_peak = 1e6*(max(detrend(data_dz_10ums.e_ry(i_dz_10ums), 0))-min(detrend(data_dz_10ums.e_ry(i_dz_10ums), 0)))/2; dz_10ums_ry_peak = (max(detrend(data_dz_10ums.e_ry(i_dz_10ums), 0))-min(detrend(data_dz_10ums.e_ry(i_dz_10ums), 0)))/2;
% RMS error % RMS error
dz_10ums_dy_rms = 1e9*rms(detrend(data_dz_10ums.e_dy(i_dz_10ums), 0)); data_dz_10ums.Dy_rms_cl = rms(detrend(data_dz_10ums.e_dy(i_dz_10ums), 0));
dz_10ums_dz_rms = 1e9*rms(detrend(data_dz_10ums.e_dz(i_dz_10ums), 0)); data_dz_10ums.Dz_rms_cl = rms(detrend(data_dz_10ums.e_dz(i_dz_10ums), 0));
dz_10ums_ry_rms = 1e6*rms(detrend(data_dz_10ums.e_ry(i_dz_10ums), 0)); data_dz_10ums.Ry_rms_cl = rms(detrend(data_dz_10ums.e_ry(i_dz_10ums), 0));
#+end_src #+end_src
#+begin_src matlab #+begin_src matlab
@ -4347,21 +4358,21 @@ i_dz_100ums = abs(diff(data_dz_100ums.m_hexa_dz)/Ts-100e-6) < 10*eps;
% i_dz_100ums = data_dz_100ums.m_hexa_dz>data_dz_100ums.m_hexa_dz(1) & data_dz_100ums.m_hexa_dz<data_dz_100ums.m_hexa_dz(end); % i_dz_100ums = data_dz_100ums.m_hexa_dz>data_dz_100ums.m_hexa_dz(1) & data_dz_100ums.m_hexa_dz<data_dz_100ums.m_hexa_dz(end);
% Peak to Peak errors % Peak to Peak errors
dz_100ums_dy_peak = 1e9*(max(detrend(data_dz_100ums.e_dy(i_dz_100ums), 0))-min(detrend(data_dz_100ums.e_dy(i_dz_100ums), 0)))/2; dz_100ums_dy_peak = (max(detrend(data_dz_100ums.e_dy(i_dz_100ums), 0))-min(detrend(data_dz_100ums.e_dy(i_dz_100ums), 0)))/2;
dz_100ums_dz_peak = 1e9*(max(detrend(data_dz_100ums.e_dz(i_dz_100ums), 0))-min(detrend(data_dz_100ums.e_dz(i_dz_100ums), 0)))/2; dz_100ums_dz_peak = (max(detrend(data_dz_100ums.e_dz(i_dz_100ums), 0))-min(detrend(data_dz_100ums.e_dz(i_dz_100ums), 0)))/2;
dz_100ums_ry_peak = 1e6*(max(detrend(data_dz_100ums.e_ry(i_dz_100ums), 0))-min(detrend(data_dz_100ums.e_ry(i_dz_100ums), 0)))/2; dz_100ums_ry_peak = (max(detrend(data_dz_100ums.e_ry(i_dz_100ums), 0))-min(detrend(data_dz_100ums.e_ry(i_dz_100ums), 0)))/2;
% RMS error % RMS error
dz_100ums_dy_rms = 1e9*rms(detrend(data_dz_100ums.e_dy(i_dz_100ums), 0)); data_dz_100ums.Dy_rms_cl = rms(detrend(data_dz_100ums.e_dy(i_dz_100ums), 0));
dz_100ums_dz_rms = 1e9*rms(detrend(data_dz_100ums.e_dz(i_dz_100ums), 0)); data_dz_100ums.Dz_rms_cl = rms(detrend(data_dz_100ums.e_dz(i_dz_100ums), 0));
dz_100ums_ry_rms = 1e6*rms(detrend(data_dz_100ums.e_ry(i_dz_100ums), 0)); data_dz_100ums.Ry_rms_cl = rms(detrend(data_dz_100ums.e_ry(i_dz_100ums), 0));
#+end_src #+end_src
#+begin_src matlab :exports none :results none #+begin_src matlab :exports none :results none
%% Dz scan at 10um/s - Lateral error %% Dz scan at 10um/s - Lateral error
figure; figure;
hold on; hold on;
plot(data_dz_10ums.time, 1e9*data_dz_10ums.e_dy, 'DisplayName', sprintf('$\\epsilon D_y: %.0f$ nm RMS', 1e9*rms(data_dz_10ums.e_dy))) plot(data_dz_10ums.time, 1e9data_dz_10ums.e_dy, 'DisplayName', sprintf('$\\epsilon D_y: %.0f$ nm RMS', 1e9*rms(data_dz_10ums.e_dy)))
plot([0, 2.2], [specs_dy_peak, specs_dy_peak], '--', 'color', colors(1,:), 'HandleVisibility', 'off'); plot([0, 2.2], [specs_dy_peak, specs_dy_peak], '--', 'color', colors(1,:), 'HandleVisibility', 'off');
plot([0, 2.2], [-specs_dy_peak, -specs_dy_peak], '--', 'color', colors(1,:), 'HandleVisibility', 'off'); plot([0, 2.2], [-specs_dy_peak, -specs_dy_peak], '--', 'color', colors(1,:), 'HandleVisibility', 'off');
hold off; hold off;
@ -4450,10 +4461,9 @@ exportFig('figs/test_id31_dz_scan_10ums_ry.pdf', 'width', 'third', 'height', 'no
#+end_subfigure #+end_subfigure
#+end_figure #+end_figure
A second scan is performed with a velocity of $100\,\mu m/s$, which is the fastest velocity for $D_z$ scans when the ultimate performances is wanted[fn:8]. A subsequent scan at $100,\mu m/s$ - the maximum velocity for high-precision $D_z$ scans[fn:8] - maintains positioning errors within specifications during the constant velocity phase, with deviations occurring only during acceleration and deceleration phases (Figure ref:fig:test_id31_dz_scan_100ums).
At this velocity, the positioning errors are also within the specifications except for the very start and very end of the motion (i.e. during acceleration/deceleration phases, see Figure ref:fig:test_id31_dz_scan_100ums). Since detectors typically operate only during the constant velocity phase, these transient deviations do not compromise measurement quality.
However, the detectors are usually triggered only during the constant velocity phase, so this is not not an issue. Yet, performance during acceleration phases could potentially be enhanced through the implementation of feedforward control.
The performances during acceleration phase may also be improved by using a feedforward controller.
#+begin_src matlab :exports none :results none #+begin_src matlab :exports none :results none
%% Dz scan at 100um/s - Lateral error %% Dz scan at 100um/s - Lateral error
@ -4550,42 +4560,39 @@ exportFig('figs/test_id31_dz_scan_100ums_ry.pdf', 'width', 'third', 'height', 'n
<<ssec:test_id31_scans_dy>> <<ssec:test_id31_scans_dy>>
**** Introduction :ignore: **** Introduction :ignore:
Lateral scans are performed with the $T_y$ stage. Lateral scans are executed using the $T_y$ stage.
The stepper motor controller[fn:5] outputs the setpoint which is received by the Speedgoat. The stepper motor controller[fn:5] generates a setpoint that is transmitted to the Speedgoat.
In the Speedgoat, the setpoint is compared with the measured $D_y$ position of the sample, and the Nano-Hexapod is used to correct positioning errors induced by the scanning of the $T_y$ stage. Within the Speedgoat, the system computes the positioning error by comparing the measured $D_y$ sample position against the received setpoint, and the Nano-Hexapod compensates for positioning errors introduced during $T_y$ stage scanning.
The stroke is here limited to $\pm 100\,\mu m$ due to the limited acceptance of the metrology system. The scanning range is constrained $\pm 100\,\mu m$ due to the limited acceptance of the metrology system.
**** Slow scan **** Slow scan
The $T_y$ stage is first scanned with a velocity of $10\,\mu m/s$ which is typical for such experiments. Initial testing utilized a scanning velocity of $10,\mu m/s$, which is typical for these experiments.
The errors in open-loop (i.e. without using the NASS) and in closed-loop are compared in Figure ref:fig:test_id31_dy_10ums. Figure ref:fig:test_id31_dy_10ums compares the positioning errors between open-loop (without NASS) and closed-loop operation.
In the scanning direction, open-loop measurements reveal periodic errors (Figure ref:fig:test_id31_dy_10ums_dy) attributable to the $T_y$ stage's stepper motor.
These micro-stepping errors, inherent to stepper motor operation, occur 200 times per motor rotation with approximately $1\,\text{mrad}$ angular error amplitude.
Given the $T_y$ stage's lead screw pitch of $2\,mm$, these errors manifest as $10\,\mu m$ periodic oscillations with $\approx 300\,nm$ amplitude, which can indeed be seen in the open-loop measurements (Figure ref:fig:test_id31_dy_10ums_dy).
In the direction of motion, periodic errors can be observed in the open-loop case (Figure ref:fig:test_id31_dy_10ums_dy). In the vertical direction (Figure ref:fig:test_id31_dy_10ums_dz), open-loop errors likely stem from metrology measurement error due to the fact that the top interferometer points at a spherical target surface (see Figure ref:fig:test_id31_xy_map_sphere).
These errors are induced by the stepper motor being used in the $T_y$ stage. Under closed-loop control, positioning errors remain within specifications across all directions.
Indeed, stepper motors inherently have "micro-stepping errors" which are periodic errors happening 200 times per motor rotation with an amplitude approximately equal to $1\,\text{mrad}$.
As the lead screw for the $T_y$ stage has a pitch of $2\,mm$, this means that the micro-stepping errors have a period of $10\,\mu m$ and an amplitude of $\approx 300\,nm$ which can indeed be seen in open-loop.
In the vertical direction (Figure ref:fig:test_id31_dy_10ums_dz), open-loop errors are most likely due to measurement errors of the metrology itself as the top interferometer point at a sphere (see Figure ref:fig:test_id31_xy_map_sphere).
In closed-loop, the errors are within the specifications in all directions.
#+begin_src matlab #+begin_src matlab
%% Slow Ty scan (10um/s) - OL %% Slow Ty scan (10um/s) - OL
data_ty_ol_slow = load("2023-08-21_20-05_ty_scan_m1_open_loop_slow.mat"); data_ty_ol_10ums = load("2023-08-21_20-05_ty_scan_m1_open_loop_slow.mat");
data_ty_ol_slow.time = Ts*[0:length(data_ty_ol_slow.Dy_int)-1]; data_ty_ol_10ums.time = Ts*[0:length(data_ty_ol_10ums.Dy_int)-1];
%% Slow Ty scan (10um/s) - CL %% Slow Ty scan (10um/s) - CL
data_ty_cl_slow = load("2023-08-21_20-07_ty_scan_m1_cf_closed_loop_slow.mat"); data_ty_cl_10ums = load("2023-08-21_20-07_ty_scan_m1_cf_closed_loop_slow.mat");
data_ty_cl_slow.time = Ts*[0:length(data_ty_cl_slow.Dy_int)-1]; data_ty_cl_10ums.time = Ts*[0:length(data_ty_cl_10ums.Dy_int)-1];
#+end_src #+end_src
#+begin_src matlab :exports none :results none #+begin_src matlab :exports none :results none
%% Ty scan (at 10um/s) - Dy errors %% Ty scan (at 10um/s) - Dy errors
figure; figure;
hold on; hold on;
plot(1e6*data_ty_ol_slow.Ty, 1e6*detrend(data_ty_ol_slow.e_dy, 0), ... plot(1e6*data_ty_ol_10ums.Ty, 1e6*detrend(data_ty_ol_10ums.e_dy, 0), ...
'DisplayName', 'Open-loop') 'DisplayName', 'Open-loop')
plot(1e6*data_ty_cl_slow.Ty, 1e6*detrend(data_ty_cl_slow.e_dy, 0), ... plot(1e6*data_ty_cl_10ums.Ty, 1e6*detrend(data_ty_cl_10ums.e_dy, 0), ...
'DisplayName', 'Closed-loop') 'DisplayName', 'Closed-loop')
plot([-100, 100], 1e-3*[specs_dy_peak, specs_dy_peak], 'k--', 'DisplayName', 'Specifications'); plot([-100, 100], 1e-3*[specs_dy_peak, specs_dy_peak], 'k--', 'DisplayName', 'Specifications');
plot([-100, 100], 1e-3*[-specs_dy_peak, -specs_dy_peak], 'k--', 'HandleVisibility', 'off'); plot([-100, 100], 1e-3*[-specs_dy_peak, -specs_dy_peak], 'k--', 'HandleVisibility', 'off');
@ -4605,9 +4612,9 @@ exportFig('figs/test_id31_dy_10ums_dy.pdf', 'width', 'third', 'height', 'normal'
%% Ty scan (at 10um/s) - Dz and Ry errors %% Ty scan (at 10um/s) - Dz and Ry errors
figure; figure;
hold on; hold on;
plot(1e6*data_ty_ol_slow.Ty, 1e6*detrend(data_ty_ol_slow.e_dz, 0), ... plot(1e6*data_ty_ol_10ums.Ty, 1e6*detrend(data_ty_ol_10ums.e_dz, 0), ...
'DisplayName', 'Open-loop') 'DisplayName', 'Open-loop')
plot(1e6*data_ty_cl_slow.Ty, 1e6*detrend(data_ty_cl_slow.e_dz, 0), ... plot(1e6*data_ty_cl_10ums.Ty, 1e6*detrend(data_ty_cl_10ums.e_dz, 0), ...
'DisplayName', 'Closed-loop') 'DisplayName', 'Closed-loop')
plot([-100, 100], 1e-3*[specs_dz_peak, specs_dz_peak], 'k--', 'DisplayName', 'Specifications'); plot([-100, 100], 1e-3*[specs_dz_peak, specs_dz_peak], 'k--', 'DisplayName', 'Specifications');
plot([-100, 100], 1e-3*[-specs_dz_peak, -specs_dz_peak], 'k--', 'HandleVisibility', 'off'); plot([-100, 100], 1e-3*[-specs_dz_peak, -specs_dz_peak], 'k--', 'HandleVisibility', 'off');
@ -4627,9 +4634,9 @@ exportFig('figs/test_id31_dy_10ums_dz.pdf', 'width', 'third', 'height', 'normal'
#+begin_src matlab :exports none :results none #+begin_src matlab :exports none :results none
figure; figure;
hold on; hold on;
plot(1e6*data_ty_ol_slow.Ty, 1e6*data_ty_ol_slow.e_ry, ... plot(1e6*data_ty_ol_10ums.Ty, 1e6*data_ty_ol_10ums.e_ry, ...
'DisplayName', 'Open-loop') 'DisplayName', 'Open-loop')
plot(1e6*data_ty_cl_slow.Ty, 1e6*data_ty_cl_slow.e_ry, ... plot(1e6*data_ty_cl_10ums.Ty, 1e6*data_ty_cl_10ums.e_ry, ...
'DisplayName', 'Closed-loop') 'DisplayName', 'Closed-loop')
plot([-100, 100], [specs_ry_peak, specs_ry_peak], 'k--', 'DisplayName', 'Specifications'); plot([-100, 100], [specs_ry_peak, specs_ry_peak], 'k--', 'DisplayName', 'Specifications');
plot([-100, 100], [-specs_ry_peak, -specs_ry_peak], 'k--', 'HandleVisibility', 'off'); plot([-100, 100], [-specs_ry_peak, -specs_ry_peak], 'k--', 'HandleVisibility', 'off');
@ -4672,34 +4679,33 @@ exportFig('figs/test_id31_dy_10ums_ry.pdf', 'width', 'third', 'height', 'normal'
**** Fast Scan **** Fast Scan
The performance of the NASS is then tested for a scanning velocity of $100\,\mu m/s$ and the results are shown in Figure ref:fig:test_id31_dy_100ums. System performance was evaluated at an increased scanning velocity of $100\,\mu m/s$, with results presented in Figure ref:fig:test_id31_dy_100ums.
At this velocity, the micro-stepping errors have a frequency of $10\,\text{Hz}$ and are inducing lot's of vibrations which are even amplified by some resonances of the micro-station. At this velocity, the micro-stepping errors generate $10\,\text{Hz}$ vibrations, which are further amplified by micro-station resonances.
These vibrations are outside the bandwidth of the NASS feedback controller and therefore not well reduced in closed-loop. These vibrations exceed the NASS feedback controller bandwidth, resulting in limited attenuation under closed-loop control.
This limitation exemplifies why stepper motors are suboptimal for "long-stroke/short-stroke" systems requiring precise scanning performance [[cite:&dehaeze22_fastj_uhv]].
This is the main reason why stepper motors should be not be used for "long-stroke / short-stroke" systems when good scanning performances are wanted [[cite:&dehaeze22_fastj_uhv]]. Two potential solutions exist for improving high-velocity scanning performance.
In order to improve the scanning performances at high velocity, the stepper motor of the $T_y$ stage could be replaced by a three-phase torque motor for instance. First, the $T_y$ stage's stepper motor could be replaced with a three-phase torque motor.
Alternatively, since closed-loop errors in $D_z$ and $R_y$ directions remain within specifications (Figures ref:fig:test_id31_dy_100ums_dz and ref:fig:test_id31_dy_100ums_ry), detector triggering could be based on measured $D_y$ position rather than time or $T_y$ setpoint, reducing sensitivity to $D_y$ vibrations.
As the closed-loop errors in $D_z$ and $R_y$ directions are within specifications (see Figures ref:fig:test_id31_dy_100ums_dz and ref:fig:test_id31_dy_100ums_ry), another option would be to trigger the detectors based on the measured $D_y$ position instead of based on time or on the $T_y$ setpoint. For applications requiring small $D_y$ scans, the nano-hexapod can be used exclusively, though with limited stroke capability.
This would make the experiment less sensitive to $D_y$ vibrations.
For small $D_y$ scans, the nano-hexapod alone can be used for the scans, but with limited strokes.
#+begin_src matlab #+begin_src matlab
%% Fast Ty scan (100um/s) - OL %% Fast Ty scan (100um/s) - OL
data_ty_ol_fast = load("2023-08-21_20-05_ty_scan_m1_open_loop.mat"); data_ty_ol_100ums = load("2023-08-21_20-05_ty_scan_m1_open_loop.mat");
data_ty_ol_fast.time = Ts*[0:length(data_ty_ol_fast.Dy_int)-1]; data_ty_ol_100ums.time = Ts*[0:length(data_ty_ol_100ums.Dy_int)-1];
%% Fast Ty scan (10um/s) - CL %% Fast Ty scan (100um/s) - CL
data_ty_cl_fast = load("2023-08-21_20-07_ty_scan_m1_cf_closed_loop.mat"); data_ty_cl_100ums = load("2023-08-21_20-07_ty_scan_m1_cf_closed_loop.mat");
data_ty_cl_fast.time = Ts*[0:length(data_ty_cl_fast.Dy_int)-1]; data_ty_cl_100ums.time = Ts*[0:length(data_ty_cl_100ums.Dy_int)-1];
#+end_src #+end_src
#+begin_src matlab :exports none :results none #+begin_src matlab :exports none :results none
%% Ty scan (at 100um/s) - Dy errors %% Ty scan (at 100um/s) - Dy errors
figure; figure;
hold on; hold on;
plot(1e6*data_ty_ol_fast.Ty, 1e6*detrend(data_ty_ol_fast.e_dy, 0), ... plot(1e6*data_ty_ol_100ums.Ty, 1e6*detrend(data_ty_ol_100ums.e_dy, 0), ...
'DisplayName', 'Open-loop') 'DisplayName', 'Open-loop')
plot(1e6*data_ty_cl_fast.Ty, 1e6*detrend(data_ty_cl_fast.e_dy, 0), ... plot(1e6*data_ty_cl_100ums.Ty, 1e6*detrend(data_ty_cl_100ums.e_dy, 0), ...
'DisplayName', 'Closed-loop') 'DisplayName', 'Closed-loop')
plot([-100, 100], 1e-3*[specs_dy_peak, specs_dy_peak], 'k--', 'DisplayName', 'Specifications'); plot([-100, 100], 1e-3*[specs_dy_peak, specs_dy_peak], 'k--', 'DisplayName', 'Specifications');
plot([-100, 100], 1e-3*[-specs_dy_peak, -specs_dy_peak], 'k--', 'HandleVisibility', 'off'); plot([-100, 100], 1e-3*[-specs_dy_peak, -specs_dy_peak], 'k--', 'HandleVisibility', 'off');
@ -4720,9 +4726,9 @@ exportFig('figs/test_id31_dy_100ums_dy.pdf', 'width', 'third', 'height', 'normal
%% Ty scan (at 100um/s) - Dz and Ry errors %% Ty scan (at 100um/s) - Dz and Ry errors
figure; figure;
hold on; hold on;
plot(1e6*data_ty_ol_fast.Ty, 1e6*detrend(data_ty_ol_fast.e_dz, 0), ... plot(1e6*data_ty_ol_100ums.Ty, 1e6*detrend(data_ty_ol_100ums.e_dz, 0), ...
'DisplayName', 'Open-loop') 'DisplayName', 'Open-loop')
plot(1e6*data_ty_cl_fast.Ty, 1e6*detrend(data_ty_cl_fast.e_dz, 0), ... plot(1e6*data_ty_cl_100ums.Ty, 1e6*detrend(data_ty_cl_100ums.e_dz, 0), ...
'DisplayName', 'Closed-loop') 'DisplayName', 'Closed-loop')
plot([-100, 100], 1e-3*[specs_dz_peak, specs_dz_peak], 'k--', 'DisplayName', 'Specifications'); plot([-100, 100], 1e-3*[specs_dz_peak, specs_dz_peak], 'k--', 'DisplayName', 'Specifications');
plot([-100, 100], 1e-3*[-specs_dz_peak, -specs_dz_peak], 'k--', 'HandleVisibility', 'off'); plot([-100, 100], 1e-3*[-specs_dz_peak, -specs_dz_peak], 'k--', 'HandleVisibility', 'off');
@ -4742,9 +4748,9 @@ exportFig('figs/test_id31_dy_100ums_dz.pdf', 'width', 'third', 'height', 'normal
#+begin_src matlab :exports none :results none #+begin_src matlab :exports none :results none
figure; figure;
hold on; hold on;
plot(1e6*data_ty_ol_fast.Ty, 1e6*data_ty_ol_fast.e_ry, ... plot(1e6*data_ty_ol_100ums.Ty, 1e6*data_ty_ol_100ums.e_ry, ...
'DisplayName', 'Open-loop') 'DisplayName', 'Open-loop')
plot(1e6*data_ty_cl_fast.Ty, 1e6*data_ty_cl_fast.e_ry, ... plot(1e6*data_ty_cl_100ums.Ty, 1e6*data_ty_cl_100ums.e_ry, ...
'DisplayName', 'Closed-loop') 'DisplayName', 'Closed-loop')
plot([-100, 100], [specs_ry_peak, specs_ry_peak], 'k--', 'DisplayName', 'Specifications'); plot([-100, 100], [specs_ry_peak, specs_ry_peak], 'k--', 'DisplayName', 'Specifications');
plot([-100, 100], [-specs_ry_peak, -specs_ry_peak], 'k--', 'HandleVisibility', 'off'); plot([-100, 100], [-specs_ry_peak, -specs_ry_peak], 'k--', 'HandleVisibility', 'off');
@ -4787,74 +4793,70 @@ exportFig('figs/test_id31_dy_100ums_ry.pdf', 'width', 'third', 'height', 'normal
#+begin_src matlab #+begin_src matlab
%% Compute errors for Dy scans %% Compute errors for Dy scans
i_ty_ol_slow = data_ty_ol_slow.Ty > data_ty_ol_slow.Ty(1) & data_ty_ol_slow.Ty < data_ty_ol_slow.Ty(end); i_ty_ol_10ums = data_ty_ol_10ums.Ty > data_ty_ol_10ums.Ty(1) & data_ty_ol_10ums.Ty < data_ty_ol_10ums.Ty(end);
i_ty_cl_slow = data_ty_cl_slow.Ty > data_ty_cl_slow.Ty(1) & data_ty_cl_slow.Ty < data_ty_cl_slow.Ty(end); i_ty_cl_10ums = data_ty_cl_10ums.Ty > data_ty_cl_10ums.Ty(1) & data_ty_cl_10ums.Ty < data_ty_cl_10ums.Ty(end);
i_ty_ol_fast = data_ty_ol_fast.Ty > data_ty_ol_fast.Ty(1) & data_ty_ol_fast.Ty < data_ty_ol_fast.Ty(end); i_ty_ol_100ums = data_ty_ol_100ums.Ty > data_ty_ol_100ums.Ty(1) & data_ty_ol_100ums.Ty < data_ty_ol_100ums.Ty(end);
i_ty_cl_fast = data_ty_cl_fast.Ty > data_ty_cl_fast.Ty(1) & data_ty_cl_fast.Ty < data_ty_cl_fast.Ty(end); i_ty_cl_100ums = data_ty_cl_100ums.Ty > data_ty_cl_100ums.Ty(1) & data_ty_cl_100ums.Ty < data_ty_cl_100ums.Ty(end);
% Peak to Peak errors % Peak to Peak errors
ty_ol_slow_dy_peak = 1e9*(max(detrend(data_ty_ol_slow.e_dy(i_ty_ol_slow), 0))-min(detrend(data_ty_ol_slow.e_dy(i_ty_ol_slow), 0)))/2; ty_ol_10ums_dy_peak = (max(detrend(data_ty_ol_10ums.e_dy(i_ty_ol_10ums), 0))-min(detrend(data_ty_ol_10ums.e_dy(i_ty_ol_10ums), 0)))/2;
ty_ol_slow_dz_peak = 1e9*(max(detrend(data_ty_ol_slow.e_dz(i_ty_ol_slow), 0))-min(detrend(data_ty_ol_slow.e_dz(i_ty_ol_slow), 0)))/2; ty_ol_10ums_dz_peak = (max(detrend(data_ty_ol_10ums.e_dz(i_ty_ol_10ums), 0))-min(detrend(data_ty_ol_10ums.e_dz(i_ty_ol_10ums), 0)))/2;
ty_ol_slow_ry_peak = 1e6*(max(detrend(data_ty_ol_slow.e_ry(i_ty_ol_slow), 0))-min(detrend(data_ty_ol_slow.e_ry(i_ty_ol_slow), 0)))/2; ty_ol_10ums_ry_peak = (max(detrend(data_ty_ol_10ums.e_ry(i_ty_ol_10ums), 0))-min(detrend(data_ty_ol_10ums.e_ry(i_ty_ol_10ums), 0)))/2;
ty_cl_slow_dy_peak = 1e9*(max(detrend(data_ty_cl_slow.e_dy(i_ty_cl_slow), 0))-min(detrend(data_ty_cl_slow.e_dy(i_ty_cl_slow), 0)))/2; ty_cl_10ums_dy_peak = (max(detrend(data_ty_cl_10ums.e_dy(i_ty_cl_10ums), 0))-min(detrend(data_ty_cl_10ums.e_dy(i_ty_cl_10ums), 0)))/2;
ty_cl_slow_dz_peak = 1e9*(max(detrend(data_ty_cl_slow.e_dz(i_ty_cl_slow), 0))-min(detrend(data_ty_cl_slow.e_dz(i_ty_cl_slow), 0)))/2; ty_cl_10ums_dz_peak = (max(detrend(data_ty_cl_10ums.e_dz(i_ty_cl_10ums), 0))-min(detrend(data_ty_cl_10ums.e_dz(i_ty_cl_10ums), 0)))/2;
ty_cl_slow_ry_peak = 1e6*(max(detrend(data_ty_cl_slow.e_ry(i_ty_cl_slow), 0))-min(detrend(data_ty_cl_slow.e_ry(i_ty_cl_slow), 0)))/2; ty_cl_10ums_ry_peak = (max(detrend(data_ty_cl_10ums.e_ry(i_ty_cl_10ums), 0))-min(detrend(data_ty_cl_10ums.e_ry(i_ty_cl_10ums), 0)))/2;
ty_ol_fast_dy_peak = 1e9*(max(detrend(data_ty_ol_fast.e_dy(i_ty_ol_fast), 0))-min(detrend(data_ty_ol_fast.e_dy(i_ty_ol_fast), 0)))/2; ty_ol_100ums_dy_peak = (max(detrend(data_ty_ol_100ums.e_dy(i_ty_ol_100ums), 0))-min(detrend(data_ty_ol_100ums.e_dy(i_ty_ol_100ums), 0)))/2;
ty_ol_fast_dz_peak = 1e9*(max(detrend(data_ty_ol_fast.e_dz(i_ty_ol_fast), 0))-min(detrend(data_ty_ol_fast.e_dz(i_ty_ol_fast), 0)))/2; ty_ol_100ums_dz_peak = (max(detrend(data_ty_ol_100ums.e_dz(i_ty_ol_100ums), 0))-min(detrend(data_ty_ol_100ums.e_dz(i_ty_ol_100ums), 0)))/2;
ty_ol_fast_ry_peak = 1e6*(max(detrend(data_ty_ol_fast.e_ry(i_ty_ol_fast), 0))-min(detrend(data_ty_ol_fast.e_ry(i_ty_ol_fast), 0)))/2; ty_ol_100ums_ry_peak = (max(detrend(data_ty_ol_100ums.e_ry(i_ty_ol_100ums), 0))-min(detrend(data_ty_ol_100ums.e_ry(i_ty_ol_100ums), 0)))/2;
ty_cl_fast_dy_peak = 1e9*(max(detrend(data_ty_cl_fast.e_dy(i_ty_cl_fast), 0))-min(detrend(data_ty_cl_fast.e_dy(i_ty_cl_fast), 0)))/2; ty_cl_100ums_dy_peak = (max(detrend(data_ty_cl_100ums.e_dy(i_ty_cl_100ums), 0))-min(detrend(data_ty_cl_100ums.e_dy(i_ty_cl_100ums), 0)))/2;
ty_cl_fast_dz_peak = 1e9*(max(detrend(data_ty_cl_fast.e_dz(i_ty_cl_fast), 0))-min(detrend(data_ty_cl_fast.e_dz(i_ty_cl_fast), 0)))/2; ty_cl_100ums_dz_peak = (max(detrend(data_ty_cl_100ums.e_dz(i_ty_cl_100ums), 0))-min(detrend(data_ty_cl_100ums.e_dz(i_ty_cl_100ums), 0)))/2;
ty_cl_fast_ry_peak = 1e6*(max(detrend(data_ty_cl_fast.e_ry(i_ty_cl_fast), 0))-min(detrend(data_ty_cl_fast.e_ry(i_ty_cl_fast), 0)))/2; ty_cl_100ums_ry_peak = (max(detrend(data_ty_cl_100ums.e_ry(i_ty_cl_100ums), 0))-min(detrend(data_ty_cl_100ums.e_ry(i_ty_cl_100ums), 0)))/2;
% RMS error % RMS error
ty_ol_slow_dy_rms = 1e9*rms(detrend(data_ty_ol_slow.e_dy(i_ty_ol_slow), 0)); data_ty_ol_10ums.Dy_rms = rms(detrend(data_ty_ol_10ums.e_dy(i_ty_ol_10ums), 0));
ty_ol_slow_dz_rms = 1e9*rms(detrend(data_ty_ol_slow.e_dz(i_ty_ol_slow), 0)); data_ty_ol_10ums.Dz_rms = rms(detrend(data_ty_ol_10ums.e_dz(i_ty_ol_10ums), 0));
ty_ol_slow_ry_rms = 1e6*rms(detrend(data_ty_ol_slow.e_ry(i_ty_ol_slow), 0)); data_ty_ol_10ums.Ry_rms = rms(detrend(data_ty_ol_10ums.e_ry(i_ty_ol_10ums), 0));
ty_cl_slow_dy_rms = 1e9*rms(detrend(data_ty_cl_slow.e_dy(i_ty_cl_slow), 0)); data_ty_cl_10ums.Dy_rms = rms(detrend(data_ty_cl_10ums.e_dy(i_ty_cl_10ums), 0));
ty_cl_slow_dz_rms = 1e9*rms(detrend(data_ty_cl_slow.e_dz(i_ty_cl_slow), 0)); data_ty_cl_10ums.Dz_rms = rms(detrend(data_ty_cl_10ums.e_dz(i_ty_cl_10ums), 0));
ty_cl_slow_ry_rms = 1e6*rms(detrend(data_ty_cl_slow.e_ry(i_ty_cl_slow), 0)); data_ty_cl_10ums.Ry_rms = rms(detrend(data_ty_cl_10ums.e_ry(i_ty_cl_10ums), 0));
ty_ol_fast_dy_rms = 1e9*rms(detrend(data_ty_ol_fast.e_dy(i_ty_ol_fast), 0)); data_ty_ol_100ums.Dy_rms = rms(detrend(data_ty_ol_100ums.e_dy(i_ty_ol_100ums), 0));
ty_ol_fast_dz_rms = 1e9*rms(detrend(data_ty_ol_fast.e_dz(i_ty_ol_fast), 0)); data_ty_ol_100ums.Dz_rms = rms(detrend(data_ty_ol_100ums.e_dz(i_ty_ol_100ums), 0));
ty_ol_fast_ry_rms = 1e6*rms(detrend(data_ty_ol_fast.e_ry(i_ty_ol_fast), 0)); data_ty_ol_100ums.Ry_rms = rms(detrend(data_ty_ol_100ums.e_ry(i_ty_ol_100ums), 0));
ty_cl_fast_dy_rms = 1e9*rms(detrend(data_ty_cl_fast.e_dy(i_ty_cl_fast), 0)); data_ty_cl_100ums.Dy_rms = rms(detrend(data_ty_cl_100ums.e_dy(i_ty_cl_100ums), 0));
ty_cl_fast_dz_rms = 1e9*rms(detrend(data_ty_cl_fast.e_dz(i_ty_cl_fast), 0)); data_ty_cl_100ums.Dz_rms = rms(detrend(data_ty_cl_100ums.e_dz(i_ty_cl_100ums), 0));
ty_cl_fast_ry_rms = 1e6*rms(detrend(data_ty_cl_fast.e_ry(i_ty_cl_fast), 0)); data_ty_cl_100ums.Ry_rms = rms(detrend(data_ty_cl_100ums.e_ry(i_ty_cl_100ums), 0));
#+end_src #+end_src
** Diffraction Tomography ** Diffraction Tomography
<<ssec:test_id31_scans_diffraction_tomo>> <<ssec:test_id31_scans_diffraction_tomo>>
In diffraction tomography experiments, the micro-station executes combined motions: continuous rotation around the $R_z$ axis while performing lateral scans along $D_y$.
In diffraction tomography, the micro-station performs combined $R_z$ rotation and $D_y$ lateral scans. For this validation, the spindle maintained a constant rotational velocity of $6\,\text{deg/s}$ while the nano-hexapod executed the lateral scanning motion.
Here the spindle is performing a continuous rotation at $6\,\text{deg/s}$ while the nano-hexapod is used to perform fast $D_y$ scans. To avoid high-frequency vibrations typically induced by the stepper motor, the $T_y$ stage was not utilized, which constrained the scanning range to approximately $\pm 100\,\mu m/s$.
The system's performance was evaluated at three lateral scanning velocities: $0.1\,mm/s$, $0.5\,mm/s$, and $1\,mm/s$. Figure ref:fig:test_id31_diffraction_tomo_setpoint presents both the $D_y$ position setpoints and the corresponding measured $D_y$ positions for all tested velocities.
The $T_y$ stage is here not used as the stepper motor would induce high frequency vibrations, therefore the stroke is here limited to $\approx \pm 100\,\mu m/s$.
Several $D_y$ velocities are tested: $0.1\,mm/s$, $0.5\,mm/s$ and $1\,mm/s$.
The $D_y$ setpoint and the measured positions are shown for all tested velocities in Figure ref:fig:test_id31_diffraction_tomo_setpoint.
#+begin_src matlab #+begin_src matlab
%% 100um/s - Robust controller %% 100um/s - Robust controller
data_dt_100ums = load("2023-08-18_17-12_diffraction_tomo_m0.mat"); data_dt_100ums = load("2023-08-18_17-12_diffraction_tomo_m0.mat");
t = Ts*[0:length(data_dt_100ums.Dy_int)-1]; t = Ts*[0:length(data_dt_100ums.Dy_int)-1];
data_dt_100ums = structfun(@(field) field(t>1.0861),data_dt_100ums, 'UniformOutput', false) data_dt_100ums = structfun(@(field) field(t>1.0861),data_dt_100ums, 'UniformOutput', false);
data_dt_100ums.time = Ts*[0:length(data_dt_100ums.Dy_int)-1]; data_dt_100ums.time = Ts*[0:length(data_dt_100ums.Dy_int)-1];
%% 500um/s - Complementary filters %% 500um/s - Complementary filters
data_dt_500ums = load("2023-08-21_15-15_diffraction_tomo_m0_fast_cf.mat"); data_dt_500ums = load("2023-08-21_15-15_diffraction_tomo_m0_fast_cf.mat");
t = Ts*[0:length(data_dt_500ums.Dy_int)-1]; t = Ts*[0:length(data_dt_500ums.Dy_int)-1];
data_dt_500ums = structfun(@(field) field(t>0.275),data_dt_500ums, 'UniformOutput', false) data_dt_500ums = structfun(@(field) field(t>0.275),data_dt_500ums, 'UniformOutput', false);
data_dt_500ums.time = Ts*[0:length(data_dt_500ums.Dy_int)-1]; data_dt_500ums.time = Ts*[0:length(data_dt_500ums.Dy_int)-1];
%% 1mm/s - Complementary filters %% 1mm/s - Complementary filters
data_dt_1000ums = load("2023-08-21_15-16_diffraction_tomo_m0_fast_cf.mat"); data_dt_1000ums = load("2023-08-21_15-16_diffraction_tomo_m0_fast_cf.mat");
t = Ts*[0:length(data_dt_1000ums.Dy_int)-1]; t = Ts*[0:length(data_dt_1000ums.Dy_int)-1];
data_dt_1000ums = structfun(@(field) field(t>0.19),data_dt_1000ums, 'UniformOutput', false) data_dt_1000ums = structfun(@(field) field(t>0.19),data_dt_1000ums, 'UniformOutput', false);
data_dt_1000ums.time = Ts*[0:length(data_dt_1000ums.Dy_int)-1]; data_dt_1000ums.time = Ts*[0:length(data_dt_1000ums.Dy_int)-1];
#+end_src #+end_src
@ -4891,10 +4893,11 @@ exportFig('figs/test_id31_diffraction_tomo_setpoint.pdf', 'width', 'wide', 'heig
#+RESULTS: #+RESULTS:
[[file:figs/test_id31_diffraction_tomo_setpoint.png]] [[file:figs/test_id31_diffraction_tomo_setpoint.png]]
The measured errors in $D_y$, $D_z$ and $R_y$ directions are shown in Figure ref:fig:test_id31_diffraction_tomo. The positioning errors measured along $D_y$, $D_z$, and $R_y$ directions are displayed in Figure ref:fig:test_id31_diffraction_tomo.
While the $D_z$ and $R_y$ errors are within specifications (see Figures ref:fig:test_id31_diffraction_tomo_dz and ref:fig:test_id31_diffraction_tomo_ry), the lateral error goes outside of specifications during acceleration and deceleration phases (Figure ref:fig:test_id31_diffraction_tomo_dy). The system maintained positioning errors within specifications for both $D_z$ and $R_y$ (Figures ref:fig:test_id31_diffraction_tomo_dz and ref:fig:test_id31_diffraction_tomo_ry).
However, it goes out of specifications during only during $\approx 20\,ms$, so the detector integration can just be delayed by $20\,ms$ which could be acceptable. However, lateral positioning errors exceeded specifications during acceleration and deceleration phases (Figure ref:fig:test_id31_diffraction_tomo_dy).
Another way to improve the errors in the $D_y$ direction would be to develop a feedforward controller. Since these large errors occurred only during $\approx 20\,ms$ intervals, the issue could be addressed by implementing a corresponding delay in detector integration.
Alternatively, developing a feedforward controller could improve lateral positioning accuracy during these transient phases.
#+begin_src matlab :exports none :results none #+begin_src matlab :exports none :results none
%% Diffraction Tomography - Dy errors for several configured velocities %% Diffraction Tomography - Dy errors for several configured velocities
@ -4970,7 +4973,6 @@ leg.ItemTokenSize(1) = 15;
exportFig('figs/test_id31_diffraction_tomo_ry.pdf', 'width', 'third', 'height', 'normal'); exportFig('figs/test_id31_diffraction_tomo_ry.pdf', 'width', 'third', 'height', 'normal');
#+end_src #+end_src
#+name: fig:test_id31_diffraction_tomo #+name: fig:test_id31_diffraction_tomo
#+caption: Diffraction tomography scans (combined $R_z$ and $D_y$ motions) at several $D_y$ velocities ($R_z$ rotational velocity is $6\,\text{deg/s}$). #+caption: Diffraction tomography scans (combined $R_z$ and $D_y$ motions) at several $D_y$ velocities ($R_z$ rotational velocity is $6\,\text{deg/s}$).
#+attr_latex: :options [htbp] #+attr_latex: :options [htbp]
@ -5033,158 +5035,104 @@ for i = i_dec(2:2:end)
end end
% Peak to Peak errors % Peak to Peak errors
dt_100ums_dy_peak = 1e9*(max(detrend(data_dt_100ums.Dy_int(i_dt_100ums)-data_dt_100ums.m_hexa_dy(i_dt_100ums), 0))-min(detrend(data_dt_100ums.Dy_int(i_dt_100ums)-data_dt_100ums.m_hexa_dy(i_dt_100ums), 0)))/2; dt_100ums_dy_peak = (max(detrend(data_dt_100ums.Dy_int(i_dt_100ums)-data_dt_100ums.m_hexa_dy(i_dt_100ums), 0))-min(detrend(data_dt_100ums.Dy_int(i_dt_100ums)-data_dt_100ums.m_hexa_dy(i_dt_100ums), 0)))/2;
dt_100ums_dz_peak = 1e9*(max(detrend(data_dt_100ums.Dz_int(i_dt_100ums), 0))-min(detrend(data_dt_100ums.Dz_int(i_dt_100ums), 0)))/2; dt_100ums_dz_peak = (max(detrend(data_dt_100ums.Dz_int(i_dt_100ums), 0))-min(detrend(data_dt_100ums.Dz_int(i_dt_100ums), 0)))/2;
dt_100ums_ry_peak = 1e6*(max(detrend(data_dt_100ums.Ry_int(i_dt_100ums), 0))-min(detrend(data_dt_100ums.Ry_int(i_dt_100ums), 0)))/2; dt_100ums_ry_peak = (max(detrend(data_dt_100ums.Ry_int(i_dt_100ums), 0))-min(detrend(data_dt_100ums.Ry_int(i_dt_100ums), 0)))/2;
dt_500ums_dy_peak = 1e9*(max(detrend(data_dt_500ums.Dy_int(i_dt_500ums)-data_dt_500ums.m_hexa_dy(i_dt_500ums), 0))-min(detrend(data_dt_500ums.Dy_int(i_dt_500ums)-data_dt_500ums.m_hexa_dy(i_dt_500ums), 0)))/2; dt_500ums_dy_peak = (max(detrend(data_dt_500ums.Dy_int(i_dt_500ums)-data_dt_500ums.m_hexa_dy(i_dt_500ums), 0))-min(detrend(data_dt_500ums.Dy_int(i_dt_500ums)-data_dt_500ums.m_hexa_dy(i_dt_500ums), 0)))/2;
dt_500ums_dz_peak = 1e9*(max(detrend(data_dt_500ums.Dz_int(i_dt_500ums), 0))-min(detrend(data_dt_500ums.Dz_int(i_dt_500ums), 0)))/2; dt_500ums_dz_peak = (max(detrend(data_dt_500ums.Dz_int(i_dt_500ums), 0))-min(detrend(data_dt_500ums.Dz_int(i_dt_500ums), 0)))/2;
dt_500ums_ry_peak = 1e6*(max(detrend(data_dt_500ums.Ry_int(i_dt_500ums), 0))-min(detrend(data_dt_500ums.Ry_int(i_dt_500ums), 0)))/2; dt_500ums_ry_peak = (max(detrend(data_dt_500ums.Ry_int(i_dt_500ums), 0))-min(detrend(data_dt_500ums.Ry_int(i_dt_500ums), 0)))/2;
dt_1000ums_dy_peak = 1e9*(max(detrend(data_dt_1000ums.Dy_int(i_dt_1000ums)-data_dt_1000ums.m_hexa_dy(i_dt_1000ums), 0))-min(detrend(data_dt_1000ums.Dy_int(i_dt_1000ums)-data_dt_1000ums.m_hexa_dy(i_dt_1000ums), 0)))/2; dt_1000ums_dy_peak = (max(detrend(data_dt_1000ums.Dy_int(i_dt_1000ums)-data_dt_1000ums.m_hexa_dy(i_dt_1000ums), 0))-min(detrend(data_dt_1000ums.Dy_int(i_dt_1000ums)-data_dt_1000ums.m_hexa_dy(i_dt_1000ums), 0)))/2;
dt_1000ums_dz_peak = 1e9*(max(detrend(data_dt_1000ums.Dz_int(i_dt_1000ums), 0))-min(detrend(data_dt_1000ums.Dz_int(i_dt_1000ums), 0)))/2; dt_1000ums_dz_peak = (max(detrend(data_dt_1000ums.Dz_int(i_dt_1000ums), 0))-min(detrend(data_dt_1000ums.Dz_int(i_dt_1000ums), 0)))/2;
dt_1000ums_ry_peak = 1e6*(max(detrend(data_dt_1000ums.Ry_int(i_dt_1000ums), 0))-min(detrend(data_dt_1000ums.Ry_int(i_dt_1000ums), 0)))/2; dt_1000ums_ry_peak = (max(detrend(data_dt_1000ums.Ry_int(i_dt_1000ums), 0))-min(detrend(data_dt_1000ums.Ry_int(i_dt_1000ums), 0)))/2;
% RMS error % RMS error
dt_100ums_dy_rms = 1e9*(rms(detrend(data_dt_100ums.Dy_int(i_dt_100ums)-data_dt_100ums.m_hexa_dy(i_dt_100ums), 0))); data_dt_100ums.Dy_rms_cl = rms(detrend(data_dt_100ums.Dy_int(i_dt_100ums)-data_dt_100ums.m_hexa_dy(i_dt_100ums), 0));
dt_100ums_dz_rms = 1e9*(rms(detrend(data_dt_100ums.Dz_int(i_dt_100ums), 0))); data_dt_100ums.Dz_rms_cl = rms(detrend(data_dt_100ums.Dz_int(i_dt_100ums), 0));
dt_100ums_ry_rms = 1e6*(rms(detrend(data_dt_100ums.Ry_int(i_dt_100ums), 0))); data_dt_100ums.Ry_rms_cl = rms(detrend(data_dt_100ums.Ry_int(i_dt_100ums), 0));
dt_500ums_dy_rms = 1e9*(rms(detrend(data_dt_500ums.Dy_int(i_dt_500ums)-data_dt_500ums.m_hexa_dy(i_dt_500ums), 0))); data_dt_500ums.Dy_rms_cl = rms(detrend(data_dt_500ums.Dy_int(i_dt_500ums)-data_dt_500ums.m_hexa_dy(i_dt_500ums), 0));
dt_500ums_dz_rms = 1e9*(rms(detrend(data_dt_500ums.Dz_int(i_dt_500ums), 0))); data_dt_500ums.Dz_rms_cl = rms(detrend(data_dt_500ums.Dz_int(i_dt_500ums), 0));
dt_500ums_ry_rms = 1e6*(rms(detrend(data_dt_500ums.Ry_int(i_dt_500ums), 0))); data_dt_500ums.Ry_rms_cl = rms(detrend(data_dt_500ums.Ry_int(i_dt_500ums), 0));
dt_1000ums_dy_rms = 1e9*(rms(detrend(data_dt_1000ums.Dy_int(i_dt_1000ums)-data_dt_1000ums.m_hexa_dy(i_dt_1000ums), 0))); data_dt_1000ums.Dy_rms_cl = rms(detrend(data_dt_1000ums.Dy_int(i_dt_1000ums)-data_dt_1000ums.m_hexa_dy(i_dt_1000ums), 0));
dt_1000ums_dz_rms = 1e9*(rms(detrend(data_dt_1000ums.Dz_int(i_dt_1000ums), 0))); data_dt_1000ums.Dz_rms_cl = rms(detrend(data_dt_1000ums.Dz_int(i_dt_1000ums), 0));
dt_1000ums_ry_rms = 1e6*(rms(detrend(data_dt_1000ums.Ry_int(i_dt_1000ums), 0))); data_dt_1000ums.Ry_rms_cl = rms(detrend(data_dt_1000ums.Ry_int(i_dt_1000ums), 0));
#+end_src #+end_src
** Conclusion ** Conclusion
<<ssec:test_id31_scans_conclusion>> <<ssec:test_id31_scans_conclusion>>
For each conducted experiments, the $D_y$, $D_z$ and $R_y$ errors are computed and summarized in Table ref:tab:id31_experiments_results_summary. A comprehensive series of experimental validations was conducted to evaluate the NASS performance across a wide range of typical scientific experiments.
The system demonstrated robust performance in most scenarios, with positioning errors generally remaining within specified tolerances (30 nm RMS in $D_y$, 15 nm RMS in $D_z$, and 250 nrad RMS in $R_y$).
- [ ] Remove 20ms at the start of each scan for Dy For tomography experiments, the NASS successfully maintained positioning accuracy at rotational velocities up to $180\,\text{deg/s}$ with light payloads, though performance degraded somewhat with heavier masses.
- [ ] Add result for move aggressive controller (tomography, 180deg/s) The HAC-LAC control architecture proved particularly effective, with the decentralized IFF providing damping of nano-hexapod suspension modes while the high authority controller addressed low-frequency disturbances.
Vertical scanning capabilities were validated in both step-by-step and continuous motion modes.
The system successfully resolved 10 nm steps with 50 ms detector integration time, while maintaining positioning accuracy during continuous scans at speeds up to $100\,\mu m/s$.
For lateral scanning, the system performed well at moderate speeds ($10\,\mu m/s$) but showed limitations at higher velocities ($100\,\mu m/s$) due to stepper motor-induced vibrations in the $T_y$ stage.
The most challenging test case - diffraction tomography combining rotation and lateral scanning - demonstrated the system's ability to maintain vertical and angular stability while highlighting some limitations in lateral positioning during rapid accelerations.
These limitations could potentially be addressed through feedforward control or alternative detector triggering strategies.
Overall, the experimental results validate the effectiveness of the developed control architecture and demonstrate that the NASS meets most design specifications across a wide range of operating conditions (summarized in Table ref:tab:id31_experiments_results_summary).
The identified limitations, primarily related to high-speed lateral scanning and heavy payload handling, provide clear directions for future improvements.
#+begin_src matlab #+begin_src matlab
%% Summary of results %% Summary of results
data_results = [... 1e9*data_tomo_m0_Wz6.Dy_rms_ol, 1e9*data_tomo_m0_Wz6.Dz_rms_ol, 1e6*data_tomo_m0_Wz6.Ry_rms_ol % Tomo - OL - 6deg/s - 0kg
specs_dy_rms, specs_dz_rms, 1e3*specs_ry_rms ; ... % Specifications 1e9*data_tomo_m0_Wz6.Dy_rms_cl, 1e9*data_tomo_m0_Wz6.Dz_rms_cl, 1e6*data_tomo_m0_Wz6.Ry_rms_cl % Tomo - CL - 6deg/s - 0kg
1e9*data_tomo_1rpm_m0.Dy_rms_cl, 1e9*data_tomo_1rpm_m0.Dz_rms_cl, 1e9*data_tomo_1rpm_m0.Ry_rms_cl ; ... % Tomo 1rpm 1e9*data_tomo_m1_Wz6.Dy_rms_ol, 1e9*data_tomo_m1_Wz6.Dz_rms_ol, 1e6*data_tomo_m1_Wz6.Ry_rms_ol % Tomo - OL - 6deg/s - 13kg
1e9*data_tomo_30rpm_m0.Dy_rms_cl, 1e9*data_tomo_30rpm_m0.Dz_rms_cl, 1e9*data_tomo_30rpm_m0.Ry_rms_cl ; ... % Tomo 30rpm 1e9*data_tomo_m1_Wz6.Dy_rms_cl, 1e9*data_tomo_m1_Wz6.Dz_rms_cl, 1e6*data_tomo_m1_Wz6.Ry_rms_cl % Tomo - CL - 6deg/s - 13kg
1e9*rms(detrend(data_dz_10ums.e_dy, 0)), 1e9*rms(detrend(data_dz_10ums.e_dz, 0)), 1e9*rms(detrend(data_dz_10ums.e_ry, 0)) ; ... % Dz 10um/s 1e9*data_tomo_m2_Wz6.Dy_rms_ol, 1e9*data_tomo_m2_Wz6.Dz_rms_ol, 1e6*data_tomo_m2_Wz6.Ry_rms_ol % Tomo - OL - 6deg/s - 26kg
1e9*rms(detrend(data_dz_100ums.e_dy,0)), 1e9*rms(detrend(data_dz_100ums.e_dz,0)), 1e9*rms(detrend(data_dz_100ums.e_ry,0)) ; ... % Dz 100um/s 1e9*data_tomo_m2_Wz6.Dy_rms_cl, 1e9*data_tomo_m2_Wz6.Dz_rms_cl, 1e6*data_tomo_m2_Wz6.Ry_rms_cl % Tomo - CL - 6deg/s - 26kg
1e9*rms(detrend(data_ry.e_dy,0)), 1e9*rms(detrend(data_ry.e_dz,0)), 1e9*rms(detrend(data_ry.e_ry,0)) ; ... % Ry 100urad/s 1e9*data_tomo_m3_Wz6.Dy_rms_ol, 1e9*data_tomo_m3_Wz6.Dz_rms_ol, 1e6*data_tomo_m3_Wz6.Ry_rms_ol % Tomo - OL - 6deg/s - 39kg
1e9*rms(detrend(data_ty_cl_slow.e_dy, 0)), 1e9*rms(detrend(data_ty_cl_slow.e_dz, 0)), 1e9*rms(detrend(data_ty_cl_slow.e_ry, 0)) ; ... % Dy 10 um/s 1e9*data_tomo_m3_Wz6.Dy_rms_cl, 1e9*data_tomo_m3_Wz6.Dz_rms_cl, 1e6*data_tomo_m3_Wz6.Ry_rms_cl % Tomo - CL - 6deg/s - 39kg
1e9*rms(detrend(data_dt_100ums.Dy_int-data_dt_100ums.m_hexa_dy, 0)), 1e9*rms(detrend(data_dt_100ums.Dz_int, 0)), 1e9*rms(detrend(data_dt_100ums.Ry_int, 0)); ... % Diffraction tomo 0.1mm/s 1e9*data_tomo_m0_Wz180.Dy_rms_ol, 1e9*data_tomo_m0_Wz180.Dz_rms_ol, 1e6*data_tomo_m0_Wz180.Ry_rms_ol % Tomo - OL - 180deg/s - 0kg
1e9*rms(detrend(data_dt_1000ums.Dy_int-data_dt_1000ums.m_hexa_dy,0)), 1e9*rms(detrend(data_dt_1000ums.Dz_int,0)), 1e9*rms(detrend(data_dt_1000ums.Ry_int,0)) ... % Diffraction tomo 1mm/s 1e9*data_tomo_m0_Wz180.Dy_rms_cl, 1e9*data_tomo_m0_Wz180.Dz_rms_cl, 1e6*data_tomo_m0_Wz180.Ry_rms_cl % Tomo - CL - 180deg/s - 0kg
]; 1e9*data_hac_Wz180.Dy_rms_cl, 1e9*data_hac_Wz180.Dz_rms_cl, 1e6*data_hac_Wz180.Ry_rms_cl % Tomo - CL (high performance HAC) - 180deg/s - 0kg
#+end_src 1e9*data_ry.Dy_rms_cl, 1e9*data_ry.Dz_rms_cl, 1e6*data_ry.Ry_rms_cl % Ry 100urad/s
1e9*data_dz_10ums.Dy_rms_cl, 1e9*data_dz_10ums.Dz_rms_cl, 1e6*data_dz_10ums.Ry_rms_cl % Dz 10um/s
#+begin_src matlab :exports results :results value table replace :tangle no :post addhdr(*this*) 1e9*data_dz_100ums.Dy_rms_cl, 1e9*data_dz_100ums.Dz_rms_cl, 1e6*data_dz_100ums.Ry_rms_cl % Dz 100um/s
data2orgtable(data_results, {'Specifications', 'Tomography ($R_z$ 6 deg/s)', 'Tomography ($R_z$ 180 deg/s)', 'Dirty Layer ($D_z$ $10\,\mu m/s$)', 'Dirty Layer ($D_z$ $100\,\mu m/s$)', 'Reflectivity ($R_y$ $100\,\mu\text{rad}/s$)', 'Lateral Scan ($D_y$ $10\,\mu m/s$)', 'Diffraction Tomography ($R_z$ 1rpm, $D_y$ 0.1mm/s)', 'Diffraction Tomography ($R_z$ 1rpm, $D_y$ 1mm/s)'}, {'$D_y$ [nmRMS]', '$D_z$ [nmRMS]', '$R_y$ [nradRMS]'}, ' %.0f '); 1e9*data_ty_ol_10ums.Dy_rms, 1e9*data_ty_ol_10ums.Dz_rms, 1e6*data_ty_ol_10ums.Ry_rms % Ty - OL - 10um/s
1e9*data_ty_cl_10ums.Dy_rms, 1e9*data_ty_cl_10ums.Dz_rms, 1e6*data_ty_cl_10ums.Ry_rms % Ty - CL - 10um/s
1e9*data_ty_ol_100ums.Dy_rms, 1e9*data_ty_ol_100ums.Dz_rms, 1e6*data_ty_ol_100ums.Ry_rms % Ty - OL - 100um/s
1e9*data_ty_cl_100ums.Dy_rms, 1e9*data_ty_cl_100ums.Dz_rms, 1e6*data_ty_cl_100ums.Ry_rms % Ty - CL - 100um/s
1e9*data_dt_100ums.Dy_rms_cl, 1e9*data_dt_100ums.Dz_rms_cl, 1e6*data_dt_100ums.Ry_rms_cl % Diffraction Tomo - CL - 6deg/s, 100um/s
1e9*data_dt_500ums.Dy_rms_cl, 1e9*data_dt_500ums.Dz_rms_cl, 1e6*data_dt_500ums.Ry_rms_cl % Diffraction Tomo - CL - 6deg/s, 500um/s
1e9*data_dt_1000ums.Dy_rms_cl, 1e9*data_dt_1000ums.Dz_rms_cl, 1e6*data_dt_1000ums.Ry_rms_cl % Diffraction Tomo - CL - 6deg/s, 1000um/s
#+end_src #+end_src
#+name: tab:id31_experiments_results_summary #+name: tab:id31_experiments_results_summary
#+caption: Table caption #+caption: Summary of the experimental results performed with the NASS on ID31. Open-loop errors are indicated at the left of the arrows. Closed-loop errors that are out of specifications are indicated by bold number.
#+attr_latex: :environment tabularx :width \linewidth :align Xccc #+attr_latex: :environment tabularx :width \linewidth :align Xccc
#+attr_latex: :center t :booktabs t #+attr_latex: :center t :booktabs t
#+RESULTS: | *Experiments* | $\bm{D_y}$ *[nmRMS]* | $\bm{D_z}$ *[nmRMS]* | $\bm{R_y}$ *[nradRMS]* |
| | $D_y$ [nmRMS] | $D_z$ [nmRMS] | $R_y$ [nradRMS] | |---------------------------------------------------------+-----------------------------+---------------------------+-----------------------------|
|----------------------------------------------------+---------------+---------------+-----------------| | Tomography ($6\,\text{deg/s}$) | $142 \Rightarrow 15$ | $32 \Rightarrow 5$ | $464 \Rightarrow 56$ |
| Specifications | | | | | Tomography ($6\,\text{deg/s}$, 13kg) | $149 \Rightarrow 25$ | $26 \Rightarrow 6$ | $471 \Rightarrow 55$ |
|----------------------------------------------------+---------------+---------------+-----------------| | Tomography ($6\,\text{deg/s}$, 26kg) | $202 \Rightarrow 25$ | $36 \Rightarrow 7$ | $1737 \Rightarrow 104$ |
| Tomography ($R_z$ 1rpm) | 15 | 5 | 55 | | Tomography ($6\,\text{deg/s}$, 39kg) | $297 \Rightarrow \bm{53}$ | $38 \Rightarrow 9$ | $1737 \Rightarrow 170$ |
| Tomography ($R_z$ 6rpm) | 19 | 5 | 73 | |---------------------------------------------------------+-----------------------------+---------------------------+-----------------------------|
| Tomography ($R_z$ 30rpm) | 38 | 10 | 129 | | Tomography ($180\,\text{deg/s}$) | $143 \Rightarrow \bm{38}$ | $24 \Rightarrow 11$ | $252 \Rightarrow 130$ |
|----------------------------------------------------+---------------+---------------+-----------------| | Tomography ($180\,\text{deg/s}$, custom HAC) | $143 \Rightarrow 29$ | $24 \Rightarrow 5$ | $252 \Rightarrow 142$ |
| Dirty Layer ($D_z$ $10\,\mu m/s$) | 25 | 5 | 114 | |---------------------------------------------------------+-----------------------------+---------------------------+-----------------------------|
| Dirty Layer ($D_z$ $100\,\mu m/s$) | 34 | 15 | 130 | | Reflectivity ($100\,\mu\text{rad}/s$) | $28$ | $6$ | $118$ |
|----------------------------------------------------+---------------+---------------+-----------------| |---------------------------------------------------------+-----------------------------+---------------------------+-----------------------------|
| Reflectivity ($R_y$ $100\,\mu\text{rad}/s$) | 28 | 6 | 118 | | $D_z$ scan ($10\,\mu m/s$) | $25$ | $5$ | $108$ |
|----------------------------------------------------+---------------+---------------+-----------------| | $D_z$ scan ($100\,\mu m/s$) | $\bm{35}$ | $9$ | $132$ |
| Lateral Scan ($D_y$ $10\,\mu m/s$) | 21 | 10 | 37 | |---------------------------------------------------------+-----------------------------+---------------------------+-----------------------------|
|----------------------------------------------------+---------------+---------------+-----------------| | Lateral Scan ($10\,\mu m/s$) | $585 \Rightarrow 21$ | $155 \Rightarrow 10$ | $6300 \Rightarrow 60$ |
| Diffraction Tomography ($R_z$ 1rpm, $D_y$ 0.1mm/s) | 75 | 9 | 118 | | Lateral Scan ($100\,\mu m/s$) | $1063 \Rightarrow \bm{732}$ | $167 \Rightarrow \bm{20}$ | $6445 \Rightarrow \bm{356}$ |
| Diffraction Tomography ($R_z$ 1rpm, $D_y$ 1mm/s) | 428 | 11 | 169 | |---------------------------------------------------------+-----------------------------+---------------------------+-----------------------------|
| Diffraction tomography ($6\,\text{deg/s}$, $0.1\,mm/s$) | $\bm{36}$ | $7$ | $113$ |
| Diffraction tomography ($6\,\text{deg/s}$, $0.5\,mm/s$) | $29$ | $8$ | $81$ |
# #+caption: RMS values of the measured errors during open-loop and closed-loop tomography scans ($6\,\text{deg/s}$) for all considered payloads. Measured closed-Loop errors are indicated by "bold" font. | Diffraction tomography ($6\,\text{deg/s}$, $1\,mm/s$) | $\bm{53}$ | $10$ | $135$ |
# | | $D_y$ | $D_z$ | $R_y$ | |---------------------------------------------------------+-----------------------------+---------------------------+-----------------------------|
# |------------------+----------------------------------------------+--------------------------------------------+--------------------------------------------------| | *Specifications* | $30$ | $15$ | $250$ |
# | $0\,kg$ | $142 \Longrightarrow \bm{15}\,\text{nm RMS}$ | $32 \Longrightarrow \bm{5}\,\text{nm RMS}$ | $460 \Longrightarrow \bm{55}\,\text{nrad RMS}$ |
# | $13\,kg$ | $149 \Longrightarrow \bm{25}\,\text{nm RMS}$ | $26 \Longrightarrow \bm{6}\,\text{nm RMS}$ | $470 \Longrightarrow \bm{55}\,\text{nrad RMS}$ |
# | $26\,kg$ | $202 \Longrightarrow \bm{25}\,\text{nm RMS}$ | $36 \Longrightarrow \bm{7}\,\text{nm RMS}$ | $1700 \Longrightarrow \bm{103}\,\text{nrad RMS}$ |
# | $39\,kg$ | $297 \Longrightarrow \bm{53}\,\text{nm RMS}$ | $38 \Longrightarrow \bm{9}\,\text{nm RMS}$ | $1700 \Longrightarrow \bm{169}\,\text{nrad RMS}$ |
# |------------------+----------------------------------------------+--------------------------------------------+--------------------------------------------------|
# | *Specifications* | $30\,\text{nmRMS}$ | $15\,\text{nmRMS}$ | $250\,\text{nradRMS}$ |
# #+caption: RMS values of the errors for a tomography experiment at $180\,\text{deg/s}$ and without payload. Experimental results and simulation are compared.
# | | $D_y$ | $D_z$ | $R_y$ |
# |-----------------+-----------------------+--------------------+------------------------|
# | Experiment (OL) | $1.8\,\mu\text{mRMS}$ | $24\,\text{nmRMS}$ | $10\,\mu\text{radRMS}$ |
# |-----------------+-----------------------+--------------------+------------------------|
# | Simulation (CL) | $30\,\text{nmRMS}$ | $8\,\text{nmRMS}$ | $73\,\text{nradRMS}$ |
# | Experiment (CL) | $39\,\text{nmRMS}$ | $11\,\text{nmRMS}$ | $130\,\text{nradRMS}$ |
# |-----------------+-----------------------+--------------------+------------------------|
# | Specifications | $30\,\text{nmRMS}$ | $15\,\text{nmRMS}$ | $250\,\text{nradRMS}$ |
# #+caption: Dz scans, RMS values
# #+RESULTS:
# | | $D_y$ | $D_z$ | $R_y$ |
# |---------+-------+-------+-------|
# | Specs | 100.0 | 50.0 | 0.85 |
# | 10um/s | 82.35 | 17.94 | 0.41 |
# | 100um/s | 98.72 | 41.45 | 0.48 |
# #+caption: Dz scans, Peak 2 Peak values
# #+RESULTS:
# | | $D_y$ | $D_z$ | $R_y$ |
# |---------+-------+-------+-------|
# | Specs | 30.0 | 15.0 | 0.25 |
# | 10um/s | 25.11 | 5.04 | 0.11 |
# | 100um/s | 34.84 | 9.08 | 0.13 |
# #+caption: Dy scans, RMS values
# #+RESULTS:
# | | $D_y$ | $D_z$ | $R_y$ |
# |--------------+---------+--------+-------|
# | Specs | 30.0 | 15.0 | 0.25 |
# |--------------+---------+--------+-------|
# | 10um/s (OL) | 585.43 | 154.51 | 6.3 |
# | 10um/s (CL) | 20.64 | 9.67 | 0.06 |
# |--------------+---------+--------+-------|
# | 100um/s (OL) | 1063.58 | 166.85 | 6.44 |
# | 100um/s (CL) | 731.63 | 19.91 | 0.36 |
# #+caption: Dy scans, peak to peak values
# #+RESULTS:
# | | $D_y$ | $D_z$ | $R_y$ |
# |--------------+---------+--------+-------|
# | Specs | 100.0 | 50.0 | 0.85 |
# | 10um/s (OL) | 1167.8 | 308.35 | 11.06 |
# | 10um/s (CL) | 86.36 | 41.6 | 0.28 |
# | 100um/s (OL) | 2687.67 | 328.45 | 11.26 |
# | 100um/s (CL) | 1339.31 | 69.5 | 0.91 |
# #+caption: Diffraction tomography, Rz at 6deg/s, RMS values
# #+RESULTS:
# | Velocity | $D_y$ [nmRMS] | $D_z$ [nmRMS] | $R_y$ [$\mu\text{radRMS}$] |
# |----------+---------------+---------------+----------------------------|
# | Specs | 100.0 | 50.0 | 0.85 |
# | 0.1 mm/s | 208.25 | 35.33 | 0.73 |
# | 0.5 mm/s | 117.94 | 28.03 | 0.27 |
# | 1 mm/s | 186.88 | 33.02 | 0.53 |
# #+caption: Diffraction tomography, Rz at 6deg/s, peak 2 peak values
# #+RESULTS:
# | Velocity | $D_y$ [nmRMS] | $D_z$ [nmRMS] | $R_y$ [$\mu\text{radRMS}$] |
# |----------+---------------+---------------+----------------------------|
# | Specs | 30.0 | 15.0 | 0.25 |
# | 0.1 mm/s | 36.18 | 7.35 | 0.11 |
# | 0.5 mm/s | 28.58 | 7.52 | 0.08 |
# | 1 mm/s | 53.05 | 9.84 | 0.14 |
* Conclusion * Conclusion
:PROPERTIES: :PROPERTIES:
@ -5192,6 +5140,24 @@ data2orgtable(data_results, {'Specifications', 'Tomography ($R_z$ 6 deg/s)', 'To
:END: :END:
<<ssec:test_id31_conclusion>> <<ssec:test_id31_conclusion>>
This chapter presented a comprehensive experimental validation of the Nano Active Stabilization System (NASS) on the ID31 beamline, demonstrating its capability to maintain precise sample positioning during various experimental scenarios.
The implementation and testing followed a systematic approach, beginning with the development of a short-stroke metrology system to measure the sample's position, followed by the successful implementation of a HAC-LAC control architecture, and concluding in extensive performance validation across diverse experimental conditions.
The short-stroke metrology system, while designed as an temporary solution, proved effective in providing high bandwidth and low noise 5-DoF position measurements.
The careful alignment of the fibered interferometers targeting two reference spheres ensured reliable measurements throughout the testing campaign.
The implementation of the control architecture validated the theoretical framework developed earlier in the project.
The decentralized Integral Force Feedback (IFF) controller successfully provided robust damping of suspension modes across all payload conditions (0-39 kg), reducing peak amplitudes by approximately a factor of 10.
The High Authority Controller (HAC) effectively managed low-frequency disturbances, though its performance showed some dependency on payload mass, particularly for lateral motion control.
The experimental validation encompassed a wide range of scientific scenarios.
The system demonstrated remarkable performance in most conditions, meeting the stringent positioning requirements (30 nm RMS in $D_y$, 15 nm RMS in $D_z$, and 250 nrad RMS in $R_y$) for the majority of test cases.
Some limitations were identified, particularly in handling heavy payloads during rapid motions and in managing high-speed lateral scanning with the existing stepper motor $T_y$ stage.
The successful validation of the NASS demonstrates that, once an accurate online metrology system is developed, it will be ready for integration into actual beamline operations.
The system's ability to maintain precise sample positioning across a wide range of experimental conditions, combined with its robust performance and adaptive capabilities, suggests it will significantly enhance the quality and efficiency of X-ray experiments at ID31.
Moreover, the systematic approach to system development and validation, along with the detailed understanding of performance limitations, provides valuable insights for future improvements and potential applications in similar high-precision positioning systems.
* Bibliography :ignore: * Bibliography :ignore:
#+latex: \printbibliography[heading=bibintoc,title={Bibliography}] #+latex: \printbibliography[heading=bibintoc,title={Bibliography}]

Binary file not shown.

View File

@ -1,4 +1,4 @@
% Created 2025-02-03 Mon 18:41 % Created 2025-02-04 Tue 12:58
% Intended LaTeX compiler: pdflatex % Intended LaTeX compiler: pdflatex
\documentclass[a4paper, 10pt, DIV=12, parskip=full, bibliography=totoc]{scrreprt} \documentclass[a4paper, 10pt, DIV=12, parskip=full, bibliography=totoc]{scrreprt}
@ -12,10 +12,10 @@
\bibliography{test-bench-id31.bib} \bibliography{test-bench-id31.bib}
\author{Dehaeze Thomas} \author{Dehaeze Thomas}
\date{\today} \date{\today}
\title{Nano-Hexapod on the micro-station} \title{Experimental Validation on the ID31 Beamline}
\hypersetup{ \hypersetup{
pdfauthor={Dehaeze Thomas}, pdfauthor={Dehaeze Thomas},
pdftitle={Nano-Hexapod on the micro-station}, pdftitle={Experimental Validation on the ID31 Beamline},
pdfkeywords={}, pdfkeywords={},
pdfsubject={}, pdfsubject={},
pdfcreator={Emacs 29.4 (Org mode 9.6)}, pdfcreator={Emacs 29.4 (Org mode 9.6)},
@ -29,17 +29,23 @@
\clearpage \clearpage
Now that the nano-hexapod is mounted and that the the multi-body model of the nano-hexapod could be validated based on dynamics measurements, the complete NASS is mounted as shown in Figure \ref{fig:test_id31_micro_station_nano_hexapod} and the performances are evaluated on the ID31 beamline. The nano-hexapod's mounting and validation through dynamics measurements marks a crucial milestone in the development of the Nano Active Stabilization System (NASS).
This chapter presents a comprehensive experimental evaluation of the complete system's performance on the ID31 beamline, focusing on its ability to maintain precise sample positioning during various experimental conditions.
At the beginning of the project, it was planned to develop a long stroke 5-DoF metrology system to measure the pose of the sample with respect to the granite. Initially, the project planned to develop a long-stroke (\(\approx 1 \, cm^3\)) 5-DoF metrology system to measure sample position relative to the granite base.
The development of such system was complex, and was not completed at the time of the experimental tests on ID31. However, the complexity of this development prevented its completion before the experimental testing phase on ID31.
To still be able to validate the developed nano active platform and the associated instrumentation and control architecture, a 5-DoF short stroke metrology system is developed and presented in Section \ref{sec:test_id31_metrology}. To proceed with validation of the nano active platform and its associated control architecture, an alternative short-stroke (\(> 100\,\mu m^3\)) metrology system was developed, which is presented in Section \ref{sec:test_id31_metrology}.
The identify dynamics of the nano-hexapod fixed on top of the micro-station is identified for different experimental conditions (payload masses, rotational velocities) and compared with the multi-body model in Section \ref{sec:test_id31_open_loop_plant}. Then, several key aspects of the system validation are examined.
Section \ref{sec:test_id31_open_loop_plant} analyzes the identified dynamics of the nano-hexapod mounted on the micro-station under various experimental conditions, including different payload masses and rotational velocities.
These measurements are compared with predictions from the multi-body model to verify its accuracy and applicability for control design.
In order to apply the developed HAC-LAC architecture, decentralized Integral Force Feedback is first applied to actively damp the plant in a robust way (Section \ref{sec:test_id31_iff}), and the high authority controller is then implemented (Section \ref{sec:test_id31_hac}). Sections \ref{sec:test_id31_iff} and \ref{sec:test_id31_hac} focus on the implementation and validation of the HAC-LAC control architecture.
First, Section \ref{sec:test_id31_iff} demonstrates the application of decentralized Integral Force Feedback for robust active damping of the nano-hexapod's suspension modes.
This is followed in Section \ref{sec:test_id31_hac} by the implementation of the high authority controller, which addresses low-frequency disturbances and completes the control system design.
Finally, the positioning accuracy of the NASS is evaluated by performing scans corresponding to several scientific experiments (Section \ref{sec:test_id31_experiments}) Finally, Section \ref{sec:test_id31_experiments} evaluates the NASS's positioning performances through a comprehensive series of experiments that mirror typical scientific applications.
These include tomography scans at various speeds and with different payload masses, reflectivity measurements, and combined motion sequences that test the system's full capabilities.
\begin{figure}[htbp] \begin{figure}[htbp]
\begin{subfigure}{0.49\textwidth} \begin{subfigure}{0.49\textwidth}
@ -745,28 +751,28 @@ These results demonstrate both the effectiveness and limitations of implementing
\chapter{Validation with Scientific experiments} \chapter{Validation with Scientific experiments}
\label{sec:test_id31_experiments} \label{sec:test_id31_experiments}
In this section, the goal is to evaluate the performances of the NASS and validate its use for real work scientific experiments. In this section, the goal is to evaluate the performances of the NASS and validate its use for typical scientific experiments.
However, the online metrology prototype (presented in Section \ref{sec:test_id31_metrology}) does not allow samples to be placed on top of the nano-hexapod while being illuminated by the x-ray beam. However, the online metrology prototype (presented in Section \ref{sec:test_id31_metrology}) does not allow samples to be placed on top of the nano-hexapod while being illuminated by the x-ray beam.
Nevertheless, in order to fully validate the NASS, typical motion performed during scientific experiments can be mimicked, and the positioning performances can be evaluated. Nevertheless, in order to fully validate the NASS, typical motion performed during scientific experiments can be mimicked, and the positioning performances can be evaluated.
Several scientific experiments are mimicked, such as: Several scientific experiments are here replicated, such as:
\begin{itemize} \begin{itemize}
\item Tomography scans: continuous rotation of the Spindle along the vertical axis (Section \ref{ssec:test_id31_scans_tomography}) \item Tomography scans: continuous rotation of the Spindle along the vertical axis (Section \ref{ssec:test_id31_scans_tomography})
\item Reflectivity scans: \(R_y\) rotations using the tilt-stage (Section \ref{ssec:test_id31_scans_reflectivity}) \item Reflectivity scans: \(R_y\) rotations using the tilt-stage (Section \ref{ssec:test_id31_scans_reflectivity})
\item Vertical layer scans: the nano-hexapod is used to perform \(D_z\) step motion or ramp scans (Section \ref{ssec:test_id31_scans_dz}) \item Vertical layer scans: \(D_z\) step motion or ramp scans using the nano-hexapod (Section \ref{ssec:test_id31_scans_dz})
\item Lateral scans: \(D_y\) scans using the \(T_y\) translation stage (Section \ref{ssec:test_id31_scans_dy}) \item Lateral scans: \(D_y\) scans using the \(T_y\) translation stage (Section \ref{ssec:test_id31_scans_dy})
\item Diffraction Tomography: the Spindle is performing continuous \(R_z\) rotation while the translation stage is performing lateral \(D_y\) scans at the same time. \item Diffraction Tomography:continuous \(R_z\) rotation using the Spindle and lateral \(D_y\) scans performed at the same time using the translation stage.
This is the experiment with the most stringent requirements (Section \ref{ssec:test_id31_scans_diffraction_tomo}) This is the experiment with the most stringent requirements (Section \ref{ssec:test_id31_scans_diffraction_tomo})
\end{itemize} \end{itemize}
Unless explicitly stated, all the closed-loop experiments are performed using the robust (i.e. conservative) high authority controller designed in Section \ref{ssec:test_id31_iff_hac_controller}. Unless explicitly stated, all the closed-loop experiments are performed using the robust (i.e. conservative) high authority controller designed in Section \ref{ssec:test_id31_iff_hac_controller}.
For each experiment, the obtained performances are compared to the specifications for the most depending case in which nano-focusing optics are used to focus the beam down to \(200\,nm\times 100\,nm\). For each experiment, the obtained performances are compared to the specifications for the most depending case in which nano-focusing optics are used to focus the beam down to \(200\,nm\times 100\,nm\).
In that case the goal is to keep the sample's point of interested in the beam, and therefore the \(D_y\) and \(D_z\) positioning errors should be less than \(200\,nm\) and \(100\,nm\) peak-to-peak respectively. In this case, the goal is to keep the sample's point of interested in the beam, and therefore the \(D_y\) and \(D_z\) positioning errors should be less than \(200\,nm\) and \(100\,nm\) peak-to-peak respectively.
The \(R_y\) error should be less than \(1.7\,\mu\text{rad}\) peak-to-peak. The \(R_y\) error should be less than \(1.7\,\mu\text{rad}\) peak-to-peak.
In terms of RMS errors, this corresponds to \(30\,nm\) in \(D_y\), \(15\,nm\) in \(D_z\) and \(250\,\text{nrad}\) in \(R_y\) (a summary of the specifications is given in Table \ref{tab:test_id31_experiments_specifications}). In terms of RMS errors, this corresponds to \(30\,nm\) in \(D_y\), \(15\,nm\) in \(D_z\) and \(250\,\text{nrad}\) in \(R_y\) (a summary of the specifications is given in Table \ref{tab:test_id31_experiments_specifications}).
Obtained results for all the experiments are summarized and compared with the specifications in Section \ref{ssec:test_id31_scans_conclusion}. Results obtained for all the experiments are summarized and compared to the specifications in Section \ref{ssec:test_id31_scans_conclusion}.
\begin{table}[htbp] \begin{table}[htbp]
\caption{\label{tab:test_id31_experiments_specifications}Specifications for the Nano-Active-Stabilization-System} \caption{\label{tab:test_id31_experiments_specifications}Specifications for the Nano-Active-Stabilization-System}
@ -785,13 +791,13 @@ RMS & 30nm & 15nm & \(250\,\text{nrad}\)\\
\paragraph{Slow Tomography scans} \paragraph{Slow Tomography scans}
First, tomography scans are performed with a rotational velocity of \(6\,\text{deg/s}\) for all considered payload masses (shown in Figure \ref{fig:test_id31_picture_masses}). First, tomography scans are performed with a rotational velocity of \(6\,\text{deg/s}\) for all considered payload masses (shown in Figure \ref{fig:test_id31_picture_masses}).
For each experiment, a complete spindle rotation was first performed in open-loop, and then the loop was closed during another full spindle rotation. Each experimental sequence consisted of two complete spindle rotations: an initial open-loop rotation followed by a closed-loop rotation.
The experimental results for the \(26\,\text{kg}\) payload are presented in Figure \ref{fig:test_id31_tomo_m2_1rpm_robust_hac_iff_fit}.
Results with the \(26\,\text{kg}\) payload is shown in Figure \ref{fig:test_id31_tomo_m2_1rpm_robust_hac_iff_fit}. Due to static deformation of the micro-station stages under payload loading, a significant eccentricity was observed between the point of interest and the spindle rotation axis.
The eccentricity between the ``point of interest'' and the spindle rotation axis is quite large as the added payload mass statically deforms the micro-station stages. To establish a theoretical lower bound for open-loop errors, an ideal scenario was assumed where the point of interest perfectly aligns with the spindle rotation axis.
To estimate the open-loop errors, it is here supposed that the ``point of interest'' can be perfectly aligned with the spindle rotation axis. This idealized case was simulated by first calculating the eccentricity through circular fitting (represented by the dashed black circle in Figure \ref{fig:test_id31_tomo_m2_1rpm_robust_hac_iff_fit}), and then subtracting it from the measured data, as shown in Figure \ref{fig:test_id31_tomo_m2_1rpm_robust_hac_iff_fit_removed}.
To simulate this case, the eccentricity is first estimated by performing a circular fit (dashed black circle in Figure \ref{fig:test_id31_tomo_m2_1rpm_robust_hac_iff_fit}), and is then subtracted from the data in Figure \ref{fig:test_id31_tomo_m2_1rpm_robust_hac_iff_fit_removed}. While this approach likely underestimates actual open-loop errors, as perfect alignment is practically unattainable, it enables a more balanced comparison with closed-loop performance.
This underestimate the real open-loop errors as it is difficult to obtain a perfect alignment in practice, but it provides a more equitable comparison with the closed-loop case.
\begin{figure}[htbp] \begin{figure}[htbp]
\begin{subfigure}{0.49\textwidth} \begin{subfigure}{0.49\textwidth}
@ -809,9 +815,9 @@ This underestimate the real open-loop errors as it is difficult to obtain a perf
\caption{\label{fig:test_id31_tomo_m2_1rpm_robust_hac_iff}Tomography experiment with rotation velocity of \(6\,\text{deg/s}\), and payload mass of 26kg. Errors in the \((x,y)\) plane are shown in (\subref{fig:test_id31_tomo_m2_1rpm_robust_hac_iff_fit}). The estimated eccentricity is displayed by the black dashed circle. Errors with subtracted eccentricity are shown in (\subref{fig:test_id31_tomo_m2_1rpm_robust_hac_iff_fit_removed}).} \caption{\label{fig:test_id31_tomo_m2_1rpm_robust_hac_iff}Tomography experiment with rotation velocity of \(6\,\text{deg/s}\), and payload mass of 26kg. Errors in the \((x,y)\) plane are shown in (\subref{fig:test_id31_tomo_m2_1rpm_robust_hac_iff_fit}). The estimated eccentricity is displayed by the black dashed circle. Errors with subtracted eccentricity are shown in (\subref{fig:test_id31_tomo_m2_1rpm_robust_hac_iff_fit_removed}).}
\end{figure} \end{figure}
After removing the eccentricity for each experiment, the remaining measured motion are shown in the \(Y-Z\) plane and compared with the smallest beam size in Figure \ref{fig:test_id31_tomo_Wz36_results}. After eccentricity compensation for each experiment, the residual motion in the \(Y-Z\) is compared against the minimum beam size, as illustrated in Figure \ref{fig:test_id31_tomo_Wz36_results}.
Results are indicating the NASS succeeds in keeping the sample's point of interests on the beam, except for the highest mass of \(39\,\text{kg}\) for which the lateral motion is a bit too high. Results are indicating the NASS succeeds in keeping the sample's point of interests on the beam, except for the highest mass of \(39\,\text{kg}\) for which the lateral motion is a bit too high.
This confirms what was found during the tomography simulations performed in Section \ref{ssec:test_id31_iff_hac_robustness}. These experimental findings align with the predictions from the tomography simulations presented in Section \ref{ssec:test_id31_iff_hac_robustness}.
\begin{figure}[htbp] \begin{figure}[htbp]
\centering \centering
@ -821,10 +827,10 @@ This confirms what was found during the tomography simulations performed in Sect
\paragraph{Fast Tomography scans} \paragraph{Fast Tomography scans}
A tomography experiment was then performed with the highest rotational velocity of the Spindle: \(180\,\text{deg/s}\)\footnote{The highest rotational velocity of \(360\,\text{deg/s}\) could not be tested due to issue in the Spindle's controller.}. A tomography experiment was then performed with the highest rotational velocity of the Spindle: \(180\,\text{deg/s}\)\footnote{The highest rotational velocity of \(360\,\text{deg/s}\) could not be tested due to an issue in the Spindle's controller.}.
The measured position of the ``point of interest'' during the experiment is shown in Figure \ref{fig:test_id31_tomo_m0_30rpm_robust_hac_iff_exp}. The trajectory of the point of interest during this fast tomography scan is shown in Figure \ref{fig:test_id31_tomo_m0_30rpm_robust_hac_iff_exp}.
Obtained results are similar to the simulated ones (Figure \ref{fig:test_id31_tomo_m0_30rpm_robust_hac_iff_sim}) even though performances are a bit worse experimentally. While the experimental results closely mirror the simulation results (Figure \ref{fig:test_id31_tomo_m0_30rpm_robust_hac_iff_sim}), the actual performance are slightly lower than predicted.
Results obtained with this robust (i.e. conservative) HAC are already close to the specifications. Nevertheless, even with this robust (conservative) HAC implementation, the system performance approaches the specified requirements.
\begin{figure}[htbp] \begin{figure}[htbp]
\begin{subfigure}{0.49\textwidth} \begin{subfigure}{0.49\textwidth}
@ -844,14 +850,15 @@ Results obtained with this robust (i.e. conservative) HAC are already close to t
\paragraph{Cumulative Amplitude Spectra} \paragraph{Cumulative Amplitude Spectra}
In order to see how the HAC-LAC strategy reduces the positioning errors, three tomography scans with a rotational velocity of \(180\,\text{deg/s}\) are performed: in open-loop, with the decentralized IFF, and with the HAC-LAC strategy. A comparative analysis was conducted using three tomography scans at \(180,\text{deg/s}\) to evaluate the effectiveness of the HAC-LAC strategy in reducing positioning errors.
For this particular measurement, a slightly more aggressive high authority controller was designed to work specifically with low payload masses in order to fulfill the requirements. The scans were performed under three conditions: open-loop, with decentralized IFF control, and with the complete HAC-LAC strategy.
For these specific measurements, an enhanced high authority controller was optimized for low payload masses to meet performance requirements.
Cumulative amplitude spectra of the measured position errors are computed for the three cases and are compared in Figure \ref{fig:test_id31_hac_cas_cl}. Figure \ref{fig:test_id31_hac_cas_cl} presents the cumulative amplitude spectra of the position errors for all three cases.
It can be observed that the decentralized IFF decreases the vibrations around the suspension modes of the nano-hexapod (that would not be possible to do with a HAC alone), and then the high authority controller reduces the low frequency vibrations that are mainly due to guiding errors of the Spindle. The results reveal two distinct control contributions: the decentralized IFF effectively attenuates vibrations near the nano-hexapod suspension modes (an achievement not possible with HAC alone), while the high authority controller suppresses low-frequency vibrations primarily arising from Spindle guiding errors.
It is interesting to see the similarity of Figure \ref{fig:test_id31_hac_cas_cl} with the cumulative amplitude spectra computed very early in the project. Notably, the spectral patterns in Figure \ref{fig:test_id31_hac_cas_cl} closely resemble the cumulative amplitude spectra computed in the project's early stages.
This experiment also shows that designing a controller for specific experimental conditions (especially payload inertia) can lead to better performances. This experiment also illustrates that when needed, performance can be enhanced by designing controllers for specific experimental conditions, rather than relying solely on robust controllers that accommodate all payload ranges.
\begin{figure}[htbp] \begin{figure}[htbp]
\begin{subfigure}{0.33\textwidth} \begin{subfigure}{0.33\textwidth}
@ -878,9 +885,9 @@ This experiment also shows that designing a controller for specific experimental
\section{Reflectivity Scans} \section{Reflectivity Scans}
\label{ssec:test_id31_scans_reflectivity} \label{ssec:test_id31_scans_reflectivity}
X-ray reflectivity consists of scanning the \(R_y\) angle of thin structures (typically solid/liquid interfaces) through the beam. X-ray reflectivity measurements involve scanning thin structures, particularly solid/liquid interfaces, through the beam by varying the \(R_y\) angle.
Here, a \(R_y\) scan is performed with a rotational velocity of \(100\,\mu rad/s\) and the positioning errors in closed-loop are recorded (Figure \ref{fig:test_id31_reflectivity}). In this experiment, a \(R_y\) scan was executed at a rotational velocity of \(100,\mu rad/s\), and the closed-loop positioning errors were monitored (Figure \ref{fig:test_id31_reflectivity}).
It is shown that the NASS is able to keep the point of interest in the beam within specifications. The results confirm that the NASS successfully maintains the point of interest within the specified beam parameters throughout the scanning process.
\begin{figure}[htbp] \begin{figure}[htbp]
\begin{subfigure}{0.33\textwidth} \begin{subfigure}{0.33\textwidth}
@ -906,17 +913,16 @@ It is shown that the NASS is able to keep the point of interest in the beam with
\section{Dirty Layer Scans} \section{Dirty Layer Scans}
\label{ssec:test_id31_scans_dz} \label{ssec:test_id31_scans_dz}
In some cases, samples are composed of several atomic ``layers'' that are first aligned in the horizontal plane with precise \(R_x\) and \(R_y\) positioning and that are then scanned vertically with accurate \(D_z\) motion. In some cases, samples are composed of several atomic ``layers'' that are first aligned in the horizontal plane through \(R_x\) and \(R_y\) positioning, followed by vertical scanning with precise \(D_z\) motion.
The vertical scans can be performed continuously of using step-by-step motion. These vertical scans can be executed either continuously or in a step-by-step manner.
\paragraph{Step by Step \(D_z\) motion} \paragraph{Step by Step \(D_z\) motion}
Vertical steps are here performed using the nano-hexapod only. The vertical step motion is performed exclusively with the nano-hexapod.
Step sizes from \(10\,nm\) to \(1\,\mu m\) are tested, and the results are shown in Figure \ref{fig:test_id31_dz_mim_steps}. Testing was conducted across step sizes ranging from \(10,nm\) to \(1,\mu m\), with results presented in Figure \ref{fig:test_id31_dz_mim_steps}. The system successfully resolves 10nm steps when detectors integrate over a 50ms period (illustrated by the red curve in Figure \ref{fig:test_id31_dz_mim_10nm_steps}), which is compatible with many experimental requirements.
10nm steps can be resolved if detectors are integrating over 50ms (see red curve in Figure \ref{fig:test_id31_dz_mim_10nm_steps}), which is reasonable for many experiments.
When doing step-by-step scans, the time to reach the next value is quite critical as long settling time can render the total experiment excessively long. In step-by-step scanning procedures, settling time is a critical parameter as it significantly impacts the total experiment duration.
The response time to reach the wanted value (to within \(\pm 20\,nm\)) is around \(70\,ms\) as shown with the \(1\,\mu m\) step response in Figure \ref{fig:test_id31_dz_mim_1000nm_steps}. The system achieves a response time of approximately \(70,ms\) to reach the target position (within \(\pm 20,nm\)), as demonstrated by the \(1,\mu m\) step response in Figure \ref{fig:test_id31_dz_mim_1000nm_steps}.
This is typically shorted for smaller steps. This settling duration typically decreases for smaller step sizes.
\begin{figure}[htbp] \begin{figure}[htbp]
\begin{subfigure}{0.33\textwidth} \begin{subfigure}{0.33\textwidth}
@ -942,10 +948,10 @@ This is typically shorted for smaller steps.
\paragraph{Continuous \(D_z\) motion: Dirty Layer Scans} \paragraph{Continuous \(D_z\) motion: Dirty Layer Scans}
In this section and for the following experiments, the NASS is used to performs ``ramp scans'' (i.e. constant velocity scans). For these and subsequent experiments, the NASS performs ``ramp scans'' (constant velocity scans).
To have no tracking errors, two integrators needs to be present in the feedback loop, and as the plant does not have integral action at low frequency, two integrators are included in the controller. To eliminate tracking errors, the feedback controller incorporates two integrators, compensating for the plant's lack of integral action at low frequencies.
The first test is a scan at \(10\,\mu m/s\), and the errors shown in Figure \ref{fig:test_id31_dz_scan_10ums} are well into the specifications (shown by the dashed lines). Initial testing at \(10,\mu m/s\) demonstrates positioning errors well within specifications (indicated by dashed lines in Figure \ref{fig:test_id31_dz_scan_10ums}).
\begin{figure}[htbp] \begin{figure}[htbp]
\begin{subfigure}{0.33\textwidth} \begin{subfigure}{0.33\textwidth}
@ -969,10 +975,9 @@ The first test is a scan at \(10\,\mu m/s\), and the errors shown in Figure \ref
\caption{\label{fig:test_id31_dz_scan_10ums}\(D_z\) scan with a velocity of \(10\,\mu m/s\). \(D_z\) setpoint, measured position and error are shown in (\subref{fig:test_id31_dz_scan_10ums_dz}). Errors in \(D_y\) and \(R_y\) are respectively shown in (\subref{fig:test_id31_dz_scan_10ums_dy}) and (\subref{fig:test_id31_dz_scan_10ums_ry})} \caption{\label{fig:test_id31_dz_scan_10ums}\(D_z\) scan with a velocity of \(10\,\mu m/s\). \(D_z\) setpoint, measured position and error are shown in (\subref{fig:test_id31_dz_scan_10ums_dz}). Errors in \(D_y\) and \(R_y\) are respectively shown in (\subref{fig:test_id31_dz_scan_10ums_dy}) and (\subref{fig:test_id31_dz_scan_10ums_ry})}
\end{figure} \end{figure}
A second scan is performed with a velocity of \(100\,\mu m/s\), which is the fastest velocity for \(D_z\) scans when the ultimate performances is wanted\footnote{Such scan could corresponding to a 1ms integration time (which is typically the smallest integration time) and 100nm ``resolution'' (equal to the vertical beam size).}. A subsequent scan at \(100,\mu m/s\) - the maximum velocity for high-precision \(D_z\) scans\footnote{Such scan could corresponding to a 1ms integration time (which is typically the smallest integration time) and 100nm ``resolution'' (equal to the vertical beam size).} - maintains positioning errors within specifications during the constant velocity phase, with deviations occurring only during acceleration and deceleration phases (Figure \ref{fig:test_id31_dz_scan_100ums}).
At this velocity, the positioning errors are also within the specifications except for the very start and very end of the motion (i.e. during acceleration/deceleration phases, see Figure \ref{fig:test_id31_dz_scan_100ums}). Since detectors typically operate only during the constant velocity phase, these transient deviations do not compromise measurement quality.
However, the detectors are usually triggered only during the constant velocity phase, so this is not not an issue. Yet, performance during acceleration phases could potentially be enhanced through the implementation of feedforward control.
The performances during acceleration phase may also be improved by using a feedforward controller.
\begin{figure}[htbp] \begin{figure}[htbp]
\begin{subfigure}{0.33\textwidth} \begin{subfigure}{0.33\textwidth}
@ -998,23 +1003,20 @@ The performances during acceleration phase may also be improved by using a feedf
\section{Lateral Scans} \section{Lateral Scans}
\label{ssec:test_id31_scans_dy} \label{ssec:test_id31_scans_dy}
Lateral scans are performed with the \(T_y\) stage. Lateral scans are executed using the \(T_y\) stage.
The stepper motor controller\footnote{The ``IcePAP'' \cite{janvier13_icepap} which is developed at the ESRF.} outputs the setpoint which is received by the Speedgoat. The stepper motor controller\footnote{The ``IcePAP'' \cite{janvier13_icepap} which is developed at the ESRF.} generates a setpoint that is transmitted to the Speedgoat.
In the Speedgoat, the setpoint is compared with the measured \(D_y\) position of the sample, and the Nano-Hexapod is used to correct positioning errors induced by the scanning of the \(T_y\) stage. Within the Speedgoat, the system computes the positioning error by comparing the measured \(D_y\) sample position against the received setpoint, and the Nano-Hexapod compensates for positioning errors introduced during \(T_y\) stage scanning.
The stroke is here limited to \(\pm 100\,\mu m\) due to the limited acceptance of the metrology system. The scanning range is constrained \(\pm 100\,\mu m\) due to the limited acceptance of the metrology system.
\paragraph{Slow scan} \paragraph{Slow scan}
The \(T_y\) stage is first scanned with a velocity of \(10\,\mu m/s\) which is typical for such experiments. Initial testing utilized a scanning velocity of \(10,\mu m/s\), which is typical for these experiments.
The errors in open-loop (i.e. without using the NASS) and in closed-loop are compared in Figure \ref{fig:test_id31_dy_10ums}. Figure \ref{fig:test_id31_dy_10ums} compares the positioning errors between open-loop (without NASS) and closed-loop operation.
In the scanning direction, open-loop measurements reveal periodic errors (Figure \ref{fig:test_id31_dy_10ums_dy}) attributable to the \(T_y\) stage's stepper motor.
These micro-stepping errors, inherent to stepper motor operation, occur 200 times per motor rotation with approximately \(1\,\text{mrad}\) angular error amplitude.
Given the \(T_y\) stage's lead screw pitch of \(2\,mm\), these errors manifest as \(10\,\mu m\) periodic oscillations with \(\approx 300\,nm\) amplitude, which can indeed be seen in the open-loop measurements (Figure \ref{fig:test_id31_dy_10ums_dy}).
In the direction of motion, periodic errors can be observed in the open-loop case (Figure \ref{fig:test_id31_dy_10ums_dy}). In the vertical direction (Figure \ref{fig:test_id31_dy_10ums_dz}), open-loop errors likely stem from metrology measurement error due to the fact that the top interferometer points at a spherical target surface (see Figure \ref{fig:test_id31_xy_map_sphere}).
These errors are induced by the stepper motor being used in the \(T_y\) stage. Under closed-loop control, positioning errors remain within specifications across all directions.
Indeed, stepper motors inherently have ``micro-stepping errors'' which are periodic errors happening 200 times per motor rotation with an amplitude approximately equal to \(1\,\text{mrad}\).
As the lead screw for the \(T_y\) stage has a pitch of \(2\,mm\), this means that the micro-stepping errors have a period of \(10\,\mu m\) and an amplitude of \(\approx 300\,nm\) which can indeed be seen in open-loop.
In the vertical direction (Figure \ref{fig:test_id31_dy_10ums_dz}), open-loop errors are most likely due to measurement errors of the metrology itself as the top interferometer point at a sphere (see Figure \ref{fig:test_id31_xy_map_sphere}).
In closed-loop, the errors are within the specifications in all directions.
\begin{figure}[htbp] \begin{figure}[htbp]
\begin{subfigure}{0.33\textwidth} \begin{subfigure}{0.33\textwidth}
@ -1040,16 +1042,15 @@ In closed-loop, the errors are within the specifications in all directions.
\paragraph{Fast Scan} \paragraph{Fast Scan}
The performance of the NASS is then tested for a scanning velocity of \(100\,\mu m/s\) and the results are shown in Figure \ref{fig:test_id31_dy_100ums}. System performance was evaluated at an increased scanning velocity of \(100\,\mu m/s\), with results presented in Figure \ref{fig:test_id31_dy_100ums}.
At this velocity, the micro-stepping errors have a frequency of \(10\,\text{Hz}\) and are inducing lot's of vibrations which are even amplified by some resonances of the micro-station. At this velocity, the micro-stepping errors generate \(10\,\text{Hz}\) vibrations, which are further amplified by micro-station resonances.
These vibrations are outside the bandwidth of the NASS feedback controller and therefore not well reduced in closed-loop. These vibrations exceed the NASS feedback controller bandwidth, resulting in limited attenuation under closed-loop control.
This limitation exemplifies why stepper motors are suboptimal for ``long-stroke/short-stroke'' systems requiring precise scanning performance \cite{dehaeze22_fastj_uhv}.
This is the main reason why stepper motors should be not be used for ``long-stroke / short-stroke'' systems when good scanning performances are wanted \cite{dehaeze22_fastj_uhv}. Two potential solutions exist for improving high-velocity scanning performance.
In order to improve the scanning performances at high velocity, the stepper motor of the \(T_y\) stage could be replaced by a three-phase torque motor for instance. First, the \(T_y\) stage's stepper motor could be replaced with a three-phase torque motor.
Alternatively, since closed-loop errors in \(D_z\) and \(R_y\) directions remain within specifications (Figures \ref{fig:test_id31_dy_100ums_dz} and \ref{fig:test_id31_dy_100ums_ry}), detector triggering could be based on measured \(D_y\) position rather than time or \(T_y\) setpoint, reducing sensitivity to \(D_y\) vibrations.
As the closed-loop errors in \(D_z\) and \(R_y\) directions are within specifications (see Figures \ref{fig:test_id31_dy_100ums_dz} and \ref{fig:test_id31_dy_100ums_ry}), another option would be to trigger the detectors based on the measured \(D_y\) position instead of based on time or on the \(T_y\) setpoint. For applications requiring small \(D_y\) scans, the nano-hexapod can be used exclusively, though with limited stroke capability.
This would make the experiment less sensitive to \(D_y\) vibrations.
For small \(D_y\) scans, the nano-hexapod alone can be used for the scans, but with limited strokes.
\begin{figure}[htbp] \begin{figure}[htbp]
\begin{subfigure}{0.33\textwidth} \begin{subfigure}{0.33\textwidth}
@ -1075,14 +1076,10 @@ For small \(D_y\) scans, the nano-hexapod alone can be used for the scans, but w
\section{Diffraction Tomography} \section{Diffraction Tomography}
\label{ssec:test_id31_scans_diffraction_tomo} \label{ssec:test_id31_scans_diffraction_tomo}
In diffraction tomography experiments, the micro-station executes combined motions: continuous rotation around the \(R_z\) axis while performing lateral scans along \(D_y\).
In diffraction tomography, the micro-station performs combined \(R_z\) rotation and \(D_y\) lateral scans. For this validation, the spindle maintained a constant rotational velocity of \(6\,\text{deg/s}\) while the nano-hexapod executed the lateral scanning motion.
Here the spindle is performing a continuous rotation at \(6\,\text{deg/s}\) while the nano-hexapod is used to perform fast \(D_y\) scans. To avoid high-frequency vibrations typically induced by the stepper motor, the \(T_y\) stage was not utilized, which constrained the scanning range to approximately \(\pm 100\,\mu m/s\).
The system's performance was evaluated at three lateral scanning velocities: \(0.1\,mm/s\), \(0.5\,mm/s\), and \(1\,mm/s\). Figure \ref{fig:test_id31_diffraction_tomo_setpoint} presents both the \(D_y\) position setpoints and the corresponding measured \(D_y\) positions for all tested velocities.
The \(T_y\) stage is here not used as the stepper motor would induce high frequency vibrations, therefore the stroke is here limited to \(\approx \pm 100\,\mu m/s\).
Several \(D_y\) velocities are tested: \(0.1\,mm/s\), \(0.5\,mm/s\) and \(1\,mm/s\).
The \(D_y\) setpoint and the measured positions are shown for all tested velocities in Figure \ref{fig:test_id31_diffraction_tomo_setpoint}.
\begin{figure}[htbp] \begin{figure}[htbp]
\centering \centering
@ -1090,10 +1087,11 @@ The \(D_y\) setpoint and the measured positions are shown for all tested velocit
\caption{\label{fig:test_id31_diffraction_tomo_setpoint}Dy motion for several configured velocities} \caption{\label{fig:test_id31_diffraction_tomo_setpoint}Dy motion for several configured velocities}
\end{figure} \end{figure}
The measured errors in \(D_y\), \(D_z\) and \(R_y\) directions are shown in Figure \ref{fig:test_id31_diffraction_tomo}. The positioning errors measured along \(D_y\), \(D_z\), and \(R_y\) directions are displayed in Figure \ref{fig:test_id31_diffraction_tomo}.
While the \(D_z\) and \(R_y\) errors are within specifications (see Figures \ref{fig:test_id31_diffraction_tomo_dz} and \ref{fig:test_id31_diffraction_tomo_ry}), the lateral error goes outside of specifications during acceleration and deceleration phases (Figure \ref{fig:test_id31_diffraction_tomo_dy}). The system maintained positioning errors within specifications for both \(D_z\) and \(R_y\) (Figures \ref{fig:test_id31_diffraction_tomo_dz} and \ref{fig:test_id31_diffraction_tomo_ry}).
However, it goes out of specifications during only during \(\approx 20\,ms\), so the detector integration can just be delayed by \(20\,ms\) which could be acceptable. However, lateral positioning errors exceeded specifications during acceleration and deceleration phases (Figure \ref{fig:test_id31_diffraction_tomo_dy}).
Another way to improve the errors in the \(D_y\) direction would be to develop a feedforward controller. Since these large errors occurred only during \(\approx 20\,ms\) intervals, the issue could be addressed by implementing a corresponding delay in detector integration.
Alternatively, developing a feedforward controller could improve lateral positioning accuracy during these transient phases.
\begin{figure}[htbp] \begin{figure}[htbp]
\begin{subfigure}{0.33\textwidth} \begin{subfigure}{0.33\textwidth}
@ -1120,43 +1118,75 @@ Another way to improve the errors in the \(D_y\) direction would be to develop a
\section{Conclusion} \section{Conclusion}
\label{ssec:test_id31_scans_conclusion} \label{ssec:test_id31_scans_conclusion}
For each conducted experiments, the \(D_y\), \(D_z\) and \(R_y\) errors are computed and summarized in Table \ref{tab:id31_experiments_results_summary}. A comprehensive series of experimental validations was conducted to evaluate the NASS performance across a wide range of typical scientific experiments.
The system demonstrated robust performance in most scenarios, with positioning errors generally remaining within specified tolerances (30 nm RMS in \(D_y\), 15 nm RMS in \(D_z\), and 250 nrad RMS in \(R_y\)).
\begin{itemize} For tomography experiments, the NASS successfully maintained positioning accuracy at rotational velocities up to \(180\,\text{deg/s}\) with light payloads, though performance degraded somewhat with heavier masses.
\item[{$\square$}] Remove 20ms at the start of each scan for Dy The HAC-LAC control architecture proved particularly effective, with the decentralized IFF providing damping of nano-hexapod suspension modes while the high authority controller addressed low-frequency disturbances.
\item[{$\square$}] Add result for move aggressive controller (tomography, 180deg/s)
\end{itemize} Vertical scanning capabilities were validated in both step-by-step and continuous motion modes.
The system successfully resolved 10 nm steps with 50 ms detector integration time, while maintaining positioning accuracy during continuous scans at speeds up to \(100\,\mu m/s\).
For lateral scanning, the system performed well at moderate speeds (\(10\,\mu m/s\)) but showed limitations at higher velocities (\(100\,\mu m/s\)) due to stepper motor-induced vibrations in the \(T_y\) stage.
The most challenging test case - diffraction tomography combining rotation and lateral scanning - demonstrated the system's ability to maintain vertical and angular stability while highlighting some limitations in lateral positioning during rapid accelerations.
These limitations could potentially be addressed through feedforward control or alternative detector triggering strategies.
Overall, the experimental results validate the effectiveness of the developed control architecture and demonstrate that the NASS meets most design specifications across a wide range of operating conditions (summarized in Table \ref{tab:id31_experiments_results_summary}).
The identified limitations, primarily related to high-speed lateral scanning and heavy payload handling, provide clear directions for future improvements.
\begin{table}[htbp] \begin{table}[htbp]
\caption{\label{tab:id31_experiments_results_summary}Table caption} \caption{\label{tab:id31_experiments_results_summary}Summary of the experimental results performed with the NASS on ID31. Open-loop errors are indicated at the left of the arrows. Closed-loop errors that are out of specifications are indicated by bold number.}
\centering \centering
\begin{tabularx}{\linewidth}{Xccc} \begin{tabularx}{\linewidth}{Xccc}
\toprule \toprule
& \(D_y\) [nmRMS] & \(D_z\) [nmRMS] & \(R_y\) [nradRMS]\\ \textbf{Experiments} & \(\bm{D_y}\) \textbf{[nmRMS]} & \(\bm{D_z}\) \textbf{[nmRMS]} & \(\bm{R_y}\) \textbf{[nradRMS]}\\
\midrule \midrule
Specifications & & & \\ Tomography (\(6\,\text{deg/s}\)) & \(142 \Rightarrow 15\) & \(32 \Rightarrow 5\) & \(464 \Rightarrow 56\)\\
Tomography (\(6\,\text{deg/s}\), 13kg) & \(149 \Rightarrow 25\) & \(26 \Rightarrow 6\) & \(471 \Rightarrow 55\)\\
Tomography (\(6\,\text{deg/s}\), 26kg) & \(202 \Rightarrow 25\) & \(36 \Rightarrow 7\) & \(1737 \Rightarrow 104\)\\
Tomography (\(6\,\text{deg/s}\), 39kg) & \(297 \Rightarrow \bm{53}\) & \(38 \Rightarrow 9\) & \(1737 \Rightarrow 170\)\\
\midrule \midrule
Tomography (\(R_z\) 1rpm) & 15 & 5 & 55\\ Tomography (\(180\,\text{deg/s}\)) & \(143 \Rightarrow \bm{38}\) & \(24 \Rightarrow 11\) & \(252 \Rightarrow 130\)\\
Tomography (\(R_z\) 6rpm) & 19 & 5 & 73\\ Tomography (\(180\,\text{deg/s}\), custom HAC) & \(143 \Rightarrow 29\) & \(24 \Rightarrow 5\) & \(252 \Rightarrow 142\)\\
Tomography (\(R_z\) 30rpm) & 38 & 10 & 129\\
\midrule \midrule
Dirty Layer (\(D_z\) \(10\,\mu m/s\)) & 25 & 5 & 114\\ Reflectivity (\(100\,\mu\text{rad}/s\)) & \(28\) & \(6\) & \(118\)\\
Dirty Layer (\(D_z\) \(100\,\mu m/s\)) & 34 & 15 & 130\\
\midrule \midrule
Reflectivity (\(R_y\) \(100\,\mu\text{rad}/s\)) & 28 & 6 & 118\\ \(D_z\) scan (\(10\,\mu m/s\)) & \(25\) & \(5\) & \(108\)\\
\(D_z\) scan (\(100\,\mu m/s\)) & \(\bm{35}\) & \(9\) & \(132\)\\
\midrule \midrule
Lateral Scan (\(D_y\) \(10\,\mu m/s\)) & 21 & 10 & 37\\ Lateral Scan (\(10\,\mu m/s\)) & \(585 \Rightarrow 21\) & \(155 \Rightarrow 10\) & \(6300 \Rightarrow 60\)\\
Lateral Scan (\(100\,\mu m/s\)) & \(1063 \Rightarrow \bm{732}\) & \(167 \Rightarrow \bm{20}\) & \(6445 \Rightarrow \bm{356}\)\\
\midrule \midrule
Diffraction Tomography (\(R_z\) 1rpm, \(D_y\) 0.1mm/s) & 75 & 9 & 118\\ Diffraction tomography (\(6\,\text{deg/s}\), \(0.1\,mm/s\)) & \(\bm{36}\) & \(7\) & \(113\)\\
Diffraction Tomography (\(R_z\) 1rpm, \(D_y\) 1mm/s) & 428 & 11 & 169\\ Diffraction tomography (\(6\,\text{deg/s}\), \(0.5\,mm/s\)) & \(29\) & \(8\) & \(81\)\\
Diffraction tomography (\(6\,\text{deg/s}\), \(1\,mm/s\)) & \(\bm{53}\) & \(10\) & \(135\)\\
\midrule
\textbf{Specifications} & \(30\) & \(15\) & \(250\)\\
\bottomrule \bottomrule
\end{tabularx} \end{tabularx}
\end{table} \end{table}
\chapter*{Conclusion} \chapter*{Conclusion}
\label{ssec:test_id31_conclusion} \label{ssec:test_id31_conclusion}
This chapter presented a comprehensive experimental validation of the Nano Active Stabilization System (NASS) on the ID31 beamline, demonstrating its capability to maintain precise sample positioning during various experimental scenarios.
The implementation and testing followed a systematic approach, beginning with the development of a short-stroke metrology system to measure the sample's position, followed by the successful implementation of a HAC-LAC control architecture, and concluding in extensive performance validation across diverse experimental conditions.
The short-stroke metrology system, while designed as an temporary solution, proved effective in providing high bandwidth and low noise 5-DoF position measurements.
The careful alignment of the fibered interferometers targeting two reference spheres ensured reliable measurements throughout the testing campaign.
The implementation of the control architecture validated the theoretical framework developed earlier in the project.
The decentralized Integral Force Feedback (IFF) controller successfully provided robust damping of suspension modes across all payload conditions (0-39 kg), reducing peak amplitudes by approximately a factor of 10.
The High Authority Controller (HAC) effectively managed low-frequency disturbances, though its performance showed some dependency on payload mass, particularly for lateral motion control.
The experimental validation encompassed a wide range of scientific scenarios.
The system demonstrated remarkable performance in most conditions, meeting the stringent positioning requirements (30 nm RMS in \(D_y\), 15 nm RMS in \(D_z\), and 250 nrad RMS in \(R_y\)) for the majority of test cases.
Some limitations were identified, particularly in handling heavy payloads during rapid motions and in managing high-speed lateral scanning with the existing stepper motor \(T_y\) stage.
The successful validation of the NASS demonstrates that, once an accurate online metrology system is developed, it will be ready for integration into actual beamline operations.
The system's ability to maintain precise sample positioning across a wide range of experimental conditions, combined with its robust performance and adaptive capabilities, suggests it will significantly enhance the quality and efficiency of X-ray experiments at ID31.
Moreover, the systematic approach to system development and validation, along with the detailed understanding of performance limitations, provides valuable insights for future improvements and potential applications in similar high-precision positioning systems.
\printbibliography[heading=bibintoc,title={Bibliography}] \printbibliography[heading=bibintoc,title={Bibliography}]
\end{document} \end{document}