T.
P Commande LQR
Figure 1 _ Pendule inversé
la représentation d'état du système.
A = [0 1 0 0
0 -(I+m*l^2)*b/p (m^2*g*l^2)/p 0
0 0 0 1
0 -(m*l*b)/p m*g*l*(M+m)/p 0]
B = [ 0;
(I+m*l^2)/p;
0;
m*l/p]
C = [1 0 0 0;
0 0 1 0]
D = [0;
0]
Modélisation
%========================================
% Open-loop model
%=====================
M = 0.5; % masse du chariot
m = 0.2; % masse du pendule
b = 0.1; % coefficient du frottement du chariot
I = 0.006; % moment d'inertie du pendule
g = 9.8; %
l = 0.3; % distance du centre masse du pendule
p = I*(M+m)+M*m*l^2; %denominator for the A and B matrices
A = [0 1 0 0;
0 -(I+m*l^2)*b/p (m^2*g*l^2)/p 0;
T.P Commande LQR
0 0 0 1;
0 -(m*l*b)/p m*g*l*(M+m)/p 0];
B = [ 0;
(I+m*l^2)/p;
0;
m*l/p];
C = [1 0 0 0;
0 0 1 0];
D = [0;
0];
states = {'x' 'x_dot' 'phi' 'phi_dot'};
inputs = {'u'};
outputs = {'x'; 'phi'};
%
sys_ss =
ss(A,B,C,D,'statename',states,'inputname',inputs,'outputname',outputs);
3- Stabilité et controllabilité de sys ;
%========================================
% Stability
poles = eig(A)
%======================
% Controllability
cont = ctrb(sys_ss);
controllability = rank(cont)
% observability
Obser = obsv(sys_ss);
observabily = rank(Obser)
>> poles =
0
-5.6041
-0.1428
5.5651
%%% les sys est instable
>> controllability =
4
>> observabily =
%%% les sys est commandable et observable.
T.P Commande LQR
Commande LQR
Figure 2 _ Système en boucle fermée
% LQR control
%================
Q = C'*C;
R = 1;
K = lqr(A,B,Q,R)
Ac =[(A-B*K)] ;
Bc = [B];
Cc = [C] ;
Dc = [D];
states = {'x' 'x_dot' 'phi' 'phi_dot'};
inputs = {'r'};
outputs = {'x'; 'phi'};
sys_cl =
ss(Ac,Bc,Cc,Dc,'statename',states,'inputname',inputs,'outputname',outputs);
t = 0:0.01:5;
r =0.2*ones(size(t));
[y,t,x]=lsim(sys_cl,r,t);
plot(t,y(:,1),t,x(:,2)) %la réponse du système en boucle fermée
grid on
K =
-1.0000 -1.6567 18.6854 3.4594
T.P Commande LQR
0.1
0.05
-0.05
-0.1
-0.15
-0.2
-0.25
0 0.5 1 1.5 2 2.5 3 3.5 4 4.5 5
Figure 3_ la réponse du système en boucle fermée
La courbe en bleu représente l'angle du pendule en radians et la courbe en vert
représente la position du chariot en mètres.
Nous avons remarqué que la position finale du chariot n'était pas proche de
l'emplacement souhaité, mais qu'elle s'était en fait déplacée dans la direction
opposée.
Q(1,1) = 5000;
Q(3,3) = 100
R = 1;
T.P Commande LQR
states = {'x' 'x_dot' 'phi' 'phi_dot'};
inputs = {'r'};
outputs = {'x'; 'phi'};
sys_cl =
ss(Ac,Bc,Cc,Dc,'statename',states,'inputname',inputs,'outputname',outputs);
t = 0:0.01:5;
r =0.2*ones(size(t));
[y,t,x]=lsim(sys_cl,r,t);
[AX,H1,H2] = plotyy(t,y(:,1),t,y(:,2),'plot');
grid on
set(get(AX(1),'Ylabel'),'String','cart position (m)')
set(get(AX(2),'Ylabel'),'String','pendulum angle (radians)')
-3 -3
x 10 x 10
1 3
0 2
pendulum angle (radians)
cart position (m)
-1 1
-2 0
-3 -1
0 0.5 1 1.5 2 2.5 3 3.5 4 4.5 5
Figure 4_réponce pas à pas avec commande numerique LQR
nous avons remarqué que si vous augmentiez les valeurs des éléments de Q
encore plus haut, vous amélioriez encore plus la réponse.
%===========================
% Lqr + precompensation
%===========================
T.P Commande LQR
Q(1,1) = 5000;
Q(3,3) = 100
R = 1;
K = lqr(A,B,Q,R)
Nbar = -60.55
Ts=1/10;
%
Ac = [(A-B*K)];
Bc = [B];
Cc = [C];
Dc = [D];
states = {'x' 'x_dot' 'phi' 'phi_dot'};
inputs = {'r'};
outputs = {'x'; 'phi'};
%
sys_cl =
ss(Ac,Bc*Nbar,Cc,Dc,'statename',states,'inputname',inputs,'outputname',outp
uts);
t = 0:0.01:5;
r =0.2*ones(size(t));
[y,t,x]=lsim(sys_cl,r,t);
[AX,H1,H2] = plotyy(t,y(:,1),t,y(:,2),'plot');
set(get(AX(1),'Ylabel'),'String','cart position (m)')
set(get(AX(2),'Ylabel'),'String','pendulum angle (radians)')
grid on
0.2 0.1
0.15 0.05
pendulum angle (radians)
cart position (m)
0.1 0
0.05 -0.05
0 -0.1
-0.05 -0.15
0 0.5 1 1.5 2 2.5 3 3.5 4 4.5 5
Figure 5_Step Response with Digital LQR Control and Precompensation
T.P Commande LQR
Maintenant, les temps de montée et de stabilisation sont respectés et le
dépassement du pendule est dans la plage des critères de conception.