Chapter5
垂直駆動アームの角度追従制御
mu = 1.5e-2; % 粘性摩擦係数[kg*m^2/s]
J = 1.0e-2; % 慣性モーメント[kg*m^2]
P = tf( [0,1], [J, mu, M*g*l] );
P制御
K = tf([0, kp(i)], [0, 1]);
plot(t,y*ref, 'linewidth', 2, 'DisplayName','k_P='+string(kp(i)))
plot_set(gcf, 't', 'y', 'best')
plot(t, ref*ones(1,size(t,2)), 'k');
K = tf([0, kp(i)], [0, 1]);
[gain, phase, w] = bode(Gyr, logspace(-1,2));
gainLog = 20*log10(gain(:));
semilogx(w, gainLog, 'LineWidth', 2, 'DisplayName','k_P='+string(kp(i)));
semilogx(w, phaseDeg, 'LineWidth', 2, 'DisplayName','k_P='+string(kp(i)));
subplot(2,1,1); bodeplot_set(gcf, '\omega [rad/s]', 'Gain [dB]', 'best');
subplot(2,1,2); bodeplot_set(gcf, '\omega [rad/s]', 'Phase [deg]', 'best');
PD制御
K = tf([kd(i), kp], [0, 1]);
plot(t,y*ref, 'linewidth', 2, 'DisplayName','k_D='+string(kd(i)))
plot_set(gcf, 't', 'y', 'best')
plot(t, ref*ones(1,size(t,2)), 'k');
K = tf([kd(i), kp], [0, 1]);
[gain, phase, w] = bode(Gyr, logspace(-1,2));
gainLog = 20*log10(gain(:));
semilogx(w, gainLog, 'LineWidth', 2, 'DisplayName','k_D='+string(kd(i)));
semilogx(w, phaseDeg, 'LineWidth', 2, 'DisplayName','k_D='+string(kd(i)));
subplot(2,1,1); bodeplot_set(gcf, '\omega [rad/s]', 'Gain [dB]', 'best');
subplot(2,1,2); bodeplot_set(gcf, '\omega [rad/s]', 'Phase [deg]', 'best');
PID制御
K = tf([kd, kp, ki(i)], [1, 0]);
plot(t,y*ref, 'linewidth', 2, 'DisplayName','k_I='+string(ki(i)))
plot_set(gcf, 't', 'y', 'best')
plot(t, ref*ones(1,size(t,2)), 'k');
K = tf([kd, kp, ki(i)], [1, 0]);
[gain, phase, w] = bode(Gyr, logspace(-1,2));
gainLog = 20*log10(gain(:));
semilogx(w, gainLog, 'LineWidth', 2, 'DisplayName','k_I='+string(ki(i)));
semilogx(w, phaseDeg, 'LineWidth', 2, 'DisplayName','k_I='+string(ki(i)));
subplot(2,1,1); bodeplot_set(gcf, '\omega [rad/s]', 'Gain [dB]', 'best');
subplot(2,1,2); bodeplot_set(gcf, '\omega [rad/s]', 'Phase [deg]', 'best');
練習問題(外乱抑制)
K = tf([kd, kp, ki(i)], [1, 0]);
plot(t,y, 'linewidth', 2, 'DisplayName','k_I='+string(ki(i)))
plot_set(gcf, 't', 'y', 'best')
K = tf([kd, kp, ki(i)], [1, 0]);
[gain, phase, w] = bode(Gyd, logspace(-1,2));
gainLog = 20*log10(gain(:));
semilogx(w, gainLog, 'LineWidth', 2, 'DisplayName','k_I='+string(ki(i)));
semilogx(w, phaseDeg, 'LineWidth', 2, 'DisplayName','k_I='+string(ki(i)));
subplot(2,1,1); bodeplot_set(gcf, '\omega [rad/s]', 'Gain [dB]', 'best');
subplot(2,1,2); bodeplot_set(gcf, '\omega [rad/s]', 'Phase [deg]', 'best');
2自由度制御
K1 = tf([kd, kp, ki], [1, 0]);
K2 = tf([0, ki], [kd, kp, ki]);
K3 = tf([kp, ki], [kd, kp, ki]);
PI-D制御
plot(t,r*ref, 'linewidth', 2);
plot(t,y*ref, 'linewidth', 2, 'DisplayName','PID');
plot(t,z*ref, 'linewidth', 2);
plot(t,y*ref, 'linewidth', 2, 'DisplayName','PI-D');
plot_set(gcf, 't', 'y', 'best')
set(gcf,'Position',[100 100 700 250])
plot(t, ref*ones(1,size(t,2)), 'k');
制御入力
PID制御では,Gur がインプロパーになるので,擬似微分を用いて計算する
Klp = tf([kd, 0], [tau, 1]); % 擬似微分器
Ktau = tf([kp, ki], [1, 0]) + Klp;
Gyz = feedback(P*Ktau, 1);
plot(t,u, 'linewidth', 2);
plot(t,y*ref, 'linewidth', 2, 'DisplayName','PID');
plot(t,u, 'linewidth', 2);
plot(t,y*ref, 'linewidth', 2, 'DisplayName','PI-D');
plot_set(gcf, 't', 'y', 'best')
set(gcf,'Position',[100 100 700 250])
plot(t, ref*ones(1,size(t,2)), 'k');
I-PD制御
plot(t,r*ref, 'linewidth', 2);
plot(t,y*ref, 'linewidth', 2, 'DisplayName','PID');
plot(t,z*ref, 'linewidth', 2);
plot(t,y*ref, 'linewidth', 2, 'DisplayName','I-PD');
plot_set(gcf, 't', 'y', 'best')
set(gcf,'Position',[100 100 700 250])
制御入力
PID制御では,Gur がインプロパーになるので,擬似微分を用いて計算する
Klp = tf([kd, 0], [tau, 1]); % 擬似微分器
Ktau = tf([kp, ki], [1, 0]) + Klp;
Gyz = feedback(P*Ktau, 1);
plot(t,u, 'linewidth', 2);
plot(t,y*ref, 'linewidth', 2, 'DisplayName','PID');
plot(t,u, 'linewidth', 2);
plot(t,y*ref, 'linewidth', 2, 'DisplayName','I-PD');
plot_set(gcf, 't', 'y', 'best')
set(gcf,'Position',[100 100 700 250])
限界感度法
無駄時間システム
Pdelay = tf( [0,1], [J, mu, M*g*l], 'InputDelay', 0.005)
Pdelay =
1
exp(-0.005*s) * --------------------------
0.01 s^2 + 0.015 s + 0.981
連続時間の伝達関数です。
チューニング
K = tf([0, kp0], [0, 1]);
Gyr = feedback(Pdelay*K, 1);
plot(t,y*ref, 'linewidth', 2);
plot(t, ref*ones(1,size(t,2)), 'k');
Rule = ["Classic", "No Overshoot"];
ki(1) = kp(1) / (0.5 * T0)
kd(1) = kp(1) * (0.125 * T0)
ki(2) = kp(2) / (0.5 * T0)
kd(2) = kp(2) * (0.33 * T0)
K = tf([kd(i), kp(i), ki(i)], [1, 0]);
plot(t,y*ref, 'linewidth', 2, 'DisplayName',Rule(i) )
plot_set(gcf, 't', 'y', 'best')
plot(t, ref*ones(1,size(t,2)), 'k');
モデルマッチング
G = (kp*s+ki)/(J*s^3 +(mu+kd)*s^2 + (Mgl + kp)*s + ki);
taylor(1/G, s, 'ExpansionPoint', 0, 'Order', 4)
ans =

