Rework the presentation of results + analysis
This commit is contained in:
		@@ -1,64 +0,0 @@
 | 
			
		||||
%% Remove first second
 | 
			
		||||
Ts = t(2)-t(1);
 | 
			
		||||
t = t(ceil(1/Ts):end);
 | 
			
		||||
d = d(ceil(1/Ts):end);
 | 
			
		||||
dp = dp(ceil(1/Ts):end);
 | 
			
		||||
F = F(ceil(1/Ts):end);
 | 
			
		||||
 | 
			
		||||
t = t - t(1);
 | 
			
		||||
F = F - F(1);
 | 
			
		||||
 | 
			
		||||
%% LPf
 | 
			
		||||
s = tf('s');
 | 
			
		||||
G_lpf = 1/(1+s/2/pi/10);
 | 
			
		||||
F = lsim(G_lpf, F, t);
 | 
			
		||||
d = lsim(G_lpf, d, t);
 | 
			
		||||
dp = lsim(G_lpf, dp, t);
 | 
			
		||||
 | 
			
		||||
%%
 | 
			
		||||
figure;
 | 
			
		||||
plot(t, F);
 | 
			
		||||
 | 
			
		||||
figure;
 | 
			
		||||
hold on;
 | 
			
		||||
plot(t, d, 'DisplayName', 'Encoder');
 | 
			
		||||
plot(t, dp, 'DisplayName', 'Mahr')
 | 
			
		||||
hold off;
 | 
			
		||||
legend;
 | 
			
		||||
 | 
			
		||||
%%
 | 
			
		||||
t_start = 0.05;
 | 
			
		||||
t_end = 0.12;
 | 
			
		||||
d = d(t < t_end & t > t_start);
 | 
			
		||||
dp = dp(t < t_end & t > t_start);
 | 
			
		||||
F = F(t < t_end & t > t_start);
 | 
			
		||||
 | 
			
		||||
d = d - d(1);
 | 
			
		||||
dp = dp - dp(1);
 | 
			
		||||
F = F - F(1);
 | 
			
		||||
 | 
			
		||||
%%
 | 
			
		||||
figure;
 | 
			
		||||
plot(F, dp);
 | 
			
		||||
xlabel('Measured Force [N]');
 | 
			
		||||
ylabel('Measured Displacement [m]');
 | 
			
		||||
 | 
			
		||||
%%
 | 
			
		||||
sprintf('Stiffness is %.3f [N/mm]', abs(1e-3*(d\F)))
 | 
			
		||||
 | 
			
		||||
%%
 | 
			
		||||
figure;
 | 
			
		||||
hold on;
 | 
			
		||||
plot(F, d);
 | 
			
		||||
plot(F, F/(d\F));
 | 
			
		||||
hold off;
 | 
			
		||||
xlabel('Measured Force [N]');
 | 
			
		||||
ylabel('Measured Displacement [m]');
 | 
			
		||||
 | 
			
		||||
%%
 | 
			
		||||
figure;
 | 
			
		||||
hold on;
 | 
			
		||||
plot(dp, d);
 | 
			
		||||
hold off;
 | 
			
		||||
xlabel('Probe [m]');
 | 
			
		||||
ylabel('Encoder [m]');
 | 
			
		||||
							
								
								
									
										53
									
								
								matlab/bench_dimensioning.m
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								matlab/bench_dimensioning.m
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,53 @@
 | 
			
		||||
%% Clear Workspace and Close figures
 | 
			
		||||
clear; close all; clc;
 | 
			
		||||
 | 
			
		||||
%% Intialize Laplace variable
 | 
			
		||||
s = zpk('s');
 | 
			
		||||
 | 
			
		||||
% Flexible joint Geometry
 | 
			
		||||
% The flexible joint used for the Nano-Hexapod is shown in Figure [[fig:flexible_joint_geometry]].
 | 
			
		||||
% Its bending stiffness is foreseen to be $k_{R_y}\approx 5\,\frac{Nm}{rad}$ and its stroke $\theta_{y,\text{max}}\approx 25\,mrad$.
 | 
			
		||||
 | 
			
		||||
% #+name: fig:flexible_joint_geometry
 | 
			
		||||
% #+caption: Geometry of the flexible joint
 | 
			
		||||
% [[file:figs/flexible_joint_geometry.png]]
 | 
			
		||||
 | 
			
		||||
% The height between the flexible point (center of the joint) and the point where external forces are applied is $h = 20\,mm$.
 | 
			
		||||
 | 
			
		||||
% Let's define the parameters on Matlab.
 | 
			
		||||
 | 
			
		||||
