{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"slideshow": {
"slide_type": "skip"
}
},
"outputs": [],
"source": [
"from IPython.display import IFrame"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"# Introducción al Control\n",
"\n",
"_\"como hacer plataformas moviles moverse efectiva, segura, predecible y colaborativamente usando teorias de control modernas\"_"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"# Introducción al Control\n",
"_Entender los conceptos asociados al control_"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"# Juego de Palabras\n",
"\n",
"Encontremos palabras asociadas a los siguientes terminos:\n",
"\n",
"- control\n",
"- producto\n",
"- mecatrónica\n",
"- sistema\n",
"- automático\n",
"- proceso\n",
"- realimentación\n",
"- lazo cerrado\n",
"- lazo abierto\n",
"- sensor\n",
"- actuador"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"# Ejemplos de control"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"slideshow": {
"slide_type": "-"
}
},
"outputs": [
{
"data": {
"text/html": [
"\n",
" \n",
" "
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"display(IFrame(\"https://www.youtube.com/embed/videoseries?list=PLMUWUECzl9GIKfCRF1rKLkw-deF3Y7Ppo&enablejsapi=1\",width=\"100%\",height=\"400px\"))"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"# Que es teoría de control ? \n",
"\n",
"- Sistema\n",
" : Algo que cambia en el tiempo\n",
"- Control\n",
" : Influencia el cambio\n",
" \n",
" \n",
"## Ejemplos\n",
"\n",
"- Robots\n",
"- Epidemias\n",
"- Circuitos\n",
"- Motores\n",
"- Redes eléctricas\n",
"- Pilotos automáticos"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"# Elementos básicos\n",
"\n",
"- Estado\n",
" : Representación de lo que esta haciendo el sistema actualmente.\n",
"- Dinámica\n",
" : Descripción de como evolucionan los estados.\n",
"- Referencia\n",
" : Que queremos que el sistema haga.\n",
"- Salida\n",
" : Medidas (de algunos aspectos) del sistema.\n",
"- Entrada\n",
" : Señal de control.\n",
"- Realimentación\n",
" : Mapeo entre las salidas a las entradas.\n",
" \n",
""
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"# Sobre la necesidad de un modelo\n",
"\n",
"**¿Cómo seleccionamos la señal de entrada $u$?**"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"# Objetivos a la hora de seleccionar un controlador\n",
"\n",
"- Estabilidad\n",
"- Seguimiento de la referencia\n",
"- Robustez\n",
"- Insensibilidad a las perturbaciones\n",
"- Optimalidad"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"# Modelos dinámicos\n",
"\n",
"Las estrategias efectivas de control se bazan en modelos predictivos.\n",
"\n",
"En la actualidad debemos pasar todos los modelos a modelos discretos:\n",
"\n",
"$$x_{k+1} = f\\left(x_k,u_k\\right)$$\n",
"\n",
"e.g. un reloj:\n",
"\n",
"$$x_{k+1} = x_k + 1$$"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"## Reloj en tiempo discreto\n",
"\n",
""
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"# Dinámica > cambio en el tiempo\n",
"\n",
"_Las leyes de la física todas están en tiempo continuo, en vez de pensar en el siguiente estado, tenemos derivadas con respecto al tiempo_\n",
"\n",
"Tiempo continuo:\n",
"\n",
"$$\\frac{dx}{dt}=f\\left(x,u\\right) \\qquad - \\qquad \\dot{x}=f\\left(x,u\\right)$$\n",
"\n",
"e.g. un reloj:\n",
"\n",
"$$\\dot{x} = 1$$"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"## Reloj en tiempo continuo\n",
"\n",
""
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"# De tiempo continuo a tiempo discreto\n",
"\n",
"En la implementación de un controlador todo esta discretizado, o muestreado:\n",
"\n",
"$$\\dot{x}=f\\left(x,u\\right)$$\n",
"\n",
"Con un tiempo de muestreo de $\\delta t$, tenemos\n",
"\n",
"$$x_k = x(k\\delta t) \\qquad \\to \\qquad x_{k+1}=x((k+1)\\delta t) = ??$$\n",
"\n",
"$$x(k\\delta t + \\delta t) \\approx x(k \\delta t) + \\delta t \\, \\dot{x}(k\\delta t)$$\n",
"\n",
"$$x_{k+1} = x_k + \\delta t \\, f(x_k,u_k)$$"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"# Ejemplo : Controlador de velocidad crucero\n",
"\n",
"Hagamos que un carro se mantenga a la velocidad deseada, la velocidad de referencia $r$:\n",
"\n",
"Sabemos de la segunda ley de Newton:\n",
"\n",
"$$F=m\\,a$$\n",
"\n",
"- El estado del sistema es \n",
" : la velocidad $x$\n",
"- La entrada del sistema es\n",
" : la fuerza del motor o el freno $u$ relacionado con $F=c\\,u$ con $c$ siendo un coeficiente de transmisión electro-mecánica\n",
"- La dinámica es:\n",
"\n",
"$$\\dot{x} = a \\quad\\to\\quad m\\,\\dot{x} = c \\, u \\quad\\to\\quad \\dot{x}=\\frac{c}{m}u$$"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"## Diseño de un controlador\n",
"\n",
"- Asumamos que medimos la velocidad ($y=x$)\n",
"- La señal de control debería ser entonces función de la diferencia de $r-y$ ($=e$)\n",
"\n",
"\n",
"**¿Cuales deben ser las propiedades de la señal de control?**\n",
"\n",
"- Pequeños $e$ deben dar pequeñas $u$.\n",
"- la señal $u$ no debe tener movimiento bruscos.\n",
"- la señal $u$ no debe depender de que tan bien conocemos los parámetros $c$ y $m$."
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"## Intento de controlador\n",
"\n",
"Modelo del carro:\n",
"\n",
"$$\\dot{x}=\\frac{c}{m}u$$\n",
"\n",
"queremos que $x\\to r$ cuando $t \\to \\infty$ o lo que es lo mismo $e \\to 0$ (e=r-x)\n",
"\n",
"**Intento #1 de controlador**\n",
"\n",
"$$u = \\cases{ u_{max} & si e>0\\cr\n",
" -u_{max} & si e<0\\cr\n",
" 0 & si e=0\n",
" }\n",
"$$\n",
"\n",
"[Simulador en Simulink](bang_bang.slx)"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"Con este controlador tendresmo un aceleraciones bruscas y dañaremos los actuadores."
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"# Controlador tipo P\n",
"\n",
"El **problema** del controlador anterior es que sobre reacciona a pequeños errores.\n",
"\n",
"**Intento #2 de Controlador**\n",
"\n",
"$$u=k\\,e$$\n",
"\n",
"- Pequeños errores generar pequeñas señales de control.\n",
"- Señales de control suaves.\n",
"- Es conocido como un controlador proporcional.\n",
"\n",
"[Simulador en Simulink](proporcional.slx)"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"# Estabilidad pero no seguimiento del objetivo\n",
"\n",
"**Discrepancia** : El modelo \"real\" tiene en cuenta la resistencia con el viento:\n",
"\n",
"$$\\dot{x} = \\frac{c}{m}\\,u - \\gamma\\,x$$\n",
"\n",
"Este es el modelo usado para simular el controlador. Por lo que en estado estacionario tendremos un error diferente de cero. \n",
"\n",
"Calculemos el error. "
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"# Error en estado estacionario para un control P\n",
"\n",
"Sabemos que $u=k\\,e$ y tenemos que $e = r-x$ de esto, replazando en la ecuación anterior:\n",
"\n",
"$$\\dot{x} = \\frac{c}{m}\\,k(r-x) - \\gamma\\,x = 0$$\n",
"\n",
"luego,\n",
"\n",
"$$ x = \\frac{ck}{ck+\\gamma m}r < r$$\n",
"\n",
"de aquí vemos que $x$ será diferente de $r$ a menos que $k \\to \\infty$ ($k$ tienda a infinito)"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"# Objetivo de rendimiento\n",
"\n",
"Un controlador debe: \n",
"\n",
"- Ser estable\n",
"- Seguir el objetivo\n",
"- Ser robusto\n",
"\n",
"**El model:**\n",
"\n",
"$$\\dot{x} = \\frac{c}{m}\\,u - \\gamma\\,x$$\n",
"\n",
"**Intento #3 de Controlador**\n",
"\n",
"$$u = k\\, e + \\gamma \\frac{m}{c}x$$\n",
"\n",
"entonces: \n",
"\n",
"$$\\dot{x}=0=\\frac{c}{m}k(r-x)+\\gamma\\,x-\\gamma,x \\quad\\to\\quad x=r$$\n",
"\n",
"Seguimiento... pero, tenemos que conocer todos los parámetros físicos. Algo que no es posible."
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"## Intento #4\n",
"\n",
"Controlador PI: \n",
"\n",
"$$u(t) = k_P\\, e(t)+k_I\\int_0^te(\\tau)d\\tau$$\n",
"\n",
"Controlador PID:\n",
"\n",
"$$u(t) = k_P\\, e(t)+k_I\\int_0^te(\\tau)d\\tau + k_D \\frac{de(t)}{dt}$$"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"# Control PID \n",
"\n",
"$$u(t) = k_P\\, e(t)+k_I\\int_0^te(\\tau)d\\tau + k_D \\frac{de(t)}{dt}$$\n",
"\n",
"- P : Contribuye a la estabilidad, y a la respuesta media\n",
"- I : Contribuye al seguimiento del objetivo y al rechazo de las perturbaciones. También contribure a la respuesta lenta. Puede causar oscilaciones. \n",
"- D : Contribuye a la respuesta rápida. Es sensible al ruido. \n",
"\n",
"El PID es el controlador de bajo nivel más utilizado, la estabilidad no esta garantizada. \n",
"\n",
"_La realimentación tiene una gran habilidad para ser robusta al desconocimiento de los parámetros_"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"# Controlador de velocidad cruzero\n",
"\n",
"- Modelo \n",
"\n",
"$$\\dot{x} = \\frac{c}{m}\\,u - \\gamma\\,x$$\n",
"\n",
"- Parámetros\n",
"\n",
"$$c=1\\quad m=1\\quad \\gamma =0.1\\quad r=1$$"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"# Implementación de una derivada\n",
"\n",
"Cómo podemos implementar la derivada de manera discreta (tiempo de muestreo $\\Delta t$): \n",
"\n",
"$$\\dot{e}=\\frac{e_{nuevo}-e_{viejo}}{\\Delta t}$$"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"# Implementación de una integral\n",
"\n",
"Cómo podemos implementar la integral de manera discreta (tiempo de muestreo $\\Delta t$): \n",
"\n",
"$$\\int_0^t e(\\tau) d\\tau \\approx \\sum_{k=0}^N e(k\\Delta t)\\Delta t = \\Delta t E$$\n",
"\n",
"luego,\n",
"\n",
"$$\\Delta t E_{new} = \\Delta t \\sum_{k=0}^{N+1} e(k\\Delta t) = \\Delta t e((N+1)\\Delta t) + \\Delta t E_{old}$$\n",
"\n",
"en otras palabras,\n",
"\n",
"$$E_{new}=E_{old} + e$$"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"# Implementación \n",
"\n",
"Cada vez que el controlador es llamado:\n",
"\n",
"```matlab\n",
"read e;\n",
"e_dot = e - old_e;\n",
"E = E + e;\n",
"u = kP*e + kD*e_dot + kI*E;\n",
"old_e = e;\n",
"```\n",
"\n",
"**Nota:** Los coeficientes del controlador deben incluir el tiempo de muestreo. "
]
}
],
"metadata": {
"celltoolbar": "Slideshow",
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.11.0"
},
"short": "Introducción",
"title": "Introducción al curso",
"week": 1
},
"nbformat": 4,
"nbformat_minor": 2
}