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 #+end_src
* APA300ML * APA300ML
** Introduction :ignore:
#+name: fig:apa300ml_ansys
#+caption: Ansys FEM of the APA300ML
[[file:figs/apa300ml_ansys.jpg]]
** Matlab Init :noexport:ignore: ** Matlab Init :noexport:ignore:
#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name) #+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name)
<<matlab-dir>> <<matlab-dir>>
@ -715,8 +721,8 @@ Then, we extract the coordinates of the interface nodes.
#+RESULTS: #+RESULTS:
| Total number of Nodes | 7 | | Total number of Nodes | 7 |
| Number of interface Nodes | 7 | | Number of interface Nodes | 7 |
| Number of Modes | 38 | | Number of Modes | 6 |
| Size of M and K matrices | 80 | | Size of M and K matrices | 48 |
#+begin_src matlab :exports results :results value table replace :tangle no :post addhdr(*this*) #+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 '); 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: #+RESULTS:
: 5.8594 : 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 ** Identification of the Dynamics
The flexible element is imported using the =Reduced Order Flexible Solid= simscape block. 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. 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. We first set the mass to be zero.
#+begin_src matlab #+begin_src matlab :exports none
m = 0.01; m = 0.01;
#+end_src #+end_src
The dynamics is identified from the applied force to the measured relative displacement. 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 %% Name of the Simulink File
mdl = 'APA300ML_test_bench'; 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); Gh = -linearize(mdl, io);
#+end_src #+end_src
Then, we add 10Kg of mass: The same dynamics is identified for a payload mass of 10Kg.
#+begin_src matlab #+begin_src matlab
m = 10; m = 10;
#+end_src #+end_src
And the dynamics is identified. #+begin_src matlab :exports none
The two identified dynamics are compared in Figure [[fig:dynamics_act_disp_comp_mass]].
#+begin_src matlab
%% Name of the Simulink File %% Name of the Simulink File
mdl = 'APA300ML_test_bench'; mdl = 'APA300ML_test_bench';
@ -890,16 +999,24 @@ The two identified dynamics are compared in Figure [[fig:dynamics_act_disp_comp_
legend('location', 'southwest'); legend('location', 'southwest');
#+end_src #+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 ** IFF
Then, we add 10Kg of mass: Let's use 2 stacks as actuators and 1 stack as force sensor.
#+begin_src matlab
The transfer function from actuator to sensors is identified and shown in Figure [[fig:apa300ml_iff_plant]].
#+begin_src matlab :exports none
m = 10; m = 10;
#+end_src #+end_src
And the dynamics is identified. #+begin_src matlab :exports none
The two identified dynamics are compared in Figure [[fig:dynamics_act_disp_comp_mass]].
#+begin_src matlab
%% Name of the Simulink File %% Name of the Simulink File
mdl = 'APA300ML_test_bench'; 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, '/Va'], 1, 'openinput'); io_i = io_i + 1;
io(io_i) = linio([mdl, '/Vs'], 1, 'openoutput'); 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 #+end_src
#+begin_src matlab :exports none #+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); ax1 = subplot(2,1,1);
hold on; hold on;
plot(freqs, abs(squeeze(freqresp(G, freqs, 'Hz'))), '-'); plot(freqs, abs(squeeze(freqresp(Giff, freqs, 'Hz'))), '-');
hold off; hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
ylabel('Amplitude'); set(gca, 'XTickLabel',[]); 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); ax2 = subplot(2,1,2);
hold on; 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'); set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
yticks(-360:90:360); yticks(-360:90:360);
ylim([-360 0]); ylim([-180 180]);
xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); xlabel('Frequency [Hz]'); ylabel('Phase [deg]');
hold off; hold off;
linkaxes([ax1,ax2],'x'); linkaxes([ax1,ax2],'x');
xlim([freqs(1), freqs(end)]); xlim([freqs(1), freqs(end)]);
#+end_src #+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; figure;
gains = logspace(0, 5, 500); gains = logspace(0, 5, 500);
hold on; hold on;
plot(real(pole(G)), imag(pole(G)), 'kx'); plot(real(pole(Giff)), imag(pole(Giff)), 'kx');
plot(real(tzero(G)), imag(tzero(G)), 'ko'); plot(real(tzero(Giff)), imag(tzero(Giff)), 'ko');
for k = 1:length(gains) 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.'); plot(real(cl_poles), imag(cl_poles), 'k.');
end end
hold off; 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'); xlabel('Real Part'); ylabel('Imaginary Part');
#+end_src #+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 ** 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; m = 10;
#+end_src #+end_src
And the dynamics is identified. #+begin_src matlab :exports none
The two identified dynamics are compared in Figure [[fig:dynamics_act_disp_comp_mass]].
#+begin_src matlab
%% Name of the Simulink File %% Name of the Simulink File
mdl = 'APA300ML_test_bench'; 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)]); xlim([freqs(1), freqs(end)]);
#+end_src #+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; figure;
gains = logspace(0, 5, 500); 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'); xlabel('Real Part'); ylabel('Imaginary Part');
#+end_src #+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? - [ ] 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. Use the relative motion sensor at low frequency and the force sensor at high frequency.
@ -1203,6 +1358,12 @@ Root locus
#+end_src #+end_src
* Flexible Joint * Flexible Joint
** Introduction :ignore:
#+name: fig:flexor_id16_screenshot
#+caption: Flexor studied
[[file:figs/flexor_id16_screenshot.png]]
** Matlab Init :noexport:ignore: ** Matlab Init :noexport:ignore:
#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name) #+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name)
<<matlab-dir>> <<matlab-dir>>
@ -1302,16 +1463,16 @@ Using =K=, =M= and =int_xyz=, we can use the =Reduced Order Flexible Solid= sims
** Flexible Joint Characteristics ** Flexible Joint Characteristics
#+begin_src matlab :exports results :results value table replace :tangle no :post addhdr(*this*) #+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 #+end_src
#+RESULTS: #+RESULTS:
| *Caracteristic* | *Value* | | *Caracteristic* | *Value* | *Estimation by Francois* |
|----------------------------+---------| |----------------------------+---------+--------------------------|
| Axial Stiffness [N/um] | 119 | | Axial Stiffness [N/um] | 119 | 60 |
| Bending Stiffness [Nm/rad] | 33 | | Bending Stiffness [Nm/rad] | 33 | 15 |
| Bending Stiffness [Nm/rad] | 33 | | Bending Stiffness [Nm/rad] | 33 | 15 |
| Torsion Stiffness [Nm/rad] | 236 | | Torsion Stiffness [Nm/rad] | 236 | 20 |
** Identification ** Identification
#+begin_src matlab #+begin_src matlab