Compare analytical and multi-body models
This commit is contained in:
parent
fca54e3d88
commit
95b9b460f7
1924
figs/nhexa_comp_multi_body_analytical.pdf
Normal file
1924
figs/nhexa_comp_multi_body_analytical.pdf
Normal file
File diff suppressed because it is too large
Load Diff
BIN
figs/nhexa_comp_multi_body_analytical.png
Normal file
BIN
figs/nhexa_comp_multi_body_analytical.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 150 KiB |
BIN
figs/nhexa_multi_body_plant_dL.pdf
Normal file
BIN
figs/nhexa_multi_body_plant_dL.pdf
Normal file
Binary file not shown.
BIN
figs/nhexa_multi_body_plant_dL.png
Normal file
BIN
figs/nhexa_multi_body_plant_dL.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 92 KiB |
2389
figs/nhexa_multi_body_plant_fm.pdf
Normal file
2389
figs/nhexa_multi_body_plant_fm.pdf
Normal file
File diff suppressed because it is too large
Load Diff
BIN
figs/nhexa_multi_body_plant_fm.png
Normal file
BIN
figs/nhexa_multi_body_plant_fm.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 100 KiB |
@ -14,7 +14,7 @@ function [nano_hexapod] = initializeSimplifiedNanoHexapod(args)
|
||||
%% Actuators
|
||||
args.actuator_type char {mustBeMember(args.actuator_type,{'1dof', '2dof', 'flexible'})} = '1dof'
|
||||
args.actuator_k (1,1) double {mustBeNumeric, mustBePositive} = 1e6
|
||||
args.actuator_kp (1,1) double {mustBeNumeric, mustBeNonnegative} = 5e4
|
||||
args.actuator_kp (1,1) double {mustBeNumeric, mustBeNonnegative} = 1e4
|
||||
args.actuator_ke (1,1) double {mustBeNumeric, mustBePositive} = 4952605
|
||||
args.actuator_ka (1,1) double {mustBeNumeric, mustBePositive} = 2476302
|
||||
args.actuator_c (1,1) double {mustBeNumeric, mustBePositive} = 50
|
||||
|
@ -750,7 +750,7 @@ The primary forces acting on the system are actuator forces $\bm{\tau}$, elastic
|
||||
Combining these forces and using eqref:eq:nhexa_forward_kinematics_approximate yields the complete dynamic equation eqref:eq:nhexa_dynamical_equations.
|
||||
|
||||
\begin{equation}\label{eq:nhexa_dynamical_equations}
|
||||
M s^2 \mathcal{X} = \mathcal{F} - J^T \mathcal{K} J \mathcal{X} - J^T \mathcal{C} J s \mathcal{X}
|
||||
\bm{M} s^2 \bm{\mathcal{X}} = \bm{\mathcal{F}} - \bm{J}^T \bm{\mathcal{K}} \bm{J} \bm{\mathcal{X}} - \bm{J}^T \bm{\mathcal{C}} \bm{J} s \bm{\mathcal{X}}
|
||||
\end{equation}
|
||||
|
||||
The transfer function in the Cartesian frame becomes eqref:eq:nhexa_transfer_function_cart.
|
||||
@ -804,6 +804,9 @@ While a reasonable geometric configuration will be used to validate the NASS dur
|
||||
Complex because has to model the inertia of the struts.
|
||||
Cite papers that tries to model the stewart platform analytically
|
||||
Advantage: it will be easily included in the model of the NASS
|
||||
- Model definition (Section ref:ssec:nhexa_model_def)
|
||||
- Validation of the model by comparing with analytical equations (Section ref:ssec:nhexa_model_validation)
|
||||
- Dynamics of the nano-hexapod used for conceptual analysis: (Section ref:ssec:nhexa_model_dynamics)
|
||||
|
||||
** Matlab Init :noexport:ignore:
|
||||
#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name)
|
||||
@ -834,10 +837,6 @@ While a reasonable geometric configuration will be used to validate the NASS dur
|
||||
<<ssec:nhexa_model_def>>
|
||||
**** Geometry
|
||||
|
||||
#+begin_src matlab
|
||||
nano_hexapod = initializeSimplifiedNanoHexapod();
|
||||
#+end_src
|
||||
|
||||
The geometry of the Stewart platform (see Figure ref:fig:nhexa_stewart_model_def) is defined by the position of frame $\{F\}$ with respect to $\{M\}$ and by the locations of the joints ${}^Fa_i$ and ${}^Mb_i$.
|
||||
The point of interest, indicated by frame $\{A\}$ is located $150\,mm$ above the top platform (i.e. above the $\{M\}$ frame).
|
||||
Parameters that defines the geometry of the nano-hexapod multi-body models are summarized in Table ref:tab:nhexa_stewart_model_geometry.
|
||||
@ -928,15 +927,11 @@ Thanks to the flexibility of the multi-body model, the model of the actuators ca
|
||||
#+end_scriptsize
|
||||
#+end_minipage
|
||||
|
||||
** Model Dynamics
|
||||
<<ssec:nhexa_model_dynamics>>
|
||||
** Validation of the multi-body model
|
||||
<<ssec:nhexa_model_validation>>
|
||||
|
||||
- If all is perfect (mass-less struts, perfect joints, etc...), maybe compare analytical model with simscape model?
|
||||
- Say something about the model order
|
||||
Model order is 12, and that we can compute modes from matrices M and K, compare with the Simscape model
|
||||
- 4 observed modes (due to symmetry, in reality 6 modes)
|
||||
- Compare with analytical formulas (see number of states)
|
||||
- [ ] Effect of parallel on IFF plant?
|
||||
The obtained multi-body model can schematically be represented as in Figure ref:fig:nhexa_stewart_model_input_outputs with actuator inputs $\bm{f}$, force sensor outputs $\bm{f}_m$ and relative displacement outputs $\bm{d}_L$.
|
||||
The 3D representation of the Stewart platform using the multi-body model is shown in Figure ref:fig:nhexa_simscape_screenshot.
|
||||
|
||||
#+attr_latex: :options [b]{0.6\linewidth}
|
||||
#+begin_minipage
|
||||
@ -954,6 +949,32 @@ Thanks to the flexibility of the multi-body model, the model of the actuators ca
|
||||
[[file:figs/nhexa_simscape_screenshot.jpg]]
|
||||
#+end_minipage
|
||||
|
||||
To validate the multi-body model of the Stewart platform, the simplest Stewart platform configuration is used to compare the multi-body dynamics with the analytical transfer functions obtained in Section ref:ssec:nhexa_stewart_platform_dynamics.
|
||||
|
||||
The bottom joints are universal joints while the top joints are spherical joints. All joints mass-less and have zero stiffness in the free DoF.
|
||||
The struts are modelled with a stiffness equal to $k_a = 1\,N/\mu m$, damping $c_a = 10\,N/(m/s)$, and are mass-less.
|
||||
The geometry used is shown in Table ref:tab:nhexa_actuator_parameters.
|
||||
|
||||
The top platform is considered mass-less, but a payload with mass $m = 10\,kg$ is added on top of the Stewart platform.
|
||||
The payload is cylindrical with a radius of $r = 110\,mm$ and a height $h = 300\,mm$ such that its center of mass coincide with $\{A\}$.
|
||||
|
||||
Stiffness, damping and mass matrices for the analytical equations are summarized in eqref:eq:nhexa_analytical_matrices.
|
||||
The transfer functions from actuator forces to displacement of each strut can then be computed using eqref:eq:nhexa_transfer_function_struts.
|
||||
|
||||
\begin{subequations}\label{eq:nhexa_analytical_matrices}
|
||||
\begin{align}
|
||||
\bm{K} &= \text{diag}(k_a,\ k_a,\ k_a,\ k_a,\ k_a,\ k_a) \\
|
||||
\bm{C} &= \text{diag}(c_a,\ c_a,\ c_a,\ c_a,\ c_a,\ c_a) \\
|
||||
\bm{M} &= \text{diag}\left(m,\ m,\ m,\ \frac{1}{12}m(3r^2 + h^2),\ \frac{1}{12}m(3r^2 + h^2),\ \frac{1}{2}mr^2\right)
|
||||
\end{align}
|
||||
\end{subequations}
|
||||
|
||||
The same transfer functions are extracted from the multi-body model.
|
||||
The obtained state-space model has 12 states which corresponds to the 6-DoF of the top platform.
|
||||
|
||||
The transfer functions from the first actuator to the displacement of the 6 struts are compared in Figure ref:fig:nhexa_comp_multi_body_analytical.
|
||||
A good match can be observed between the analytical formulas and the multi-body model therefore validating the multi-body model.
|
||||
|
||||
#+begin_src matlab
|
||||
%% Plant using Analytical Equations
|
||||
% Stewart platform definition
|
||||
@ -964,7 +985,7 @@ stewart = initializeSimplifiedNanoHexapod(...
|
||||
'Mpm', 1e-3, ...
|
||||
'actuator_type', '1dof', ...
|
||||
'actuator_k', k, ...
|
||||
'actuator_kp', 1e4, ...
|
||||
'actuator_kp', 0, ...
|
||||
'actuator_c', c ...
|
||||
);
|
||||
|
||||
@ -1004,62 +1025,35 @@ G_simscape.InputName = {'f1', 'f2', 'f3', 'f4', 'f5', 'f6'};
|
||||
G_simscape.OutputName = {'dL1', 'dL2', 'dL3', 'dL4', 'dL5', 'dL6'};
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab
|
||||
bodeFig({G_analytical(1,1), G_simscape(1,1), G_analytical(1,2), G_simscape(1,2)})
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab
|
||||
% initializeSimplifiedNanoHexapod('flex_type_F', '2dof', 'flex_type_M', '3dof', 'actuator_type', '1dof');
|
||||
% initializeSample('type', 'cylindrical', 'm', 50, 'H', 300e-3);
|
||||
|
||||
% initializeLoggingConfiguration('log', 'none');
|
||||
% initializeController('type', 'open-loop');
|
||||
|
||||
% Input/Output definition
|
||||
clear io; io_i = 1;
|
||||
io(io_i) = linio([mdl, '/Controller'], 1, 'openinput'); io_i = io_i + 1; % Actuator Inputs [N]
|
||||
io(io_i) = linio([mdl, '/plant'], 2, 'openoutput', [], 'dL'); io_i = io_i + 1; % Encoders [m]
|
||||
io(io_i) = linio([mdl, '/plant'], 2, 'openoutput', [], 'fn'); io_i = io_i + 1; % Force Sensors [N]
|
||||
|
||||
% With no payload
|
||||
G = linearize(mdl, io);
|
||||
G.InputName = {'f1', 'f2', 'f3', 'f4', 'f5', 'f6'};
|
||||
G.OutputName = {'dL1', 'dL2', 'dL3', 'dL4', 'dL5', 'dL6', ...
|
||||
'fn1', 'fn2', 'fn3', 'fn4', 'fn5', 'fn6'};
|
||||
|
||||
size(G)
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab :exports none
|
||||
%% Diagonal elements of the FRF matrix from u to de
|
||||
#+begin_src matlab :exports none :results none
|
||||
%% Comparison of the analytical transfer functions and the multi-body model
|
||||
figure;
|
||||
tiledlayout(3, 1, 'TileSpacing', 'Compact', 'Padding', 'None');
|
||||
|
||||
ax1 = nexttile([2,1]);
|
||||
hold on;
|
||||
plot(freqs, abs(squeeze(freqresp(G(1,1), freqs, 'Hz'))), 'color', colors(2,:), ...
|
||||
'DisplayName', '$d_{ei}/u_i$ - Model')
|
||||
for i = 2:6
|
||||
plot(freqs, abs(squeeze(freqresp(G(i,i), freqs, 'Hz'))), 'color', colors(2,:), ...
|
||||
'HandleVisibility', 'off');
|
||||
end
|
||||
for i = 1:5
|
||||
for j = i+1:6
|
||||
plot(freqs, abs(squeeze(freqresp(G(i,j), freqs, 'Hz'))), 'color', [0, 0, 0, 0.2], ...
|
||||
'HandleVisibility', 'off');
|
||||
for i = 1:6
|
||||
plot(freqs, abs(squeeze(freqresp(G_simscape(i,1), freqs, 'Hz'))), 'color', [colors(i,:), 0.5], ...
|
||||
'DisplayName', sprintf('$d_{L%i}/f_1$ - Multi-Body', i))
|
||||
end
|
||||
for i = 1:6
|
||||
plot(freqs, abs(squeeze(freqresp(G_analytical(i,1), freqs, 'Hz'))), '--', 'color', [colors(i,:)], ...
|
||||
'DisplayName', sprintf('$d_{L%i}/f_1$ - Analytical', i))
|
||||
end
|
||||
hold off;
|
||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||
ylabel('Amplitude [m/N]'); set(gca, 'XTickLabel',[]);
|
||||
ylim([1e-9, 1e-4]);
|
||||
leg = legend('location', 'southwest', 'FontSize', 8, 'NumColumns', 1);
|
||||
leg = legend('location', 'northwest', 'FontSize', 6, 'NumColumns', 1);
|
||||
leg.ItemTokenSize(1) = 15;
|
||||
|
||||
ax2 = nexttile;
|
||||
hold on;
|
||||
for i = 1:6
|
||||
plot(freqs, 180/pi*angle(squeeze(freqresp(G(i,i), freqs, 'Hz'))), 'color', [colors(2,:),0.5]);
|
||||
plot(freqs, 180/pi*angle(squeeze(freqresp(G_simscape(i,1), freqs, 'Hz'))), 'color', [colors(i,:),0.5]);
|
||||
end
|
||||
for i = 1:6
|
||||
plot(freqs, 180/pi*angle(squeeze(freqresp(G_analytical(i,1), freqs, 'Hz'))), '--', 'color', colors(i,:));
|
||||
end
|
||||
hold off;
|
||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
|
||||
@ -1071,57 +1065,43 @@ linkaxes([ax1,ax2],'x');
|
||||
xlim([freqs(1), freqs(end)]);
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab :exports none
|
||||
%% Diagonal elements of the FRF matrix from u to de
|
||||
figure;
|
||||
tiledlayout(3, 1, 'TileSpacing', 'Compact', 'Padding', 'None');
|
||||
|
||||
ax1 = nexttile([2,1]);
|
||||
hold on;
|
||||
plot(freqs, abs(squeeze(freqresp(G(6+1,1), freqs, 'Hz'))), 'color', colors(2,:), ...
|
||||
'DisplayName', '$d_{ei}/u_i$ - Model')
|
||||
for i = 2:6
|
||||
plot(freqs, abs(squeeze(freqresp(G(6+i,i), freqs, 'Hz'))), 'color', colors(2,:), ...
|
||||
'HandleVisibility', 'off');
|
||||
end
|
||||
for i = 1:5
|
||||
for j = i+1:6
|
||||
plot(freqs, abs(squeeze(freqresp(G(6+i,j), freqs, 'Hz'))), 'color', [0, 0, 0, 0.2], ...
|
||||
'HandleVisibility', 'off');
|
||||
end
|
||||
end
|
||||
hold off;
|
||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||
ylabel('Amplitude [N/N]'); set(gca, 'XTickLabel',[]);
|
||||
ylim([1e-5, 1e2]);
|
||||
leg = legend('location', 'southwest', 'FontSize', 8, 'NumColumns', 1);
|
||||
leg.ItemTokenSize(1) = 15;
|
||||
|
||||
ax2 = nexttile;
|
||||
hold on;
|
||||
for i = 1:6
|
||||
plot(freqs, 180/pi*angle(squeeze(freqresp(G(6+i,i), freqs, 'Hz'))), 'color', [colors(2,:),0.5]);
|
||||
end
|
||||
hold off;
|
||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
|
||||
ylabel('Phase [deg]'); xlabel('Frequency [Hz]');
|
||||
ylim([-180, 180]);
|
||||
yticks([-180, -90, 0, 90, 180]);
|
||||
|
||||
linkaxes([ax1,ax2],'x');
|
||||
xlim([freqs(1), freqs(end)]);
|
||||
#+begin_src matlab :tangle no :exports results :results file replace
|
||||
exportFig('figs/nhexa_comp_multi_body_analytical.pdf', 'width', 'wide', 'height', 600);
|
||||
#+end_src
|
||||
|
||||
** Nano Hexapod
|
||||
#+name: fig:nhexa_comp_multi_body_analytical
|
||||
#+caption: Comparison of the analytical transfer functions and the multi-body model
|
||||
#+RESULTS:
|
||||
[[file:figs/nhexa_comp_multi_body_analytical.png]]
|
||||
|
||||
** Nano Hexapod Dynamics
|
||||
<<ssec:nhexa_model_dynamics>>
|
||||
|
||||
Now that the multi-body model is validated, it can be used to study the dynamics of the nano-hexapod.
|
||||
The model is initialized as described in Section ref:ssec:nhexa_model_def with a $10\,kg$ payload, and the transfer functions from $\bm{f}$ to $\bm{f}_m$ and $\bm{d}_e$ are computed from the multi-body model.
|
||||
|
||||
|
||||
|
||||
- [X] What payload to use?
|
||||
10kg payload
|
||||
- [ ] Transfer function from f to de:
|
||||
- [ ] All diagonal terms equal (thanks to symmetry and having the same struts)
|
||||
- [ ] 4 observed modes (due to symmetry, in reality 6 modes)
|
||||
- [ ] Decoupled at low frequency $G(j\omega) \xrightarrow[\omega \to 0]{} \mathcal{K}^{-1}$ (low frequency gain is K)
|
||||
- [ ] High frequency gain is $G(j\omega) \xrightarrow[\omega \to \infty]{} J M^{-T} J^T \frac{-1}{\omega^2}$, which is in general not diagonal
|
||||
- [ ] Transfer function from f to fm:
|
||||
- [ ] Alternating poles and zeros
|
||||
- [ ] Effect of parallel stiffness on IFF plant?
|
||||
- [ ] Validation of compliance matrix?
|
||||
|
||||
#+begin_src matlab
|
||||
initializeSimplifiedNanoHexapod();
|
||||
initializeSample('type', 'cylindrical', 'm', 50);
|
||||
%% Multi-Body model of the Nano-Hexapod
|
||||
% Initialize 1DoF
|
||||
initializeSimplifiedNanoHexapod('flex_type_F', '2dof', 'flex_type_M', '3dof', 'actuator_type', '1dof');
|
||||
initializeSample('type', 'cylindrical', 'm', 10, 'H', 300e-3);
|
||||
initializeLoggingConfiguration('log', 'none');
|
||||
initializeController('type', 'open-loop');
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab
|
||||
% Input/Output definition
|
||||
clear io; io_i = 1;
|
||||
io(io_i) = linio([mdl, '/Controller'], 1, 'openinput'); io_i = io_i + 1; % Actuator Inputs [N]
|
||||
@ -1135,36 +1115,50 @@ G.OutputName = {'dL1', 'dL2', 'dL3', 'dL4', 'dL5', 'dL6', ...
|
||||
'fn1', 'fn2', 'fn3', 'fn4', 'fn5', 'fn6'};
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab :exports none
|
||||
%% Diagonal elements of the FRF matrix from u to de
|
||||
#+begin_src matlab
|
||||
%% Multi-Body model of the Nano-Hexapod without parallel stiffness
|
||||
% Initialize 1DoF
|
||||
initializeSimplifiedNanoHexapod('flex_type_F', '2dof', 'flex_type_M', '3dof', 'actuator_type', '1dof', 'actuator_kp', 0);
|
||||
|
||||
% With no payload
|
||||
G_no_kp = linearize(mdl, io);
|
||||
G_no_kp.InputName = {'f1', 'f2', 'f3', 'f4', 'f5', 'f6'};
|
||||
G_no_kp.OutputName = {'dL1', 'dL2', 'dL3', 'dL4', 'dL5', 'dL6', ...
|
||||
'fn1', 'fn2', 'fn3', 'fn4', 'fn5', 'fn6'};
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab :exports none :results none
|
||||
%% Transfer function from actuator force inputs to displacement of each strut
|
||||
figure;
|
||||
tiledlayout(3, 1, 'TileSpacing', 'Compact', 'Padding', 'None');
|
||||
|
||||
ax1 = nexttile([2,1]);
|
||||
hold on;
|
||||
plot(freqs, abs(squeeze(freqresp(G(1,1), freqs, 'Hz'))), 'color', colors(2,:), ...
|
||||
'DisplayName', '$d_{ei}/u_i$ - Model')
|
||||
for i = 2:6
|
||||
plot(freqs, abs(squeeze(freqresp(G(i,i), freqs, 'Hz'))), 'color', colors(2,:), ...
|
||||
'HandleVisibility', 'off');
|
||||
end
|
||||
for i = 1:5
|
||||
for j = i+1:6
|
||||
plot(freqs, abs(squeeze(freqresp(G(i,j), freqs, 'Hz'))), 'color', [0, 0, 0, 0.2], ...
|
||||
'HandleVisibility', 'off');
|
||||
end
|
||||
end
|
||||
plot(freqs, abs(squeeze(freqresp(G(1,1), freqs, 'Hz'))), 'color', colors(1,:), ...
|
||||
'DisplayName', '$d_{ei}/f_i$')
|
||||
for i = 2:6
|
||||
plot(freqs, abs(squeeze(freqresp(G(i,i), freqs, 'Hz'))), 'color', colors(1,:), ...
|
||||
'HandleVisibility', 'off');
|
||||
end
|
||||
plot(freqs, abs(squeeze(freqresp(G(1,2), freqs, 'Hz'))), 'color', [0, 0, 0, 0.2], ...
|
||||
'DisplayName', '$d_{ei}/f_j$')
|
||||
hold off;
|
||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||
ylabel('Amplitude [m/N]'); set(gca, 'XTickLabel',[]);
|
||||
ylim([1e-9, 1e-4]);
|
||||
leg = legend('location', 'southwest', 'FontSize', 8, 'NumColumns', 1);
|
||||
leg = legend('location', 'northwest', 'FontSize', 8, 'NumColumns', 1);
|
||||
leg.ItemTokenSize(1) = 15;
|
||||
|
||||
ax2 = nexttile;
|
||||
hold on;
|
||||
for i = 1:6
|
||||
plot(freqs, 180/pi*angle(squeeze(freqresp(G(i,i), freqs, 'Hz'))), 'color', [colors(2,:),0.5]);
|
||||
plot(freqs, 180/pi*angle(squeeze(freqresp(G(i,i), freqs, 'Hz'))), 'color', [colors(1,:),0.5]);
|
||||
end
|
||||
hold off;
|
||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
|
||||
@ -1176,36 +1170,47 @@ linkaxes([ax1,ax2],'x');
|
||||
xlim([freqs(1), freqs(end)]);
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab :exports none
|
||||
%% Diagonal elements of the FRF matrix from u to de
|
||||
#+begin_src matlab :tangle no :exports results :results file none
|
||||
exportFig('figs/nhexa_multi_body_plant_dL.pdf', 'width', 'half', 'height', 600);
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab :exports none :results none
|
||||
%% Transfer function from actuator force inputs to force sensor in each strut
|
||||
figure;
|
||||
tiledlayout(3, 1, 'TileSpacing', 'Compact', 'Padding', 'None');
|
||||
|
||||
ax1 = nexttile([2,1]);
|
||||
hold on;
|
||||
plot(freqs, abs(squeeze(freqresp(G(6+1,1), freqs, 'Hz'))), 'color', colors(2,:), ...
|
||||
'DisplayName', '$d_{ei}/u_i$ - Model')
|
||||
for i = 2:6
|
||||
plot(freqs, abs(squeeze(freqresp(G(6+i,i), freqs, 'Hz'))), 'color', colors(2,:), ...
|
||||
'HandleVisibility', 'off');
|
||||
end
|
||||
for i = 1:5
|
||||
for j = i+1:6
|
||||
plot(freqs, abs(squeeze(freqresp(G(6+i,j), freqs, 'Hz'))), 'color', [0, 0, 0, 0.2], ...
|
||||
'HandleVisibility', 'off');
|
||||
end
|
||||
end
|
||||
plot(freqs, abs(squeeze(freqresp(G(7,1), freqs, 'Hz'))), 'color', colors(1,:), ...
|
||||
'DisplayName', '$f_{mi}/f_i$')
|
||||
plot(freqs, abs(squeeze(freqresp(G_no_kp(7,1), freqs, 'Hz'))), 'color', colors(2,:), ...
|
||||
'DisplayName', '$f_{mi}/f_i$ (no $k_p$)')
|
||||
for i = 2:6
|
||||
plot(freqs, abs(squeeze(freqresp(G(6+i,i), freqs, 'Hz'))), 'color', colors(1,:), ...
|
||||
'HandleVisibility', 'off');
|
||||
plot(freqs, abs(squeeze(freqresp(G_no_kp(6+i,i), freqs, 'Hz'))), 'color', colors(2,:), ...
|
||||
'HandleVisibility', 'off');
|
||||
end
|
||||
plot(freqs, abs(squeeze(freqresp(G(7,2), freqs, 'Hz'))), 'color', [0, 0, 0, 0.2], ...
|
||||
'DisplayName', '$f_{mi}/f_j$')
|
||||
hold off;
|
||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||
ylabel('Amplitude [N/N]'); set(gca, 'XTickLabel',[]);
|
||||
ylim([1e-5, 1e2]);
|
||||
leg = legend('location', 'southwest', 'FontSize', 8, 'NumColumns', 1);
|
||||
ylim([1e-4, 1e2]);
|
||||
leg = legend('location', 'northwest', 'FontSize', 8, 'NumColumns', 1);
|
||||
leg.ItemTokenSize(1) = 15;
|
||||
|
||||
ax2 = nexttile;
|
||||
hold on;
|
||||
for i = 1:6
|
||||
plot(freqs, 180/pi*angle(squeeze(freqresp(G(6+i,i), freqs, 'Hz'))), 'color', [colors(2,:),0.5]);
|
||||
plot(freqs, 180/pi*angle(squeeze(freqresp(G(6+i,i), freqs, 'Hz'))), 'color', colors(1,:));
|
||||
plot(freqs, 180/pi*angle(squeeze(freqresp(G_no_kp(6+i,i), freqs, 'Hz'))), 'color', colors(2,:));
|
||||
end
|
||||
hold off;
|
||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
|
||||
@ -1217,6 +1222,28 @@ linkaxes([ax1,ax2],'x');
|
||||
xlim([freqs(1), freqs(end)]);
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab :tangle no :exports results :results file none
|
||||
exportFig('figs/nhexa_multi_body_plant_fm.pdf', 'width', 'half', 'height', 600);
|
||||
#+end_src
|
||||
|
||||
#+name: fig:nhexa_multi_body_plant
|
||||
#+caption: Bode plot of the transfer functions computed from the nano-hexapod multi-body model
|
||||
#+attr_latex: :options [htbp]
|
||||
#+begin_figure
|
||||
#+attr_latex: :caption \subcaption{\label{fig:nhexa_multi_body_plant_dL}$f_i$ to $d_{Li}$}
|
||||
#+attr_latex: :options {0.48\textwidth}
|
||||
#+begin_subfigure
|
||||
#+attr_latex: :width \linewidth
|
||||
[[file:figs/nhexa_multi_body_plant_dL.png]]
|
||||
#+end_subfigure
|
||||
#+attr_latex: :caption \subcaption{\label{fig:nhexa_multi_body_plant_fm}$f_i$ to $f_{mi}$}
|
||||
#+attr_latex: :options {0.48\textwidth}
|
||||
#+begin_subfigure
|
||||
#+attr_latex: :width \linewidth
|
||||
[[file:figs/nhexa_multi_body_plant_fm.png]]
|
||||
#+end_subfigure
|
||||
#+end_figure
|
||||
|
||||
** Conclusion
|
||||
:properties:
|
||||
:unnumbered: t
|
||||
@ -1244,6 +1271,8 @@ Different ways to try to decouple a MIMO plant.
|
||||
|
||||
Reference book: [[cite:&skogestad07_multiv_feedb_contr]]
|
||||
|
||||
Control will be more detailed in chapter 2.
|
||||
|
||||
** Matlab Init :noexport:ignore:
|
||||
#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name)
|
||||
<<matlab-dir>>
|
||||
@ -1575,7 +1604,7 @@ function [nano_hexapod] = initializeSimplifiedNanoHexapod(args)
|
||||
%% Actuators
|
||||
args.actuator_type char {mustBeMember(args.actuator_type,{'1dof', '2dof', 'flexible'})} = '1dof'
|
||||
args.actuator_k (1,1) double {mustBeNumeric, mustBePositive} = 1e6
|
||||
args.actuator_kp (1,1) double {mustBeNumeric, mustBeNonnegative} = 5e4
|
||||
args.actuator_kp (1,1) double {mustBeNumeric, mustBeNonnegative} = 1e4
|
||||
args.actuator_ke (1,1) double {mustBeNumeric, mustBePositive} = 4952605
|
||||
args.actuator_ka (1,1) double {mustBeNumeric, mustBePositive} = 2476302
|
||||
args.actuator_c (1,1) double {mustBeNumeric, mustBePositive} = 50
|
||||
|
Binary file not shown.
@ -1,4 +1,4 @@
|
||||
% Created 2025-02-10 Mon 17:32
|
||||
% Created 2025-02-10 Mon 19:03
|
||||
% Intended LaTeX compiler: pdflatex
|
||||
\documentclass[a4paper, 10pt, DIV=12, parskip=full, bibliography=totoc]{scrreprt}
|
||||
|
||||
@ -386,7 +386,7 @@ The primary forces acting on the system are actuator forces \(\bm{\tau}\), elast
|
||||
Combining these forces and using \eqref{eq:nhexa_forward_kinematics_approximate} yields the complete dynamic equation \eqref{eq:nhexa_dynamical_equations}.
|
||||
|
||||
\begin{equation}\label{eq:nhexa_dynamical_equations}
|
||||
M s^2 \mathcal{X} = \mathcal{F} - J^T \mathcal{K} J \mathcal{X} - J^T \mathcal{C} J s \mathcal{X}
|
||||
\bm{M} s^2 \bm{\mathcal{X}} = \bm{\mathcal{F}} - \bm{J}^T \bm{\mathcal{K}} \bm{J} \bm{\mathcal{X}} - \bm{J}^T \bm{\mathcal{C}} \bm{J} s \bm{\mathcal{X}}
|
||||
\end{equation}
|
||||
|
||||
The transfer function in the Cartesian frame becomes \eqref{eq:nhexa_transfer_function_cart}.
|
||||
@ -432,6 +432,9 @@ While a reasonable geometric configuration will be used to validate the NASS dur
|
||||
Complex because has to model the inertia of the struts.
|
||||
Cite papers that tries to model the stewart platform analytically
|
||||
Advantage: it will be easily included in the model of the NASS
|
||||
\item Model definition (Section \ref{ssec:nhexa_model_def})
|
||||
\item Validation of the model by comparing with analytical equations (Section \ref{ssec:nhexa_model_validation})
|
||||
\item Dynamics of the nano-hexapod used for conceptual analysis: (Section \ref{ssec:nhexa_model_dynamics})
|
||||
\end{itemize}
|
||||
\section{Model Definition}
|
||||
\label{ssec:nhexa_model_def}
|
||||
@ -527,12 +530,11 @@ Thanks to the flexibility of the multi-body model, the model of the actuators ca
|
||||
\end{scriptsize}
|
||||
\end{minipage}
|
||||
|
||||
\section{Model Dynamics}
|
||||
\label{ssec:nhexa_model_dynamics}
|
||||
\section{Validation of the multi-body model}
|
||||
\label{ssec:nhexa_model_validation}
|
||||
|
||||
\begin{itemize}
|
||||
\item[{$\square$}] Screenshot of the obtained multi-body model ?
|
||||
\end{itemize}
|
||||
The obtained multi-body model can schematically be represented as in Figure \ref{fig:nhexa_stewart_model_input_outputs} with actuator inputs \(\bm{f}\), force sensor outputs \(\bm{f}_m\) and relative displacement outputs \(\bm{d}_L\).
|
||||
The 3D representation of the Stewart platform using the multi-body model is shown in Figure \ref{fig:nhexa_simscape_screenshot}.
|
||||
|
||||
\begin{minipage}[b]{0.6\linewidth}
|
||||
\begin{center}
|
||||
@ -548,16 +550,79 @@ Thanks to the flexibility of the multi-body model, the model of the actuators ca
|
||||
\end{center}
|
||||
\end{minipage}
|
||||
|
||||
To validate the multi-body model of the Stewart platform, the simplest Stewart platform configuration is used to compare the multi-body dynamics with the analytical transfer functions obtained in Section \ref{ssec:nhexa_stewart_platform_dynamics}.
|
||||
|
||||
The bottom joints are universal joints while the top joints are spherical joints. All joints mass-less and have zero stiffness in the free DoF.
|
||||
The struts are modelled with a stiffness equal to \(k_a = 1\,N/\mu m\), damping \(c_a = 10\,N/(m/s)\), and are mass-less.
|
||||
The geometry used is shown in Table \ref{tab:nhexa_actuator_parameters}.
|
||||
|
||||
The top platform is considered mass-less, but a payload with mass \(m = 10\,kg\) is added on top of the Stewart platform.
|
||||
The payload is cylindrical with a radius of \(r = 110\,mm\) and a height \(h = 300\,mm\) such that its center of mass coincide with \(\{A\}\).
|
||||
|
||||
Stiffness, damping and mass matrices for the analytical equations are summarized in \eqref{eq:nhexa_analytical_matrices}.
|
||||
The transfer functions from actuator forces to displacement of each strut can then be computed using \eqref{eq:nhexa_transfer_function_struts}.
|
||||
|
||||
\begin{subequations}\label{eq:nhexa_analytical_matrices}
|
||||
\begin{align}
|
||||
\bm{K} &= \text{diag}(k_a,\ k_a,\ k_a,\ k_a,\ k_a,\ k_a) \\
|
||||
\bm{C} &= \text{diag}(c_a,\ c_a,\ c_a,\ c_a,\ c_a,\ c_a) \\
|
||||
\bm{M} &= \text{diag}\left(m,\ m,\ m,\ \frac{1}{12}m(3r^2 + h^2),\ \frac{1}{12}m(3r^2 + h^2),\ \frac{1}{2}mr^2\right)
|
||||
\end{align}
|
||||
\end{subequations}
|
||||
|
||||
The same transfer functions are extracted from the multi-body model.
|
||||
The obtained state-space model has 12 states which corresponds to the 6-DoF of the top platform.
|
||||
|
||||
The transfer functions from the first actuator to the displacement of the 6 struts are compared in Figure \ref{fig:nhexa_comp_multi_body_analytical}.
|
||||
A good match can be observed between the analytical formulas and the multi-body model therefore validating the multi-body model.
|
||||
|
||||
\begin{figure}[htbp]
|
||||
\centering
|
||||
\includegraphics[scale=1]{figs/nhexa_comp_multi_body_analytical.png}
|
||||
\caption{\label{fig:nhexa_comp_multi_body_analytical}Comparison of the analytical transfer functions and the multi-body model}
|
||||
\end{figure}
|
||||
|
||||
\section{Nano Hexapod Dynamics}
|
||||
\label{ssec:nhexa_model_dynamics}
|
||||
|
||||
Now that the multi-body model is validated, it can be used to study the dynamics of the nano-hexapod.
|
||||
The model is initialized as described in Section \ref{ssec:nhexa_model_def} with a \(10\,kg\) payload, and the transfer functions from \(\bm{f}\) to \(\bm{f}_m\) and \(\bm{d}_e\) are computed from the multi-body model.
|
||||
|
||||
|
||||
|
||||
\begin{itemize}
|
||||
\item If all is perfect (mass-less struts, perfect joints, etc\ldots{}), maybe compare analytical model with simscape model?
|
||||
\item Say something about the model order
|
||||
Model order is 12, and that we can compute modes from matrices M and K, compare with the Simscape model
|
||||
\item 4 observed modes (due to symmetry, in reality 6 modes)
|
||||
\item Compare with analytical formulas (see number of states)
|
||||
\item[{$\square$}] Effect of parallel on IFF plant?
|
||||
\item[{$\boxtimes$}] What payload to use?
|
||||
10kg payload
|
||||
\item[{$\square$}] Transfer function from f to de:
|
||||
\begin{itemize}
|
||||
\item[{$\square$}] All diagonal terms equal (thanks to symmetry and having the same struts)
|
||||
\item[{$\square$}] 4 observed modes (due to symmetry, in reality 6 modes)
|
||||
\item[{$\square$}] Decoupled at low frequency \(G(j\omega) \xrightarrow[\omega \to 0]{} \mathcal{K}^{-1}\) (low frequency gain is K)
|
||||
\item[{$\square$}] High frequency gain is \(G(j\omega) \xrightarrow[\omega \to \infty]{} J M^{-T} J^T \frac{-1}{\omega^2}\), which is in general not diagonal
|
||||
\end{itemize}
|
||||
\item[{$\square$}] Transfer function from f to fm:
|
||||
\begin{itemize}
|
||||
\item[{$\square$}] Alternating poles and zeros
|
||||
\item[{$\square$}] Effect of parallel stiffness on IFF plant?
|
||||
\end{itemize}
|
||||
\item[{$\square$}] Validation of compliance matrix?
|
||||
\end{itemize}
|
||||
|
||||
\section{Nano Hexapod}
|
||||
\begin{figure}[htbp]
|
||||
\begin{subfigure}{0.48\textwidth}
|
||||
\begin{center}
|
||||
\includegraphics[scale=1,width=\linewidth]{figs/nhexa_multi_body_plant_dL.png}
|
||||
\end{center}
|
||||
\subcaption{\label{fig:nhexa_multi_body_plant_dL}$f_i$ to $d_{Li}$}
|
||||
\end{subfigure}
|
||||
\begin{subfigure}{0.48\textwidth}
|
||||
\begin{center}
|
||||
\includegraphics[scale=1,width=\linewidth]{figs/nhexa_multi_body_plant_fm.png}
|
||||
\end{center}
|
||||
\subcaption{\label{fig:nhexa_multi_body_plant_fm}$f_i$ to $f_{mi}$}
|
||||
\end{subfigure}
|
||||
\caption{\label{fig:nhexa_multi_body_plant}Bode plot of the transfer functions computed from the nano-hexapod multi-body model}
|
||||
\end{figure}
|
||||
|
||||
\section*{Conclusion}
|
||||
\begin{itemize}
|
||||
@ -580,6 +645,8 @@ Important to have tools to study interaction
|
||||
Different ways to try to decouple a MIMO plant.
|
||||
|
||||
Reference book: \cite{skogestad07_multiv_feedb_contr}
|
||||
|
||||
Control will be more detailed in chapter 2.
|
||||
\section{Centralized and Decentralized Control}
|
||||
\label{ssec:nhexa_control_centralized_decentralized}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user