Add study about APA300ML

This commit is contained in:
Thomas Dehaeze 2020-08-03 15:37:17 +02:00
parent bc62f55f22
commit 77c75f5a67
16 changed files with 1742 additions and 105 deletions

BIN
figs/apa300ml_ansys.jpg Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

BIN
figs/apa300ml_dvf_plant.pdf Normal file

Binary file not shown.

BIN
figs/apa300ml_dvf_plant.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 127 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

BIN
figs/apa300ml_iff_plant.pdf Normal file

Binary file not shown.

BIN
figs/apa300ml_iff_plant.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 146 KiB

BIN
figs/apa300ml_resonance.pdf Normal file

Binary file not shown.

BIN
figs/apa300ml_resonance.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

1612
index.html

File diff suppressed because it is too large Load Diff

235
index.org
View File

@ -664,6 +664,12 @@ The two identified dynamics are compared in Figure [[fig:dynamics_act_disp_comp_
#+end_src
* APA300ML
** Introduction :ignore:
#+name: fig:apa300ml_ansys
#+caption: Ansys FEM of the APA300ML
[[file:figs/apa300ml_ansys.jpg]]
** 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>>
@ -715,8 +721,8 @@ Then, we extract the coordinates of the interface nodes.
#+RESULTS:
| Total number of Nodes | 7 |
| Number of interface Nodes | 7 |
| Number of Modes | 38 |
| Size of M and K matrices | 80 |
| Number of Modes | 6 |
| Size of M and K matrices | 48 |
#+begin_src matlab :exports results :results value table replace :tangle no :post addhdr(*this*)
data2orgtable([[1:length(int_i)]', int_i, int_xyz], {}, {'Node i', 'Node Number', 'x [m]', 'y [m]', 'z [m]'}, ' %f ');
@ -814,6 +820,112 @@ where:
#+RESULTS:
: 5.8594
** Identification of the APA Characteristics
*** Stiffness
#+begin_src matlab :exports none
m = 0.001;
#+end_src
The transfer function from vertical external force to the relative vertical displacement is identified.
#+begin_src matlab :exports none
%% Name of the Simulink File
mdl = 'APA300ML_test_bench';
%% Input/Output definition
clear io; io_i = 1;
io(io_i) = linio([mdl, '/Fd'], 1, 'openinput'); io_i = io_i + 1;
io(io_i) = linio([mdl, '/y'], 1, 'openoutput'); io_i = io_i + 1;
G = linearize(mdl, io);
#+end_src
The inverse of its DC gain is the axial stiffness of the APA:
#+begin_src matlab :results replace value
1e-6/dcgain(G) % [N/um]
#+end_src
#+RESULTS:
: 1.8634
The specified stiffness in the datasheet is $k = 1.8\, [N/\mu m]$.
*** Resonance Frequency
The resonance frequency is specified to be between 650Hz and 840Hz.
This is also the case for the FEM model (Figure [[fig:apa300ml_resonance]]).
#+begin_src matlab :exports none
freqs = logspace(2, 4, 5000);
figure;
hold on;
plot(freqs, abs(squeeze(freqresp(G, freqs, 'Hz'))));
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
xlabel('Frequency [Hz]'); ylabel('Amplitude');
hold off;
#+end_src
#+begin_src matlab :tangle no :exports results :results file replace
exportFig('figs/apa300ml_resonance.pdf', 'width', 'wide', 'height', 'normal');
#+end_src
#+name: fig:apa300ml_resonance
#+caption: First resonance is around 800Hz
#+RESULTS:
[[file:figs/apa300ml_resonance.png]]
*** Amplification factor
The amplification factor is the ratio of the axial displacement to the stack displacement.
#+begin_src matlab :exports none
%% Name of the Simulink File
mdl = 'APA300ML_test_bench';
%% Input/Output definition
clear io; io_i = 1;
io(io_i) = linio([mdl, '/F'], 1, 'openinput'); io_i = io_i + 1;
io(io_i) = linio([mdl, '/y'], 1, 'openoutput'); io_i = io_i + 1;
io(io_i) = linio([mdl, '/d'], 1, 'openoutput'); io_i = io_i + 1;
G = linearize(mdl, io);
#+end_src
The ratio of the two displacement is computed from the FEM model.
#+begin_src matlab :results replace value
-dcgain(G(1,1))./dcgain(G(2,1))
#+end_src
#+RESULTS:
: 4.936
If we take the ratio of the piezo height and length (approximation of the amplification factor):
#+begin_src matlab :results replace value
75/15
#+end_src
#+RESULTS:
: 5
*** Stroke
Estimation of the actuator stroke:
\[ \Delta H = A n \Delta L \]
with:
- $\Delta H$ Axial Stroke of the APA
- $A$ Amplification factor (5 for the APA300ML)
- $n$ Number of stack used
- $\Delta L$ Stroke of the stack (0.1% of its length)
#+begin_src matlab :results replace value
1e6 * 5 * 3 * 20e-3 * 0.1e-2
#+end_src
#+RESULTS:
: 300
This is exactly the specified stroke in the data-sheet.
** Identification of the Dynamics
The flexible element is imported using the =Reduced Order Flexible Solid= simscape block.
@ -823,12 +935,12 @@ A =Relative Motion Sensor= block is added between the nodes 1 and 2 to measure t
One mass is fixed at one end of the piezo-electric stack actuator, the other end is fixed to the world frame.
We first set the mass to be zero.
#+begin_src matlab
#+begin_src matlab :exports none
m = 0.01;
#+end_src
The dynamics is identified from the applied force to the measured relative displacement.
#+begin_src matlab
#+begin_src matlab :exports none
%% Name of the Simulink File
mdl = 'APA300ML_test_bench';
@ -840,15 +952,12 @@ The dynamics is identified from the applied force to the measured relative displ
Gh = -linearize(mdl, io);
#+end_src
Then, we add 10Kg of mass:
The same dynamics is identified for a payload mass of 10Kg.
#+begin_src matlab
m = 10;
#+end_src
And the dynamics is identified.
The two identified dynamics are compared in Figure [[fig:dynamics_act_disp_comp_mass]].
#+begin_src matlab
#+begin_src matlab :exports none
%% Name of the Simulink File
mdl = 'APA300ML_test_bench';
@ -890,16 +999,24 @@ The two identified dynamics are compared in Figure [[fig:dynamics_act_disp_comp_
legend('location', 'southwest');
#+end_src
#+begin_src matlab :tangle no :exports results :results file replace
exportFig('figs/apa300ml_plant_dynamics.pdf', 'width', 'full', 'height', 'full');
#+end_src
#+name: fig:apa300ml_plant_dynamics
#+caption: Transfer function from forces applied by the stack to the axial displacement of the APA
#+RESULTS:
[[file:figs/apa300ml_plant_dynamics.png]]
** IFF
Then, we add 10Kg of mass:
#+begin_src matlab
Let's use 2 stacks as actuators and 1 stack as force sensor.
The transfer function from actuator to sensors is identified and shown in Figure [[fig:apa300ml_iff_plant]].
#+begin_src matlab :exports none
m = 10;
#+end_src
And the dynamics is identified.
The two identified dynamics are compared in Figure [[fig:dynamics_act_disp_comp_mass]].
#+begin_src matlab
#+begin_src matlab :exports none
%% Name of the Simulink File
mdl = 'APA300ML_test_bench';
@ -908,7 +1025,7 @@ The two identified dynamics are compared in Figure [[fig:dynamics_act_disp_comp_
io(io_i) = linio([mdl, '/Va'], 1, 'openinput'); io_i = io_i + 1;
io(io_i) = linio([mdl, '/Vs'], 1, 'openoutput'); io_i = io_i + 1;
G = -linearize(mdl, io);
Giff = -linearize(mdl, io);
#+end_src
#+begin_src matlab :exports none
@ -918,7 +1035,7 @@ The two identified dynamics are compared in Figure [[fig:dynamics_act_disp_comp_
ax1 = subplot(2,1,1);
hold on;
plot(freqs, abs(squeeze(freqresp(G, freqs, 'Hz'))), '-');
plot(freqs, abs(squeeze(freqresp(Giff, freqs, 'Hz'))), '-');
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
ylabel('Amplitude'); set(gca, 'XTickLabel',[]);
@ -926,26 +1043,37 @@ The two identified dynamics are compared in Figure [[fig:dynamics_act_disp_comp_
ax2 = subplot(2,1,2);
hold on;
plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(G, freqs, 'Hz')))), '-');
plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(Giff, freqs, 'Hz')))), '-');
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
yticks(-360:90:360);
ylim([-360 0]);
ylim([-180 180]);
xlabel('Frequency [Hz]'); ylabel('Phase [deg]');
hold off;
linkaxes([ax1,ax2],'x');
xlim([freqs(1), freqs(end)]);
#+end_src
#+begin_src matlab
#+begin_src matlab :tangle no :exports results :results file replace
exportFig('figs/apa300ml_iff_plant.pdf', 'width', 'full', 'height', 'full');
#+end_src
#+name: fig:apa300ml_iff_plant
#+caption: Transfer function from actuator to force sensor
#+RESULTS:
[[file:figs/apa300ml_iff_plant.png]]
For root locus corresponding to IFF is shown in Figure [[fig:apa300ml_iff_root_locus]].
#+begin_src matlab :exports none
figure;
gains = logspace(0, 5, 500);
hold on;
plot(real(pole(G)), imag(pole(G)), 'kx');
plot(real(tzero(G)), imag(tzero(G)), 'ko');
plot(real(pole(Giff)), imag(pole(Giff)), 'kx');
plot(real(tzero(Giff)), imag(tzero(Giff)), 'ko');
for k = 1:length(gains)
cl_poles = pole(feedback(G, gains(k)/s));
cl_poles = pole(feedback(Giff, gains(k)/s));
plot(real(cl_poles), imag(cl_poles), 'k.');
end
hold off;
@ -955,15 +1083,22 @@ The two identified dynamics are compared in Figure [[fig:dynamics_act_disp_comp_
xlabel('Real Part'); ylabel('Imaginary Part');
#+end_src
#+begin_src matlab :tangle no :exports results :results file replace
exportFig('figs/apa300ml_iff_root_locus.pdf', 'width', 'wide', 'height', 'tall');
#+end_src
#+name: fig:apa300ml_iff_root_locus
#+caption: Root Locus for IFF
#+RESULTS:
[[file:figs/apa300ml_iff_root_locus.png]]
** DVF
#+begin_src matlab
Now the dynamics from the stack actuator to the relative motion sensor is identified and shown in Figure [[fig:apa300ml_dvf_plant]].
#+begin_src matlab :exports none
m = 10;
#+end_src
And the dynamics is identified.
The two identified dynamics are compared in Figure [[fig:dynamics_act_disp_comp_mass]].
#+begin_src matlab
#+begin_src matlab :exports none
%% Name of the Simulink File
mdl = 'APA300ML_test_bench';
@ -1000,7 +1135,18 @@ The two identified dynamics are compared in Figure [[fig:dynamics_act_disp_comp_
xlim([freqs(1), freqs(end)]);
#+end_src
#+begin_src matlab
#+begin_src matlab :tangle no :exports results :results file replace
exportFig('figs/apa300ml_dvf_plant.pdf', 'width', 'full', 'height', 'full');
#+end_src
#+name: fig:apa300ml_dvf_plant
#+caption: Transfer function from stack actuator to relative motion sensor
#+RESULTS:
[[file:figs/apa300ml_dvf_plant.png]]
The root locus for DVF is shown in Figure [[fig:apa300ml_dvf_root_locus]].
#+begin_src matlab :exports none
figure;
gains = logspace(0, 5, 500);
@ -1019,7 +1165,16 @@ The two identified dynamics are compared in Figure [[fig:dynamics_act_disp_comp_
xlabel('Real Part'); ylabel('Imaginary Part');
#+end_src
** Sensor Fusion
#+begin_src matlab :tangle no :exports results :results file replace
exportFig('figs/apa300ml_dvf_root_locus.pdf', 'width', 'wide', 'height', 'tall');
#+end_src
#+name: fig:apa300ml_dvf_root_locus
#+caption: Root Locus for Direct Velocity Feedback
#+RESULTS:
[[file:figs/apa300ml_dvf_root_locus.png]]
** TODO Sensor Fusion :noexport:
- [ ] What is the goal of that? Special control properties, lower the sensor noise?
Use the relative motion sensor at low frequency and the force sensor at high frequency.
@ -1203,6 +1358,12 @@ Root locus
#+end_src
* Flexible Joint
** Introduction :ignore:
#+name: fig:flexor_id16_screenshot
#+caption: Flexor studied
[[file:figs/flexor_id16_screenshot.png]]
** 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>>
@ -1302,16 +1463,16 @@ Using =K=, =M= and =int_xyz=, we can use the =Reduced Order Flexible Solid= sims
** Flexible Joint Characteristics
#+begin_src matlab :exports results :results value table replace :tangle no :post addhdr(*this*)
data2orgtable([1e-6*K(3,3), K(4,4), K(5,5), K(6,6)]', {'Axial Stiffness [N/um]', 'Bending Stiffness [Nm/rad]', 'Bending Stiffness [Nm/rad]', 'Torsion Stiffness [Nm/rad]'}, {'*Caracteristic*', '*Value*'}, ' %0.f ');
data2orgtable([1e-6*K(3,3), K(4,4), K(5,5), K(6,6); 60, 15, 15, 20]', {'Axial Stiffness [N/um]', 'Bending Stiffness [Nm/rad]', 'Bending Stiffness [Nm/rad]', 'Torsion Stiffness [Nm/rad]'}, {'*Caracteristic*', '*Value*', '*Estimation by Francois*'}, ' %0.f ');
#+end_src
#+RESULTS:
| *Caracteristic* | *Value* |
|----------------------------+---------|
| Axial Stiffness [N/um] | 119 |
| Bending Stiffness [Nm/rad] | 33 |
| Bending Stiffness [Nm/rad] | 33 |
| Torsion Stiffness [Nm/rad] | 236 |
| *Caracteristic* | *Value* | *Estimation by Francois* |
|----------------------------+---------+--------------------------|
| Axial Stiffness [N/um] | 119 | 60 |
| Bending Stiffness [Nm/rad] | 33 | 15 |
| Bending Stiffness [Nm/rad] | 33 | 15 |
| Torsion Stiffness [Nm/rad] | 236 | 20 |
** Identification
#+begin_src matlab