Matlab Pendulum
Matlab Pendulum
clc
clear all
% mass matrices
M1=m1*eye(3); M1(3,3)=0; % Moment of inertia = 0 -> cart doesn't turn
M2=m2*eye(3); M2(3,3)=0; % Moment of inertia around cg = 0 -> concentrated mass at the end of the pole
% derive poses
y1d=diff(y1,t);
y2d=diff(y2,t);
% calculate energies
T=0.5*(y1d.'*M1*y1d + y2d.'*M2*y2d);
gvec=[0; g; 0].';
U=gvec*M1*y1+gvec*M2*y2;
% calculate Lagrangian
L=T-U;
L=simplify(L);
% L_q:
q=[q1f; q2f];
L_q=jacobian(L,q);
L_q=simplify(L_q);
% L_qd:
qd=diff(q,t);
L_qd=jacobian(L,qd);
L_qd=simplify(L_qd);
% L_qd_t:
L_qd_t=diff(L_qd,t);
L_qd_t=simplify(L_qd_t);
% rename variables
syms q1dd q2dd q1d q2d q1 q2
lhs=subs(lhs,diff(diff(q1f,t),t),q1dd);
lhs=subs(lhs,diff(diff(q2f,t),t),q2dd);
lhs=subs(lhs,diff(q1f,t),q1d);
lhs=subs(lhs,diff(q2f,t),q2d);
lhs=subs(lhs,q1f(t),q1);
lhs=subs(lhs,q2f(t),q2);
% setpoints
xs = [-1; 0; 0; 0];
if(t>5)
xs = [1; 0; 0; 0];
end
% open loop
if(t>8)
%if(t>0)
u = 0;
else
end
% differential equation
xd(1) = x(2);
xd(2) = (-d1*x(2) + g*m2*sin(2*x(3))/2 - l*m2*x(4)^2*sin(x(3)) + u)/(m2*sin(x(3))^2 + m1);
xd(3) = x(4);
xd(4) = (g*(m1 + m2)*sin(x(3)) - (d1*x(2) + l*m2*x(4)^2*sin(x(3)) - u)*cos(x(3)))/(l*(m2*sin(x(3))^2 + m1));
end
(l*(m2*sin(x(3))^2 + m1));
function drawPendulum(t,x,m1,m2,g,l)
s = x(:,1);
phi = x(:,3);
Epot = m2 * g * l * cos(phi);
% dimensions
W = 1*sqrt(m1/5); % cart width
H = .5*sqrt(m1/5); % cart height
mr = .3*sqrt(m2); % mass radius
% positions
px = s - l*sin(phi);
py = H/2 + l*cos(phi);
tic
end
%figure
%plot(diff(t3));
%legend('plot time');
%close all
EdgeColor',[1 1 1]);
% mass matrices
M1=m1*eye(3); M1(3,3)=0; % Moment of inertia = 0 -> cart doesn't turn
M2=m2*eye(3); M2(3,3)=0; % Moment of inertia around cg = 0 -> concentrated mass at the end of th
% derive poses
y1d=diff(y1,t);
y2d=diff(y2,t);
% calculate energies
T=0.5*(y1d.'*M1*y1d + y2d.'*M2*y2d);
gvec=[0; g; 0].';
U=gvec*M1*y1+gvec*M2*y2;
% calculate Lagrangian
L=T-U;
L=simplify(L);
% L_q:
q=[q1f; q2f];
L_q=jacobian(L,q);
L_q=simplify(L_q);
% L_qd:
qd=diff(q,t);
L_qd=jacobian(L,qd);
L_qd=simplify(L_qd);
% L_qd_t:
L_qd_t=diff(L_qd,t);
L_qd_t=simplify(L_qd_t);
% rename variables
syms q1dd q2dd q1d q2d q1 q2
lhs=subs(lhs,diff(diff(q1f,t),t),q1dd);
lhs=subs(lhs,diff(diff(q2f,t),t),q2dd);
lhs=subs(lhs,diff(q1f,t),q1d);
lhs=subs(lhs,diff(q2f,t),q2d);
lhs=subs(lhs,q1f(t),q1);
lhs=subs(lhs,q2f(t),q2);
% kinematics
% x = 3; % cart position
% th = 3*pi/2; % pendulum angle
% dimensions
% L = 2; % pendulum length
W = 1*sqrt(M/5); % cart width
H = .5*sqrt(M/5); % cart height
wr = .2; % wheel radius
mr = .3*sqrt(m); % mass radius
% positions
% y = wr/2; % cart vertical position
y = wr/2+H/2; % cart vertical position
w1x = x-.9*W/2;
w1y = 0;
w2x = x+.9*W/2-wr;
w2y = 0;
px = x + L*sin(th);
py = y - L*cos(th);
% set(gca,'YTick',[])
% set(gca,'XTick',[])
xlim([-5 5]);
ylim([-2 2.5]);
set(gca,'Color','k','XColor','w','YColor','w')
set(gcf,'Position',[10 900 800 400])
set(gcf,'Color','k')
set(gcf,'InvertHardcopy','off')
% box off
drawnow
hold off
0.1],'EdgeColor',[1 1 1])
geColor',[1 1 1])
geColor',[1 1 1])
% kinematics
% x = 3; % cart position
% th = 3*pi/2; % pendulum angle
% dimensions
% L = 2; % pendulum length
W = 1*sqrt(M/5); % cart width
H = .5*sqrt(M/5); % cart height
wr = .2; % wheel radius
mr = .3*sqrt(m); % mass radius
% positions
% y = wr/2; % cart vertical position
y = wr/2+H/2; % cart vertical position
w1x = x-.9*W/2;
w1y = 0;
w2x = x+.9*W/2-wr;
w2y = 0;
px = x + L*sin(th);
py = y - L*cos(th);
% set(gca,'YTick',[])
% set(gca,'XTick',[])
xlim([-5 5]);
ylim([-2 2.5]);
set(gcf,'Position',[100 550 1000 400])
% box off
drawnow
hold off
clear all, close all, clc
m = 1;
M = 5;
L = 2;
g = -10;
d = 1;
C = [1 0 0 0];
D = zeros(size(C,1),size(B,2));
sysC = ss(A,BF,C,[0 0 0 0 0 Vn]); % build big state space system... with single output
[y,t] = lsim(sysC,uAUG,t);
[xtrue,t] = lsim(sysFullOutput,uAUG,t);
plot(t,xtrue,'-',t,x,'--','LineWidth',2)
figure
plot(t,y)
hold on
plot(t,xtrue(:,1),'r')
plot(t,x(:,1),'k--')
h single output
m = 1;
M = 5;
L = 2;
g = -10;
d = 1;
s = 1; % pendulum up (s=1)
A = [0 1 0 0;
0 -d/M -m*g/M 0;
0 0 0 1;
0 -s*d/(M*L) -s*(m+M)*g/(M*L) 0];
B = [0; 1/M; 0; s*1/(M*L)];
eig(A)
C = eye(4);
sys = ss(A,B,C,0*B);
%%
tspan = 0:.001:10;
if(s==-1)
y0 = [0; 0; 0; 1.5];
[yL,t,xL] = initial(sys,y0,tspan);
[t,yNL] = ode45(@(t,y)cartpend(y,m,M,L,g,d,0),tspan,y0);
elseif(s==1)
y0 = [0; 0; pi+.0001; 0];
[yL,t,xL] = initial(sys,y0-[0; 0; pi; 0],tspan);
[t,yNL] = ode45(@(t,y)cartpend(y,m,M,L,g,d,0),tspan,y0);
else
end
figure
% plot(t,yL);
plot(t,yL+ones(10001,1)*[0; 0; pi; 0]');
hold on
plot(t,yNL);
figure
for k=1:100:length(t)
drawcartpend_bw(yNL(k,:),m,M,L);
end
clear all, close all, clc
m = 1;
M = 5;
L = 2;
g = -10;
d = 1;
s = 1; % pendulum up (s=1)
A = [0 1 0 0;
0 -d/M -m*g/M 0;
0 0 0 1;
0 -s*d/(M*L) -s*(m+M)*g/(M*L) 0];
B = [0; 1/M; 0; s*1/(M*L)];
eig(A)
C = eye(4);
sys = ss(A,B,C,0*B);
%%
tspan = 0:.001:10;
if(s==-1)
y0 = [0; 0; 0; 1.5];
[yL,t,xL] = initial(sys,y0,tspan);
[t,yNL] = ode45(@(t,y)cartpend(y,m,M,L,g,d,0),tspan,y0);
elseif(s==1)
y0 = [0; 0; pi+.0001; 0];
[yL,t,xL] = initial(sys,y0-[0; 0; pi; 0],tspan);
[t,yNL] = ode45(@(t,y)cartpend(y,m,M,L,g,d,0),tspan,y0);
else
end
figure
% plot(t,yL);
plot(t,yL+ones(10001,1)*[0; 0; pi; 0]');
hold on
plot(t,yNL);
figure
for k=1:100:length(t)
drawcartpend_bw(yNL(k,:),m,M,L);
end
clear all, close all, clc
m = 1;
M = 5;
L = 2;
g = -10;
d = 1;
s = 1; % pendulum up (s=1)
A = [0 1 0 0;
0 -d/M -m*g/M 0;
0 0 0 1;
0 -s*d/(M*L) -s*(m+M)*g/(M*L) 0];
Q = [1 0 0 0;
0 1 0 0;
0 0 10 0;
0 0 0 100];
R = .0001;
%%
det(ctrb(A,B))
%%
K = lqr(A,B,Q,R);
tspan = 0:.001:10;
if(s==-1)
y0 = [0; 0; 0; 0];
[t,y] = ode45(@(t,y)cartpend(y,m,M,L,g,d,-K*(y-[4; 0; 0; 0])),tspan,y0);
elseif(s==1)
y0 = [-3; 0; pi+.1; 0];
% % [t,y] = ode45(@(t,y)((A-B*K)*(y-[0; 0; pi; 0])),tspan,y0);
[t,y] = ode45(@(t,y)cartpend(y,m,M,L,g,d,-K*(y-[1; 0; pi; 0])),tspan,y0);
else
end
for k=1:100:length(t)
drawcartpend_bw(y(k,:),m,M,L);
end
1
clear all, close all, clc
m = 1;
M = 5;
L = 2;
g = -10;
d = 1;
C = [1 0 0 0];
D = zeros(size(C,1),size(B,2));
sysC = ss(A,BF,C,[0 0 0 0 0 Vn]); % build big state space system... with single output
uDIST = randn(4,size(t,2));
uNOISE = randn(size(t));
u = 0*t;
u(100:120) = 100; % impulse
u(1500:1520) = -100; % impulse
[y,t] = lsim(sysC,uAUG,t);
[xtrue,t] = lsim(sysFullOutput,uAUG,t);
plot(t,xtrue,'-',t,x,'--','LineWidth',2)
figure
plot(t,y)
hold on
plot(t,xtrue(:,1),'r')
plot(t,x(:,1),'k--')
h single output
m = 1;
M = 5;
L = 2;
g = -10;
d = 1;
s = 1; % pendulum up (s=1)
A = [0 1 0 0;
0 -d/M -m*g/M 0;
0 0 0 1;
0 -s*d/(M*L) -s*(m+M)*g/(M*L) 0];
B = [0; 1/M; 0; s*1/(M*L)];
eig(A)
C = eye(4);
sys = ss(A,B,C,0*B);
%%
tspan = 0:.001:10;
if(s==-1)
y0 = [0; 0; 0; 1.5];
[yL,t,xL] = initial(sys,y0,tspan);
[t,yNL] = ode45(@(t,y)cartpend(y,m,M,L,g,d,0),tspan,y0);
elseif(s==1)
y0 = [0; 0; pi+.0001; 0];
[yL,t,xL] = initial(sys,y0-[0; 0; pi; 0],tspan);
[t,yNL] = ode45(@(t,y)cartpend(y,m,M,L,g,d,0),tspan,y0);
else
end
figure
% plot(t,yL);
plot(t,yL+ones(10001,1)*[0; 0; pi; 0]');
hold on
plot(t,yNL);
figure
for k=1:100:length(t)
drawcartpend_bw(yNL(k,:),m,M,L);
end
3
clear all, close all, clc
m = 1;
M = 5;
L = 2;
g = -10;
d = 1;
s = 1; % pendulum up (s=1)
A = [0 1 0 0;
0 -d/M -m*g/M 0;
0 0 0 1;
0 -s*d/(M*L) -s*(m+M)*g/(M*L) 0];
B = [0; 1/M; 0; s*1/(M*L)];
eig(A)
C = eye(4);
sys = ss(A,B,C,0*B);
%%
tspan = 0:.001:10;
if(s==-1)
y0 = [0; 0; 0; 1.5];
[yL,t,xL] = initial(sys,y0,tspan);
[t,yNL] = ode45(@(t,y)cartpend(y,m,M,L,g,d,0),tspan,y0);
elseif(s==1)
y0 = [0; 0; pi+.0001; 0];
[yL,t,xL] = initial(sys,y0-[0; 0; pi; 0],tspan);
[t,yNL] = ode45(@(t,y)cartpend(y,m,M,L,g,d,0),tspan,y0);
else
end
figure
% plot(t,yL);
plot(t,yL+ones(10001,1)*[0; 0; pi; 0]');
hold on
plot(t,yNL);
figure
for k=1:100:length(t)
drawcartpend_bw(yNL(k,:),m,M,L);
end
4
clear all, close all, clc
m = 1;
M = 5;
L = 2;
g = -10;
d = 1;
s = 1; % pendulum up (s=1)
A = [0 1 0 0;
0 -d/M -m*g/M 0;
0 0 0 1;
0 -s*d/(M*L) -s*(m+M)*g/(M*L) 0];
Q = [1 0 0 0;
0 1 0 0;
0 0 10 0;
0 0 0 100];
R = .0001;
%%
det(ctrb(A,B))
%%
K = lqr(A,B,Q,R);
tspan = 0:.001:10;
if(s==-1)
y0 = [0; 0; 0; 0];
[t,y] = ode45(@(t,y)cartpend(y,m,M,L,g,d,-K*(y-[4; 0; 0; 0])),tspan,y0);
elseif(s==1)
y0 = [-3; 0; pi+.1; 0];
% % [t,y] = ode45(@(t,y)((A-B*K)*(y-[0; 0; pi; 0])),tspan,y0);
[t,y] = ode45(@(t,y)cartpend(y,m,M,L,g,d,-K*(y-[1; 0; pi; 0])),tspan,y0);
else
end
for k=1:100:length(t)
drawcartpend_bw(y(k,:),m,M,L);
end
5
clear all, close all, clc
m = 1;
M = 5;
L = 2;
g = -10;
d = 1;
tspan = 0:.1:10;
y0 = [0; 0; pi; .5];
[t,y] = ode45(@(t,y)cartpend(y,m,M,L,g,d,0),tspan,y0);
for k=1:length(t)
drawcartpend_bw(y(k,:),m,M,L);
end
% function dy = pendcart(y,m,M,L,g,d,u)
6
clear all, close all, clc
m = 1;
M = 5;
L = 2;
g = -10;
d = 1;
s = 1; % pendulum up (s=1)
A = [0 1 0 0;
0 -d/M -m*g/M 0;
0 0 0 1;
0 -s*d/(M*L) -s*(m+M)*g/(M*L) 0];
rank(ctrb(A,B)) % is it controllable
%% Pole placement
tspan = 0:.001:10;
if(s==-1)
y0 = [0; 0; 0; 0];
[t,y] = ode45(@(t,y)cartpend(y,m,M,L,g,d,-K*(y-[4; 0; 0; 0])),tspan,y0);
elseif(s==1)
y0 = [-3; 0; pi+.1; 0];
% [t,y] = ode45(@(t,y)cartpend(y,m,M,L,g,d,-K*(y-[1; 0; pi; 0])),tspan,y0);
[t,y] = ode45(@(t,y)cartpend(y,m,M,L,g,d,-K*(y-[1; 0; pi; 0])),tspan,y0);
else
end
for k=1:100:length(t)
drawcartpend_bw(y(k,:),m,M,L);
end
7
clear all, close all, clc
m = 1;
M = 5;
L = 2;
g = -10;
d = 1;
A = [0 1 0 0;
0 -d/M -m*g/M 0;
0 0 0 1;
0 -s*d/(M*L) -s*(m+M)*g/(M*L) 0];
D = zeros(size(C,1),size(B,2));
sys = ss(A,B,C,D);
det(gram(sys,'o'))
8
clear all, close all, clc
m = 1;
M = 5;
L = 2;
g = -10;
d = 1;
s = 1; % pendulum up (s=1)
A = [0 1 0 0;
0 -d/M -m*g/M 0;
0 0 0 1;
0 -s*d/(M*L) -s*(m+M)*g/(M*L) 0];
Q = [1 0 0 0;
0 1 0 0;
0 0 10 0;
0 0 0 100];
R = .0001;
%%
det(ctrb(A,B))
%%
K = lqr(A,B,Q,R);
tspan = 0:.001:10;
if(s==-1)
y0 = [0; 0; 0; 0];
[t,y] = ode45(@(t,y)cartpend(y,m,M,L,g,d,-K*(y-[4; 0; 0; 0])),tspan,y0);
elseif(s==1)
y0 = [-3; 0; pi+.1; 0];
% % [t,y] = ode45(@(t,y)((A-B*K)*(y-[0; 0; pi; 0])),tspan,y0);
[t,y] = ode45(@(t,y)cartpend(y,m,M,L,g,d,-K*(y-[1; 0; pi; 0])),tspan,y0);
else
end
for k=1:100:length(t)
drawcartpend_bw(y(k,:),m,M,L);
end
% function dy = pendcart(y,m,M,L,g,d,u)