Está en la página 1de 7

LABORATORIO 01: INTRODUCCIÓN

Materiales y equipamientos
_ Computador o Smartphone.
_ Gnu-Octave instalado o acceso https://octave-online.net/.
_ Cuaderno de apuntes.
_ Python (opcional).

Procedimientos

1. Encontrar la solución numérica del sistema péndulo invertido (no lineal, figura 1) y
visualizar respuestas de las cuatro variables de estado en función de diferentes
condiciones iniciales. Mostrar por lo menos 2 casos (ayuda: puede usar la función
ODE45 de Gnu-Octave).

𝑪𝒄𝐠 (x𝑐g, y 𝑐g)


Las siguientes ecuaciones nos muestran la distancia que se a movido el vehículo con
respecto a la fuerza u(t)
xcg = x + ℓsenθ
ycg = ℓcosθ
𝑭x representa el movimiento horizontal del péndulo y u(t) representa la fuerza de
entrada.
Mẍ + Fx = u(t)
Aplicamos la segunda Ley de Newton al movimiento rotacional
IӪ = Fyℓsenθ − Fxℓcosθ
Siendo I el momento de inercia del péndulo, 𝑭x y 𝑭y representan el movimiento del
péndulo respectivamente a su eje

Fx = m𝑥𝑐𝑔
Reemplazamos la ecuación de Xcg
𝐹𝑥 = 𝑚𝑥̈ + 𝑚𝑙𝑎̈

Obtenemos la segunda derivada de 𝑎̈ del valor de

𝑎̈ = (cos 𝜃)𝜃̈ − (𝑠𝑒𝑛𝜃)𝜃 2̇


Reemplazamos el valor hallado de a en la ecuación de Fx

Fx = mẍ + mℓ𝜃̈cosθ − mℓ𝜃 2̇ senθ


El movimiento vertical Fy
Fy = m𝑦̈𝑐𝑔 + mg
Fy = mℓb̈ + mg
Derivamos la distancia para obtener b̈
𝑑2
(cosθ) = (−senθ)𝜃̈ − (cosθ)𝜃 2̇
𝑑2 x
Reemplazamos las ecuaciones anteriores para obtener la representación del
movimiento vertical
Fy = −mℓ𝜃̈senθ − mℓ 𝜃 2̇ cosθ + mg

Usando las ecuaciones marcadas representamos el Movimiento rotacional del péndulo


I𝜃̈ = [−mℓ𝜃̈senθ − mℓ 𝜃 2̇ cos𝜃 + mg]ℓsen𝜃 − [mẍ + mℓ𝜃̈cos𝜃
− mℓ 𝜃 2̇ senθ]ℓcosθ

I𝜃̈=0 se puede suponer que el momento de inercia es igual a cero


(mg)senθ = ml𝜃̈ + (mẍ)cos𝜃

Ecuación del movimiento traslacional


(M + m)ẍ − mlℓ̇senθ + mℓ𝜃̈cosθ = u(t)

𝑚𝑙 𝑚 cos 𝜃 𝜃̈ (mg)senθ
[ ][ ] = [ ]
𝑚𝑙 cos 𝜃 𝑀 + 𝑚 ẍ u(t) + mℓ𝜃 2̇ sen𝜃

mgθ = mℓ𝜃̈ + mẍ

(M + m)ẍ + mℓ𝜃̈ = u(t)

𝑚 1
𝑥̈ = − 𝑔𝜃 + 𝑢(𝑡)
𝑀 𝑀

(M + m) 1
𝜃̈ = − 𝑔𝜃 − 𝑢(𝑡)
Mℓ Mℓ

𝜃(𝑠) −1 1
= ∗
𝑈(𝑠) 𝑀ℓ 𝑠 2 − 𝑔 (𝑀 + 𝑚)
𝑀ℓ

x1 = θ, x2 = 𝜃̇, x3 = x, x4 = ẋ

(𝑀 + 𝑚) 1
𝑥̇ 2 = 𝑔𝑥1 − 𝑢(𝑡)
𝑀ℓ 𝑀ℓ

(𝑚 ) 1
𝑥̇ 4 = − 𝑔𝑥1 + 𝑢(𝑡)
𝑀ℓ 𝑀
Ingresando los datos en el octave

function GA()
to=0; % start time
tf=5; % end time
t=linspace(to,tf,100);
yo(1)=1; % initial condition
yo(2)=0;
yo(3)=0.01;
yo(4)=0;

[t,ydot] = ode45(@(t,y)nonlinear(t,y),t,yo);

subplot(2,2,1);
plot(t,ydot(:,1))
title('x');

subplot(2,2,2);
plot(t,ydot(:,2))
title('xdot');