kRx = 5; % Bending Stiffness [Nm/rad]
 | 
			
		||||
Rxmax = 25e-3; % Bending Stroke [rad]
 | 
			
		||||
h = 20e-3; % Height [m]
 | 
			
		||||
 | 
			
		||||
% Required external applied force
 | 
			
		||||
 | 
			
		||||
% The bending $\theta_y$ of the flexible joint due to the force $F_x$ is:
 | 
			
		||||
% \begin{equation}
 | 
			
		||||
%   \theta_y = \frac{M_y}{k_{R_y}} = \frac{F_x h}{k_{R_y}}
 | 
			
		||||
% \end{equation}
 | 
			
		||||
 | 
			
		||||
% Therefore, the applied force to test the full range of the flexible joint is:
 | 
			
		||||
% \begin{equation}
 | 
			
		||||
%   F_{x,\text{max}} = \frac{k_{R_y} \theta_{y,\text{max}}}{h}
 | 
			
		||||
% \end{equation}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Fxmax = kRx*Rxmax/h; % Force to induce maximum stroke [N]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
% And we obtain:
 | 
			
		||||
 | 
			
		||||
sprintf('\\begin{equation} F_{x,max} = %.1f\\, [N] \\end{equation}', Fxmax)
 | 
			
		||||
 | 
			
		||||
% Required actuator stroke and sensors range
 | 
			
		||||
 | 
			
		||||
% The flexible joint is designed to allow a bending motion of $\pm 25\,mrad$.
 | 
			
		||||
% The corresponding stroke at the location of the force sensor is:
 | 
			
		||||
% \[ d_{x,\text{max}} = h \tan(R_{x,\text{max}}) \]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
dxmax = h*tan(Rxmax);
 | 
			
		||||
 | 
			
		||||
sprintf('\\begin{equation} d_{max} = %.1f\\, [mm] \\end{equation}', 1e3*dxmax)
 | 
			
		||||
							
								
								
									
										67
									
								
								matlab/error_budget.m
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										67
									
								
								matlab/error_budget.m
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,67 @@
 | 
			
		||||
%% Clear Workspace and Close figures
 | 
			
		||||
clear; close all; clc;
 | 
			
		||||
 | 
			
		||||
%% Intialize Laplace variable
 | 
			
		||||
s = zpk('s');
 | 
			
		||||
 | 
			
		||||
% Finite Element Model
 | 
			
		||||
% From the Finite Element Model, the stiffness and stroke of the flexible joint have been computed and summarized in Tables [[tab:axial_shear_characteristics]] and [[tab:bending_torsion_characteristics]].
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
%% Stiffness
 | 
			
		||||
ka = 94e6; % Axial Stiffness [N/m]
 | 
			
		||||
ks = 13e6; % Shear Stiffness [N/m]
 | 
			
		||||
kb = 5;    % Bending Stiffness [Nm/rad]
 | 
			
		||||
kt = 260;  % Torsional Stiffness [Nm/rad]
 | 
			
		||||
 | 
			
		||||
%% Maximum force
 | 
			
		||||
Fa = 469;    % Axial Force before yield [N]
 | 
			
		||||
Fs = 242;    % Shear Force before yield [N]
 | 
			
		||||
Fb = 0.118;  % Bending Force before yield [Nm]
 | 
			
		||||
Ft = 1.508; % Torsional Force before yield [Nm]
 | 
			
		||||
 | 
			
		||||
%% Compute the corresponding stroke
 | 
			
		||||
Xa = Fa/ka; % Axial Stroke before yield [m]
 | 
			
		||||
Xs = Fs/ks; % Shear Stroke before yield [m]
 | 
			
		||||
Xb = Fb/kb; % Bending Stroke before yield [rad]
 | 
			
		||||
Xt = Ft/kt; % Torsional Stroke before yield [rad]
 | 
			
		||||
 | 
			
		||||
% Setup
 | 
			
		||||
 | 
			
		||||
% The setup is schematically represented in Figure [[fig:test_bench_flex_side_bis]].
 | 
			
		||||
 | 
			
		||||
% The force is applied on top of the flexible joint with a distance $h$ with the joint's center.
 | 
			
		||||
% The displacement of the flexible joint is also measured at the same height.
 | 
			
		||||
 | 
			
		||||
% The height between the joint's center and the force application point is:
 | 
			
		||||
 | 
			
		||||
h = 25e-3; % Height [m]
 | 
			
		||||
 | 
			
		||||
% Estimation error due to force sensor compression
 | 
			
		||||
% The measured displacement is not done directly at the joint's location.
 | 
			
		||||
