Add study about APA300ML
BIN
figs/apa300ml_ansys.jpg
Executable file
After Width: | Height: | Size: 45 KiB |
BIN
figs/apa300ml_dvf_plant.pdf
Normal file
BIN
figs/apa300ml_dvf_plant.png
Normal file
After Width: | Height: | Size: 127 KiB |
BIN
figs/apa300ml_dvf_root_locus.pdf
Normal file
BIN
figs/apa300ml_dvf_root_locus.png
Normal file
After Width: | Height: | Size: 24 KiB |
BIN
figs/apa300ml_iff_plant.pdf
Normal file
BIN
figs/apa300ml_iff_plant.png
Normal file
After Width: | Height: | Size: 106 KiB |
BIN
figs/apa300ml_iff_root_locus.pdf
Normal file
BIN
figs/apa300ml_iff_root_locus.png
Normal file
After Width: | Height: | Size: 26 KiB |
BIN
figs/apa300ml_plant_dynamics.pdf
Normal file
BIN
figs/apa300ml_plant_dynamics.png
Normal file
After Width: | Height: | Size: 146 KiB |
BIN
figs/apa300ml_resonance.pdf
Normal file
BIN
figs/apa300ml_resonance.png
Normal file
After Width: | Height: | Size: 63 KiB |
1612
index.html
235
index.org
@ -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
|
||||
|