Christophe's review
This commit is contained in:
Binary file not shown.
Binary file not shown.
@@ -18,55 +18,75 @@ mdl = 'nano_hexapod_model';
|
||||
%% Colors for the figures
|
||||
colors = colororder;
|
||||
|
||||
%% Frequency Vector
|
||||
%% Frequency Vector [Hz]
|
||||
freqs = logspace(0, 3, 1000);
|
||||
|
||||
% Range validity of the approximate inverse kinematics
|
||||
|
||||
% The accuracy of the Jacobian-based forward kinematics solution was estimated through a systematic error analysis.
|
||||
% For a series of platform positions along the $x\text{-axis}$, the exact strut lengths are computed using the analytical inverse kinematics equation eqref:eq:nhexa_inverse_kinematics.
|
||||
% These strut lengths are then used with the Jacobian to estimate the platform pose, from which the error between the estimated and true poses can be calculated.
|
||||
% The accuracy of the Jacobian-based forward kinematics solution was estimated by a simple analysis.
|
||||
% For a series of platform positions, the exact strut lengths are computed using the analytical inverse kinematics equation eqref:eq:nhexa_inverse_kinematics.
|
||||
% These strut lengths are then used with the Jacobian to estimate the platform pose eqref:eq:nhexa_forward_kinematics_approximate, from which the error between the estimated and true poses can be calculated, both in terms of position $\epsilon_D$ and orientation $\epsilon_R$.
|
||||
|
||||
% The estimation errors in the $x$, $y$, and $z$ directions are shown in Figure ref:fig:nhexa_forward_kinematics_approximate_errors.
|
||||
% For motion strokes from $1\,\mu m$ to $10\,mm$, the errors are estimated for all direction of motion, and the worst case errors are shown in Figure ref:fig:nhexa_forward_kinematics_approximate_errors.
|
||||
% The results demonstrate that for displacements up to approximately $1\,\%$ of the hexapod's size (which corresponds to $100\,\mu m$ as the size of the Stewart platform is here $\approx 100\,mm$), the Jacobian approximation provides excellent accuracy.
|
||||
|
||||
% This finding has particular significance for the Nano-hexapod application.
|
||||
% Since the maximum required stroke ($\approx 100\,\mu m$) is three orders of magnitude smaller than the stewart platform size ($\approx 100\,mm$), the Jacobian matrix can be considered constant throughout the workspace.
|
||||
% Since the maximum required stroke of the nano-hexapod ($\approx 100\,\mu m$) is three orders of magnitude smaller than its overall size ($\approx 100\,mm$), the Jacobian matrix can be considered constant throughout the workspace.
|
||||
% It can be computed once at the rest position and used for both forward and inverse kinematics with high accuracy.
|
||||
|
||||
|
||||
%% Estimate the errors associated with approximate forward kinematics using the Jacobian matrix
|
||||
stewart = initializeSimplifiedNanoHexapod('H', 100e-3, 'MO_B', 0);
|
||||
stewart = initializeSimplifiedNanoHexapod('H', 100e-3);
|
||||
|
||||
Xrs = logspace(-6, -1, 100); % Wanted X translation of the mobile platform [m]
|
||||
Xrs = logspace(-6, -1, 10); % Wanted X translation of the mobile platform [m]
|
||||
phis = linspace(-pi, pi, 100); % Tested azimutal angles [rad]
|
||||
thetas = linspace(0, pi, 100); % Tested polar angles [rad]
|
||||
|
||||
% Compute the strut exact length for each X-position
|
||||
Ls_exact = zeros(6, length(Xrs));
|
||||
Xrs_errors = zeros(1, length(Xrs)); % Maximum distance error [m]
|
||||
Rrs_errors = zeros(1, length(Xrs)); % Maximum angular error [rad]
|
||||
for i = 1:length(Xrs)
|
||||
[~, L_exact(:, i)] = inverseKinematics(stewart, 'AP', [Xrs(i); 0; 0]);
|
||||
end
|
||||
|
||||
% From the strut length, compute the stewart pose using the Jacobian matrix
|
||||
Xrs_approx = zeros(6, length(Xrs));
|
||||
for i = 1:length(Xrs)
|
||||
Xrs_approx(:, i) = inv(stewart.geometry.J)*L_exact(:, i);
|
||||
Xrs_error_min = 0;
|
||||
Rrs_error_min = 0;
|
||||
for theta = thetas
|
||||
for phi = phis
|
||||
ix = [sin(theta)*cos(phi); sin(theta)*sin(phi);cos(theta)]; % Unit vector for the displacement direction
|
||||
[~, L_exact] = inverseKinematics(stewart, 'AP', Xrs(i)*ix); % Compute exact strut length for the wanted position
|
||||
Xrs_approx = inv(stewart.geometry.J)*L_exact; % Approximate the position using the Jacobian
|
||||
Xrs_error = norm(Xrs(i)*ix - Xrs_approx(1:3), 2); % Compute the position estimation error
|
||||
Rrs_error = norm(Xrs_approx(4:6), 2); % Compute the angular estimation error
|
||||
if Xrs_error > Xrs_error_min
|
||||
Xrs_error_min = Xrs_error;
|
||||
end
|
||||
if Rrs_error > Rrs_error_min
|
||||
Rrs_error_min = Rrs_error;
|
||||
end
|
||||
end
|
||||
end
|
||||
Xrs_errors(i) = Xrs_error_min;
|
||||
Rrs_errors(i) = Rrs_error_min;
|
||||
end
|
||||
|
||||
%% Errors associated with the use of the Jacobian matrix to solve the forward kinematic problem
|
||||
figure;
|
||||
yyaxis left
|
||||
hold on;
|
||||
plot(1e6*Xrs, 1e9*abs(Xrs - Xrs_approx(1, :)), 'DisplayName', '$\epsilon_x$');
|
||||
plot(1e6*Xrs, 1e9*abs(Xrs_approx(2, :)), 'DisplayName', '$\epsilon_y$');
|
||||
plot(1e6*Xrs, 1e9*abs(Xrs_approx(3, :)), 'DisplayName', '$\epsilon_z$');
|
||||
plot(1e6*Xrs, 1e6*Xrs, 'k--', 'DisplayName', '$0.1\%$ error');
|
||||
plot(1e6*Xrs, 1e9*Xrs_errors, 'DisplayName', '$\epsilon_D$');
|
||||
plot(1e6*Xrs, 1e6*Xrs, '--', 'DisplayName', '$0.1\%$ error');
|
||||
hold off;
|
||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||
leg = legend('location', 'northwest', 'FontSize', 8, 'NumColumns', 1);
|
||||
leg.ItemTokenSize(1) = 15;
|
||||
xlim([1, 1e4]); ylim([1, 1e4]);
|
||||
xlabel('$D_x$ motion');
|
||||
xlabel('Motion Stroke');
|
||||
ylabel('Kinematic Errors');
|
||||
xticks([1, 10, 100, 1000, 10000]);
|
||||
yticks([1, 10, 100, 1000, 10000]);
|
||||
xticklabels({'$1\mu m$', '$10\mu m$', '$100\mu m$', '$1mm$', '$10mm$'});
|
||||
yticklabels({'$1nm$', '$10nm$', '$100nm$', '$1\mu m$', '$10\mu m$'});
|
||||
|
||||
yyaxis right
|
||||
plot(1e6*Xrs, 1e9*Rrs_errors, 'DisplayName', '$\epsilon_R$');
|
||||
set(gca, 'YScale', 'log');
|
||||
ylim([1, 1e4]);
|
||||
yticks([1, 10, 100, 1000, 10000]);
|
||||
yticklabels({'$1$nrad', '$10$nrad', '$100$nrad', '$1\mu$rad', '$10\mu$rad'});
|
||||
|
@@ -18,7 +18,7 @@ mdl = 'nano_hexapod_model';
|
||||
%% Colors for the figures
|
||||
colors = colororder;
|
||||
|
||||
%% Frequency Vector
|
||||
%% Frequency Vector [Hz]
|
||||
freqs = logspace(0, 3, 1000);
|
||||
|
||||
% Validation of the multi-body model
|
||||
@@ -44,13 +44,13 @@ freqs = logspace(0, 3, 1000);
|
||||
% [[file:figs/nhexa_simscape_screenshot.jpg]]
|
||||
% #+end_minipage
|
||||
|
||||
% The validation of the multi-body model is performed using the simplest Stewart platform configuration, enabling direct comparison with the analytical transfer functions derived in Section ref:ssec:nhexa_stewart_platform_dynamics.
|
||||
% The validation of the multi-body model was performed using the simplest Stewart platform configuration, enabling direct comparison with the analytical transfer functions derived in Section ref:ssec:nhexa_stewart_platform_dynamics.
|
||||
% This configuration consists of massless universal joints at the base, massless spherical joints at the top platform, and massless struts with stiffness $k_a = 1\,\text{N}/\mu\text{m}$ and damping $c_a = 10\,\text{N}/({\text{m}/\text{s}})$.
|
||||
% The geometric parameters remain as specified in Table ref:tab:nhexa_actuator_parameters.
|
||||
|
||||
% While the moving platform itself is considered massless, a $10\,\text{kg}$ cylindrical payload is mounted on top with a radius of $r = 110\,mm$ and a height $h = 300\,mm$.
|
||||
|
||||
% For the analytical model, the stiffness, damping and mass matrices are defined in eqref:eq:nhexa_analytical_matrices.
|
||||
% For the analytical model, the stiffness, damping, and mass matrices are defined in eqref:eq:nhexa_analytical_matrices.
|
||||
|
||||
% \begin{subequations}\label{eq:nhexa_analytical_matrices}
|
||||
% \begin{align}
|
||||
@@ -60,9 +60,9 @@ freqs = logspace(0, 3, 1000);
|
||||
% \end{align}
|
||||
% \end{subequations}
|
||||
|
||||
% The transfer functions from actuator forces to strut displacements are computed using these matrices according to equation eqref:eq:nhexa_transfer_function_struts.
|
||||
% The transfer functions from the actuator forces to the strut displacements are computed using these matrices according to equation eqref:eq:nhexa_transfer_function_struts.
|
||||
% These analytical transfer functions are then compared with those extracted from the multi-body model.
|
||||
% The multi-body model yields a state-space representation with 12 states, corresponding to the six degrees of freedom of the moving platform.
|
||||
% The developed multi-body model yields a state-space representation with 12 states, corresponding to the six degrees of freedom of the moving platform.
|
||||
|
||||
% Figure ref:fig:nhexa_comp_multi_body_analytical presents a comparison between the analytical and multi-body transfer functions, specifically showing the response from the first actuator force to all six strut displacements.
|
||||
% The close agreement between both approaches across the frequency spectrum validates the multi-body model's accuracy in capturing the system's dynamic behavior.
|
||||
@@ -123,7 +123,7 @@ tiledlayout(3, 1, 'TileSpacing', 'Compact', 'Padding', 'None');
|
||||
ax1 = nexttile([2,1]);
|
||||
hold on;
|
||||
for i = 1:6
|
||||
plot(freqs, abs(squeeze(freqresp(G_simscape(i,1), freqs, 'Hz'))), 'color', [colors(i,:), 0.5], ...
|
||||
plot(freqs, abs(squeeze(freqresp(G_simscape(i,1), freqs, 'Hz'))), 'color', [colors(i,:), 0.5], 'linewidth', 2.5, ...
|
||||
'DisplayName', sprintf('$l_%i/f_1$ - Multi-Body', i))
|
||||
end
|
||||
for i = 1:6
|
||||
@@ -140,7 +140,7 @@ leg.ItemTokenSize(1) = 15;
|
||||
ax2 = nexttile;
|
||||
hold on;
|
||||
for i = 1:6
|
||||
plot(freqs, 180/pi*angle(squeeze(freqresp(G_simscape(i,1), freqs, 'Hz'))), 'color', [colors(i,:),0.5]);
|
||||
plot(freqs, 180/pi*angle(squeeze(freqresp(G_simscape(i,1), freqs, 'Hz'))), 'color', [colors(i,:),0.5], 'linewidth', 2.5);
|
||||
end
|
||||
for i = 1:6
|
||||
plot(freqs, 180/pi*angle(squeeze(freqresp(G_analytical(i,1), freqs, 'Hz'))), '--', 'color', colors(i,:));
|
||||
@@ -157,13 +157,13 @@ xlim([freqs(1), freqs(end)]);
|
||||
% Nano Hexapod Dynamics
|
||||
% <<ssec:nhexa_model_dynamics>>
|
||||
|
||||
% Following the validation of the multi-body model, a detailed analysis of the nano-hexapod dynamics has been performed.
|
||||
% The model parameters are set according to the specifications outlined in Section ref:ssec:nhexa_model_def, with a payload mass of $10\,kg$.
|
||||
% Transfer functions from actuator forces $\bm{f}$ to both strut displacements $\bm{\mathcal{L}}$ and force measurements $\bm{f}_n$ are derived from the multi-body model.
|
||||
% Following the validation of the multi-body model, a detailed analysis of the nano-hexapod dynamics was performed.
|
||||
% The model parameters were set according to the specifications outlined in Section ref:ssec:nhexa_model_def, with a payload mass of $10\,kg$.
|
||||
% The transfer functions from actuator forces $\bm{f}$ to both strut displacements $\bm{\mathcal{L}}$ and force measurements $\bm{f}_n$ were derived from the multi-body model.
|
||||
|
||||
% The transfer functions relating actuator forces to strut displacements are presented in Figure ref:fig:nhexa_multi_body_plant_dL.
|
||||
% Due to the system's symmetrical design and identical strut configurations, all diagonal terms (transfer functions from force $f_i$ to displacement $l_i$ of the same strut) exhibit identical behavior.
|
||||
% While the system possesses six degrees of freedom, only four distinct resonance frequencies are observed in the frequency response.
|
||||
% While the system has six degrees of freedom, only four distinct resonance frequencies were observed in the frequency response.
|
||||
% This reduction from six to four observable modes is attributed to the system's symmetry, where two pairs of resonances occur at identical frequencies.
|
||||
|
||||
% The system's behavior can be characterized in three frequency regions.
|
||||
@@ -173,7 +173,7 @@ xlim([freqs(1), freqs(end)]);
|
||||
|
||||
% The force sensor transfer functions, shown in Figure ref:fig:nhexa_multi_body_plant_fm, display characteristics typical of collocated actuator-sensor pairs.
|
||||
% Each actuator's transfer function to its associated force sensor exhibits alternating complex conjugate poles and zeros.
|
||||
% The inclusion of parallel stiffness introduces an additional complex conjugate zero at low frequency, a feature previously observed in the three-degree-of-freedom rotating model.
|
||||
% The inclusion of parallel stiffness introduces an additional complex conjugate zero at low frequency, which was previously observed in the three-degree-of-freedom rotating model.
|
||||
|
||||
|
||||
%% Multi-Body model of the Nano-Hexapod
|
||||
|
@@ -18,22 +18,22 @@ mdl = 'nano_hexapod_model';
|
||||
%% Colors for the figures
|
||||
colors = colororder;
|
||||
|
||||
%% Frequency Vector
|
||||
%% Frequency Vector [Hz]
|
||||
freqs = logspace(0, 3, 1000);
|
||||
|
||||
% Control in Cartesian Space
|
||||
|
||||
% Alternatively, control can be implemented directly in Cartesian space, as shown in Figure ref:fig:nhexa_control_cartesian.
|
||||
% Here, the controller processes Cartesian errors $\bm{\epsilon}_{\mathcal{X}}$ to generate forces and torques $\bm{\mathcal{F}}$, which are then mapped to actuator forces through the transpose of the inverse Jacobian matrix.
|
||||
% Alternatively, control can be implemented directly in Cartesian space, as illustrated in Figure ref:fig:nhexa_control_cartesian.
|
||||
% Here, the controller processes Cartesian errors $\bm{\epsilon}_{\mathcal{X}}$ to generate forces and torques $\bm{\mathcal{F}}$, which are then mapped to actuator forces using the transpose of the inverse Jacobian matrix eqref:eq:nhexa_jacobian_forces.
|
||||
|
||||
% The plant behavior in Cartesian space, illustrated in Figure ref:fig:nhexa_plant_frame_cartesian, reveals interesting characteristics.
|
||||
% Some degrees of freedom, particularly the vertical translation and rotation about the vertical axis, exhibit simpler second-order dynamics.
|
||||
% A key advantage of this approach is that control performance can be individually tuned for each direction.
|
||||
% A key advantage of this approach is that the control performance can be tuned individually for each direction.
|
||||
% This is particularly valuable when performance requirements differ between degrees of freedom - for instance, when higher positioning accuracy is required vertically than horizontally, or when certain rotational degrees of freedom can tolerate larger errors than others.
|
||||
|
||||
% However, significant coupling exists between certain degrees of freedom, particularly between rotations and translations (e.g., $\epsilon_{R_x}/\mathcal{F}_y$ or $\epsilon_{D_y}/\bm\mathcal{M}_x$).
|
||||
|
||||
% For the conceptual validation of the nano-hexapod, control in the strut space has been selected due to its simpler implementation and the beneficial decoupling properties observed at low frequencies.
|
||||
% For the conceptual validation of the nano-hexapod, control in the strut space was selected due to its simpler implementation and the beneficial decoupling properties observed at low frequencies.
|
||||
% More sophisticated control strategies will be explored during the detailed design phase.
|
||||
|
||||
|
||||
@@ -166,12 +166,12 @@ xlim([freqs(1), freqs(end)]);
|
||||
% \end{equation}
|
||||
|
||||
|
||||
% In this section, the stiffness in parallel with the force sensor has been omitted since the Stewart platform is not subjected to rotation.
|
||||
% The effect of this parallel stiffness will be examined in the next section when the platform is integrated into the complete NASS system.
|
||||
% In this section, the stiffness in parallel with the force sensor was omitted since the Stewart platform is not subjected to rotation.
|
||||
% The effect of this parallel stiffness is examined in the next section when the platform is integrated into the complete NASS.
|
||||
|
||||
% The Root Locus analysis, shown in Figure ref:fig:nhexa_decentralized_iff_root_locus, reveals the evolution of the closed-loop poles as the controller gain $g$ varies from $0$ to $\infty$.
|
||||
% Root Locus analysis, shown in Figure ref:fig:nhexa_decentralized_iff_root_locus, reveals the evolution of the closed-loop poles as the controller gain $g$ varies from $0$ to $\infty$.
|
||||
% A key characteristic of force feedback control with collocated sensor-actuator pairs is observed: all closed-loop poles are bounded to the left-half plane, indicating guaranteed stability [[cite:&preumont08_trans_zeros_struc_contr_with]].
|
||||
% This property is particularly valuable as the coupling is very large around resonance frequencies, enabling control of modes that would be difficult to include within the bandwidth using position feedback alone.
|
||||
% This property is particularly valuable because the coupling is very large around resonance frequencies, enabling control of modes that would be difficult to include within the bandwidth using position feedback alone.
|
||||
|
||||
% The bode plot of an individual loop gain (i.e. the loop gain of $K_{\text{IFF}}(s) \cdot \frac{f_{ni}}{f_i}(s)$), presented in Figure ref:fig:nhexa_decentralized_iff_loop_gain, exhibits the typical characteristics of integral force feedback of having a phase bounded between $-90^o$ and $+90^o$.
|
||||
% The loop-gain is high around the resonance frequencies, indicating that the decentralized IFF provides significant control authority over these modes.
|
||||
@@ -266,9 +266,9 @@ xlim([1, 1e3]);
|
||||
% [[file:figs/nhexa_hac_iff_schematic.png]]
|
||||
|
||||
% The effect of decentralized IFF on the plant dynamics can be observed by comparing two sets of transfer functions.
|
||||
% Figure ref:fig:nhexa_decentralized_hac_iff_plant_undamped shows the original transfer functions from actuator forces $\bm{f}$ to strut errors $\bm{\epsilon}_{\mathcal{L}}$, characterized by pronounced resonant peaks.
|
||||
% When decentralized IFF is implemented, the transfer functions from modified inputs $\bm{f}^{\prime}$ to strut errors $\bm{\epsilon}_{\mathcal{L}}$, shown in Figure ref:fig:nhexa_decentralized_hac_iff_plant_damped, exhibit significantly attenuated resonances.
|
||||
% This damping of structural resonances serves two purposes: it reduces vibrations in the vicinity of resonances and simplifies the design of the high authority controller by providing a simpler plant dynamics.
|
||||
% Figure ref:fig:nhexa_decentralized_hac_iff_plant_undamped shows the original transfer functions from actuator forces $\bm{f}$ to strut errors $\bm{\epsilon}_{\mathcal{L}}$, which are characterized by pronounced resonant peaks.
|
||||
% When the decentralized IFF is implemented, the transfer functions from modified inputs $\bm{f}^{\prime}$ to strut errors $\bm{\epsilon}_{\mathcal{L}}$ exhibit significantly attenuated resonances (Figure ref:fig:nhexa_decentralized_hac_iff_plant_damped).
|
||||
% This damping of structural resonances serves two purposes: it reduces vibrations near resonances and simplifies the design of the high authority controller by providing simpler plant dynamics.
|
||||
|
||||
|
||||
%% Identify the IFF Plant
|
||||
@@ -395,8 +395,8 @@ xlim([freqs(1), freqs(end)]);
|
||||
% #+end_subfigure
|
||||
% #+end_figure
|
||||
|
||||
% Building upon the damped plant dynamics shown in Figure ref:fig:nhexa_decentralized_hac_iff_plant_damped, a high authority controller is designed with the structure given in eqref:eq:nhexa_khac.
|
||||
% The controller combines three elements: an integrator providing high gain at low frequencies, a lead compensator improving stability margins, and a low-pass filter for robustness to unmodeled high-frequency dynamics.
|
||||
% Based upon the damped plant dynamics shown in Figure ref:fig:nhexa_decentralized_hac_iff_plant_damped, a high authority controller was designed with the structure given in eqref:eq:nhexa_khac.
|
||||
% The controller combines three elements: an integrator providing high gain at low frequencies, a lead compensator improving stability margins, and a low-pass filter for robustness against unmodeled high-frequency dynamics.
|
||||
% The loop gain of an individual control channel is shown in Figure ref:fig:nhexa_decentralized_hac_iff_loop_gain.
|
||||
|
||||
% \begin{equation}\label{eq:nhexa_khac}
|
||||
@@ -408,9 +408,10 @@ xlim([freqs(1), freqs(end)]);
|
||||
% \end{equation}
|
||||
|
||||
% The stability of the MIMO feedback loop is analyzed through the /characteristic loci/ method.
|
||||
% Such characteristic loci, shown in Figure ref:fig:nhexa_decentralized_hac_iff_root_locus, represent the eigenvalues of the loop gain matrix $\bm{G}(j\omega)\bm{K}(j\omega)$ plotted in the complex plane as frequency varies from $0$ to $\infty$.
|
||||
% Such characteristic loci represent the eigenvalues of the loop gain matrix $\bm{G}(j\omega)\bm{K}(j\omega)$ plotted in the complex plane as the frequency varies from $0$ to $\infty$.
|
||||
% For MIMO systems, this method generalizes the classical Nyquist stability criterion: with the open-loop system being stable, the closed-loop system is stable if none of the characteristic loci encircle the -1 point [[cite:&skogestad07_multiv_feedb_contr]].
|
||||
% As seen in Figure ref:fig:nhexa_decentralized_hac_iff_root_locus, all loci remain to the right of the -1 point, confirming the stability of the closed-loop system. Additionally, the distance of the loci from the -1 point provides information about stability margins for the coupled system.
|
||||
% As shown in Figure ref:fig:nhexa_decentralized_hac_iff_root_locus, all loci remain to the right of the $-1$ point, validating the stability of the closed-loop system.
|
||||
% Additionally, the distance of the loci from the $-1$ point provides information about stability margins of the coupled system.
|
||||
|
||||
|
||||
%% High Authority Controller - Mid Stiffness Nano-Hexapod
|
||||
@@ -442,6 +443,7 @@ Lmimo = squeeze(freqresp(G_hac_struts*Khac, freqs, 'Hz'));
|
||||
for i_f = 2:length(freqs)
|
||||
Ldet(:, i_f) = eig(squeeze(Lmimo(:,:,i_f)));
|
||||
end
|
||||
mod_margin = min(min(abs(Ldet + ones(size(Ldet)))));
|
||||
|
||||
figure;
|
||||
hold on;
|
||||
@@ -454,6 +456,8 @@ plot(real(squeeze(Ldet(i,:))), -imag(squeeze(Ldet(i,:))), ...
|
||||
'HandleVisibility', 'off');
|
||||
end
|
||||
plot(-1, 0, 'kx', 'HandleVisibility', 'off');
|
||||
patch(-1 + mod_margin*cos([0:0.1:2*pi+0.1]), mod_margin*sin([0:0.1:2*pi+0.1]), colors(5,:), 'linestyle', '--', 'EdgeColor','black', 'FaceAlpha', 0.5, 'HandleVisibility', 'off');
|
||||
text(-1,0.1, 'Robustness', 'FontSize', 8, 'horizontalalignment', 'center')
|
||||
hold off;
|
||||
set(gca, 'XScale', 'lin'); set(gca, 'YScale', 'lin');
|
||||
xlabel('Real Part'); ylabel('Imaginary Part');
|
||||
@@ -461,12 +465,16 @@ axis square
|
||||
xlim([-1.8, 0.2]); ylim([-1, 1]);
|
||||
|
||||
%% Loop gain for the Decentralized HAC_IFF
|
||||
i_fb = find(abs(squeeze(freqresp(G_hac_struts(1,1)*Khac(1,1), freqs, 'Hz')))<1, 1);
|
||||
|
||||
figure;
|
||||
tiledlayout(3, 1, 'TileSpacing', 'compact', 'Padding', 'None');
|
||||
|
||||
ax1 = nexttile([2,1]);
|
||||
hold on;
|
||||
patch([freqs(1:i_fb), freqs(i_fb), freqs(1)], [abs(squeeze(freqresp(G_hac_struts(1,1)*Khac(1,1), [freqs(1:i_fb)], 'Hz'))); 1; 1], colors(5,:), 'EdgeColor','none', 'FaceAlpha', 0.5)
|
||||
plot(freqs, abs(squeeze(freqresp(G_hac_struts(1,1)*Khac(1,1), freqs, 'Hz'))));
|
||||
text(1.2,2.5,{'Disturbance', 'rejection'}, 'FontSize', 8)
|
||||
hold off;
|
||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||
ylabel('Loop Gain'); set(gca, 'XTickLabel',[]);
|
||||
|
@@ -19,10 +19,10 @@ function [stewart] = generateGeneralConfiguration(stewart, args)
|
||||
|
||||
arguments
|
||||
stewart
|
||||
args.FH (1,1) double {mustBeNumeric, mustBePositive} = 15e-3
|
||||
args.FH (1,1) double {mustBeNumeric, mustBeNonnegative} = 15e-3
|
||||
args.FR (1,1) double {mustBeNumeric, mustBePositive} = 115e-3;
|
||||
args.FTh (6,1) double {mustBeNumeric} = [-10, 10, 120-10, 120+10, 240-10, 240+10]*(pi/180);
|
||||
args.MH (1,1) double {mustBeNumeric, mustBePositive} = 15e-3
|
||||
args.MH (1,1) double {mustBeNumeric, mustBeNonnegative} = 15e-3
|
||||
args.MR (1,1) double {mustBeNumeric, mustBePositive} = 90e-3;
|
||||
args.MTh (6,1) double {mustBeNumeric} = [-60+10, 60-10, 60+10, 180-10, 180+10, -60-10]*(pi/180);
|
||||
end
|
||||
|
@@ -5,10 +5,10 @@ function [nano_hexapod] = initializeSimplifiedNanoHexapod(args)
|
||||
args.H (1,1) double {mustBeNumeric, mustBePositive} = 95e-3 % Height of the nano-hexapod [m]
|
||||
args.MO_B (1,1) double {mustBeNumeric} = 150e-3 % Height of {B} w.r.t. {M} [m]
|
||||
%% generateGeneralConfiguration
|
||||
args.FH (1,1) double {mustBeNumeric, mustBePositive} = 15e-3 % Height of fixed joints [m]
|
||||
args.FH (1,1) double {mustBeNumeric, mustBeNonnegative} = 15e-3 % Height of fixed joints [m]
|
||||
args.FR (1,1) double {mustBeNumeric, mustBePositive} = 120e-3 % Radius of fixed joints [m]
|
||||
args.FTh (6,1) double {mustBeNumeric} = [220, 320, 340, 80, 100, 200]*(pi/180) % Angles of fixed joints [rad]
|
||||
args.MH (1,1) double {mustBeNumeric, mustBePositive} = 15e-3 % Height of mobile joints [m]
|
||||
args.MH (1,1) double {mustBeNumeric, mustBeNonnegative} = 15e-3 % Height of mobile joints [m]
|
||||
args.MR (1,1) double {mustBeNumeric, mustBePositive} = 110e-3 % Radius of mobile joints [m]
|
||||
args.MTh (6,1) double {mustBeNumeric} = [255, 285, 15, 45, 135, 165]*(pi/180) % Angles of fixed joints [rad]
|
||||
%% Actuators
|
||||
|
Reference in New Issue
Block a user