% The force sensor compression will then induce an error on the joint's stiffness.
 | 
			
		||||
 | 
			
		||||
% The force sensor stiffness $k_F$ is estimated to be around:
 | 
			
		||||
 | 
			
		||||
kF = 50/0.05e-3; % [N/m]
 | 
			
		||||
 | 
			
		||||
sprintf('k_F = %.1e [N/m]', kF)
 | 
			
		||||
 | 
			
		||||
% Estimation error due to height estimation error
 | 
			
		||||
% Let's consider an error in the estimation of the height from the application of the force to the joint's center:
 | 
			
		||||
% \begin{equation}
 | 
			
		||||
% h_{\text{est}} = h (1 + \epsilon)
 | 
			
		||||
% \end{equation}
 | 
			
		||||
 | 
			
		||||
% The computed bending stiffness will be:
 | 
			
		||||
% \begin{equation}
 | 
			
		||||
%   k_\text{est} \approx h_{\text{est}}^2 \frac{F_x}{d_x}
 | 
			
		||||
% \end{equation}
 | 
			
		||||
 | 
			
		||||
% And the stiffness estimation error is:
 | 
			
		||||
% \begin{equation}
 | 
			
		||||
% \frac{k_{\text{est}}}{k_{R_y}} = (1 + \epsilon)^2
 | 
			
		||||
% \end{equation}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
h_err = 0.2e-3; % Height estimation error [m]
 | 
			
		||||
							
								
								
									
										62
									
								
								matlab/probe_stiffness.m
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								matlab/probe_stiffness.m
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,62 @@
 | 
			
		||||
%% Clear Workspace and Close figures
 | 
			
		||||
clear; close all; clc;
 | 
			
		||||
 | 
			
		||||
%% Intialize Laplace variable
 | 
			
		||||
s = zpk('s');
 | 
			
		||||
 | 
			
		||||
addpath('./mat/');
 | 
			
		||||
 | 
			
		||||
% Results                                                         :ignore:
 | 
			
		||||
% Let's load the measurement results.
 | 
			
		||||
 | 
			
		||||
load('meas_stiff_probe.mat', 't', 'd', 'dp', 'F')
 | 
			
		||||
 | 
			
		||||
%% Sampling time [s]
 | 
			
		||||
Ts = (t(end) - t(1))/(length(t)-1);
 | 
			
		||||
 | 
			
		||||
%% Remove first second
 | 
			
		||||
t = t(ceil(1/Ts):end);
 | 
			
		||||
d = d(ceil(1/Ts):end);
 | 
			
		||||
dp = dp(ceil(1/Ts):end);
 | 
			
		||||
F = F(ceil(1/Ts):end);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
%% Remove Offset
 | 
			
		||||
t = t - t(1);
 | 
			
		||||
F = F - mean(F(1:ceil(1/Ts)));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
% The time domain measured force and displacement are shown in Figure [[fig:mahr_time_domain]].
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
%% Time Domain plots
 | 
			
		||||
figure;
 | 
			
		||||
tiledlayout(2, 1, 'TileSpacing', 'None', 'Padding', 'None');
 | 
			
		||||
 | 
			
		||||
ax1 = nexttile;
 | 
			
		||||
plot(t, F);
 | 
			
		||||
ylabel('Force [N]'); set(gca, 'XTickLabel',[]);
 | 
			
		||||
 | 
			
		||||
ax2 = nexttile;
 | 
			
		||||
plot(t, d);
 | 
			
		||||
xlabel('Time [s]'); ylabel('Displacement [m]');
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
% #+RESULTS:
 | 
			
		||||
% : Stiffness is 0.039 [N/mm]
 | 
			
		||||
 | 
			
		||||
% This is very close to the 0.04 [N/mm] written in the [[file:doc/tmp3m0cvmue_7888038c-cdc8-48d8-a837-35de02760685.pdf][Millimar 1318 probe datasheet]].
 | 
			
		||||
 | 
			
		||||
% And compare the linear fit with the raw measurement data (Figure [[fig:mahr_stiffness_f_d_plot]]).
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
figure;
 | 
			
		||||
hold on;
 | 
			
		||||
plot(F, d, 'DisplayName', 'Raw data');
 | 
			
		||||
plot(F, F/(d\F), 'DisplayName', 'Linear fit');
 | 
			
		||||
hold off;
 | 
			
		||||
xlabel('Measured Force [N]');
 | 
			
		||||
ylabel('Measured Displacement [m]');
 | 
			
		||||
