cybertech 2018 - reset.etsii.upm.es · - sensores de línea (cny70 o qtr) con 8 sensores cada...

19
CYBERTECH 2018 TALLER 5: CONTROL Departamento de Automática, Ingeniería Electrónica e Informática Industrial #CYBERTECH2018

Upload: votruc

Post on 04-Oct-2018

215 views

Category:

Documents


0 download

TRANSCRIPT

CYBERTECH 2018TALLER 5:CONTROL

Departamento de Automática, Ingeniería Electrónica e Informática Industrial

#CYBERTECH2018

INTRODUCCIÓN ¿Cómo le digo a mi robot no se choque contra las paredes

en el laberinto?

¿Cómo como convencerle de que la línea negra es lo que quiere seguir?

La lógica de control es lo nos ayuda a relacionar las lecturas

de los sensores con la tensión que aplicamos a los motores

REFERENCI¿Qué quiero?REFERENCIA REGULADOR

Una función como int regulador(int err)

SISTEMA Nuestro Robot

SALIDA Lo que el robot hace

PERTURBACIÓN Cosas que no podemos controlar nosotros

SENSORES Medimos donde estamos

¿Qué posición queremos?Estar centrados en la línea O en el laberinto

ERROR = REF - SENSOR Queremos que sea 0 o lo más pequeño posible.

La línea va cambiando dePosición y forma. Las paredes

del laberinto se acaban o cambian...

¿Después de todo esto qué pasa? Nuestro objetivo es que sea igual a la referencia la salida

HAZME CASO ROBOT ESTÚPIDO

Cálculo del error Laberinto

Un sensor (a la derecha):

Posición deseada d0 (la mitad)

Distancia del robot a la pared derecha D medida con el sensor.

e > 0, robot en la derecha. Girar a la izquierda.

e > 0, robot en la izquierda. Girar a la derecha.

Si e = 0, robot centrado.Seguir recto.

e = d0 - D

Cálculo del error Laberinto

Con dos sensores:

La distancia del robot a la pared derecha es D y a la izquierda I.

e > 0, robot en la derecha. Girar a la izquierda.

e > 0, robot en la izquierda. Girar a la derecha.

Si e = 0, robot centrado.Seguir recto. e = (I – D) / 2

Es recomendable usar dos sensores en vez de uno, a parte de queno necesitáis conocer d

0, podréis hacer un control más fino.

Cálculo del error Sigue-líneas

03

00 1 2 4 5 6 7- Sensores de línea (CNY70 o QTR) con 8 sensores

Cada sensor tendrá una lectura, 0 si no hay línea y otro valor que significa que está justo encima de la línea.

Enumeramos a los sensores de la figura, una forma de calcular la “posición” de nuestro robot es:

Cálculo del error Sigue-líneas

03

00 1 2 4 5 6 7

Por ejemplo, si el sensor 2 esta en el centro de la línea, la expresión da 2000.

Si queremos que nuestro robotillo esté centrado en la línea, la expresión debe marcar 3500 en ese caso, entre el sensor 3 y 4.

- El error entonces es e = 3500 - pos

De esta forma funciona la librería de sensores QTR de Pololu, también vale perfectamente con unarray de sensores CNY70 soldado por vosotros. Podéis usar dos o más sensores, pero mejor usar como poco 5.

Medios de locomoción- El robot básico que los equipos han hecho encybertech año tras año ha sido el robot diferencial. - Omnirueda y mecanum wheel

- Los diferenciales son mejores en siguelíneas.

- Los omnirueda son mejores en el laberinto, pero su movimiento es complejo.

-Explicaremos una forma básica de mover aun robot diferencial.

- Por ejemplo, aplicaremos las siguiente tensiones a cada motor, si es positiva la rueda girará hacia delante si es negativo hacia atrás.u

IZQ = u

NOMINAL + regulador(error)

uDER

= uNOMINAL

– regulador(error)

- Si regulador(error) es cero, moveriamos los dos motores a la vez con uNOMINAL

- Si regulador(error) es positivo nos desplazariamos a la derecha- Si regulador(error) es negativo nos desplazariamos a la izquierda

r = 0 r > 0 r < 0

nNOM

nNOM

nNOM

-r

nNOM

+r nNOM

+r

nNOM

-r

Robot diferencial

Regulador TODO o NADA

Este regulador es el más simple:

-Si la línea queda a la derecha, debemos girar a la izquierda

-Si la línea queda a la izquierda, girar a la derecha.

-Si estamos centrados, no hacer nada.

int regulador(int error) {if (error > 0) {

return 1;} else if (error < 0) {

return -1;}return 0;

}

Regulador TODO o NADA

VENTAJAS

- Muy fácil de programar

INCONVENIENTES

- Bajas velocidades y muchas oscilaciones de un lado a otro.

- No distingue entre errores grandes y pequeños

- Al cambiar de sentido los motores una y otra vez de forma brusca, se consume mucha energía.

Regulador P Proporcional

