{ "cells": [ { "cell_type": "code", "execution_count": 2, "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": 3, "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", "![elementos básicos](basico.png)" ] }, { "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", "![representación](reloj-discreto.png)" ] }, { "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", "![grafico reloj continuo](reloj-continuo.png)" ] }, { "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.9.8" } }, "nbformat": 4, "nbformat_minor": 2 }