f2 = (mu+kd)/ki-Mgl*kp/(ki^2)-1/(wn^2);
f3 = J/ki-kp*(mu+kd)/(ki^2)+Mgl*kp^2/(ki^3);
S = solve([f1==0, f2==0, f3==0],[kp, kd, ki]);
S.kp
ans = 
S.kd
ans =

S.ki
ans =

mu = 1.5e-2; % 粘性摩擦係数[kg*m^2/s]
J = 1.0e-2; % 慣性モーメント[kg*m^2]
P = tf( [0,1], [J, mu, M*g*l] );
Label = ["Binomial coeff.", "Butterworth"];
Msys = tf([0,omega_n^2], [1,2*zeta(i)*omega_n,omega_n^2]);
plot(t,y*ref, 'linewidth', 2, 'DisplayName', Label(i) )
plot_set(gcf, 't', 'y', 'best')
plot(t, ref*ones(1,size(t,2)), 'k');
Msys = tf([0,omega_n^2], [1,2*zeta*omega_n,omega_n^2]);
ki = omega_n*M*g*l/(2*zeta)
kd = 2*zeta*omega_n*J + M*g*l/(2*zeta*omega_n) - mu
plot(t,y*ref, 'linewidth', 2, 'DisplayName', 'M' )
Gyr = tf([kp,ki], [J, mu+kd, M*g*l+kp, ki]);
plot(t,y*ref, 'linewidth', 2, 'DisplayName', 'Gyr' )
plot_set(gcf, 't', 'y', 'best')
plot(t, ref*ones(1,size(t,2)), 'k');
Label = ["Binomial coeff.", "Butterworth", "ITAE"];
M = tf([0, omega_n^3], [1, alpha2(i)*omega_n, alpha1(i)*omega_n^2, omega_n^3]);
plot(t,y*ref, 'linewidth', 2, 'DisplayName', Label(i) )
plot_set(gcf, 't', 'y', 'best')
plot(t, ref*ones(1,size(t,2)), 'k');
状態フィードバック
極配置
P = ss(A, B, C, D)
P =
A =
x1 x2
x1 0 1
x2 -4 5
B =
u1
x1 0
x2 1
C =
x1 x2
y1 1 0
y2 0 1
D =
u1
y1 0
y2 0
連続時間状態空間モデル。
F = -acker(P.A, P.B, Pole)
Pfb = ss(Acl, P.B, P.C, P.D);
x = initial(Pfb, X0, t) ;
plot(t, x(:,1), 'linewidth', 2, 'DisplayName','x_1');
plot(t, x(:,2), 'linewidth', 2, 'DisplayName','x_2');
plot_set(gcf, 't', 'x', 'best')
最適レギュレータ
[F, X, E] = lqr(P.A, P.B, Q, R);
disp('--- フィードバックゲイン ---')
E
-3.1441 + 0.9408i
-3.1441 - 0.9408i
eig(P.A+P.B*F)
-3.1441 + 0.9408i
-3.1441 - 0.9408i
[X, E, F] = care(P.A, P.B, Q, R);
disp('--- フィードバックゲイン ---')
E
-3.1441 + 0.9408i
-3.1441 - 0.9408i
Pfb = ss(Acl, P.B, P.C, P.D);
x = initial(Pfb, X0, t) ;
plot(t, x(:,1), 'linewidth', 2, 'DisplayName','x_1');
plot(t, x(:,2), 'linewidth', 2, 'DisplayName','x_2');
plot_set(gcf, 't', 'x', 'best')
円条件(最適レギュレータのロバスト性)
L = ss(P.A, P.B, -F, 0)
L =
A =
x1 x2
x1 0 1
x2 -4 5
B =
u1
x1 0
x2 1
C =
x1 x2
y1 6.77 11.29
D =
u1
y1 0
連続時間状態空間モデル。
[x, y] = nyquist(L, logspace(-2,3,1000));
plot(x(:), y(:), 'LineWidth', 2);
plot(x(:), -y(:), '--', 'LineWidth', 2);
scatter(-1, 0, 'filled', 'k');
開ループ系のナイキスト軌跡が (-1, 0j) を中心とする単位円の中に入らない.
これにより,位相余裕が 60 [deg] 以上であることが保証される.
ハミルトン行列
H = [ P.A -P.B*(1/R)*P.B'; -Q -P.A'];
eigH_stable = [eigH_stable, eigH(i)];
eigH_stable
-3.1441 + 0.9408i -3.1441 - 0.9408i
F = -acker(P.A, P.B, eigH_stable)
積分サーボ系
F = -acker(P.A, P.B, Pole)
Pfb = ss(Acl, P.B, P.C, P.D);
x = lsim(Pfb, Ud, t, X0);
plot(t, x(:,1), 'linewidth', 2, 'DisplayName','x_1');
plot(t, x(:,2), 'linewidth', 2, 'DisplayName','x_2');
plot_set(gcf, 't', 'x', 'best')
Abar = [P.A zeros(2,1); -P.C 0];
Fbar = -acker(Abar, Bbar, Pole)
Warning: Pole locations are more than 10% in error.
Pfb = ss(Acl, Bbar, eye(3), zeros(3,1));
x = lsim(Pfb, Ud, t, [X0, 0]);
plot(t, x(:,1), 'linewidth', 2, 'DisplayName','x_1');
plot(t, x(:,2), 'linewidth', 2, 'DisplayName','x_2');
plot_set(gcf, 't', 'x', 'best')
可制御性,可観測性