subplot(2,2,3);
plot(t,ydot(:,3))
title('teta');

subplot(2,2,4);
plot(t,ydot(:,4))
title('tetadot');

function [ydot] = nonlinear(t,y)


% parameters
m=0.1;
M=2;
l=0.32;
g=9.81;
% proportional plus derivative control action
K=[-35 -34 -140 -34];
%u=-K*y; %Cpn control lqr
u=0; % no control action
ydot=zeros(4,1);
ydot=[y(2);
(-m*g*sin(y(3))*cos(y(3))+m*l*y(4)^2*sin(y(3))+u)/(M+(1-
cos(y(3))^2)*m);
y(4);
((M+m)*(g*sin(y(3)))-(l*m*y(4)^2*sin(y(3))+u)*cos(y(3)))/(l*(M+(1-
cos(y(3))^2)*m))];
endfunction
function u=fuerza(t)
u=1;
%f=10;
%u=sin(2*pi*f*t);
endfunction
endfunction

2. Repetir lo anterior con método de integración numérica Runge Kutta, codificado por
usted mismo. Este método debe ser genérico; o sea, una función parecida a ODE45
que permita resolver cualquier sistema multivariable y no lineal (ver _gura 2 para
representación en diagrama de bloque).

function Yn=intentoNERV()
clear
clc
yo(1)=1; % initial condition
yo(2)=0;
yo(3)=0.01;
yo(4)=0;

pvi = yo';
h = 0.05;
Yn = [pvi(1); pvi(2); pvi(3); pvi(4)];
to=0;
tf=5;
for x = to:h:tf-h
[pvi] = rk4(@(t,y)nonlinear(x,y),x,pvi,h);

Yn = [Yn(1,:) pvi(1);
Yn(2,:) pvi(2);
Yn(3,:) pvi(3);
Yn(4,:) pvi(4)];
endfor

t=to:h:tf;
Yn=Yn';

subplot(2,2,1);
plot(t,Yn(:,1))
title('x');

subplot(2,2,2);
plot(t,Yn(:,2))
title('xdot');

subplot(2,2,3);
plot(t,Yn(:,3))
title('teta');

subplot(2,2,4);
plot(t,Yn(:,4))
title('tetadot');

function temp = rk4(func,x,pvi,h)


K1 = func(x,pvi);
K2 = func(x+0.5.*h,pvi+0.5*h.*K1);
K3 = func(x+0.5.*h,pvi+0.5*h.*K2);
K4 = func(x+h,pvi+h.*K3);
temp = pvi+ h.*((K1 + 2.*K2 + 2.*K3 + K4)/6);
endfunction

function [ydot] = nonlinear(t,y)


% parameters
m=0.1;
M=2;
l=0.32;
g=9.81;
% proportional plus derivative control action
K=[-35 -34 -140 -34];
u=-K*y;
%u=1;
%u=0; % no control action
ydot=zeros(4,1);
ydot=[y(2);
(-m*g*sin(y(3))*cos(y(3))+m*l*y(4)^2*sin(y(3))+u)/(M+(1-cos(y(3))^2)*m);
y(4);
((M+m)*(g*sin(y(3)))-(l*m*y(4)^2*sin(y(3))+u)*cos(y(3)))/(l*(M+(1-
cos(y(3))^2)*m))];
endfunction

endfunction

3. Linealizar el modelo de péndulo y obtener controladores PIDs para controlar la posición del
carro y en ángulo del péndulo (ver _gura 3 para representación en diagrama de bloques).

clear
clc
M = 2;
m = 0.1;
l = 0.32;
g = 9.81;
s = tf('s');
P_pend = (-1)/(M*l*s^2-(M+m)*g)

Kp = -80;
Ki = -15;
Kd = -20;
C = pid(Kp,Ki,Kd);
T = feedback(P_pend,C);
t=0:0.01:1;
subplot(2,1,1)
impulse(T,t)
title({'Response of Pendulum Position to an Impulse Disturbance';'under PID Control: Kp = -
80, Ki = -15, Kd = -20'});

P_cart = (l*s^2-g)/(M*l*s^4 -(M + m)*g*s^2)


Kp2 = 600;
Ki2 = 20;
Kd2 = 50;
C2 = pid(Kp2,Ki2,Kd2);
T2 = feedback(P_cart,C2);

t = 0:0.01:1;
subplot(2,1,2)
impulse(T2, t);
title({'Respuesta del carro a un impulso con control PID'});

%T3 = feedback(1,P_pend*C)*feedback(1,P_cart*C2);
%t = 0:0.01:10;
%impulse(T3, t);
%title({'Response of Cart Position to an Impulse Disturbance';'under PID Control: Kp = 100,
Ki = 1, Kd = 20'});

También podría gustarte