legend('location', 'southeast');
 | 
			
		||||
							
								
								
									
										86
									
								
								matlab/probe_vs_encoder.m
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										86
									
								
								matlab/probe_vs_encoder.m
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,86 @@
 | 
			
		||||
%% Clear Workspace and Close figures
 | 
			
		||||
clear; close all; clc;
 | 
			
		||||
 | 
			
		||||
%% Intialize Laplace variable
 | 
			
		||||
s = zpk('s');
 | 
			
		||||
 | 
			
		||||
addpath('./mat/');
 | 
			
		||||
 | 
			
		||||
% Results                                                         :ignore:
 | 
			
		||||
% Let's load the measurements.
 | 
			
		||||
 | 
			
		||||
load('meas_probe_against_encoder.mat', 't', 'd', 'dp', 'F')
 | 
			
		||||
 | 
			
		||||
%% Sampling time [s]
 | 
			
		||||
Ts = (t(end) - t(1))/(length(t)-1);
 | 
			
		||||
 | 
			
		||||
%% Remove first second
 | 
			
		||||
t = t(ceil(1/Ts):end);
 | 
			
		||||
d = -d(ceil(1/Ts):end);
 | 
			
		||||
dp = -dp(ceil(1/Ts):end);
 | 
			
		||||
F = F(ceil(1/Ts):end);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
% The time domain measured displacement by the probe and by the encoder is shown in Figure [[fig:comp_encoder_probe_time]].
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
%% Time Domain plots
 | 
			
		||||
figure;
 | 
			
		||||
hold on;
 | 
			
		||||
plot(t, d, 'DisplayName', 'Encoder');
 | 
			
		||||
plot(t, dp, 'DisplayName', 'Probe');
 | 
			
		||||
hold off;
 | 
			
		||||
xlabel('Time [s]'); ylabel('Displacement [m]');
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
% #+name: fig:comp_encoder_probe_time
 | 
			
		||||
% #+caption: Time domain measurement
 | 
			
		||||
% #+RESULTS:
 | 
			
		||||
% [[file:figs/comp_encoder_probe_time.png]]
 | 
			
		||||
 | 
			
		||||
% If we zoom, we see that there is some delay between the encoder and the probe (Figure [[fig:comp_encoder_probe_time_zoom]]).
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
%% Zoom
 | 
			
		||||
figure;
 | 
			
		||||
hold on;
 | 
			
		||||
plot(t, d, 'DisplayName', 'Encoder');
 | 
			
		||||
plot(t, dp, 'DisplayName', 'Probe');
 | 
			
		||||
hold off;
 | 
			
		||||
xlabel('Time [s]'); ylabel('Displacement [m]');
 | 
			
		||||
xlim([7.7, 7.9])
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
% #+RESULTS:
 | 
			
		||||
% : The time delay is approximately 15.8 [ms]
 | 
			
		||||
 | 
			
		||||
% The measured mismatch between the encoder and the probe with and without compensating for the time delay are shown in Figure [[fig:comp_encoder_probe_mismatch]].
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
figure;
 | 
			
		||||
hold on;
 | 
			
		||||
plot(t, d-dp, 'DisplayName', 'Raw Mismatch');
 | 
			
		||||
plot(t(1:end-finddelay(d, dp)), d(1:end-finddelay(d, dp))-dp(finddelay(d, dp)+1:end), 'DisplayName', 'Removed Delay');
 | 
			
		||||
hold off;
 | 
			
		||||
xlabel('Time [s]'); ylabel('Measurement Missmatch [m]');
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
% #+name: fig:comp_encoder_probe_mismatch
 | 
			
		||||
% #+caption: Measurement mismatch, with and without delay compensation
 | 
			
		||||
% #+RESULTS:
 | 
			
		||||
% [[file:figs/comp_encoder_probe_mismatch.png]]
 | 
			
		||||
 | 
			
		||||
% Finally, the displacement of the probe is shown as a function of the displacement of the encoder and a linear fit is made (Figure [[fig:comp_encoder_probe_linear_fit]]).
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
figure;
 | 
			
		||||
hold on;
 | 
			
		||||
plot(1e3*d, 1e3*dp, 'DisplayName', 'Raw data');
 | 
			
		||||
plot(1e3*d, 1e3*d*(d\dp), 'DisplayName', sprintf('Linear fit: $\\alpha = %.5f$', (d\dp)));
 | 
			
		||||
hold on;
 | 
			
		||||
xlabel('Encoder [mm]'); ylabel('Probe [mm]');
 | 
			
		||||
legend('location', 'southeast')
 | 
			
		||||
		Reference in New Issue
	
	Block a user