Update active damping analysis

This commit is contained in:
2020-02-11 18:04:45 +01:00
parent 7ff04f690f
commit 9659e5a507
51 changed files with 540 additions and 513 deletions

View File

@@ -46,7 +46,7 @@ The following decentralized active damping techniques are briefly studied:
* Inertial Control
:PROPERTIES:
:header-args:matlab+: :tangle matlab/active_damping_inertial.m
:header-args:matlab+: :tangle ../matlab/active_damping_inertial.m
:header-args:matlab+: :comments org :mkdirp yes
:END:
<<sec:active_damping_inertial>>
@@ -76,11 +76,12 @@ The following decentralized active damping techniques are briefly studied:
stewart = generateGeneralConfiguration(stewart);
stewart = computeJointsPose(stewart);
stewart = initializeStrutDynamics(stewart);
stewart = initializeJointDynamics(stewart, 'disable', true);
stewart = initializeJointDynamics(stewart, 'type_F', 'universal_p', 'type_M', 'spherical_p');
stewart = initializeCylindricalPlatforms(stewart);
stewart = initializeCylindricalStruts(stewart);
stewart = computeJacobian(stewart);
stewart = initializeStewartPose(stewart);
stewart = initializeInertialSensor(stewart, 'type', 'accelerometer', 'freq', 5e3);
#+end_src
#+begin_src matlab
@@ -104,7 +105,7 @@ The following decentralized active damping techniques are briefly studied:
The transfer function from actuator forces to force sensors is shown in Figure [[fig:inertial_plant_coupling]].
#+begin_src matlab :exports none
freqs = logspace(1, 3, 1000);
freqs = logspace(1, 4, 1000);
figure;
@@ -147,18 +148,26 @@ The transfer function from actuator forces to force sensors is shown in Figure [
#+caption: Transfer function from the Actuator force $F_{i}$ to the absolute velocity of the same leg $v_{m,i}$ and to the absolute velocity of the other legs $v_{m,j}$ with $i \neq j$ in grey ([[./figs/inertial_plant_coupling.png][png]], [[./figs/inertial_plant_coupling.pdf][pdf]])
[[file:figs/inertial_plant_coupling.png]]
** Effect of the Flexible Joint stiffness on the Dynamics
** Effect of the Flexible Joint stiffness and Actuator amplification on the Dynamics
We add some stiffness and damping in the flexible joints and we re-identify the dynamics.
#+begin_src matlab
stewart = initializeJointDynamics(stewart);
stewart = initializeJointDynamics(stewart, 'type_F', 'universal', 'type_M', 'spherical');
Gf = linearize(mdl, io, options);
Gf.InputName = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
Gf.OutputName = {'Vm1', 'Vm2', 'Vm3', 'Vm4', 'Vm5', 'Vm6'};
#+end_src
We now use the amplified actuators and re-identify the dynamics
#+begin_src matlab
stewart = initializeAmplifiedStrutDynamics(stewart);
Ga = linearize(mdl, io, options);
Ga.InputName = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
Ga.OutputName = {'Vm1', 'Vm2', 'Vm3', 'Vm4', 'Vm5', 'Vm6'};
#+end_src
The new dynamics from force actuator to force sensor is shown in Figure [[fig:inertial_plant_flexible_joint_decentralized]].
#+begin_src matlab :exports none
freqs = logspace(1, 3, 1000);
freqs = logspace(1, 4, 1000);
figure;
@@ -166,6 +175,7 @@ The new dynamics from force actuator to force sensor is shown in Figure [[fig:in
hold on;
plot(freqs, abs(squeeze(freqresp(G( 'Vm1', 'F1'), freqs, 'Hz'))));
plot(freqs, abs(squeeze(freqresp(Gf('Vm1', 'F1'), freqs, 'Hz'))));
plot(freqs, abs(squeeze(freqresp(Ga('Vm1', 'F1'), freqs, 'Hz'))));
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
ylabel('Amplitude [$\frac{m/s}{N}$]'); set(gca, 'XTickLabel',[]);
@@ -174,6 +184,7 @@ The new dynamics from force actuator to force sensor is shown in Figure [[fig:in
hold on;
plot(freqs, 180/pi*angle(squeeze(freqresp(G( 'Vm1', 'F1'), freqs, 'Hz'))), 'DisplayName', 'Perfect Joints');
plot(freqs, 180/pi*angle(squeeze(freqresp(Gf('Vm1', 'F1'), freqs, 'Hz'))), 'DisplayName', 'Flexible Joints');
plot(freqs, 180/pi*angle(squeeze(freqresp(Ga('Vm1', 'F1'), freqs, 'Hz'))), 'DisplayName', 'Amplified Actuator');
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
ylabel('Phase [deg]'); xlabel('Frequency [Hz]');
@@ -203,30 +214,38 @@ The $6 \times 6$ control is a diagonal matrix with pure proportional action on t
0 & & 1
\end{bmatrix} \]
The root locus is shown in figure [[fig:root_locus_inertial_rot_stiffness]] and the obtained pole damping function of the control gain is shown in figure [[fig:pole_damping_gain_inertial_rot_stiffness]].
The root locus is shown in figure [[fig:root_locus_inertial_rot_stiffness]].
#+begin_src matlab :exports none
gains = logspace(0, 5, 1000);
gains = logspace(2, 5, 100);
figure;
hold on;
plot(real(pole(G)), imag(pole(G)), 'x');
plot(real(pole(Gf)), imag(pole(Gf)), 'x');
plot(real(pole(Ga)), imag(pole(Ga)), 'x');
set(gca,'ColorOrderIndex',1);
plot(real(tzero(G)), imag(tzero(G)), 'o');
plot(real(tzero(Gf)), imag(tzero(Gf)), 'o');
plot(real(tzero(Ga)), imag(tzero(Ga)), 'o');
for i = 1:length(gains)
cl_poles = pole(feedback(G, gains(i)*eye(6)));
set(gca,'ColorOrderIndex',1);
plot(real(cl_poles), imag(cl_poles), '.');
cl_poles = pole(feedback(Gf, gains(i)*eye(6)));
cl_poles = pole(feedback(G, gains(i)*eye(6)));
p1 = plot(real(cl_poles), imag(cl_poles), '.');
set(gca,'ColorOrderIndex',2);
plot(real(cl_poles), imag(cl_poles), '.');
cl_poles = pole(feedback(Gf, gains(i)*eye(6)));
p2 = plot(real(cl_poles), imag(cl_poles), '.');
set(gca,'ColorOrderIndex',3);
cl_poles = pole(feedback(Ga, gains(i)*eye(6)));
p3 = plot(real(cl_poles), imag(cl_poles), '.');
end
ylim([0,2000]);
xlim([-2000,0]);
ylim([0, 3*max(imag(pole(G)))]);
xlim([-3*max(imag(pole(G))),0]);
xlabel('Real Part')
ylabel('Imaginary Part')
axis square
legend([p1, p2, p3], {'Perfect Joints', 'Flexible Joints', 'Amplified Actuator'}, 'location', 'northwest');
#+end_src
#+header: :tangle no :exports results :results none :noweb yes
@@ -238,44 +257,14 @@ The root locus is shown in figure [[fig:root_locus_inertial_rot_stiffness]] and
#+caption: Root Locus plot with Decentralized Inertial Control when considering the stiffness of flexible joints ([[./figs/root_locus_inertial_rot_stiffness.png][png]], [[./figs/root_locus_inertial_rot_stiffness.pdf][pdf]])
[[file:figs/root_locus_inertial_rot_stiffness.png]]
#+begin_src matlab :exports none
gains = logspace(0, 5, 1000);
figure;
hold on;
for i = 1:length(gains)
set(gca,'ColorOrderIndex',1);
cl_poles = pole(feedback(G, gains(i)*eye(6)));
poles_damp = phase(cl_poles(imag(cl_poles)>0)) - pi/2;
plot(gains(i)*ones(size(poles_damp)), poles_damp, '.');
set(gca,'ColorOrderIndex',2);
cl_poles = pole(feedback(Gf, gains(i)*eye(6)));
poles_damp = phase(cl_poles(imag(cl_poles)>0)) - pi/2;
plot(gains(i)*ones(size(poles_damp)), poles_damp, '.');
end
xlabel('Control Gain');
ylabel('Damping of the Poles');
set(gca, 'XScale', 'log');
ylim([0,pi/2]);
#+end_src
#+header: :tangle no :exports results :results none :noweb yes
#+begin_src matlab :var filepath="figs/pole_damping_gain_inertial_rot_stiffness.pdf" :var figsize="wide-tall" :post pdf2svg(file=*this*, ext="png")
<<plt-matlab>>
#+end_src
#+name: fig:pole_damping_gain_inertial_rot_stiffness
#+caption: Damping of the poles with respect to the gain of the Decentralized Inertial Control when considering the stiffness of flexible joints ([[./figs/pole_damping_gain_inertial_rot_stiffness.png][png]], [[./figs/pole_damping_gain_inertial_rot_stiffness.pdf][pdf]])
[[file:figs/pole_damping_gain_inertial_rot_stiffness.png]]
** Conclusion
#+begin_important
Joint stiffness does increase the resonance frequencies of the system but does not change the attainable damping when using relative motion sensors.
We do not have guaranteed stability with Inertial control. This is because of the flexibility inside the internal sensor.
#+end_important
* Integral Force Feedback
:PROPERTIES:
:header-args:matlab+: :tangle matlab/active_damping_iff.m
:header-args:matlab+: :tangle ../matlab/active_damping_iff.m
:header-args:matlab+: :comments org :mkdirp yes
:END:
<<sec:active_damping_iff>>
@@ -306,12 +295,12 @@ We first initialize the Stewart platform without joint stiffness.
stewart = generateGeneralConfiguration(stewart);
stewart = computeJointsPose(stewart);
stewart = initializeStrutDynamics(stewart);
stewart = initializeAmplifiedStrutDynamics(stewart);
stewart = initializeJointDynamics(stewart, 'disable', true);
stewart = initializeJointDynamics(stewart, 'type_F', 'universal_p', 'type_M', 'spherical_p');
stewart = initializeCylindricalPlatforms(stewart);
stewart = initializeCylindricalStruts(stewart);
stewart = computeJacobian(stewart);
stewart = initializeStewartPose(stewart);
stewart = initializeInertialSensor(stewart, 'type', 'none');
#+end_src
And we identify the dynamics from force actuators to force sensors.
@@ -379,18 +368,26 @@ The transfer function from actuator forces to force sensors is shown in Figure [
#+caption: Transfer function from the Actuator force $F_{i}$ to the Force sensor of the same leg $F_{m,i}$ and to the force sensor of the other legs $F_{m,j}$ with $i \neq j$ in grey ([[./figs/iff_plant_coupling.png][png]], [[./figs/iff_plant_coupling.pdf][pdf]])
[[file:figs/iff_plant_coupling.png]]
** Effect of the Flexible Joint stiffness on the Dynamics
** Effect of the Flexible Joint stiffness and Actuator amplification on the Dynamics
We add some stiffness and damping in the flexible joints and we re-identify the dynamics.
#+begin_src matlab
stewart = initializeJointDynamics(stewart);
stewart = initializeJointDynamics(stewart, 'type_F', 'universal', 'type_M', 'spherical');
Gf = linearize(mdl, io, options);
Gf.InputName = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
Gf.OutputName = {'Fm1', 'Fm2', 'Fm3', 'Fm4', 'Fm5', 'Fm6'};
#+end_src
We now use the amplified actuators and re-identify the dynamics
#+begin_src matlab
stewart = initializeAmplifiedStrutDynamics(stewart);
Ga = linearize(mdl, io, options);
Ga.InputName = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
Ga.OutputName = {'Fm1', 'Fm2', 'Fm3', 'Fm4', 'Fm5', 'Fm6'};
#+end_src
The new dynamics from force actuator to force sensor is shown in Figure [[fig:iff_plant_flexible_joint_decentralized]].
#+begin_src matlab :exports none
freqs = logspace(1, 3, 1000);
freqs = logspace(1, 4, 1000);
figure;
@@ -398,6 +395,7 @@ The new dynamics from force actuator to force sensor is shown in Figure [[fig:if
hold on;
plot(freqs, abs(squeeze(freqresp(G( 'Fm1', 'F1'), freqs, 'Hz'))));
plot(freqs, abs(squeeze(freqresp(Gf('Fm1', 'F1'), freqs, 'Hz'))));
plot(freqs, abs(squeeze(freqresp(Ga('Fm1', 'F1'), freqs, 'Hz'))));
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
ylabel('Amplitude [N/N]'); set(gca, 'XTickLabel',[]);
@@ -406,6 +404,7 @@ The new dynamics from force actuator to force sensor is shown in Figure [[fig:if
hold on;
plot(freqs, 180/pi*angle(squeeze(freqresp(G( 'Fm1', 'F1'), freqs, 'Hz'))), 'DisplayName', 'Perfect Joints');
plot(freqs, 180/pi*angle(squeeze(freqresp(Gf('Fm1', 'F1'), freqs, 'Hz'))), 'DisplayName', 'Flexible Joints');
plot(freqs, 180/pi*angle(squeeze(freqresp(Ga('Fm1', 'F1'), freqs, 'Hz'))), 'DisplayName', 'Amplified Actuators');
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
ylabel('Phase [deg]'); xlabel('Frequency [Hz]');
@@ -443,22 +442,30 @@ The root locus is shown in figure [[fig:root_locus_iff_rot_stiffness]] and the o
hold on;
plot(real(pole(G)), imag(pole(G)), 'x');
plot(real(pole(Gf)), imag(pole(Gf)), 'x');
plot(real(pole(Ga)), imag(pole(Ga)), 'x');
set(gca,'ColorOrderIndex',1);
plot(real(tzero(G)), imag(tzero(G)), 'o');
plot(real(tzero(Gf)), imag(tzero(Gf)), 'o');
plot(real(tzero(Ga)), imag(tzero(Ga)), 'o');
for i = 1:length(gains)
cl_poles = pole(feedback(G, (gains(i)/s)*eye(6)));
set(gca,'ColorOrderIndex',1);
plot(real(cl_poles), imag(cl_poles), '.');
p1 = plot(real(cl_poles), imag(cl_poles), '.');
cl_poles = pole(feedback(Gf, (gains(i)/s)*eye(6)));
set(gca,'ColorOrderIndex',2);
plot(real(cl_poles), imag(cl_poles), '.');
p2 = plot(real(cl_poles), imag(cl_poles), '.');
cl_poles = pole(feedback(Ga, (gains(i)/s)*eye(6)));
set(gca,'ColorOrderIndex',3);
p3 = plot(real(cl_poles), imag(cl_poles), '.');
end
ylim([0,inf]);
xlim([-3000,0]);
ylim([0, 1.1*max(imag(pole(G)))]);
xlim([-1.1*max(imag(pole(G))),0]);
xlabel('Real Part')
ylabel('Imaginary Part')
axis square
legend([p1, p2, p3], {'Perfect Joints', 'Flexible Joints', 'Amplified Actuator'}, 'location', 'northwest');
#+end_src
#+header: :tangle no :exports results :results none :noweb yes
@@ -479,16 +486,23 @@ The root locus is shown in figure [[fig:root_locus_iff_rot_stiffness]] and the o
set(gca,'ColorOrderIndex',1);
cl_poles = pole(feedback(G, (gains(i)/s)*eye(6)));
poles_damp = phase(cl_poles(imag(cl_poles)>0)) - pi/2;
plot(gains(i)*ones(size(poles_damp)), poles_damp, '.');
p1 = plot(gains(i)*ones(size(poles_damp)), poles_damp, '.');
set(gca,'ColorOrderIndex',2);
cl_poles = pole(feedback(Gf, (gains(i)/s)*eye(6)));
poles_damp = phase(cl_poles(imag(cl_poles)>0)) - pi/2;
plot(gains(i)*ones(size(poles_damp)), poles_damp, '.');
p2 = plot(gains(i)*ones(size(poles_damp)), poles_damp, '.');
set(gca,'ColorOrderIndex',3);
cl_poles = pole(feedback(Ga, (gains(i)/s)*eye(6)));
poles_damp = phase(cl_poles(imag(cl_poles)>0)) - pi/2;
p3 = plot(gains(i)*ones(size(poles_damp)), poles_damp, '.');
end
xlabel('Control Gain');
ylabel('Damping of the Poles');
set(gca, 'XScale', 'log');
ylim([0,pi/2]);
legend([p1, p2, p3], {'Perfect Joints', 'Flexible Joints', 'Amplified Actuator'}, 'location', 'northwest');
#+end_src
#+header: :tangle no :exports results :results none :noweb yes
@@ -508,7 +522,7 @@ The root locus is shown in figure [[fig:root_locus_iff_rot_stiffness]] and the o
* Direct Velocity Feedback
:PROPERTIES:
:header-args:matlab+: :tangle matlab/active_damping_dvf.m
:header-args:matlab+: :tangle ../matlab/active_damping_dvf.m
:header-args:matlab+: :comments org :mkdirp yes
:END:
<<sec:active_damping_dvf>>
@@ -539,11 +553,12 @@ We first initialize the Stewart platform without joint stiffness.
stewart = generateGeneralConfiguration(stewart);
stewart = computeJointsPose(stewart);
stewart = initializeStrutDynamics(stewart);
stewart = initializeJointDynamics(stewart, 'disable', true);
stewart = initializeJointDynamics(stewart, 'type_F', 'universal_p', 'type_M', 'spherical_p');
stewart = initializeCylindricalPlatforms(stewart);
stewart = initializeCylindricalStruts(stewart);
stewart = computeJacobian(stewart);
stewart = initializeStewartPose(stewart);
stewart = initializeInertialSensor(stewart, 'type', 'none');
#+end_src
And we identify the dynamics from force actuators to force sensors.
@@ -568,7 +583,7 @@ And we identify the dynamics from force actuators to force sensors.
The transfer function from actuator forces to relative motion sensors is shown in Figure [[fig:dvf_plant_coupling]].
#+begin_src matlab :exports none
freqs = logspace(1, 3, 1000);
freqs = logspace(1, 4, 1000);
figure;
@@ -612,18 +627,26 @@ The transfer function from actuator forces to relative motion sensors is shown i
[[file:figs/dvf_plant_coupling.png]]
** Effect of the Flexible Joint stiffness on the Dynamics
** Effect of the Flexible Joint stiffness and Actuator amplification on the Dynamics
We add some stiffness and damping in the flexible joints and we re-identify the dynamics.
#+begin_src matlab
stewart = initializeJointDynamics(stewart);
stewart = initializeJointDynamics(stewart, 'type_F', 'universal', 'type_M', 'spherical');
Gf = linearize(mdl, io, options);
Gf.InputName = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
Gf.OutputName = {'Dm1', 'Dm2', 'Dm3', 'Dm4', 'Dm5', 'Dm6'};
#+end_src
We now use the amplified actuators and re-identify the dynamics
#+begin_src matlab
stewart = initializeAmplifiedStrutDynamics(stewart);
Ga = linearize(mdl, io, options);
Ga.InputName = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
Ga.OutputName = {'Dm1', 'Dm2', 'Dm3', 'Dm4', 'Dm5', 'Dm6'};
#+end_src
The new dynamics from force actuator to relative motion sensor is shown in Figure [[fig:dvf_plant_flexible_joint_decentralized]].
#+begin_src matlab :exports none
freqs = logspace(1, 3, 1000);
freqs = logspace(1, 4, 1000);
figure;
@@ -631,6 +654,7 @@ The new dynamics from force actuator to relative motion sensor is shown in Figur
hold on;
plot(freqs, abs(squeeze(freqresp(G( 'Dm1', 'F1'), freqs, 'Hz'))));
plot(freqs, abs(squeeze(freqresp(Gf('Dm1', 'F1'), freqs, 'Hz'))));
plot(freqs, abs(squeeze(freqresp(Ga('Dm1', 'F1'), freqs, 'Hz'))));
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
ylabel('Amplitude [m/N]'); set(gca, 'XTickLabel',[]);
@@ -639,6 +663,7 @@ The new dynamics from force actuator to relative motion sensor is shown in Figur
hold on;
plot(freqs, 180/pi*angle(squeeze(freqresp(G( 'Dm1', 'F1'), freqs, 'Hz'))), 'DisplayName', 'Perfect Joints');
plot(freqs, 180/pi*angle(squeeze(freqresp(Gf('Dm1', 'F1'), freqs, 'Hz'))), 'DisplayName', 'Flexible Joints');
plot(freqs, 180/pi*angle(squeeze(freqresp(Ga('Dm1', 'F1'), freqs, 'Hz'))), 'DisplayName', 'Amplified Actuators');
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
ylabel('Phase [deg]'); xlabel('Frequency [Hz]');
@@ -668,7 +693,7 @@ The $6 \times 6$ control is a diagonal matrix with pure derivative action on the
& & s
\end{bmatrix} \]
The root locus is shown in figure [[fig:root_locus_dvf_rot_stiffness]] and the obtained pole damping function of the control gain is shown in figure [[fig:pole_damping_gain_dvf_rot_stiffness]].
The root locus is shown in figure [[fig:root_locus_dvf_rot_stiffness]].
#+begin_src matlab :exports none
gains = logspace(0, 5, 1000);
@@ -676,22 +701,30 @@ The root locus is shown in figure [[fig:root_locus_dvf_rot_stiffness]] and the o
hold on;
plot(real(pole(G)), imag(pole(G)), 'x');
plot(real(pole(Gf)), imag(pole(Gf)), 'x');
plot(real(pole(Ga)), imag(pole(Gf)), 'x');
set(gca,'ColorOrderIndex',1);
plot(real(tzero(G)), imag(tzero(G)), 'o');
plot(real(tzero(Gf)), imag(tzero(Gf)), 'o');
plot(real(tzero(Ga)), imag(tzero(Gf)), 'o');
for i = 1:length(gains)
cl_poles = pole(feedback(G, (gains(i)*s)*eye(6)));
set(gca,'ColorOrderIndex',1);
plot(real(cl_poles), imag(cl_poles), '.');
cl_poles = pole(feedback(Gf, (gains(i)*s)*eye(6)));
cl_poles = pole(feedback(G, (gains(i)*s)*eye(6)));
p1 = plot(real(cl_poles), imag(cl_poles), '.');
set(gca,'ColorOrderIndex',2);
plot(real(cl_poles), imag(cl_poles), '.');
cl_poles = pole(feedback(Gf, (gains(i)*s)*eye(6)));
p2 = plot(real(cl_poles), imag(cl_poles), '.');
set(gca,'ColorOrderIndex',3);
cl_poles = pole(feedback(Ga, (gains(i)*s)*eye(6)));
p3 = plot(real(cl_poles), imag(cl_poles), '.');
end
ylim([0,inf]);
xlim([-3000,0]);
ylim([0, 1.1*max(imag(pole(G)))]);
xlim([-1.1*max(imag(pole(G))),0]);
xlabel('Real Part')
ylabel('Imaginary Part')
axis square
legend([p1, p2, p3], {'Perfect Joints', 'Flexible Joints', 'Amplified Actuator'}, 'location', 'northwest');
#+end_src
#+header: :tangle no :exports results :results none :noweb yes
@@ -703,36 +736,6 @@ The root locus is shown in figure [[fig:root_locus_dvf_rot_stiffness]] and the o
#+caption: Root Locus plot with Direct Velocity Feedback when considering the Stiffness of flexible joints ([[./figs/root_locus_dvf_rot_stiffness.png][png]], [[./figs/root_locus_dvf_rot_stiffness.pdf][pdf]])
[[file:figs/root_locus_dvf_rot_stiffness.png]]
#+begin_src matlab :exports none
gains = logspace(0, 5, 1000);
figure;
hold on;
for i = 1:length(gains)
set(gca,'ColorOrderIndex',1);
cl_poles = pole(feedback(G, (gains(i)*s)*eye(6)));
poles_damp = phase(cl_poles(imag(cl_poles)>0)) - pi/2;
plot(gains(i)*ones(size(poles_damp)), poles_damp, '.');
set(gca,'ColorOrderIndex',2);
cl_poles = pole(feedback(Gf, (gains(i)*s)*eye(6)));
poles_damp = phase(cl_poles(imag(cl_poles)>0)) - pi/2;
plot(gains(i)*ones(size(poles_damp)), poles_damp, '.');
end
xlabel('Control Gain');
ylabel('Damping of the Poles');
set(gca, 'XScale', 'log');
ylim([0,pi/2]);
#+end_src
#+header: :tangle no :exports results :results none :noweb yes
#+begin_src matlab :var filepath="figs/pole_damping_gain_dvf_rot_stiffness.pdf" :var figsize="wide-tall" :post pdf2svg(file=*this*, ext="png")
<<plt-matlab>>
#+end_src
#+name: fig:pole_damping_gain_dvf_rot_stiffness
#+caption: Damping of the poles with respect to the gain of the Direct Velocity Feedback when considering the Stiffness of flexible joints ([[./figs/pole_damping_gain_dvf_rot_stiffness.png][png]], [[./figs/pole_damping_gain_dvf_rot_stiffness.pdf][pdf]])
[[file:figs/pole_damping_gain_dvf_rot_stiffness.png]]
** Conclusion
#+begin_important
Joint stiffness does increase the resonance frequencies of the system but does not change the attainable damping when using relative motion sensors.

View File

@@ -84,7 +84,7 @@ The Jacobian matrix is estimated at the location of the center of the cube.
#+name: fig:3d-cubic-stewart-aligned
#+caption: Centered cubic configuration
[[file:./figs/3d-cubic-stewart-aligned.png]]
[[file:figs/3d-cubic-stewart-aligned.png]]
#+begin_src matlab :exports none
displayArchitecture(stewart, 'labels', false);
@@ -158,7 +158,7 @@ The Jacobian is estimated at the cube center.
#+name: fig:3d-cubic-stewart-misaligned
#+caption: Not centered cubic configuration
[[file:./figs/3d-cubic-stewart-misaligned.png]]
[[file:figs/3d-cubic-stewart-misaligned.png]]
#+begin_src matlab
stewart = initializeStewartPlatform();
@@ -371,12 +371,12 @@ We observe that $k_{\theta_x} = k_{\theta_y}$ and $k_{\theta_z}$ increase linear
** =generateCubicConfiguration=: Generate a Cubic Configuration
:PROPERTIES:
:header-args:matlab+: :tangle src/generateCubicConfiguration.m
:header-args:matlab+: :tangle ../src/generateCubicConfiguration.m
:header-args:matlab+: :comments none :mkdirp yes :eval no
:END:
<<sec:generateCubicConfiguration>>
This Matlab function is accessible [[file:src/generateCubicConfiguration.m][here]].
This Matlab function is accessible [[file:../src/generateCubicConfiguration.m][here]].
*** Function description
:PROPERTIES:

View File

@@ -215,7 +215,7 @@ The function =forwardKinematicsApprox= (described [[sec:forwardKinematicsApprox]
** Estimation of the range validity of the approximate inverse kinematics
:PROPERTIES:
:header-args:matlab+: :tangle matlab/approximate_inverse_kinematics_validity.m
:header-args:matlab+: :tangle ../matlab/approximate_inverse_kinematics_validity.m
:header-args:matlab+: :comments org :mkdirp yes
:END:
<<sec:approximate_inverse_kinematics_validity>>
@@ -325,7 +325,7 @@ For small wanted displacements (up to $\approx 1\%$ of the size of the Hexapod),
* Estimated required actuator stroke from specified platform mobility
:PROPERTIES:
:header-args:matlab+: :tangle matlab/required_stroke_from_mobility.m
:header-args:matlab+: :tangle ../matlab/required_stroke_from_mobility.m
:header-args:matlab+: :comments org :mkdirp yes
:END:
<<sec:required_actuator_stroke>>
@@ -481,7 +481,7 @@ This is probably a much realistic estimation of the required actuator stroke.
* Estimated platform mobility from specified actuator stroke
:PROPERTIES:
:header-args:matlab+: :tangle matlab/mobility_from_actuator_stroke.m
:header-args:matlab+: :tangle ../matlab/mobility_from_actuator_stroke.m
:header-args:matlab+: :comments org :mkdirp yes
:END:
<<sec:obtained_mobility_from_stroke>>
@@ -593,12 +593,12 @@ using this function https://fr.mathworks.com/help/matlab/ref/contour3.html
<<sec:functions>>
** =computeJacobian=: Compute the Jacobian Matrix
:PROPERTIES:
:header-args:matlab+: :tangle src/computeJacobian.m
:header-args:matlab+: :tangle ../src/computeJacobian.m
:header-args:matlab+: :comments none :mkdirp yes :eval no
:END:
<<sec:computeJacobian>>
This Matlab function is accessible [[file:src/computeJacobian.m][here]].
This Matlab function is accessible [[file:../src/computeJacobian.m][here]].
*** Function description
:PROPERTIES:
@@ -676,12 +676,12 @@ This Matlab function is accessible [[file:src/computeJacobian.m][here]].
** =inverseKinematics=: Compute Inverse Kinematics
:PROPERTIES:
:header-args:matlab+: :tangle src/inverseKinematics.m
:header-args:matlab+: :tangle ../src/inverseKinematics.m
:header-args:matlab+: :comments none :mkdirp yes :eval no
:END:
<<sec:inverseKinematics>>
This Matlab function is accessible [[file:src/inverseKinematics.m][here]].
This Matlab function is accessible [[file:../src/inverseKinematics.m][here]].
*** Theory
:PROPERTIES:
@@ -774,12 +774,12 @@ Otherwise, when the limbs' lengths derived yield complex numbers, then the posit
** =forwardKinematicsApprox=: Compute the Approximate Forward Kinematics
:PROPERTIES:
:header-args:matlab+: :tangle src/forwardKinematicsApprox.m
:header-args:matlab+: :tangle ../src/forwardKinematicsApprox.m
:header-args:matlab+: :comments none :mkdirp yes :eval no
:END:
<<sec:forwardKinematicsApprox>>
This Matlab function is accessible [[file:src/forwardKinematicsApprox.m][here]].
This Matlab function is accessible [[file:../src/forwardKinematicsApprox.m][here]].
*** Function description
:PROPERTIES:

View File

@@ -170,7 +170,7 @@ We generally want to have the smallest resonant frequency $\omega_0$ to measure
*** Initialization function
:PROPERTIES:
:header-args:matlab+: :tangle ./src/initializeZAxisGeophone.m
:header-args:matlab+: :tangle ../src/initializeZAxisGeophone.m
:header-args:matlab+: :comments none :mkdirp yes :eval no
:END:
<<sec:initializeZAxisGeophone>>
@@ -221,7 +221,7 @@ Note that there is trade-off between:
*** Initialization function
:PROPERTIES:
:header-args:matlab+: :tangle ./src/initializeZAxisAccelerometer.m
:header-args:matlab+: :tangle ../src/initializeZAxisAccelerometer.m
:header-args:matlab+: :comments none :mkdirp yes :eval no
:END:
<<sec:initializeZAxisAccelerometer>>
@@ -231,7 +231,7 @@ This Matlab function is accessible [[file:../src/initializeZAxisAccelerometer.m]
#+begin_src matlab
function [accelerometer] = initializeZAxisAccelerometer(args)
arguments
args.mass (1,1) double {mustBeNumeric, mustBePositive} = 1e-3 % [kg]
args.mass (1,1) double {mustBeNumeric, mustBePositive} = 5e-3 % [kg]
args.freq (1,1) double {mustBeNumeric, mustBePositive} = 5e3 % [Hz]
end

View File

@@ -58,7 +58,7 @@ The project can be opened using the =simulinkproject= function:
When the project opens, a startup script is ran.
The startup script is defined below and is exported to the =project_startup.m= script.
#+begin_src matlab :eval no :tangle ./src/project_startup.m
#+begin_src matlab :eval no :tangle ../src/project_startup.m
project = simulinkproject;
projectRoot = project.RootFolder;
@@ -75,7 +75,7 @@ The startup script is defined below and is exported to the =project_startup.m= s
#+end_src
When the project closes, it runs the =project_shutdown.m= script defined below.
#+begin_src matlab :eval no :tangle ./src/project_shutdown.m
#+begin_src matlab :eval no :tangle ../src/project_shutdown.m
Simulink.fileGenControl('reset');
#+end_src

View File

@@ -295,12 +295,12 @@ Let's now move a little bit the top platform and re-display the configuration:
** =initializeStewartPlatform=: Initialize the Stewart Platform structure
:PROPERTIES:
:header-args:matlab+: :tangle src/initializeStewartPlatform.m
:header-args:matlab+: :tangle ../src/initializeStewartPlatform.m
:header-args:matlab+: :comments none :mkdirp yes :eval no
:END:
<<sec:initializeStewartPlatform>>
This Matlab function is accessible [[file:src/initializeStewartPlatform.m][here]].
This Matlab function is accessible [[file:../src/initializeStewartPlatform.m][here]].
*** Documentation
:PROPERTIES:
@@ -357,12 +357,12 @@ This Matlab function is accessible [[file:src/initializeStewartPlatform.m][here]
** =initializeFramesPositions=: Initialize the positions of frames {A}, {B}, {F} and {M}
:PROPERTIES:
:header-args:matlab+: :tangle src/initializeFramesPositions.m
:header-args:matlab+: :tangle ../src/initializeFramesPositions.m
:header-args:matlab+: :comments none :mkdirp yes :eval no
:END:
<<sec:initializeFramesPositions>>
This Matlab function is accessible [[file:src/initializeFramesPositions.m][here]].
This Matlab function is accessible [[file:../src/initializeFramesPositions.m][here]].
*** Documentation
:PROPERTIES:
@@ -435,12 +435,12 @@ This Matlab function is accessible [[file:src/initializeFramesPositions.m][here]
** =generateGeneralConfiguration=: Generate a Very General Configuration
:PROPERTIES:
:header-args:matlab+: :tangle src/generateGeneralConfiguration.m
:header-args:matlab+: :tangle ../src/generateGeneralConfiguration.m
:header-args:matlab+: :comments none :mkdirp yes :eval no
:END:
<<sec:generateGeneralConfiguration>>
This Matlab function is accessible [[file:src/generateGeneralConfiguration.m][here]].
This Matlab function is accessible [[file:../src/generateGeneralConfiguration.m][here]].
*** Documentation
:PROPERTIES:
@@ -565,12 +565,12 @@ The radius of the circles can be chosen as well as the angles where the joints a
** =computeJointsPose=: Compute the Pose of the Joints
:PROPERTIES:
:header-args:matlab+: :tangle src/computeJointsPose.m
:header-args:matlab+: :tangle ../src/computeJointsPose.m
:header-args:matlab+: :comments none :mkdirp yes :eval no
:END:
<<sec:computeJointsPose>>
This Matlab function is accessible [[file:src/computeJointsPose.m][here]].
This Matlab function is accessible [[file:../src/computeJointsPose.m][here]].
*** Documentation
:PROPERTIES:
@@ -700,12 +700,12 @@ This Matlab function is accessible [[file:src/computeJointsPose.m][here]].
** =initializeStewartPose=: Determine the initial stroke in each leg to have the wanted pose
:PROPERTIES:
:header-args:matlab+: :tangle src/initializeStewartPose.m
:header-args:matlab+: :tangle ../src/initializeStewartPose.m
:header-args:matlab+: :comments none :mkdirp yes :eval no
:END:
<<sec:initializeStewartPose>>
This Matlab function is accessible [[file:src/initializeStewartPose.m][here]].
This Matlab function is accessible [[file:../src/initializeStewartPose.m][here]].
*** Function description
:PROPERTIES:
@@ -761,12 +761,12 @@ This Matlab function is accessible [[file:src/initializeStewartPose.m][here]].
** =initializeCylindricalPlatforms=: Initialize the geometry of the Fixed and Mobile Platforms
:PROPERTIES:
:header-args:matlab+: :tangle src/initializeCylindricalPlatforms.m
:header-args:matlab+: :tangle ../src/initializeCylindricalPlatforms.m
:header-args:matlab+: :comments none :mkdirp yes :eval no
:END:
<<sec:initializeCylindricalPlatforms>>
This Matlab function is accessible [[file:src/initializeCylindricalPlatforms.m][here]].
This Matlab function is accessible [[file:../src/initializeCylindricalPlatforms.m][here]].
*** Function description
:PROPERTIES:
@@ -858,12 +858,12 @@ This Matlab function is accessible [[file:src/initializeCylindricalPlatforms.m][
** =initializeCylindricalStruts=: Define the inertia of cylindrical struts
:PROPERTIES:
:header-args:matlab+: :tangle src/initializeCylindricalStruts.m
:header-args:matlab+: :tangle ../src/initializeCylindricalStruts.m
:header-args:matlab+: :comments none :mkdirp yes :eval no
:END:
<<sec:initializeCylindricalStruts>>
This Matlab function is accessible [[file:src/initializeCylindricalStruts.m][here]].
This Matlab function is accessible [[file:../src/initializeCylindricalStruts.m][here]].
*** Function description
:PROPERTIES:
@@ -968,12 +968,12 @@ This Matlab function is accessible [[file:src/initializeCylindricalStruts.m][her
** =initializeStrutDynamics=: Add Stiffness and Damping properties of each strut
:PROPERTIES:
:header-args:matlab+: :tangle src/initializeStrutDynamics.m
:header-args:matlab+: :tangle ../src/initializeStrutDynamics.m
:header-args:matlab+: :comments none :mkdirp yes :eval no
:END:
<<sec:initializeStrutDynamics>>
This Matlab function is accessible [[file:src/initializeStrutDynamics.m][here]].
This Matlab function is accessible [[file:../src/initializeStrutDynamics.m][here]].
*** Documentation
:PROPERTIES:
@@ -1049,8 +1049,8 @@ A simplistic model of such amplified actuator is shown in Figure [[fig:actuator_
#+begin_src matlab
arguments
stewart
args.K (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e6*ones(6,1)
args.C (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e1*ones(6,1)
args.K (6,1) double {mustBeNumeric, mustBeNonnegative} = 20e6*ones(6,1)
args.C (6,1) double {mustBeNumeric, mustBeNonnegative} = 2e1*ones(6,1)
end
#+end_src
@@ -1067,12 +1067,12 @@ A simplistic model of such amplified actuator is shown in Figure [[fig:actuator_
** =initializeAmplifiedStrutDynamics=: Add Stiffness and Damping properties of each strut for an amplified piezoelectric actuator
:PROPERTIES:
:header-args:matlab+: :tangle src/initializeAmplifiedStrutDynamics.m
:header-args:matlab+: :tangle ../src/initializeAmplifiedStrutDynamics.m
:header-args:matlab+: :comments none :mkdirp yes :eval no
:END:
<<sec:initializeAmplifiedStrutDynamics>>
This Matlab function is accessible [[file:src/initializeAmplifiedStrutDynamics.m][here]].
This Matlab function is accessible [[file:../src/initializeAmplifiedStrutDynamics.m][here]].
*** Documentation
:PROPERTIES:
@@ -1196,12 +1196,12 @@ A simplistic model of such amplified actuator is shown in Figure [[fig:amplified
** =initializeJointDynamics=: Add Stiffness and Damping properties for spherical joints
:PROPERTIES:
:header-args:matlab+: :tangle src/initializeJointDynamics.m
:header-args:matlab+: :tangle ../src/initializeJointDynamics.m
:header-args:matlab+: :comments none :mkdirp yes :eval no
:END:
<<sec:initializeJointDynamics>>
This Matlab function is accessible [[file:src/initializeJointDynamics.m][here]].
This Matlab function is accessible [[file:../src/initializeJointDynamics.m][here]].
*** Function description
:PROPERTIES:
@@ -1215,8 +1215,8 @@ This Matlab function is accessible [[file:src/initializeJointDynamics.m][here]].
%
% Inputs:
% - args - Structure with the following fields:
% - type_F - 'universal', 'spherical', 'univesal_p', 'spherical_p'
% - type_M - 'universal', 'spherical', 'univesal_p', 'spherical_p'
% - type_F - 'universal', 'spherical', 'universal_p', 'spherical_p'
% - type_M - 'universal', 'spherical', 'universal_p', 'spherical_p'
% - Kf_M [6x1] - Bending (Rx, Ry) Stiffness for each top joints [(N.m)/rad]
% - Kt_M [6x1] - Torsion (Rz) Stiffness for each top joints [(N.m)/rad]
% - Cf_M [6x1] - Bending (Rx, Ry) Damping of each top joint [(N.m)/(rad/s)]
@@ -1245,8 +1245,8 @@ This Matlab function is accessible [[file:src/initializeJointDynamics.m][here]].
#+begin_src matlab
arguments
stewart
args.type_F char {mustBeMember(args.type_F,{'universal', 'spherical', 'univesal_p', 'spherical_p'})} = 'universal'
args.type_M char {mustBeMember(args.type_M,{'universal', 'spherical', 'univesal_p', 'spherical_p'})} = 'spherical'
args.type_F char {mustBeMember(args.type_F,{'universal', 'spherical', 'universal_p', 'spherical_p'})} = 'universal'
args.type_M char {mustBeMember(args.type_M,{'universal', 'spherical', 'universal_p', 'spherical_p'})} = 'spherical'
args.Kf_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 15*ones(6,1)
args.Cf_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e-4*ones(6,1)
args.Kt_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 20*ones(6,1)
@@ -1337,12 +1337,12 @@ Rotational Damping
** =initializeInertialSensor=: Initialize the inertial sensor in each strut
:PROPERTIES:
:header-args:matlab+: :tangle src/initializeInertialSensor.m
:header-args:matlab+: :tangle ../src/initializeInertialSensor.m
:header-args:matlab+: :comments none :mkdirp yes :eval no
:END:
<<sec:initializeInertialSensor>>
This Matlab function is accessible [[file:src/initializeInertialSensor.m][here]].
This Matlab function is accessible [[file:../src/initializeInertialSensor.m][here]].
*** Function description
:PROPERTIES:
@@ -1419,12 +1419,12 @@ This Matlab function is accessible [[file:src/initializeInertialSensor.m][here]]
** =displayArchitecture=: 3D plot of the Stewart platform architecture
:PROPERTIES:
:header-args:matlab+: :tangle src/displayArchitecture.m
:header-args:matlab+: :tangle ../src/displayArchitecture.m
:header-args:matlab+: :comments none :mkdirp yes :eval no
:END:
<<sec:displayArchitecture>>
This Matlab function is accessible [[file:src/displayArchitecture.m][here]].
This Matlab function is accessible [[file:../src/displayArchitecture.m][here]].
*** Function description
:PROPERTIES: