Rename sections, verify for loop variables
This commit is contained in:
parent
0e5ea4de15
commit
bb0a89ba25
334
matlab/index.org
334
matlab/index.org
@ -26,34 +26,16 @@
|
||||
|
||||
* Introduction :ignore:
|
||||
|
||||
| | Mathematical Notation | Matlab | Unit |
|
||||
|-----------------------------------+------------------------------+---------------+---------|
|
||||
| Actuator Stiffness | $k$ | =k= | N/m |
|
||||
| Actuator Damping | $c$ | =c= | N/(m/s) |
|
||||
| Payload Mass | $m$ | =m= | kg |
|
||||
| Damping Ratio | $\xi = \frac{c}{2\sqrt{km}}$ | =xi= | |
|
||||
| Actuator Force | $\bm{F}, F_u, F_v$ | =F= =Fu= =Fv= | N |
|
||||
| Force Sensor signal | $\bm{f}, f_u, f_v$ | =f= =fu= =fv= | N |
|
||||
| Relative Displacement | $\bm{d}, d_u, d_v$ | =d= =du= =dv= | m |
|
||||
| Relative Velocity | $\bm{v}, v_u, v_v$ | =v= =vu= =vv= | m/s |
|
||||
| Resonance freq. when $\Omega = 0$ | $\omega_0$ | =w0= | rad/s |
|
||||
| Rotation Speed | $\Omega = \dot{\theta}$ | =W= | rad/s |
|
||||
|
||||
| | Mathematical Notation | Matlab | Unit |
|
||||
|------------------+-----------------------+--------+---------|
|
||||
| Laplace variable | $s$ | =s= | |
|
||||
| Complex number | $j$ | =j= | |
|
||||
| Frequency | $\omega$ | =w= | [rad/s] |
|
||||
|
||||
| | Mathematical Notation | Matlab | Unit |
|
||||
|----------------+------------------------------------------------+--------+---------|
|
||||
| IFF Plant | $\bm{G}_\text{IFF}(s) = \frac{\bm{f}}{\bm{F}}$ | =Giff= | N/N |
|
||||
| DVF Plant | $\bm{G}_\text{DVF}(s) = \frac{\bm{v}}{\bm{F}}$ | =Gdvf= | (m/s)/N |
|
||||
| IFF Controller | $\bm{K}_\text{IFF}(s)$ | =Kiff= | |
|
||||
| DVF Controller | $\bm{K}_\text{DVF}(s)$ | =Kdvf= | |
|
||||
- Section [[sec:system_description]]
|
||||
- Section [[sec:iff_pure_int]]
|
||||
- Section [[sec:iff_pseudo_int]]
|
||||
- Section [[sec:iff_parallel_stiffness]]
|
||||
- Section [[sec:dvf]]
|
||||
- Section [[sec:comparison]]
|
||||
|
||||
* System Description and Analysis
|
||||
<<sec:system_description>>
|
||||
|
||||
** Introduction :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)
|
||||
@ -122,14 +104,14 @@ The system becomes unstable for $\Omega > \omega_0$.
|
||||
#+begin_src matlab
|
||||
Ws = linspace(0, 2, 51); % Vector of considered rotation speed [rad/s]
|
||||
|
||||
polesvc = zeros(4, length(Ws));
|
||||
p_ws = zeros(4, length(Ws));
|
||||
|
||||
for i = 1:length(Ws)
|
||||
W = Ws(i);
|
||||
for W_i = 1:length(Ws)
|
||||
W = Ws(W_i);
|
||||
|
||||
polei = pole(1/(((s^2)/(w0^2) + 2*xi*s/w0 + 1 - (W^2)/(w0^2))^2 + (2*W*s/(w0^2))^2));
|
||||
[~, i_sort] = sort(imag(polei));
|
||||
polesvc(:, i) = polei(i_sort);
|
||||
p_ws(:, W_i) = polei(i_sort);
|
||||
end
|
||||
#+end_src
|
||||
|
||||
@ -138,8 +120,8 @@ The system becomes unstable for $\Omega > \omega_0$.
|
||||
|
||||
ax1 = subplot(1,2,1);
|
||||
hold on;
|
||||
for i = 1:size(polesvc, 1)
|
||||
plot(Ws, real(polesvc(i, :)), 'k-')
|
||||
for p_i = 1:size(p_ws, 1)
|
||||
plot(Ws, real(p_ws(p_i, :)), 'k-')
|
||||
end
|
||||
plot(Ws, zeros(size(Ws)), 'k--')
|
||||
hold off;
|
||||
@ -147,9 +129,9 @@ The system becomes unstable for $\Omega > \omega_0$.
|
||||
|
||||
ax2 = subplot(1,2,2);
|
||||
hold on;
|
||||
for i = 1:size(polesvc, 1)
|
||||
plot(Ws, imag(polesvc(i, :)), 'k-')
|
||||
plot(Ws, -imag(polesvc(i, :)), 'k-')
|
||||
for p_i = 1:size(p_ws, 1)
|
||||
plot(Ws, imag(p_ws(p_i, :)), 'k-')
|
||||
plot(Ws, -imag(p_ws(p_i, :)), 'k-')
|
||||
end
|
||||
hold off;
|
||||
xlabel('Rotation Frequency [rad/s]'); ylabel('Pole Imaginary Part');
|
||||
@ -238,7 +220,9 @@ No controller for now.
|
||||
linkaxes([ax1,ax2],'y');
|
||||
#+end_src
|
||||
|
||||
* Integral Force Feedback
|
||||
* Problem with pure Integral Force Feedback
|
||||
<<sec:iff_pure_int>>
|
||||
|
||||
** Introduction :ignore:
|
||||
|
||||
- Diagram with the controller
|
||||
@ -272,16 +256,14 @@ Let's define initial values for the model.
|
||||
w0 = sqrt(k/m); % [rad/s]
|
||||
#+end_src
|
||||
|
||||
** IFF with pure integrator
|
||||
<<sec:pure_iff>>
|
||||
*** No parallel stiffness
|
||||
** No parallel stiffness
|
||||
We set the additional stiffness and damping to zero (this will be used later).
|
||||
#+begin_src matlab
|
||||
kp = 0; % [N/m]
|
||||
cp = 0; % [N/(m/s)]
|
||||
#+end_src
|
||||
|
||||
*** Equations
|
||||
** Equations
|
||||
The sensed forces are equal to:
|
||||
\begin{equation}
|
||||
\begin{bmatrix} f_{u} \\ f_{v} \end{bmatrix} =
|
||||
@ -306,7 +288,7 @@ Which then gives:
|
||||
\end{equation}
|
||||
#+end_important
|
||||
|
||||
*** Poles and Zeros without damping :noexport:
|
||||
** Poles and Zeros without damping :noexport:
|
||||
#+begin_src matlab
|
||||
syms W w0 xi positive
|
||||
assumealso(w0 > W)
|
||||
@ -341,7 +323,7 @@ Zeros (without damping)
|
||||
\left(\begin{array}{c} -\sqrt{-\frac{w_{0}\,\sqrt{{w_{0}}^2+8\,{\mathrm{W}}^2}}{2}-\frac{{w_{0}}^2}{2}-{\mathrm{W}}^2}\\ -\sqrt{\frac{w_{0}\,\sqrt{{w_{0}}^2+8\,{\mathrm{W}}^2}}{2}-\frac{{w_{0}}^2}{2}-{\mathrm{W}}^2}\\ \sqrt{-\frac{w_{0}\,\sqrt{{w_{0}}^2+8\,{\mathrm{W}}^2}}{2}-\frac{{w_{0}}^2}{2}-{\mathrm{W}}^2}\\ \sqrt{\frac{w_{0}\,\sqrt{{w_{0}}^2+8\,{\mathrm{W}}^2}}{2}-\frac{{w_{0}}^2}{2}-{\mathrm{W}}^2} \end{array}\right)
|
||||
\end{equation}
|
||||
|
||||
*** Simscape Model
|
||||
** Simscape Model
|
||||
The rotation speed is set to $\Omega = 0.1 \omega_0$.
|
||||
#+begin_src matlab
|
||||
W = 0.1*w0; % [rad/s]
|
||||
@ -371,7 +353,7 @@ No controller for now.
|
||||
Giff.OutputName = {'fu', 'fv'};
|
||||
#+end_src
|
||||
|
||||
*** Comparison with the model
|
||||
** Comparison with the model
|
||||
#+begin_src matlab
|
||||
Giff_th = 1/(((s^2)/(w0^2) + 2*xi*s/w0 + 1 - (W^2)/(w0^2))^2 + (2*W*s/(w0^2))^2) * ...
|
||||
[(s^2/w0^2 - W^2/w0^2)*((s^2)/(w0^2) + 2*xi*s/w0 + 1 - (W^2)/(w0^2)) + (2*W*s/(w0^2))^2, - (2*xi*s/w0 + 1)*2*W*s/(w0^2) ; ...
|
||||
@ -424,7 +406,7 @@ No controller for now.
|
||||
linkaxes([ax1,ax2],'y');
|
||||
#+end_src
|
||||
|
||||
*** Influence of the rotation speed on the IFF Plant
|
||||
** Influence of the rotation speed on the IFF Plant
|
||||
#+begin_src matlab
|
||||
Ws = [0, 0.1, 0.3, 0.8, 1.1]; % Rotating Speeds [rad/s]
|
||||
#+end_src
|
||||
@ -432,10 +414,10 @@ No controller for now.
|
||||
#+begin_src matlab
|
||||
Gsiff = {zeros(2, 2, length(Ws))};
|
||||
|
||||
for i = 1:length(Ws)
|
||||
W = Ws(i);
|
||||
for W_i = 1:length(Ws)
|
||||
W = Ws(W_i);
|
||||
|
||||
Gsiff(:, :, i) = {1/(((s^2)/(w0^2) + 2*xi*s/w0 + 1 - (W^2)/(w0^2))^2 + (2*W*s/(w0^2))^2) * ...
|
||||
Gsiff(:, :, W_i) = {1/(((s^2)/(w0^2) + 2*xi*s/w0 + 1 - (W^2)/(w0^2))^2 + (2*W*s/(w0^2))^2) * ...
|
||||
[(s^2/w0^2 - W^2/w0^2)*((s^2)/(w0^2) + 2*xi*s/w0 + 1 - (W^2)/(w0^2)) + (2*W*s/(w0^2))^2, - (2*xi*s/w0 + 1)*2*W*s/(w0^2) ; ...
|
||||
(2*xi*s/w0 + 1)*2*W*s/(w0^2), (s^2/w0^2 - W^2/w0^2)*((s^2)/(w0^2) + 2*xi*s/w0 + 1 - (W^2)/(w0^2))+ (2*W*s/(w0^2))^2]};
|
||||
end
|
||||
@ -448,9 +430,9 @@ No controller for now.
|
||||
|
||||
ax1 = subplot(2, 1, 1);
|
||||
hold on;
|
||||
for i = 1:length(Ws)
|
||||
plot(freqs, abs(squeeze(freqresp(Gsiff{i}(1,1), freqs))), ...
|
||||
'DisplayName', sprintf('$\\omega = %.2f \\omega_0 $', Ws(i)/w0))
|
||||
for W_i = 1:length(Ws)
|
||||
plot(freqs, abs(squeeze(freqresp(Gsiff{W_i}(1,1), freqs))), ...
|
||||
'DisplayName', sprintf('$\\omega = %.2f \\omega_0 $', Ws(W_i)/w0))
|
||||
end
|
||||
hold off;
|
||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||
@ -460,9 +442,8 @@ No controller for now.
|
||||
|
||||
ax2 = subplot(2, 1, 2);
|
||||
hold on;
|
||||
for i = 1:length(Ws)
|
||||
plot(freqs, 180/pi*angle(squeeze(freqresp(Gsiff{i}(1,1), freqs))), ...
|
||||
'DisplayName', sprintf('$\\omega = %.1f \\omega_0 $', Ws(i)/w0))
|
||||
for W_i = 1:length(Ws)
|
||||
plot(freqs, 180/pi*angle(squeeze(freqresp(Gsiff{W_i}(1,1), freqs))))
|
||||
end
|
||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
|
||||
xlabel('Frequency [rad/s]'); ylabel('Phase [deg]');
|
||||
@ -474,7 +455,7 @@ No controller for now.
|
||||
xlim([freqs(1), freqs(end)]);
|
||||
#+end_src
|
||||
|
||||
*** Loop Gain
|
||||
** Loop Gain
|
||||
Let's take $\Omega = \frac{\omega_0}{10}$.
|
||||
#+begin_src matlab
|
||||
W = 0.1*w0;
|
||||
@ -523,18 +504,18 @@ The decentralized controller contains pure integrators:
|
||||
xlim([freqs(1), freqs(end)]);
|
||||
#+end_src
|
||||
|
||||
*** Root Locus
|
||||
** Root Locus
|
||||
#+begin_src matlab
|
||||
Ws = [0, 0.1, 0.3, 0.8, 1.1];
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab
|
||||
G_iff = {zeros(2, 2, length(Ws))};
|
||||
Giff = {zeros(2, 2, length(Ws))};
|
||||
|
||||
for i = 1:length(Ws)
|
||||
W = Ws(i);
|
||||
for W_i = 1:length(Ws)
|
||||
W = Ws(W_i);
|
||||
|
||||
G_iff(:, :, i) = {1/(((s^2)/(w0^2) + 2*xi*s/w0 + 1 - (W^2)/(w0^2))^2 + (2*W*s/(w0^2))^2) * ...
|
||||
Giff(:, :, W_i) = {1/(((s^2)/(w0^2) + 2*xi*s/w0 + 1 - (W^2)/(w0^2))^2 + (2*W*s/(w0^2))^2) * ...
|
||||
[(s^2/w0^2 - W^2/w0^2)*((s^2)/(w0^2) + 2*xi*s/w0 + 1 - (W^2)/(w0^2)) + (2*W*s/(w0^2))^2, - (2*xi*s/w0 + 1)*2*W*s/(w0^2) ; ...
|
||||
(2*xi*s/w0 + 1)*2*W*s/(w0^2), (s^2/w0^2 - W^2/w0^2)*((s^2)/(w0^2) + 2*xi*s/w0 + 1 - (W^2)/(w0^2))+ (2*W*s/(w0^2))^2]};
|
||||
end
|
||||
@ -546,16 +527,16 @@ The decentralized controller contains pure integrators:
|
||||
gains = logspace(-2, 4, 100);
|
||||
|
||||
hold on;
|
||||
for i = 1:length(Ws)
|
||||
set(gca,'ColorOrderIndex',i);
|
||||
plot(real(pole(G_iff{i})), imag(pole(G_iff{i})), 'x', ...
|
||||
'DisplayName', sprintf('$\\omega = %.1f \\omega_0 $', Ws(i)/w0));
|
||||
set(gca,'ColorOrderIndex',i);
|
||||
plot(real(tzero(G_iff{i})), imag(tzero(G_iff{i})), 'o', ...
|
||||
for W_i = 1:length(Ws)
|
||||
set(gca,'ColorOrderIndex',W_i);
|
||||
plot(real(pole(Giff{W_i})), imag(pole(Giff{W_i})), 'x', ...
|
||||
'DisplayName', sprintf('$\\omega = %.1f \\omega_0 $', Ws(W_i)/w0));
|
||||
set(gca,'ColorOrderIndex',W_i);
|
||||
plot(real(tzero(Giff{W_i})), imag(tzero(Giff{W_i})), 'o', ...
|
||||
'HandleVisibility', 'off');
|
||||
for g_i = 1:length(gains)
|
||||
set(gca,'ColorOrderIndex',i);
|
||||
cl_poles = pole(feedback(G_iff{i}, gains(g_i)/s*eye(2)));
|
||||
for g = gains
|
||||
set(gca,'ColorOrderIndex',W_i);
|
||||
cl_poles = pole(feedback(Giff{W_i}, g/s*eye(2)));
|
||||
plot(real(cl_poles), imag(cl_poles), '.', ...
|
||||
'HandleVisibility', 'off');
|
||||
end
|
||||
@ -568,16 +549,50 @@ The decentralized controller contains pure integrators:
|
||||
legend('location', 'northwest');
|
||||
#+end_src
|
||||
|
||||
** Modified IFF (pseudo integrator)
|
||||
<<sec:modified_iff>>
|
||||
*** No parallel stiffness
|
||||
* Modified IFF (pseudo integrator)
|
||||
<<sec:iff_pseudo_int>>
|
||||
|
||||
** Introduction :ignore:
|
||||
|
||||
- Diagram with the controller
|
||||
- Basic idea of IFF
|
||||
|
||||
** 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>>
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab :exports none :results silent :noweb yes
|
||||
<<matlab-init>>
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab
|
||||
addpath('./matlab/');
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab
|
||||
open('rotating_frame.slx');
|
||||
#+end_src
|
||||
|
||||
** Plant Parameters
|
||||
Let's define initial values for the model.
|
||||
#+begin_src matlab
|
||||
k = 1; % [N/m]
|
||||
m = 1; % [kg]
|
||||
c = 0.05; % [N/(m/s)]
|
||||
|
||||
xi = c/(2*sqrt(k*m));
|
||||
w0 = sqrt(k/m); % [rad/s]
|
||||
#+end_src
|
||||
|
||||
** No parallel stiffness
|
||||
We set the additional stiffness and damping to zero (this will be used later).
|
||||
#+begin_src matlab
|
||||
kp = 0; % [N/m]
|
||||
cp = 0; % [N/(m/s)]
|
||||
#+end_src
|
||||
|
||||
*** Plant parameters
|
||||
** Plant parameters
|
||||
#+begin_src matlab
|
||||
W = 0.1*w0;
|
||||
|
||||
@ -587,7 +602,7 @@ We set the additional stiffness and damping to zero (this will be used later).
|
||||
|
||||
#+end_src
|
||||
|
||||
*** Control Law
|
||||
** Control Law
|
||||
Let's take the integral feedback controller as a low pass filter (pseudo integrator):
|
||||
\begin{equation}
|
||||
K_{\text{IFF}}(s) = g\frac{1}{1 + \frac{s}{\omega_i}} \begin{bmatrix}
|
||||
@ -605,7 +620,7 @@ Let's take the integral feedback controller as a low pass filter (pseudo integra
|
||||
Kiff = (g/(1+s/wi))*eye(2);
|
||||
#+end_src
|
||||
|
||||
*** Loop Gain
|
||||
** Loop Gain
|
||||
#+begin_src matlab
|
||||
freqs = logspace(-2, 1, 1000);
|
||||
|
||||
@ -631,7 +646,7 @@ Let's take the integral feedback controller as a low pass filter (pseudo integra
|
||||
xlim([freqs(1), freqs(end)]);
|
||||
#+end_src
|
||||
|
||||
*** Root Locus
|
||||
** Root Locus
|
||||
As shown in the Root Locus plot, for some value of the gain, the system is stable.
|
||||
(The system is however still not conditionally stable).
|
||||
|
||||
@ -643,8 +658,8 @@ As shown in the Root Locus plot, for some value of the gain, the system is stabl
|
||||
hold on;
|
||||
plot(real(pole(Giff)), imag(pole(Giff)), 'kx');
|
||||
plot(real(tzero(Giff)), imag(tzero(Giff)), 'ko');
|
||||
for gi = 1:length(gains)
|
||||
clpoles = pole(feedback(Giff, (gains(gi)/(1+s/wi))*eye(2)));
|
||||
for g = gains
|
||||
clpoles = pole(feedback(Giff, (g/(1+s/wi))*eye(2)));
|
||||
plot(real(clpoles), imag(clpoles), 'k.');
|
||||
end
|
||||
hold off;
|
||||
@ -654,7 +669,7 @@ As shown in the Root Locus plot, for some value of the gain, the system is stabl
|
||||
xlabel('Real Part'); ylabel('Imaginary Part');
|
||||
#+end_src
|
||||
|
||||
*** How does $\omega_i$ influences the attainable damping? Optimal Gain
|
||||
** How does $\omega_i$ influences the attainable damping? Optimal Gain
|
||||
The DC gain for $G_\text{IFF}$ is (for $\Omega < \omega_0$):
|
||||
\begin{equation}
|
||||
G_{\text{IFF}}(\omega = 0) = \frac{1}{1 - \frac{{\omega_0}^2}{\Omega^2}} \begin{bmatrix}
|
||||
@ -686,8 +701,8 @@ Root Locus => Small $\omega_i$ seems to allow more damping but may limit the gai
|
||||
set(gca,'ColorOrderIndex',wi_i);
|
||||
wi = wis(wi_i);
|
||||
L(wi_i) = plot(nan, nan, '.', 'DisplayName', sprintf('$\\omega_i = %.1e \\omega_0$', wi./w0));
|
||||
for gi = 1:length(gains)
|
||||
clpoles = pole(feedback(Giff, (gains(gi)/(1+s/wi))*eye(2)));
|
||||
for g = gains
|
||||
clpoles = pole(feedback(Giff, (g/(1+s/wi))*eye(2)));
|
||||
set(gca,'ColorOrderIndex',wi_i);
|
||||
plot(real(clpoles), imag(clpoles), '.');
|
||||
end
|
||||
@ -711,8 +726,8 @@ Limitation of large $\omega_i$: no damping attainable
|
||||
for wi_i = 1:length(wis)
|
||||
gains = linspace(0, w0^2/W^2 - 1, 100);
|
||||
|
||||
for g_i = 1:length(gains)
|
||||
Kiff = (gains(g_i)/(1+s/wis(wi_i)))*eye(2);
|
||||
for g = gains
|
||||
Kiff = (g/(1+s/wis(wi_i)))*eye(2);
|
||||
|
||||
[w, zeta] = damp(minreal(feedback(Giff, Kiff)));
|
||||
|
||||
@ -747,8 +762,8 @@ Root Locus that shows the maximum damping attainable.
|
||||
plot(real(tzero(Giff)), imag(tzero(Giff)), 'ko', 'HandleVisibility', 'off');
|
||||
for wi_i = 1:length(wis)
|
||||
wi = wis(wi_i);
|
||||
for gi = 1:length(gains)
|
||||
clpoles = pole(feedback(Giff, (gains(gi)/(1+s/wi))*eye(2)));
|
||||
for g = gains
|
||||
clpoles = pole(feedback(Giff, (g/(1+s/wi))*eye(2)));
|
||||
set(gca,'ColorOrderIndex',wi_i);
|
||||
plot(real(clpoles), imag(clpoles), '.', 'HandleVisibility', 'off');
|
||||
end
|
||||
@ -796,15 +811,49 @@ Root Locus that shows the maximum damping attainable.
|
||||
xlim([freqs(1), freqs(end)]);
|
||||
#+end_src
|
||||
|
||||
** Stiffness in parallel with the force sensor
|
||||
<<sec:stiffness_iff>>
|
||||
*** Schematic
|
||||
* IFF with a stiffness in parallel with the force sensor
|
||||
<<sec:iff_parallel_stiffness>>
|
||||
|
||||
** Introduction :ignore:
|
||||
|
||||
- Diagram with the controller
|
||||
- Basic idea of IFF
|
||||
|
||||
** 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>>
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab :exports none :results silent :noweb yes
|
||||
<<matlab-init>>
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab
|
||||
addpath('./matlab/');
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab
|
||||
open('rotating_frame.slx');
|
||||
#+end_src
|
||||
|
||||
** Plant Parameters
|
||||
Let's define initial values for the model.
|
||||
#+begin_src matlab
|
||||
k = 1; % [N/m]
|
||||
m = 1; % [kg]
|
||||
c = 0.05; % [N/(m/s)]
|
||||
|
||||
xi = c/(2*sqrt(k*m));
|
||||
w0 = sqrt(k/m); % [rad/s]
|
||||
#+end_src
|
||||
|
||||
** Schematic
|
||||
|
||||
#+name: fig:figure_name
|
||||
#+caption: Figure caption
|
||||
[[file:figs-tikz/rotating_xy_platform_springs.png]]
|
||||
|
||||
*** Physical Explanation
|
||||
** Physical Explanation
|
||||
- Negative stiffness induced by gyroscopic effects
|
||||
- Zeros of the open-loop <=> Poles of the subsystem with the force sensors removes
|
||||
- As the zeros are the poles of the closed loop system for high gains, we want them to be in the left-half plane
|
||||
@ -821,11 +870,11 @@ And thus, the stiffness in parallel should be such that:
|
||||
k_{p} > m \Omega^2
|
||||
\end{equation}
|
||||
|
||||
*** TODO Equations
|
||||
** TODO Equations
|
||||
The equations should be the same as before by taking $k = k^\prime + k_a$.
|
||||
I just have to determine the measured force by the sensor
|
||||
|
||||
*** Effect of the parallel stiffness on the IFF plant
|
||||
** Effect of the parallel stiffness on the IFF plant
|
||||
Let's fix the rotating speed:
|
||||
#+begin_src matlab
|
||||
W = 0.1*w0;
|
||||
@ -918,7 +967,7 @@ And the IFF plant is identified in three different cases:
|
||||
xlim([freqs(1), freqs(end)]);
|
||||
#+end_src
|
||||
|
||||
*** Parallel Stiffness effect
|
||||
** Parallel Stiffness effect
|
||||
Pure IFF controller can be used if:
|
||||
\begin{equation}
|
||||
k_{p} > m \Omega^2
|
||||
@ -928,7 +977,7 @@ However, having large values of $k_p$ may:
|
||||
- decrease the actuator stroke
|
||||
- decrease the attainable damping (section about optimal value)
|
||||
|
||||
*** Root locus
|
||||
** Root locus
|
||||
#+begin_src matlab :exports none
|
||||
figure;
|
||||
|
||||
@ -941,9 +990,9 @@ However, having large values of $k_p$ may:
|
||||
set(gca,'ColorOrderIndex',1);
|
||||
plot(real(tzero(Giff)), imag(tzero(Giff)), 'o', ...
|
||||
'HandleVisibility', 'off');
|
||||
for g_i = 1:length(gains)
|
||||
cl_poles = pole(feedback(Giff, (gains(g_i)/s)*eye(2)));
|
||||
set(gca,'ColorOrderIndex',1);
|
||||
for g = gains
|
||||
cl_poles = pole(feedback(Giff, (g/s)*eye(2)));
|
||||
set(gca,'ColorOrderIndex',1);
|
||||
plot(real(cl_poles), imag(cl_poles), '.', ...
|
||||
'HandleVisibility', 'off');
|
||||
end
|
||||
@ -954,9 +1003,9 @@ However, having large values of $k_p$ may:
|
||||
set(gca,'ColorOrderIndex',2);
|
||||
plot(real(tzero(Giff_s)), imag(tzero(Giff_s)), 'o', ...
|
||||
'HandleVisibility', 'off');
|
||||
for g_i = 1:length(gains)
|
||||
cl_poles = pole(feedback(Giff_s, (gains(g_i)/s)*eye(2)));
|
||||
set(gca,'ColorOrderIndex',2);
|
||||
for g = gains
|
||||
cl_poles = pole(feedback(Giff_s, (g/s)*eye(2)));
|
||||
set(gca,'ColorOrderIndex',2);
|
||||
plot(real(cl_poles), imag(cl_poles), '.', ...
|
||||
'HandleVisibility', 'off');
|
||||
end
|
||||
@ -967,9 +1016,9 @@ However, having large values of $k_p$ may:
|
||||
set(gca,'ColorOrderIndex',3);
|
||||
plot(real(tzero(Giff_l)), imag(tzero(Giff_l)), 'o', ...
|
||||
'HandleVisibility', 'off');
|
||||
for g_i = 1:length(gains)
|
||||
set(gca,'ColorOrderIndex',3);
|
||||
cl_poles = pole(feedback(Giff_l, (gains(g_i)/s)*eye(2)));
|
||||
for g = gains
|
||||
set(gca,'ColorOrderIndex',3);
|
||||
cl_poles = pole(feedback(Giff_l, (g/s)*eye(2)));
|
||||
plot(real(cl_poles), imag(cl_poles), '.', ...
|
||||
'HandleVisibility', 'off');
|
||||
end
|
||||
@ -981,7 +1030,7 @@ However, having large values of $k_p$ may:
|
||||
legend('location', 'northwest');
|
||||
#+end_src
|
||||
|
||||
*** Optimal value of $k_p$
|
||||
** Optimal value of $k_p$
|
||||
#+begin_src matlab
|
||||
kps = [0, 0.5, 1, 2, 10]*m*W^2;
|
||||
cp = 0.01;
|
||||
@ -1003,9 +1052,9 @@ However, having large values of $k_p$ may:
|
||||
set(gca,'ColorOrderIndex',kp_i);
|
||||
plot(real(tzero(Giff)), imag(tzero(Giff)), 'o', ...
|
||||
'HandleVisibility', 'off');
|
||||
for g_i = 1:length(gains)
|
||||
K_iffa = (gains(g_i)/s)*eye(2);
|
||||
cl_poles = pole(feedback(Giff, K_iffa));
|
||||
for g = gains
|
||||
Kiffa = (g/s)*eye(2);
|
||||
cl_poles = pole(feedback(Giff, Kiffa));
|
||||
set(gca,'ColorOrderIndex',kp_i);
|
||||
plot(real(cl_poles), imag(cl_poles), '.', ...
|
||||
'HandleVisibility', 'off');
|
||||
@ -1026,7 +1075,7 @@ To have unconditional stability:
|
||||
|
||||
But if $k_p$ is too late, the attainable damping is decreasing and this may as well limit the actuator stroke/force.
|
||||
|
||||
*** Optimal Gain
|
||||
** Optimal Gain
|
||||
Let's take $k_p = 2 m \Omega^2$ and find the optimal IFF control gain.
|
||||
|
||||
#+begin_src matlab
|
||||
@ -1042,8 +1091,8 @@ Let's take $k_p = 2 m \Omega^2$ and find the optimal IFF control gain.
|
||||
|
||||
gains = logspace(-2, 4, 100);
|
||||
|
||||
for g_i = 1:length(gains)
|
||||
Kiff = (gains(g_i)/s)*eye(2);
|
||||
for g = gains
|
||||
Kiff = (g/s)*eye(2);
|
||||
|
||||
[w, zeta] = damp(minreal(feedback(Giff, Kiff)));
|
||||
|
||||
@ -1062,8 +1111,8 @@ Let's take $k_p = 2 m \Omega^2$ and find the optimal IFF control gain.
|
||||
hold on;
|
||||
plot(real(pole(Giff)), imag(pole(Giff)), 'kx', 'HandleVisibility', 'off');
|
||||
plot(real(tzero(Giff)), imag(tzero(Giff)), 'ko', 'HandleVisibility', 'off');
|
||||
for gi = 1:length(gains)
|
||||
clpoles = pole(feedback(Giff, (gains(gi)/s)*eye(2)));
|
||||
for g = gains
|
||||
clpoles = pole(feedback(Giff, (g/s)*eye(2)));
|
||||
plot(real(clpoles), imag(clpoles), 'k.', 'HandleVisibility', 'off');
|
||||
end
|
||||
% Optimal Gain
|
||||
@ -1109,6 +1158,8 @@ Let's take $k_p = 2 m \Omega^2$ and find the optimal IFF control gain.
|
||||
#+end_src
|
||||
|
||||
* Direct Velocity Feedback
|
||||
<<sec:dvf>>
|
||||
|
||||
** Introduction :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)
|
||||
@ -1272,9 +1323,9 @@ The controller is a pure gain::
|
||||
plot(real(tzero(Gdvf)), imag(tzero(Gdvf)), 'o', ...
|
||||
'HandleVisibility', 'off');
|
||||
|
||||
for g_i = 1:length(gains)
|
||||
for g = gains
|
||||
set(gca,'ColorOrderIndex',W_i);
|
||||
cl_poles = pole(feedback(Gdvf, gains(g_i)*eye(2)));
|
||||
cl_poles = pole(feedback(Gdvf, g*eye(2)));
|
||||
|
||||
plot(real(cl_poles), imag(cl_poles), '.', ...
|
||||
'HandleVisibility', 'off');
|
||||
@ -1289,6 +1340,8 @@ The controller is a pure gain::
|
||||
#+end_src
|
||||
|
||||
* Comparison
|
||||
<<sec:comparison>>
|
||||
|
||||
** Introduction :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)
|
||||
@ -1418,9 +1471,9 @@ The rotation speed is set to $\Omega = 0.1 \omega_0$.
|
||||
set(gca,'ColorOrderIndex',1);
|
||||
plot(real(tzero(Giff)), imag(tzero(Giff)), 'o', ...
|
||||
'HandleVisibility', 'off');
|
||||
for g_i = 1:length(gains)
|
||||
K_iff = (gains(g_i)/(1 + s/wi))*eye(2);
|
||||
cl_poles = pole(feedback(Giff, K_iff));
|
||||
for g = gains
|
||||
Kiff = (g/(1 + s/wi))*eye(2);
|
||||
cl_poles = pole(feedback(Giff, Kiff));
|
||||
set(gca,'ColorOrderIndex',1);
|
||||
plot(real(cl_poles), imag(cl_poles), '.', ...
|
||||
'HandleVisibility', 'off');
|
||||
@ -1432,9 +1485,9 @@ The rotation speed is set to $\Omega = 0.1 \omega_0$.
|
||||
set(gca,'ColorOrderIndex',2);
|
||||
plot(real(tzero(Giff_kp)), imag(tzero(Giff_kp)), 'o', ...
|
||||
'HandleVisibility', 'off');
|
||||
for g_i = 1:length(gains)
|
||||
K_iffa = (gains(g_i)/s)*eye(2);
|
||||
cl_poles = pole(feedback(Giff_kp, K_iffa));
|
||||
for g = gains
|
||||
Kiffa = (g/s)*eye(2);
|
||||
cl_poles = pole(feedback(Giff_kp, Kiffa));
|
||||
set(gca,'ColorOrderIndex',2);
|
||||
plot(real(cl_poles), imag(cl_poles), '.', ...
|
||||
'HandleVisibility', 'off');
|
||||
@ -1446,9 +1499,9 @@ The rotation speed is set to $\Omega = 0.1 \omega_0$.
|
||||
set(gca,'ColorOrderIndex',3);
|
||||
plot(real(tzero(Gdvf)), imag(tzero(Gdvf)), 'o', ...
|
||||
'HandleVisibility', 'off');
|
||||
for g_i = 1:length(gains)
|
||||
K_dvf = gains(g_i)*eye(2);
|
||||
cl_poles = pole(feedback(Gdvf, K_dvf));
|
||||
for g = gains
|
||||
Kdvf = g*eye(2);
|
||||
cl_poles = pole(feedback(Gdvf, Kdvf));
|
||||
set(gca,'ColorOrderIndex',3);
|
||||
plot(real(cl_poles), imag(cl_poles), '.', ...
|
||||
'HandleVisibility', 'off');
|
||||
@ -1470,8 +1523,8 @@ Pseudo integrator IFF:
|
||||
opt_zeta_iff = 0;
|
||||
opt_gain_iff = 0;
|
||||
|
||||
for g_i = 1:length(gains)
|
||||
Kiff = (gains(g_i)/(1+s/wi))*eye(2);
|
||||
for g = gains
|
||||
Kiff = (g/(1+s/wi))*eye(2);
|
||||
|
||||
[w, zeta] = damp(minreal(feedback(Giff, Kiff)));
|
||||
|
||||
@ -1488,8 +1541,8 @@ Parallel Stiffness
|
||||
opt_zeta_kp = 0;
|
||||
opt_gain_kp = 0;
|
||||
|
||||
for g_i = 1:length(gains)
|
||||
Kiff = gains(g_i)/s*eye(2);
|
||||
for g = gains
|
||||
Kiff = g/s*eye(2);
|
||||
|
||||
[w, zeta] = damp(minreal(feedback(Giff_kp, Kiff)));
|
||||
|
||||
@ -1506,8 +1559,8 @@ DVF:
|
||||
opt_zeta_dvf = 0;
|
||||
opt_gain_dvf = 0;
|
||||
|
||||
for g_i = 1:length(gains)
|
||||
Kdvf = gains(g_i)*eye(2);
|
||||
for g = gains
|
||||
Kdvf = g*eye(2);
|
||||
|
||||
[w, zeta] = damp(minreal(feedback(Gdvf, Kdvf)));
|
||||
|
||||
@ -1765,3 +1818,32 @@ DVF:
|
||||
ylabel('Frequency [rad/s]'); ylabel('Compliance [m/N]');
|
||||
legend('location', 'northwest');
|
||||
#+end_src
|
||||
|
||||
* Notations
|
||||
<<sec:notations>>
|
||||
|
||||
| | Mathematical Notation | Matlab | Unit |
|
||||
|-----------------------------------+------------------------------+---------------+---------|
|
||||
| Actuator Stiffness | $k$ | =k= | N/m |
|
||||
| Actuator Damping | $c$ | =c= | N/(m/s) |
|
||||
| Payload Mass | $m$ | =m= | kg |
|
||||
| Damping Ratio | $\xi = \frac{c}{2\sqrt{km}}$ | =xi= | |
|
||||
| Actuator Force | $\bm{F}, F_u, F_v$ | =F= =Fu= =Fv= | N |
|
||||
| Force Sensor signal | $\bm{f}, f_u, f_v$ | =f= =fu= =fv= | N |
|
||||
| Relative Displacement | $\bm{d}, d_u, d_v$ | =d= =du= =dv= | m |
|
||||
| Relative Velocity | $\bm{v}, v_u, v_v$ | =v= =vu= =vv= | m/s |
|
||||
| Resonance freq. when $\Omega = 0$ | $\omega_0$ | =w0= | rad/s |
|
||||
| Rotation Speed | $\Omega = \dot{\theta}$ | =W= | rad/s |
|
||||
|
||||
| | Mathematical Notation | Matlab | Unit |
|
||||
|------------------+-----------------------+--------+---------|
|
||||
| Laplace variable | $s$ | =s= | |
|
||||
| Complex number | $j$ | =j= | |
|
||||
| Frequency | $\omega$ | =w= | [rad/s] |
|
||||
|
||||
| | Mathematical Notation | Matlab | Unit |
|
||||
|----------------+------------------------------------------------+--------+---------|
|
||||
| IFF Plant | $\bm{G}_\text{IFF}(s) = \frac{\bm{f}}{\bm{F}}$ | =Giff= | N/N |
|
||||
| DVF Plant | $\bm{G}_\text{DVF}(s) = \frac{\bm{v}}{\bm{F}}$ | =Gdvf= | (m/s)/N |
|
||||
| IFF Controller | $\bm{K}_\text{IFF}(s)$ | =Kiff= | |
|
||||
| DVF Controller | $\bm{K}_\text{DVF}(s)$ | =Kdvf= | |
|
||||
|
Loading…
Reference in New Issue
Block a user