- El regulador simplemente multiplica el error por una constante Kp

- De esta forma distinguimos si estamos cerca o lejos de la referencia, en cuanto más lejos más agresiva es la respuesta.

- Depende de el valor de esta constante irá mejor o peor el regulador.Si es muy bajo, tardará mucho en seguir la línea y se saldráSi es muy alto, oscilará de un lado a otro de forma muy parecida al todo o nadaSi es un valor intermedio seguirá la línea bastante rápido y sin oscilar demasiado

double Kp = 5;int regulador(int error) {

return Kp*error;}

Regulador P Proporcional

VENTAJAS

- Sencillo de programar, única dificultad es encontrar la Kp ideal

- Distingue si estamos cerca o lejos de la línea, en cuanto más lejos nos encontremos más agresiva será la respuesta para

volver a la línea- Para la mayoria de robots diferenciales es suficiente este

regulador

INCONVENIENTES

- Tiende a oscilar bastante si no se ajusta correctamente la Kp

- Para muchas otras cosas este regulador no es suficiente y necesitamos refinar el control

Regulador PD Proporcional+Derivativo

- El regulador añade al regulador Proporcional un término que depende de como ha variado el error de un momento, al anterior y lo multiplica por una constante K

d

- El valor de Kd suele ser menor que el de K

p.

double Kp = 5;double Kd = 0.1; int errorAnterior = 0; //Esta variable es auxiliarint regulador(int error) {

int respuesta = Kp*error + Kd*(error-errorAnterior); //La parte propocional + la derivativaerrorAnterior = error; //Guardamos el error de este momento para usarlo la proxima vezreturn respuesta;

}

Regulador PD Proporcional+Derivativo

VENTAJAS

- La línea se sigue más rápido y con menos oscilaciones- En las curvas la línea se sigue mucho mejor, al predecirlas.

- Este regulador aún siendo sencillo te permite alcanzaraltas velocidades

INCONVENIENTES

- Tiende a oscilar bastante si no se ajusta correctamente la Kd

- Son dos parámetros a ajustar y ya en vez de haber una combinación óptima puede haber varias buenas.

- Muy sensible a los cambios bruscos del error, (cuidado en los ángulos rectos)

Regulador PID

- Añadimos al regulador anterior una término que depende de los errores acumulados en los instantes anteriores y los multiplica por una K

i. También existe el regulador PI

(sin derivativo).

- Dependiendo del sistema se usa un valor grande o pequeño de Ki, para cybertech es

recomendable usar valores muy bajos para que no se desmadre. Los errores se van sumando cada muy poco tiempo y acaba siendo muy grande el valor.

double Kp = 5;double Ki = 0.005;double Kd = 0.1; int errorAnterior = 0; //Esta variable es auxiliarlong int suma = 0; //Aqui sumaremos los errores cada vez que usemos el reguladorint regulador(int error) {

int respuesta = Kp*error + Ki*suma + Kd*(error-errorAnterior); //Parte propocional + integral + derivativaerrorAnterior = error; //Guardamos el error de este momento para usarlo la proxima vezsuma = suma + error; //Sumamos el error de este instante a la variable sumareturn respuesta;

}

Regulador PID

VENTAJAS

- Con este regulador puedes alcanzar las más altas velocidadesaunque la diferencia con el PD es sutil

- Tiene en cuenta los errores pasados, en las líneas rectas funciona mejor que el PD.

-Anula perturbaciones y errores en régimen permanente (Esto para cybertech no es necesario)

INCONVENIENTES

- Muy complejo de ajustar, la derivativa y la integral se contrarrestran.

- La parte integral se puede saturar, al sumar una y otra vez puede llegar al punto al que se desestabilice y el robot se queda dando

vueltas como un tonto, sin posibilidad de volver a la línea.

Regulador PID- Las constantes Ki y Kd, planteadas de la forma anterior cambian dependiendo de cada cuanto ejecutamos el regulador. - Si estamos cambiando constantemente esta frecuencia o metiendo acciones adicionales que no tarden siempre lo mismo, sería bueno que estas constantes se adapten.

long int t = millis(); //Con millis(), obtenemos en ms el tiempo que lleva el arduino encendidodouble Kp = 5;double Ki = 0.005;double Kd = 0.1; int errorAnterior = 0; //Esta variable es auxiliarlong int suma = 0; //Aqui sumaremos los errores cada vez que usemos el reguladorint regulador(int error) {

long int dt = millis() - t; //Calculamos el tiempo que ha pasado desde la última vez que ejecutamos esto.suma = suma + error * dt; //Multiplicamos por dt el error para tener en cuenta cuanto dura cada cicloint respuesta = Kp*error + Ki*suma + Kd / dt *(error-errorAnterior) ; //Parte propocional + integral + derivativaerrorAnterior = error; //Guardamos el error de este momento para usarlo la proxima vezt = millis(); //Guardamos el tiempo actual para usar la próxima vezreturn respuesta;

}

FIIIIINNNN!!! :D