Está en la página 1de 31

Un controlador PID para robots Lego Mindstorms

Un controlador PID es una tcnica comn utilizada para controlar una amplia variedad de maquinaria, incluyendo vehculos, robots e incluso cohetes. La descripcin
matemtica completa de un controlador PID es bastante compleja pero una comprensin mucho ms simple es realmente todo lo que se necesita para usar un PID de
manera efectiva.

Este documento es una descripcin de cmo crear un controlador PID para su uso con Lego Mindstorms Robots utilizando el lenguaje de programacin NXT-G.

Ser ms fcil si tenemos una tarea real en mente, as que voy a describir cmo crear un PID para hacer la siguiente lnea. Una vez creado, se puede utilizar el mismo
PID, con slo pequeas modificaciones, con cualquier otra aplicacin de Mindstorms, como conseguir un robot que pueda conducir lo ms recto posible, o incluso para un
robot que pueda balancearse con nada ms que 2 ruedas tocando el suelo como Un Segway.

Un PID es realmente bastante sencillo y la descripcin tpica de un PID es fcil de entender por cualquier persona que haya tenido Clculo. Este documento est dirigido
a los nios de First Lego League en tercer y octavo grado. Puesto que no hay muchos nios que han tenido Clculo intentar construir el concepto entero desde un punto

de partida muy simple sin usar ningn Clculo.


As que vamos a empezar con la disposicin bsica de un robot que sera adecuado para la lnea siguiente. A la derecha est un dibujo simplificado de una vista superior
del robot con todos los detalles que necesitamos. El robot es un robot de direccin diferencial con dos motores, cada uno conectado a una de las ruedas A y C. El robot
tiene un sensor de luz montado en la parte delantera que apunta hacia abajo para que no vea nada ms que la alfombra (suelo, , Sea cual sea el robot). El crculo rojo
representa el punto bastante pequeo en la estera que el sensor de luz puede realmente "ver". El resto del robot es el rectngulo grande con una flecha, la flecha muestra
la direccin normal de viaje.

Nuestro objetivo es conseguir que el robot siga la lnea de grasa negra. La siguiente lnea es un comportamiento robtico bsico y es a menudo una de las primeras cosas
que la gente aprende. Un dispositivo mvil que puede seguir una lnea muestra todas las caractersticas de un verdadero robot. Utiliza sensor para recopilar informacin
sobre el mundo que la rodea y cambia su comportamiento dependiendo de esa informacin.

Los seguidores de lnea pueden ser construidos con un sensor de luz, o dos, o una docena o cualquier cantidad que tenga. En general, cuanto ms sensores de luz tenga,
mejor podr seguir una lnea. Aqu nos limitaremos a un nico sensor de luz Mindstorms.Incluso con un solo sensor deberamos ser capaces de construir un robot que
pueda rastrear la lnea muy precisamente incluso si la lnea tiene curvas en ella. Lo que suele soltar con un solo sensor es la capacidad de seguir la lnea mientras se
mueve rpido. A menudo, cuanto ms sensores tenga, ms rpido podr moverse el robot mientras sigue la lnea.

El primer truco que usaremos, que no est relacionado con un PID, es que no trataremos de seguir la lnea. En su lugar, trataremos de seguir el borde de la lnea. Por
qu?Porque si seguimos la lnea en s (el negro) entonces cuando el robot sale de la lnea y el sensor "ve blanco" no sabemos en qu lado de la lnea estamos. Estamos
a la izquierda oa la derecha de la lnea? Si seguimos el borde de la lnea entonces podemos decir de qu manera estamos fuera del borde cuando el robot se desva de
la lnea. Si el sensor de luz "ve blanco" entonces sabemos que est a la izquierda del borde de la lnea (y la lnea). Si "ve negro" entonces sabemos que est a la derecha
del borde de la lnea (y en la lnea). Esto se denomina " seguidor de la lnea izquierda " ya que est siguiendo el borde izquierdo de la lnea.

Necesitamos saber qu valores devuelve el sensor de luz cuando "ve blanco" y cuando "ve negro". Un sensor no calibrado tpico podra dar una lectura "blanca" de 50 y
una lectura "negra" de 40 (no calibrada, en una escala de 0 a 100). Es conveniente dibujar los valores en una lnea numrica simple para ayudar a visualizar
cmo convertimos los valores del sensor de luz en cambios en el movimiento del robot. Debajo estn nuestros valores ligeros confeccionados para blanco y negro.
Simplemente dividiremos el rango en dos partes iguales y diremos que si el nivel de luz es menor de 45, queremos que el robot gire a la izquierda. Si es mayor de 45
queremos girar a la derecha. No voy a entrar en cmo exactamente las vueltas deben hacerse. Slo dir que las vueltas suaves funcionan bien para una lnea bastante
recta. Una lnea con un montn de curvas por lo general tiene que estar haciendo vueltas ms agudas. Para giros suaves puede utilizar niveles de potencia del 50% en la
rueda rpida y el 20% en la rueda lenta. Para giros ms agudos en una lnea curvy usted puede ser que necesite utilizar la energa del 30% para la rueda rpida y la costa
o frena la rueda lenta.Independientemente de los niveles de potencia que utilice, los nmeros sern los mismos para los dos turnos, simplemente cambie el motor que
obtiene el nmero grande y el que obtiene el nmero ms pequeo (o un comando de parada).

Este tipo de seguidor de lnea seguir una lnea pero no es muy bonita. Se ve bien en una lnea recta con los motores programados para giros suaves. Pero si la lnea
tiene curvas, entonces le dir al robot que use giros ms cortos para seguir la lnea. Eso hace que el robot se mueva de un lado a otro de la lnea. El robot slo "sabe"
cmo hacer dos cosas;Gire a la izquierda y gire a la derecha. Este enfoque se puede hacer para trabajar, pero no es muy rpido o preciso y se ve terrible.

En el acercamiento anterior el robot nunca conduce derecho , aunque sea perfectamenteAlineado con el borde de la lnea y la lnea es recta. Eso no parece muy eficiente
no?
Vamos a intentar arreglar eso. En lugar de dividir nuestra lnea de nmero de valor de luz en dos regiones, divdela en tres.

As que ahora si el nivel de luz es menor de 43 queremos que el robot gire a la izquierda.Si el valor de la luz est entre 44 y 47 queremos que siga derecho (zoom de
zoom). Si el nivel de luz es mayor que 47, queremos girar a la derecha. Esto se puede implementar fcilmente en Mindstorms NXT-G con un conmutador (s / no) dentro
de un conmutador.En realidad slo tiene que hacer dos pruebas no tres.

Este enfoque funciona mejor que el primero. Por lo menos ahora el robot se mueve a veces hacia adelante. Al igual que con el primer enfoque que todava tiene que
decidir qu tipo de giros que necesita y que por lo general depende de las caractersticas de la lnea que est siguiendo. El robot probablemente seguir buscando una
buena cantidad.

El lector astuto probablemente habr pensado " bien si tres rangos de luz son mejores que dos, qu hay de agregar an ms? " Ese es el comienzo de un PID.

El "P" en "PID": Proporcin (al) es la clave

Entonces, qu pasar si agregamos ms divisiones a nuestra lnea de escala de luz?Bueno, lo primero que tenemos que tratar es lo que significa "turn" con ms de tres
rangos de luz? En nuestro primer acercamiento el robot podra hacer slo dos cosas, girar a la izquierda oa la derecha. Las vueltas eran siempre iguales en direcciones
opuestas. En el segundo enfoque aadimos el "ir directamente" a los dos turnos. Si tenemos ms de tres rangos entonces necesitamos ms "tipos" de giros.

Para ayudar a entender "ms tipos de giros" vamos a rehacer o numerar un poco la lnea y convertirlo en un grfico. Nuestro eje X (horizontal) ser nuestros valores de
luz igual que en las lneas numricas. El eje Y (vertical) bien ser nuestro "turn" del eje.
A la izquierda est nuestra disposicin original de dos niveles expresada en un grfico. El robot slo puede hacer dos cosas (mostradas por las lneas azules), girar a la
derecha oa la izquierda y las curvas son siempre las mismas, excepto su direccin. En el centro est el seguidor de tres niveles. La gama central agregada es donde el
robot conduce recto (Turn = 0). Las vueltas son las mismas que antes. A la derecha hay un seguidor de lnea Proporcional . En un seguidor de lnea proporcional el giro
vara suavemente entre dos lmites. Si la lectura del sensor de luz dice que estamos cerca de la lnea, entonces hacemos un pequeo giro. Si estamos lejos de la lnea
entonces hacemos un gran giro. Proporcional es un concepto importante. Proporcional significa que hay una relacin lineal entre dos variables. Para ponerlo an ms
simple, los medios proporcionales un grfico de las variables uno contra el otro producen una lnea recta (como en el grfico de la mano derecha arriba).

Como usted puede saber, la ecuacin de una lnea recta es:

Y = mx + b
Donde y es la distancia hacia arriba (o hacia abajo) del eje Y, x la distancia en el eje X, m es la pendiente de la lnea y b es la interseccin Y, el punto donde la lnea cruza
el eje Y cuando x Es cero. La pendiente de la lnea se define como el cambio en el valor de y dividido por el cambio en el valor de x usando cualquier par de puntos en la
lnea.

Si no sabes mucho acerca de las lneas (o has olvidado lo que una vez nuevo) voy a ampliar un poco y hacer algunas simplificaciones a nuestro grfico y la
ecuacin. Primero, cambiaremos el centro de nuestra lnea de nmero de luz (el eje X) a cero. Eso es fcil de hacer. Para nuestro rango de valores de luz de 40 y 50 slo
restamos 45 (que es el promedio de 40 y 50, (40 + 50) / 2) de todas nuestras lecturas de luz. Llamaremos a ese resultado el error . Por lo tanto, si el valor de la luz es 47
restar 45 y obtener un error = 2.El error nos dice cun lejos del borde de la lnea estamos. Si el sensor de luz est exactamente en el borde de la lnea, nuestro error es
cero, ya que el valor de luz es 45 y restamos 45 de todas nuestras lecturas. Si el sensor est en el blanco, nuestro error es +5. Todo el camino en el negro el error es -
5.
En el grfico anterior he desplazado el eje convirtindolo en una escala de error. Puesto que la lnea ahora cruza el eje Y en cero que significa que b es es cero y la
ecuacin para la lnea es un pedacito ms simple;

Y = mx

O usando nuestras etiquetas

Turn = m * error

An no hemos definido lo que significa el eje de giro, por lo que ahora solo diremos que las vueltas van desde -1 (giro fuerte a la izquierda) a +1 (giro fuerte a la derecha)
y un giro cero significa que vamos derecho . La pendiente de la lnea en el grfico anterior se puede calcular usando los dos puntos marcados en rojo (cualquier dos puntos
en la lnea funcionar);

Pendiente = m = (cambio en y) / (cambio en x) = (1- (-1)) / (-5 - 5) = 2 / -10 = -0,2

La pendiente es una constante de proporcionalidad y es el factor que tiene que multiplicar el error (x valor) por para convertirlo en un giro (valor y). Eso es algo
importante para recordar.

La "pendiente" tiene un par de nombres que significan la misma cosa, al menos en este contexto. En la literatura PID, las pendientes (constantes de proporcionalidad, m
en la ecuacin de una recta) se llaman " K " (por error ortogrfico de la palabra " c onstant"?).Varios K s aparecen en toda la literatura PID y son muy importantes. Se
puede pensar en un K (o m o pendiente o constante de proporcionalidad) como un factor de conversin .Usas K para convertir un nmero que significa una cosa (valores
de luz o error en nuestro caso) en algo ms como un giro. Eso es todo lo que hace un K. Muy simple y muy potente.

As que con estos nuevos nombres para nuestras variables la ecuacin de la lnea es;

Turno = K * ( error )

En palabras que "tome el error y multiplquelo por la constante de proporcionalidad K para obtener el turno necesario El valor Turn es la salida de nuestro controlador P
y se llama El trmino " P " ya que ste es slo un controlador proporcional.
Es posible que haya notado que en la ltima grfica la lnea no se extiende fuera del intervalo de error de -5 a +5. Fuera de la gama de -5 a +5 no podemos decir hasta
qu punto el sensor est de la lnea. Todos los "blancos" se ven iguales una vez que el sensor no puede ver ningn negro en absoluto. Recuerde que este rango es
arbitrario, su alcance ser determinado por la configuracin del sensor de luz, los colores de la alfombra, etc. Una vez que el sensor de luz se aleje demasiado del borde
de la lnea empieza a dar una lectura constante, esto significa que la lectura del sensor de luz Ya no es proporcional al error . Slo podemos juzgar hasta qu punto el
sensor es desde el borde de la lnea cuando el sensor es realmente muy cerca de l. Sobre ese rango estrecho, la lectura del sensor de luz es proporcional a la
distancia. Por lo tanto, nuestra configuracin de sensores tiene un rango limitado sobre el cual proporciona informacin proporcional. Fuera de ese rango nos dice la
direccin correcta, pero la magnitud (tamao) es incorrecta. La lectura del sensor de luz, o el error , es menor de lo que debera ser y no da una idea tan buena de lo que
debera ser el turno para corregir el error .

En la literatura PID, el rango sobre el cual el sensor da una respuesta proporcional se denomina " rango proporcional " (vea la figura: D). La gama proporcional es otro
concepto muy importante en los PID. En nuestro seguidor de lnea el rango proporcional para el sensor de luz es de 40 a 50, para el error es -5 a +5. Nuestros motores
tambin tienen un rango proporcional, desde -100 (potencia total hacia atrs) hasta +100 (potencia mxima adelante). Voy a decir un par de cosas sobre la importancia
de la gama proporcional:

(1) Usted desea que el rango proporcional sea lo ms amplio posible. La gama proporcional de nuestro sensor de luz es bastante pequea, es decir, el sensor tiene que
estar bastante cerca del borde de la lnea para obtener informacin proporcional. Exactamente lo amplio que es el rango depende en gran medida de la altura de los
sensores est por encima de la alfombra. Si el sensor est muy cerca de la estera, digamos 1/16 de pulgada, entonces el sensor est viendo un crculo muy pequeo en
la estera. Un pequeo lado a lado movimiento del sensor de luz oscilar el error de -5 a +5, que es todo el camino a travs de nuestra gama proporcional. Usted podra
decir que el sensor tiene "visin de tnel", ya que slo puede ver una parte muy pequea de la estera.El sensor tiene que estar muy cerca del borde de la lnea para
obtener una lectura que no sea "blanca" o "negra". Si el sensor se mueve ms arriba de la estera entonces ve un crculo ms grande en la estera. A una altura de
aproximadamente 1/2 pulgada el sensor de luz parece estar mirando un crculo en la estera que es aproximadamente 1/2 pulgada a travs. Con el sensor encima de este
alto, el rango proporcional es mucho ms amplio, ya que el sensor de luz slo necesita permanecer dentro de +/- 1/2 pulgada del borde de la lnea para mantener una
salida proporcional. Por desgracia, hay dos inconvenientes para un sensor de luz de alta. En primer lugar, un sensor de luz de alta "ve", y responde a, las luces de la
habitacin mucho ms que un sensor de baja. Un sensor alto tambin tiene menos diferencia entre blanco y negro que un sensor bajo. A una distancia suficientemente
grande blanco y negro dar la misma lectura.
(2) Fuera del rango proporcional, el controlador mover las cosas en la direccin correcta, pero tender a ser correcto. La respuesta proporcional del controlador est
limitada por el rango proporcional.

De P a los niveles reales de potencia del motor

Cmo podemos implementar las curvas? Cules deberan ser los niveles reales de potencia del motor? Una forma de hacer las curvas es definir un "nivel de nivel de
objetivo", que llamar " Tp ". Tp es el nivel de potencia de ambos motores cuando se supone que el robot va derecho, lo que hace cuando el error = 0 . Cuando el error no
es cero usamos la ecuacin Turn = K * ( error ) para calcular cmo cambiar los niveles de potencia de los dos motores. Un motor obtendr un nivel de potencia
de Tp + Turn , el otro motor obtendr un nivel de potencia de Tp-Turn . Tenga en cuenta que dado que nuestro error es de -5 a +5, significa que Turn puede ser positivo
o negativo, lo que corresponde a giros en direcciones opuestas. Resulta que eso es exactamente lo que queremos, ya que automticamente establecer el motor correcto
como el motor rpido y el otro como el motor lento. Un motor (supongamos que es el motor a la izquierda del robot conectado al puerto A) siempre obtendr el valor
de Tp + Turn como su nivel de potencia. El otro motor (lado derecho del robot, puerto C) obtendr siempre Tp - Girecomo es el nivel de potencia. Si el error es positivo
entonces Turn es positivo y Tp + Turn es mayor que Tp y el motor izquierdo se acelera mientras el motor derecho se ralentiza. Si el error cambia de signo y se vuelve
negativo (lo que significa que hemos cruzado el borde de la lnea y estamos "viendo negro") entonces Tp + Turn es ahora menor que Tp y el motor izquierdo se ralentiza
y el motor derecho se acelera desde Tp-Turn es Mayor que Tp. (Recuerde que el negativo de un negativo es positivo). Simple eh? Esperemos que sea un poco ms claro
a medida que avanzamos.

Pseudocdigo para un controlador P

Primero necesitamos medir los valores que el sensor de luz regresa para blanco y negro.A partir de esos dos nmeros podemos calcular el desplazamiento , es decir,
cunto restar de una lectura de luz cruda para convertirla a un valor de error . El desplazamiento es slo el promedio de las lecturas en blanco y negro. Por simplicidad,
supongo que el offset ya ha sido medido y almacenado en una variable llamada offset .(Una buena actualizacin sera hacer que el robot mida los niveles blanco y negro
y calcule el offset ).

Tambin necesitaremos una ubicacin de almacenamiento para la constante K , lo llamaremos Kp (la K onstant para el controlador p roporcional). Y, una idea inicial de
lo que debera ser Kp . Hay muchas maneras de obtener ese primer valor de Kp . Usted puede adivinar y luego refinar por ensayo y error. O bien, puede intentar estimar
un valor basado en las caractersticas del sensor y del robot. Haremos lo ltimo. Utilizaremos un Tp (potencia objetivo) de 50, cuando el error sea cero, ambos motores
funcionarn a nivel de potencia 50. El error oscila entre -5 y +5. Adivinaremos que queremos que el poder pase de 50 a 0 cuando el error va de 0 a -5. Eso significa que
el Kp (la pendiente recuerda, el cambio en y dividido por el cambio en x) es;

Kp = (0 - 50) / (- 5 - 0) = 10.

Usaremos el valor Kp = 10 para convertir un valor de error en un valor de giro . En palabras nuestra conversin es "por cada cambio de 1 unidad en el error vamos a
aumentar la potencia de un motor por 10". El poder del otro motor se reduce en 10.

Por lo tanto, en pseudo-cdigo ("pseudo-cdigo" significa que este no es el NXT-G real, o cualquier otro tipo de cdigo de programa, en cambio es slo una lista detallada
de lo que queremos que el programa haga):

Kp = 10! Inicializar nuestras tres variables


Offset = 45
Tp = 50
Lazo para siempre
LightValue = lee el sensor de luz! Cul es la lectura de luz actual?
Error = LightValue - offset! Calcular el error restando el desplazamiento
Turn = Kp * error! El "trmino P", cunto queremos cambiar el poder de los motores
PowerA = Tp + Turn! El nivel de potencia para el motor A
PowerC = Tp - Turn! A su vez! El nivel de potencia para el motor C
MOTOR A direccin = potencia delantera = potenciaA! Emita el comando con el nuevo nivel de potencia en un bloque MOTOR
MOTOR C direccin = potencia hacia adelante = potenciaC! Mismo para el otro motor pero utilizando el otro nivel de
potencia
End loop para siempre! Hecho con este lazo, vuelve al principio y hgalo otra vez
Eso es todo, bien casi. Hay un problema sutil que debe corregirse. Pero intentarlo de todos modos. Si su robot parece evitar el borde de la lnea, en lugar de intentar
encontrarlo, la causa ms probable es que haya cambiado las direcciones de giro.Cambiar Kp a -10 y ver qu pasa. Si eso fija las direcciones de la vuelta entonces cambia
Kp de nuevo a +10 y cambia los signos en las dos lneas elctricas;

PowerA = Tp - Turn
PowerC = Tp + Turn

Hay dos "parmetros sintonizables" y una constante en este controlador P. La constante es el valor de compensacin (la media de las lecturas del sensor de luz blanca
y negra).Necesitar escribir un programa corto para medir los niveles de luz en su alfombra con su robot. Necesita un valor "negro" y un valor "blanco". Calcule el promedio
y pngalo en el programa del controlador P en la variable offset . Casi todos los seguidores de lnea requieren que usted (o cdigo escrito por usted y ejecutado por el
robot) haga este paso.

El valor Kp y la potencia objetivo Tp son los parmetros sintonizables. Un parmetro sintonizable tiene que ser determinado por ensayo y error. Kp controla la velocidad
con la que el controlador intentar volver al borde de la lnea cuando se haya alejado de l. Tpcontrola la velocidad con que el robot se mueve a lo largo de la lnea.

Si la lnea es bastante recta puedes usar un Tp grande para que el robot funcione a alta velocidad y un Kp pequeo para que los giros (correcciones) sean suaves.

Si la lnea tiene curvas, especialmente las acentuadas, habr un valor mximo de Tp que funcionar. Si Tp es mayor que ese mximo no importar lo que sea Kp , el
robot perder la lnea cuando encuentre una curva porque se mueve demasiado rpido. Si Tp es realmente pequeo entonces casi cualquier valor de Kp funcionar ya
que el robot se mover muy lentamente. El objetivo es conseguir que el robot se mueva lo ms rpido posible mientras sigue siendo capaz de seguir la lnea de inters.

Tenamos guesstimated un valor inicial para Kp de 10. Para Tp puede empezar a incluso menor de lo sugerido anteriormente, tal vez 15 (el robot se mover muy
lento). Prubalo y comprueba cmo funciona. Si pierde la lnea porque el robot parece girar lentamente, aumente Kp por un par e intente de nuevo. Si pierdes la lnea
porque el robot parece hiperactivo en la bsqueda de ida y vuelta para la lnea, entonces disminuye Kp . Si el robot parece seguir la lnea bastante bien, a continuacin,
aumentar Tp y ver si puede seguir la lnea a la velocidad ms rpida. Para cada nuevo Tp necesitars determinar un nuevo Kp , aunque Kp normalmente no cambiar
demasiado.
Siguiendo una lnea recta suele ser bastante fcil. Seguir una lnea con curvas suaves es un poco ms difcil. Seguir una lnea con curvas agudas es lo ms difcil. Si el
robot se mueve lo suficientemente lento, entonces casi cualquier lnea se puede seguir, incluso con un controlador muy bsico. Queremos conseguir la buena lnea que
sigue, la buena velocidad y la capacidad de manejar esquinas suaves. (Las lneas con esquinas filosas suelen tener seguidores de lnea ms especializados o velocidades
de robot muy bajas).

Es probable que el mejor controlador P sea diferente para cada tipo de lnea (ancho de lnea, nitidez de curvas, etc.) y para diferentes robots. En otras palabras, un
controlador P (o un controlador PID para ese asunto) est ajustado para un tipo particular de lnea y robot y no necesariamente funcionar bien para otras lneas o robots. El
cdigo funcionar para muchos robots (y muchas tareas), pero los parmetros, Kp , Tp y offset , tienen que ser ajustados para cada robot y cada aplicacin.

Hacer matemticas en una computadora que no sabe qu


El punto decimal causa algunos problemas

NOTA: Este trabajo se realiz utilizando NXT-G versin 1.1 que slo admite nmeros enteros. La versin 2 de NXT-G admite nmeros de coma flotante, por lo que puede
que no sea necesario si tiene la versin 2 o posterior.

En el proceso de afinacin del controlador P usted estar ajustando el valor de Kp hacia arriba y hacia abajo. El rango esperado de valores que Kp podra ser depende
de exactamente lo que est haciendo el controlador P. Qu tan grande es el rango de entrada y cun grande es el rango de salida? Para nuestro controlador de lnea P
seguidor el rango de entrada es de aproximadamente 5 unidades de luz, y el rango de salida es de 100 unidades de potencia, por lo que parece probable que Kp ser en
la vecindad de 100/5 = 20. En algunos casos el Kp esperado no ser tan grande. Qu sucede si el Kp esperado es uno? Dado que las variables en NXT-G estn limitadas
a nmeros enteros, al intentar ajustar el valor de Kp todo lo que puede probar es ...- 2, -1, 0, 1, 2, 3, .... No puedes ingresar 1.3 por lo que no puedes probar Kp = 1.3. No
puedes usar ningn nmero con un punto decimal! Pero probablemente habr una gran diferencia en el comportamiento del robot cuando cambie el Kp por el cambio ms
pequeo posible de 1 a 2. Con Kp = 2, el robot intenta dos veces ms para corregir el error en comparacin con Kp = 1. El nivel de potencia del motor cambia dos veces
ms para el mismo cambio en los niveles de luz. Realmente nos gustara tener un control ms fino de Kp .

Es bastante fcil solucionar este problema. Todo lo que haremos es multiplicar el Kp por una potencia de diez para aumentar el rango utilizable dentro de la restriccin
entera. Si se espera que Kp est cerca de 1 entonces un valor de 100 como multiplicador sera una buena apuesta. De hecho, es probablemente mejor seguir adelante y
utilizar siempre 100 * Kp como el nmero que realmente entrar en el programa. Una vez que Kp se ha multiplicado por 100 ahora podemos entrar en lo que habra sido
1.3 como 130. 130 no tiene punto decimal, por lo que NXT-G est contento con el nmero.

Pero, no es eso el clculo de la basura? S lo hace, pero es fcil de arreglar. Una vez que hemos calculado el trmino P dividiremos por 100 para eliminar nuestro
multiplicador.Recuerde nuestra ecuacin que define el controlador P desde antes;

Turn = Kp * ( error )

Vamos a multiplicar Kp por 100, lo que significa que nuestra vuelta calculada es 100 veces mayor de lo que debera ser. Antes de usar Turn , debemos dividirlo por 100
para arreglarlo.

Por lo tanto, nuestro pseudo-cdigo nuevo y mejorado para una lnea que sigue al controlador P es:

Kp = 1000 ! RECUERDE que estamos usando Kp * 100 as que esto es realmente 10!
Offset = 45! Inicializar las otras dos variables
Tp = 50
Lazo para siempre
LightValue = lee el sensor de luz! Cul es la lectura de luz actual?
Error = LightValue - offset! Calcular el error restando el desplazamiento
Turn = Kp * error! El "trmino P", cunto queremos cambiar el poder de los motores
Turn = Turn / 100 ! RECUERDA para deshacer el efecto del factor de 100 en Kp!
PowerA = Tp + Turn! El nivel de potencia para el motor A
PowerC = Tp - A su vez! El nivel de potencia para el motor C
MOTOR A direccin = potencia delantera = potenciaA! Emitir el comando en un bloque MOTOR
MOTOR C direccin = potencia hacia adelante = potenciaC! Mismo para el otro motor pero utilizando el otro nivel de
potencia
End loop para siempre! Hecho con bucle, volver atrs y hacerlo de nuevo.
Espera, cul fue el "Problema Sutil" que mencionaste con el
Primera versin del controlador P?

Siempre hay problemas sutiles. En algn momento importan y otras no. ;)

En este caso, un problema es que cuando calculamos el nivel de potencia del motor (por ejemplo, powerC = Tp-Turn) es posible obtener un nmero negativo para la
potencia.Queremos que un nmero negativo signifique que el motor debe invertir la direccin. Pero el puerto de datos en un bloque NXT-G MOTOR no lo entiende. El
nivel de potencia es siempre un nmero entre 0 y +100. La direccin del motor es controlada por un puerto de entrada diferente. Para que el motor reaccione correctamente
cuando la potencia es negativa, tendr que manejarlo en el programa. Aqu hay una manera de hacerlo;

Si powerA> 0 entonces! La potencia positiva del motor no es problema


MOTOR A direccin = potencia hacia adelante = potenciaA
ms
PowerA = powerA * (-1) ! La potencia negativa del motor debe convertirse en
MOTOR A direccin = potencia inversa = potenciaA ! Un nmero positivo y la direccin del motor
Fin si Debe invertirse en el panel de control

El bloque MOTOR recibe la potencia (powerA para el motor A) a travs de un cable de datos. La direccin se ajusta con las casillas de verificacin en la ventana de
parmetros del motor.

Necesitar un trozo similar de cdigo para el motor C. Ahora, cuando la potencia calculada es negativa, los motores sern controlados apropiadamente. Una cosa que
esto hace es permitir que el controlador de P para ir todo el camino a un "giro de giro cero" y el robot puede girar en su lugar si es necesario. Por supuesto, que en realidad
no puede ayudar.

Hay un par de otras cosas que podran ser problemas sutiles. Qu sucede cuando se enva un nivel de potencia mayor que 100 al motor? Resulta que el motor slo trata
el nmero como 100. Eso es bueno para el programa, pero no lo mejor que tiene que suceder en un controlador P (o PID). Realmente preferira que el controlador nunca
intenta pedir a los motores que hagan algo que no pueden. Si la potencia solicitada no est demasiado por encima de 100 (o por debajo de -100), probablemente est
bien. Si la potencia solicitada es mucho ms grande que 100 (o mucho menos de -100) entonces a menudo significa que el controlador est en espiral fuera de control. Por
lo tanto, asegrese de tener un extinguidor de fuego a mano!

P Controlador Resumen

Esperamos que haya recogido lo suficiente para entender un controlador P (proporcional).Es bastante simple. Utilice un sensor para medir algo que est intentando
controlar.Convierta esa medida en un error . Para el seguidor de la lnea lo hicimos restando el promedio de los valores de luz en blanco y negro. Multiplique el error por
un factor de escala llamado Kp . El resultado es una correccin para el sistema. En nuestro ejemplo de seguidor de lnea la correccin se aplica como un aumento /
disminucin en el nivel de potencia de los motores. El factor de escala Kp se determina utilizando un poco de adivinacin educada y luego se ajusta con precisin por
ensayo y error.

P pueden manejar un sorprendente rango de problemas de control, no slo siguiendo una lnea con un robot Lego. En general, los controladores P funcionan muy bien
cuando se cumplen algunas condiciones.

1. El sensor necesita tener un amplio rango dinmico (lo cual desafortunadamente no es cierto para nuestra lnea que sigue al robot).
2. Lo que est siendo controlado (motores en nuestro caso) tambin debe tener un amplio rango dinmico, es decir que deben tener una amplia gama de niveles de
"potencia" con niveles de "energa" individuales que estn cerca (los motores NXT son bastante buenos en este el respeto).
3. Tanto el sensor como la cosa controlada deben responder rpidamente."Rpido" en este caso es "mucho ms rpido que cualquier otra cosa que est sucediendo en
el sistema". A menudo cuando se estn controlando los motores no es posible obtener una respuesta "rpida" ya que los motores tardan en reaccionar ante un cambio
de potencia. Pueden tomar unas dcimas de segundo para que los motores Lego reaccionen a un cambio en los niveles de potencia. Esto significa que las acciones
del robot estn rezagadas detrs de los comandos del controlador P. Esto dificulta el control preciso con un controlador P.

Adicin de "I" al controlador: El controlador PI


("Integral": qu has hecho por m ltimamente?)

Para mejorar la respuesta de nuestro controlador P se aadir un nuevo trmino a la ecuacin. Este trmino se llama integral , el "I" en PID. Integrales son una parte muy
importante de la matemtica avanzada, afortunadamente la parte que necesitamos es bastante sencillo.
La integral es la suma de ejecucin del error.

S, es as de simple. Hay algunos problemas sutiles que saltaremos por el momento.

Cada vez que leemos el sensor de luz y calculamos un error , aadiremos ese error a una variable que llamaremos integral (inteligente eh?).

Integral = integral + error

Esa ecuacin puede parecer un poco extraa, y lo es. No se escribe como una declaracin matemtica, se escribe en una forma comn utilizada en la programacin para
sumar una serie de valores. Matemticamente no tiene ningn sentido. En la programacin de computadoras, el signo igual tiene un significado algo diferente que en
matemticas. (Usar la misma fuente de mquina de escribir que us para los ejemplos de pseudo cdigo para resaltar que es una forma de programacin y no una forma
matemtica apropiada). El "=" significa hacer las matemticas a la derecha y guardar el resultado en la variable Nombrado en la izquierda. Queremos que la computadora
obtenga el valor antiguo de integral , agregue el error y luego guarde el resultado en integral .

A continuacin, al igual que el trmino P, multiplicaremos la integral por una constante de proporcionalidad, que es otra K. Dado que esta constante de proporcionalidad
va con el trmino integral, la llamaremos Ki . Al igual que el trmino proporcional, multiplicamos la integral por la constante ( Ki ) para obtener una correccin. Para nuestro
robot de lnea siguiente es una adicin a nuestra variable de giro .

Vuelta = Kp * ( error ) + Ki * ( integral )

Lo anterior es la ecuacin bsica para un controlador PI. Turn es nuestra correccin para los motores. El trmino proporcional es Kp * ( error ) y el trmino integral es Ki *
( integral ).

Qu hace exactamente el trmino integral para nosotros? Si el error mantiene el mismo signo para varios bucles la integral crece ms grande y ms grande. Por ejemplo,
si comprobamos el sensor de luz y calculamos que el error es 1, poco tiempo despus comprobamos el sensor y el error es 2, entonces la prxima vez que el error es 2,
la integral ser 1+ 2 + 2 = 5. La integral es 5 pero el error en este paso particular es slo 2. La integral puede ser un factor importante en la correccin, pero normalmente
toma un tiempo para que la integral se acumule hasta el punto en el que empieza a contribuir.
Otra cosa que hace la integral es que ayuda a eliminar pequeos errores. Si en nuestro seguidor de lnea el sensor de luz est muy cerca del borde de la lnea, pero no
exactamente en l, entonces el error ser pequeo y slo se necesitar una pequea correccin para corregirlo. Podra ser capaz de corregir ese
pequeo error cambiando Kpen el trmino proporcional, pero que a menudo conducir a un robot que oscila (oscilaciones de ida y vuelta). El trmino integral es perfecto
para corregir pequeos errores. Dado que la integral suma el error s, varios errores pequeos consecutivos sEventualmente hace que la integral sea lo suficientemente
grande como para marcar la diferencia.

Una forma de pensar en el trmino integral es que es la "memoria" del controlador. La integral es el historial acumulativo del error y le da al controlador un mtodo para
corregir los errores que persisten durante mucho tiempo.

Algunos problemas sutiles con la integral

S, la integral tiene ms detalle. Afortunadamente no son demasiado dolorosos.

Me acostumbr a un problema menor (OK, realmente no es menor, pero vamos a hacerlo as), el tiempo. La integral es realmente la suma del error * (tiempo delta). Delta
time ( dT) es el tiempo transcurrido entre la ltima vez que comprobamos el sensor y la hora de la ltima comprobacin del sensor;

Integral = integral + error * (dT)

As que cada vez que aadimos a la integral la cosa que debemos agregar es el errorveces la dT . Es bastante fcil que el robot mida el dT . Slo leeramos un
temporizador cada vez que leamos el sensor de luz. Si restamos la ltima vez de la hora actual, obtendremos el tiempo transcurrido desde la ltima lectura dT . (Hay
mejores maneras de hacer esto, pero voy a skip'm ya que no son necesarios.) Pero no sera bueno si no tiene que medir la dT y hacer la multiplicacin? Bueno, y si
el dT es siempre el mismo? Cada vez que aadimos a integral tenemos ese mismo trmino dT . As que podemos tomar ese factor de dT fuera de error * ( dT ) y slo
hacer la suma de la forma en que lo hacamos antes;

Integral = integral + error

Slo cuando queremos hacer otro clculo con integral necesitamos realmente multiplicar por dT . Pero espera hay mas...
Podemos hacer an ms para esconder el plazo. El trmino integral en la ecuacin del controlador PI es Ki * ( integral ) * dT . Pero Ki es un parmetro que tenemos que
afinar (al igual que Kp ) por qu no reemplazar la parte Ki * dT con un nuevo Ki ? El nuevo Kies diferente del original, pero como no conocemos a ninguno de ellos
realmente no importa cul usamos o cmo lo llamamos. No importa lo que lo llamemos o lo que representa, todava tenemos que encontrar el valor correcto en gran
medida por ensayo y error.

Por lo tanto, hemos eliminado completamente el elemento de tiempo para el trmino integral con la restriccin de que todos los pasos de tiempo, dT s, son iguales (o casi
iguales).

La integral tiene un recuerdo como un elefante

Se debe mencionar un ltimo detalle sobre la integral . Por lo general, la integral slo puede moverse hacia cero, donde no aporta nada al controlador, por tener valores
de error agregados que son el signo opuesto de la mayora de los que ya hemos recogido en integral . Por ejemplo, si durante varios ciclos a travs del bucle el error s
es 1,2,2,3,2,1, que se suma a una integral de 11. Pero el error en el ltimo punto de datos es slo 1, que es mucho menor Que la integral en ese punto. La nica manera
de que la integral se mueva hacia cero es obtener una cadena de errores negativos s para contrarrestar la secuencia anterior de error positivo s para "reducir"
la integral . Por ejemplo, si los siguientes errores son -2, -2, -3 entonces la integral caer de 11 a 4 y todava necesitaramos ms errores negativos para obtener
la integral a cero. Adems, la integral quiere que el error total se distribuya uniformemente entre errores positivos y negativos.

Si sucede algo que empuja nuestra lnea siguiendo al robot a la izquierda del borde de la lnea el tr mino integral no slo quiere volver al borde de la lnea sino que
tambin quiere superar el borde a la derecha por tanto como la perturbacin original fue la izquierda. As que la integral tiende a "liquidar" si hay grandes errores que
persisten por un tiempo. Esto puede causar problemas con controladores que incluyen un trmino integral . A veces esta tendencia del trmino integral a querer superar
cuando trata de corregir el error es un problema suficientemente grande que el programador debe hacer algo al trmino integral para que no cause problemas. Si la
solucin integral es un problema, dos soluciones comunes son (1) cero la integral , que es la integral de la variable igual a cero, cada vez que el error es cero o
el error cambia de signo. (2) "Humedecer" la integral multiplicando la integral acumulada por un factor menor que uno cuando se calcula una nueva integral . Por ejemplo;

Integral = (2/3) * integral + error


Esto reduce el valor de la integral anterior en 1/3 cada vez a travs del bucle. Si usted piensa en el trmino integral como la "memoria" de los controladores, entonces este
amortiguamiento lo est obligando a olvidarse de cosas que ocurrieron hace mucho tiempo.

Pseudo cdigo para el controlador PI

Para aadir el trmino integral al controlador necesitamos agregar una nueva variable para Ki y otra para la integral . Y no olvide que estamos multiplicando nuestros Ks
por 100 para ayudar con las restricciones matemticas enteras.

Kp = 1000! RECUERDE que estamos usando Kp * 100 as que esto es realmente 10!
Ki = 100 ! RECUERDA que estamos usando Ki * 100 as que esto es realmente 1!
Offset = 45! Inicializar las variables
Tp = 50
Integral = 0 ! El lugar donde almacenaremos nuestra integral
Lazo para siempre
LightValue = lee el sensor de luz! Cul es la lectura de luz actual?
Error = LightValue - offset! Calcular el error restando el desplazamiento
Integral = integral + error ! Nuestro nuevo trmino integral
Turn = Kp * error + Ki * integral ! El trmino "P" y el trmino "I"
Turn = Turn / 100! RECUERDA para deshacer el efecto del factor de 100 en Kp!
PowerA = Tp + Turn! El nivel de potencia para el motor A
PowerC = Tp - A su vez! El nivel de potencia para el motor C
MOTOR A direccin = potencia delantera = potenciaA! Emitir el comando en un bloque MOTOR
MOTOR C direccin = potencia hacia adelante = potenciaC! Emitir el comando en un bloque MOTOR
End loop para siempre! Hecho con este bucle, volver al principio y hacerlo de nuevo.

Adicin de "D" al controlador: El controlador PID completo


("D": qu va a pasar despus?)
Nuestro controlador ahora contiene un trmino proporcional (P) que intenta corregir el error actual y un trmino integral (I) que intenta corregir el error anterior s, existe
una manera para que el controlador mire hacia delante en el tiempo y tal vez trate de corregir el error Que ni siquiera ha ocurrido todava?

S, y la solucin es otro concepto de la matemtica avanzada llamada la derivada . Ahhh, est el "D" en PID. Al igual que la integral , la derivada puede representar
alguna matemtica bastante seria. Afortunadamente para nosotros, lo que necesitamos para el PID es bastante simple.

Podemos mirar hacia el futuro asumiendo que el siguiente cambio en el error es el mismo que el ltimo cambio en el error .

Esto significa que se espera que el siguiente error sea el error actual ms el cambio en el error entre las dos muestras de sensor precedentes. El cambio en el error entre
dos puntos consecutivos se llama la derivada. La derivada es la misma que la pendiente de una recta.

Eso podra sonar un poco complejo de calcular, pero realmente no es demasiado malo.Un ejemplo de conjunto de datos ayudar a ilustrar cmo funciona. Vamos a
suponer que el error actual es 2 y el error antes de que era 5. Qu predecir el prximo error a ser?Bueno, el cambio de error es la derivada que es;

(El error actual ) - (el error anterior )

Que para nuestros nmeros es 2 - 5 = -3. Por lo tanto, la derivada corriente es -3. Para utilizar la derivada para predecir el siguiente error , utilizaramos

(Siguiente error) = (el error actual) + (la derivada actual)

Que para nuestros nmeros es 2 + (-3) = -1. As que predecimos que el siguiente errorser -1. En la prctica, en realidad no vamos todo el camino y predecir el
siguiente error .En su lugar, slo usamos la derivada directamente en la ecuacin del controlador.

El trmino D, al igual que el trmino I, debera incluir un elemento de tiempo, y el trmino "D" oficial es;

Kd ( derivado ) / ( dT )

As como con los trminos proporcionales e integrales tenemos que multiplicar por una constante. Puesto que esta es la constante que va con la derivada se
llama Kd .Obsrvese tambin que para el trmino derivativo dividimos por dT mientras que en el trmino integral hemos multiplicado por dT . No se preocupe demasiado
acerca de por qu eso es ya que vamos a hacer el mismo tipo de trucos para deshacerse de la dT del trmino derivado como lo hicimos para el trmino integral . La
fraccin Kd / dT es una constante si dT es la misma para cada bucle. As que podemos reemplazar Kd / dT por otro Kd . Dado que este K, como el Ks anterior, es
desconocido y tiene que ser determinado por ensayo y error, no importa si es Kd / dT o simplemente un nuevo valor para Kd .

Ahora podemos escribir la ecuacin completa para un controlador PID:

Turn = Kp * ( error ) + Ki * ( integral ) + Kd * ( derivado )

Es bastante obvio que "predecir el futuro" sera una cosa til para ser capaz de hacer, pero cmo exactamente ayuda? Y cun exacta es la prediccin?

Si el error actual es peor que el error anterior, entonces el trmino D intenta corregir el error . Si el error actual es mejor que el error anterior, entonces el trmino D
intenta detener al controlador para corregir el error . Es el segundo caso que es particularmente til. Si el error se aproxima a cero, nos acercamos al punto en el que
queremos dejar de corregir. Dado que el sistema probablemente tarda un tiempo en responder a los cambios en la potencia de los motores, queremos empezar a reducir
la potencia del motor antes de que el error haya pasado a cero, de lo contrario superaremos. Cuando se pone de esa manera podra parecer que la ecuacin para el
trmino D tendra que ser ms compleja de lo que es, pero no lo es. Lo nico que tiene que preocuparse es hacer la sustraccin en el orden correcto. El orden correcto
para este tipo de cosas es "actual" menos "anterior". As que para calcular la derivada tomamos el error actual y restamos el erroranterior.

Pseudo cdigo para el controlador PID

Para aadir el trmino derivado al controlador debemos aadir una nueva variable para Kd y una variable para recordar el ltimo error . Y no olvide que estamos
multiplicando nuestros Ks por 100 para ayudar con la matemtica entera.

Kp = 1000! RECUERDE que estamos usando Kp * 100 as que esto es realmente 10!
Ki = 100! RECUERDA que estamos usando Ki * 100 as que esto es realmente 1!
Kd = 10000 ! RECUERDA que estamos usando Kd * 100 as que esto es realmente 100!
Offset = 45! Inicializar las variables
Tp = 50
Integral = 0! El lugar donde almacenaremos nuestra integral
LastError = 0 ! El lugar donde almacenaremos el ltimo valor de error
Derivado = 0! El lugar donde almacenaremos el derivado
Lazo para siempre
LightValue = lee el sensor de luz! Cul es la lectura de luz actual?
Error = LightValue - offset! Calcular el error restando el desplazamiento
Integral = integral + error! Calcular la integral
Derivative = error - lastError ! Calcular la derivada
Turn = Kp * error + Ki * integral + derivado Kd * ! El trmino "P", el trmino "I" y el "trmino D"
Turn = Turn / 100! RECUERDA que se deshace el efecto del factor de 100 en Kp, Ki y Kd!
PowerA = Tp + Turn! El nivel de potencia para el motor A
PowerC = Tp - A su vez! El nivel de potencia para el motor C
MOTOR A direccin = potencia hacia adelante = PowerA! Emitir el comando en un bloque MOTOR
MOTOR C direccin = potencia hacia adelante = PowerC! Mismo para el otro motor pero utilizando el otro nivel de
potencia
LastError = error ! Guardar el error actual por lo que puede ser el lastError la prxima vez
End loop para siempre! Hecho con bucle, volver atrs y hacerlo de nuevo.

Ahora tenemos el pseudo cdigo para nuestro controlador PID completo para una lnea que sigue al robot. Ahora viene lo que a menudo es la parte difcil, "afinar" el
PID. La afinacin es el proceso de encontrar los mejores valores, o por lo menos OK, para Kp , Kiy Kd .

Sintonizacin de un controlador PID sin matemticas complejas


(Pero todava tenemos Para hacer un poco de matemticas)

Las personas muy inteligentes ya han descubierto cmo ajustar un controlador PID.Como no soy tan inteligente como son, usar lo que aprendieron. Resulta que la
medicin de un par de parmetros para el sistema permite calcular valores "bastante buenos" para Kp , Ki y Kd . No importa mucho lo que el sistema exacto es que se
est controlando las ecuaciones de ajuste casi siempre funcionan bastante bien. Hay varias tcnicas para calcular el Ks, uno de los llamados " Ziegler-Nichols Mtodo ",
que es lo que vamos a utilizar. Una bsqueda de Google localizar muchas pginas web que describen esta tcnica en todo su detalle sangriento. La versin que voy a
utilizar es casi directamente de la pgina Wiki en PID Controllers (el mismo tratamiento se encuentra en muchos otros lugares). Slo har un pequeo cambio incluyendo
el tiempo de bucle ( dT ) en los clculos mostrados en la tabla siguiente.

Para ajustar su controlador PID, siga estos pasos:

1. Establezca los valores Ki y Kd a cero, lo que convierte esos trminos en desactivados y hace que el controlador acte como un controlador P simple.
2. Establezca el trmino Tp a uno pequeo. Para nuestros motores 25 podra ser un buen lugar para comenzar.
3. Establezca el trmino Kp en un valor "razonable". Qu es "razonable"?
1. Acabo de tomar el valor mximo que queremos enviar al control de potencia del motor (100) y dividir por el valor mximo de error utilizable. Para nuestra lnea
siguiente robot hemos asumido el error mximo es de 5 por lo que nuestra conjetura en Kp es 100/5 = 20. Cuando el error es +5 la potencia del motor oscilar
en 100 unidades. Cuando el error es cero, la potencia del motor se situar en el nivel de Tp .
2. O bien, simplemente establezca Kp a 1 (o 100) y vea lo que sucede.
3. Si has implementado que los K's son todos ingresados como 100 veces su valor real, tienes que tener esto en cuenta aqu.1 se introduce como 100, 20 como
2000, 100 como 10000.
4. Ejecutar el robot y ver lo que hace. Si no puede seguir la lnea y se desva entonces aumente Kp . Si oscila salvajemente entonces disminuye Kp .Seguir cambiando el
valor de Kp hasta encontrar uno que sigue la lnea y da oscilacin notable pero no realmente salvajes. Llamaremos a este Kp valor "Kc" ("ganancia crtica" en la
literatura PID).
5. Usando el valor de Kc como Kp , ejecute el robot a lo largo de la lnea y trate de determinar la velocidad de oscilacin. Esto puede ser difcil, pero afortunadamente la
medicin no tiene que ser tan exacta. El periodo de oscilacin ( Pc ) es el tiempo que tarda el robot en oscilar de un lado de la lnea a la otra y luego al lado donde
comenz. Para los robots Lego tpicos, Pcestar probablemente en el intervalo de aproximadamente 0,5 segundos a uno o dos segundos.
6. Tambin es necesario saber qu tan rpido el robot cicla a travs de su bucle de control. Acabo de establecer el bucle a un nmero fijo de pasos (como 10.000) y el
tiempo de tiempo que el robot tarda en terminar (o hacer que el robot realice el tiempo y mostrar el resultado.) El tiempo por bucle ( dT ) es el tiempo medido dividido
Por el nmero de bucles. Para un controlador PID completo, escrito en NXT-G, sin ningn zumbido o silbido aadido, el dTestar en el rango de 0,015 a 0,020 segundos
por bucle.
7. Utilice la tabla siguiente para calcular un conjunto de valores Kp , Ki y Kc . Si slo desea un controlador P, utilice la lnea en la tabla marcada P para calcular
el Kp "correcto" ( Ki ' y Kd' son ambos cero). Si desea un controlador PI, utilice la siguiente lnea. El controlador PID completo es la lnea de fondo.
8. Si ha implementado que los K's se introducen como 100 veces su valor real, no es necesario tenerlo en cuenta en estos clculos . Ese factor de 100 ya se tiene en
cuenta en el valor Kp = Kc determinado.
9. Ejecutar el robot y ver cmo se comporta.
10. Ajusta los valores de Kp , Ki y Kd para obtener el mejor rendimiento posible.Usted puede comenzar con ajustes bastante grandes, digamos un 30% y luego intentar
pequeos ajustes para obtener el rendimiento ptimo (o al menos aceptable).
11. Una vez que tenga un buen conjunto de K's tratar de aumentar el valor de Tp , que controla la velocidad recta del robot.
12. Re-tweak los K o tal vez incluso volver al paso 1 y repetir todo el proceso para el nuevo valor Tp.
13. Sigue repitiendo hasta que el comportamiento del robot sea aceptable.

Mtodo de Ziegler-Nichols que da valores de K '


(Tiempos de bucle considerados constantes e iguales a dT)

Tipo de control Kp Ki Kd

PAG 0,50 Kc 0 0

Pi 0,45 K c 1,2 K p dT / P c 0

PD 0,80 K c 0 K _ { p} P _ { c} / (8dT)

PID 0,60 K c 2 K p dT / P c K _ { p} P _ { c} / (8dT)

Los primos (apstrofes) en el K i ' y K d ' son slo para recordarles que se calculan asumir dT es constante y dT se ha rodado en los valores K.
Aqu estn los valores que med para mi robot de prueba (el del video vinculado ms adelante). Kc era 300 y cuando Kp = Kc el robot oscilaba aproximadamente a 0,8
segundos por oscilacin, de manera que Pc es 0,8. Med Pc simplemente contando en voz alta cada vez que el robot giraba completamente en una direccin
particular.Entonces compar mi percepcin de lo rpido que estaba contando con "1 patata - 2 patatas - 3 patatas ...". Eso no es "ingeniera de precisin", pero funciona
lo suficientemente bien, as que lo llamaremos "ingeniera prctica". El tiempo de bucle, dT , es 0.014 segundos / bucle determinado simplemente ejecutando el programa
para 10.000 bucles y teniendo el NXT mostrar el tiempo de ejecucin. Utilizando la tabla anterior para un controlador PID obtendremos;

Kp = (0,60) (Kc) = (0,60) (300) = 180


Ki = 2 ( Kp ) ( dT ) / ( Pc ) = 2 (180) (0,014) / (0,8) = 6,3 (que se redondea a 6)
Kd = ( Kp ) ( Pc ) / ((8) ( dT )) = (180) (0,8) / ((8) (0,014)) = 1286

Despus de un nuevo ajuste de ensayo y error, los valores finales fueron de 220, 7 y 500 para Kp , Ki y Kd, respectivamente. Recuerde que todos mis K son introducidos
como 100x su valor real por lo que los valores reales son 2,2, 0,07 y 5.

Cmo los cambios en Kp, Ki y Kd afectan el comportamiento de los robots

La tabla y el mtodo descritos anteriormente son un buen punto de partida para optimizar su PID. A veces ayuda a tener una mejor idea de cul ser el resultado de
aumentar (o disminuir) uno de los tres Ks. La tabla a continuacin est disponible en muchos sitios web. Esta versin particular es de Wiki en los controladores PID.

Efectos de los parmetros crecientes

Error en
Parmetro Hora de levantarse Excederse Tiempo de estabilizacin
equilibrio

Kp Disminucin Incrementar Pequeo cambio Disminucin

Ki Disminucin Incrementar Incrementar Eliminar


Indefinido
Kd (Pequea disminucin Disminucin Disminucin Ninguna
O aumento)

El "tiempo de subida" es la rapidez con la que el robot intenta corregir un error. En nuestro caso de muestra es la rapidez con que el robot intenta regresar al borde de la
lnea despus de que se haya desviado de l. El tiempo de subida es mayormente controlado por Kp . Un Kp ms grande har que el robot trate de regresar ms rpido
y disminuye el tiempo de subida. Si Kp es demasiado grande el robot superar.

El "Overshoot" es cunto ms all del borde de la lnea el robot tiende a ir, ya que est respondiendo a un error. Por ejemplo, si el rebasamiento es pequeo, entonces el
robot no gira a la derecha de la lnea, ya que est tratando de fijar a la izquierda de la lnea. Si el rebasamiento es grande entonces el robot oscila bien ms all del borde
de la lnea cuando trata de corregir un error. El overshoot est controlado en gran medida por el trmino Kd, pero est fuertemente afectado por los trminos Ki y Kp . Por
lo general, para corregir demasiado exceso que desea aumentar Kd . Recuerdas a nuestro primer seguidor de lnea muy simple, el que no poda hacer nada sino girar a
la derecha oa la izquierda? Ese seguidor de lnea tiene muy mal exceso. De hecho, eso es todo lo que hace.

El "tiempo de asentamiento" es el tiempo que el robot tarda en volver a establecerse cuando encuentra un cambio grande. En nuestro caso de la lnea siguiente ocurre un
cambio grande cuando el robot encuentra un giro. Como el robot responde a la curva que va a corregir el error y luego superar en cierta cantidad. A continuacin, debe
corregir el exceso y podra rebasar la espalda de la otra manera. Entonces necesita corregir el exceso ... bueno, usted consigue la idea. Como el robot est respondiendo
a un errortender a oscilar alrededor de la posicin deseada. El "tiempo de sedimentacin" es cunto tiempo dura esa oscilacin para amortiguar a cero. El tiempo de
sedimentacin responde fuertemente tanto al Ki como al Kd . Un Ki ms grande proporciona tiempos de sedimentacin ms largos. Un Kd mayor proporciona un tiempo
de sedimentacin ms corto.

"Error en Equilibrium" es el error que queda mientras el sistema funciona sin ser perturbado. Para nuestro seguidor de lnea sera el desplazamiento de la lnea como el
robot sigue una larga lnea recta. A menudo los controladores P y PD terminan con este tipo de error. Puede reducirse aumentando Kp pero eso puede hacer que el robot
oscile.Incluyendo un trmino I y Ki creciente fijar a menudo un controlador P o PD que tenga un error constante en el equilibrio. (Esto supone que incluso se preocupan
por un pequeo error restante cuando el robot sigue la lnea, simplemente significa que est desplazado en un lado o en el otro por una pequea cantidad).
Qu tan bien funciona?

Aqu est un breve video de un robot Lego Mindstorms bsico siguiendo la lnea en la estera de prueba que viene con el conjunto. La calidad del video no es muy buena.

El sensor de luz est a aproximadamente 1/2 "por encima de la alfombra y el desplazamiento a un lado de la lnea central del robot.La Tp (potencia de destino) se
estableci en el 70% .El robot es un promedio de 8 pulgadas por segundo en este curso. Un seguidor de la lnea izquierda y est siguiendo el borde interior del valo.El
borde interior es un poco ms difcil de seguir que el borde exterior.

MPEG4 - MP4 (644KB) QuickTime - MOV (972KB)

En general, el seguidor de lnea parece funcionar bastante bien. Si observas el video de cerca vers al robot "agitar la cola" un poco a medida que sale de las esquinas. Ese
es el PID oscilando un poco. Cuando el robot est corriendo hacia la cmara, puede ver el punto rojo en la alfombra del LED del sensor de luz. Parece estar siguiendo el
borde de la lnea bastante bien.
El controlador PID bsico debe funcionar para muchos problemas de control diferentes y, por supuesto, puede utilizarse como u n controlador P o PI en lugar de un
PID. Usted tendra que llegar a una nueva definicin del error y el PID tendra que ser afinado para la tarea en particular.

Entonces, dnde est el cdigo?

Podra drtelo pero entonces tendra que matarte.

Dado que este documento est dirigido a los nios FLL ms antiguos, realmente no quiero dar el cdigo. Ellos deben ser capaces de escribir sus propias.

El pseudo cdigo tiene prcticamente todo lo que necesita para el propio PID. Puede que tenga que agregar algn cdigo de configuracin y quizs una manera adecuada
de detener el bucle de seguidor de lnea.

Como un poco de ayuda aqu hay un MyBlock que toma dos entradas, la potencia de destino Tp y el valor de Turno , y controla los dos motores. Este MyBlock tambin
se ocupa correctamente de los niveles de potencia negativos. Incluso emite un pitido cuando un motor invierte las direcciones, lo que es til para la sintonizacin. Una
lnea adecuadamente sintonizada despus de PID raramente tendr que invertir las direcciones del motor.

PID_LF_MotorControl.rbt es el archivo RBT para NXT-G v1.1. Una captura de pantalla del programa est en PID_LF_MotorControld.png

Si realmente desea obtener mi cdigo PID NXT-G, enveme un correo electrnico.

Las cosas al azar que podran ser rellenas en este documento en algn lugar

Para un excelente ejemplo de otro controlador PID en un robot Mindstorms ver Philos equilibrio segway como robot . El PID est escrito en NQC ("no C"). El equilibrio es
un problema de control mucho ms complicado que seguir una lnea. (Lo s porque lo he probado!)

Un controlador PID (o PI o P) es un ejemplo de un bucle de realimentacin. La regeneracin es la cosa ms grande desde encurtidos rebanados.

Existen mtodos avanzados para ajustar un controlador PID. Normalmente requiere hardware y / o software que un constructor de robots Lego no tiene.
Algunos controladores PID son mucho ms fciles de sintonizar que otros. Por ejemplo, a menudo se utiliza un controlador PID para controlar la temperatura en un
horno. Este es un trabajo de ajuste bastante fcil ya que el horno es bastante estable, aunque puede estar lejos de su temperatura objetivo, incluso cuando el PID est
mal sintonizado. Los controladores PID tambin se utilizan para controlar robots de equilibrado. Eso es mucho ms difcil de sintonizar ya que el PID tiene que ser ajustado
bastante bien de lo contrario el robot slo se cae. Es difcil ajustar el PID si el robot se cae rpidamente cada vez que se enciende.

Existen variantes del mtodo Ziegler-Nichols y otros mtodos para ajustar un PID.

Hay controladores que son ms complejos que un PID.

Los PIDs han existido desde hace mucho tiempo y precedieron al control de la computadora. Un PID puede, ya menudo ha sido implementado en sistemas puramente
mecnicos. Es decir, ninguna computadora o incluso partes elctricas.

Sera interesante que el programa NXT-G escriba datos en un archivo mientras se est ejecutando el PID. A continuacin, transferir los datos de nuevo a la PC para su
anlisis.Esto sera una gran manera de determinar Pc . Creo que la versin 2.0 de NXT-G puede transferir datos de nuevo a la PC en tiempo real para la representacin
grfica. Escribir en un archivo de datos (o enviar los datos a travs de Bluetooth) tiene algunos problemas cuando se utiliza con un PID. Escribir en un archivo es un
proceso bastante lento, por lo que el tiempo de bucle del PID aumentar, creo que transmitir algo a travs de Bluetooth tambin es bastante lento. Esto significa que el
PID toma ms tiempo para realizar bucle y est midiendo el error y actualizando los motores con menos frecuencia. Otro problema con la escritura en un archivo es que
peridicamente la rutina de escritura de archivos toma una gran cantidad de tiempo (tanto como 0.1 segundos) para hacer un poco de "limpieza". Esto puede evitarse "pre-
extendiendo" el archivo al lmite cuando se abre por primera vez el archivo. Un archivo NXT-G puede ser tan grande como 32K si tiene mucho espacio libre en el NXT-
G. Si intenta pre-extender el archivo de datos y no tiene suficiente memoria, el NXT-G no da ninguna indicacin de que hubo un problema. Si utiliza un mtodo como este,
entonces el valor Pc que obtiene es relevante slo para el dTparticular que tiene el programa "PID with logging". Si desea medir el Pc y, a continuacin, quitar el cdigo
de registro de datos del programa para hacerlo ms rpido, el Pc ya no es vlido. Una solucin parcial es obligar a todos los bucles del PID a tomar la misma cantidad de
tiempo. Al comienzo del bucle establecer un temporizador a cero. Al final del bucle WAIT durante un perodo de tiempo ms largo que el dT normal del bucle.Puede utilizar
esta tcnica para mantener constantes los tiempos de bucle incluso si agrega o quita grandes trozos de cdigo (como el registro de datos). Por supuesto, eso significa
que usted siempre tiene el bucle PID ms lento de lo que podra ser, y est perdiendo el tiempo en cada ciclo de bucle.
He manipulado un poco con la escritura de datos en un archivo mientras el PID se est ejecutando. Es til iniciar el archivo de datos con una lista de los valores
de Tp , offset , Kp , Ki y Kd . Los buenos datos para registrar cada vez que se ejecuta el bucle PID son el tiempo, error , salida PID y el ngulo de uno de los ejes del
motor. A partir de esos datos se puede reconstruir el integral y el derivado para que no tengan que ser registrados.

No est claro para m lo rpido que el PID necesita para el ciclo, que es lo pequeo que tiene que ser dT, para obtener un buen controlador. Sospecho que el PID necesita
ciclar ms rpido que el tiempo de respuesta de los motores. Quizs varias veces ms rpido.Andar en bicicleta el PID mucho ms rpido que eso probablemente no
ayuda mucho ya que las cosas no estn cambiando tan rpido. El tiempo de respuesta de los motores NXT, cuando en realidad estn moviendo un robot, est en el rango
de un par de dcimas de segundo. El PID probablemente debera ir en ciclo de 1/5 a 1/10 de ese tiempo, o alrededor de 0,010 a 0,030 segundos por bucle. El programa
PID bsico descrito anteriormente tiene un dT de aproximadamente 0,015 segundos, que debe ser lo suficientemente rpido. Si el programa tambin registra datos
mientras se ejecuta, el dTsube a aproximadamente 0,030 segundos por bucle.

El uso de valores de luz crudos (escala de 0 a 1023), en lugar de valores de luz no calibrados, podra aumentar el rango dinmico de los sensores de luz. Para nuestro
ejemplo los valores de luz negros seran 400 y 500 blancos. El offset sera 450 con un rango de +/- 50 en lugar de +/- 5. Los valores de luz bruta estn disponibles desde
un puerto de datos en el bloque sensor de luz. Si calibra su sensor de luz bajo sus condiciones de iluminacin y utiliza los valores calibrados entonces el blanco ser
alrededor de 100 y el negro ser aproximadamente 0. Esta es otra forma de aumentar el rango proporcional del sensor de luz. Tanto en los modos crudo como calibrado
los valores de luz probablemente no son precisos en el ltimo dgito, pero espero que los valores sean algo ms precisos que usar un rango de valores de luz de 10 o
menos.

Al crear un controlador PID hay a menudo un par de maneras diferentes de definir el error. Para nuestro seguidor de lnea, el error es proporcional a la distancia del sensor
desde el borde de la lnea. La derivada es la velocidad con la que el sensor se mueve hacia, o lejos del borde de la lnea. La integral es la suma de las distancias desde
el borde de la lnea, que realmente no tiene mucho significado fsico (aunque todava ayuda al controlador). Hay otras maneras de hacer las cosas. Podemos definir el
error como la rapidez con que nos movemos hacia o lejos del borde de las lneas. En otras palabras, el error es ahora cul era la derivada en nuestro seguidor de lnea. Para
esta nueva definicin de error, la derivada se convierte en lo rpido que estamos acelerando hacia, o lejos de, el borde de la lnea. La integral se convierte en lo lejos que
estamos del borde de la lnea, lo que tiene sentido fsico. El mtodo que funciona mejor a menudo depende de lo exacto que pueda medir el error y la cantidad de ruido
(fluctuacin aleatoria) que existe. Si usamos la velocidad como el error, se tiene que calcular a partir de la lectura de la luz y es la derivada de la lectura de la luz. Para
obtener la derivada para el PID tenemos que tomar la derivada de una derivada. La derivada de un derivado probablemente no funcionar muy bien con nuestro limitado
rango proporcional de valores de luz.

Para el "seguidor de tres niveles de lnea", los tres rangos no necesitan ser del mismo tamao. Si este tipo de seguidor es suficientemente bueno, a menudo es mejor
hacer que el rango del centro sea mayor que los dos rangos externos. Algo como 42 a 47 tal vez para nuestros valores de ejemplo. Lo nico que tienes que preocuparte
es que esto se vuelve bastante sensible a pequeos cambios en la iluminacin de la habitacin. Los tres rangos pares (y el enfoque original de dos rangos) son bastante
insensibles a los cambios en la iluminacin de la sala. Si haces que el alcance del centro sea demasiado grande, corre el riesgo de tener un pequeo cambio en la
iluminacin de la habitacin y mueve tu rango de luz fuera de lo que esperabas. El sensor de luz podra nunca devolver nmeros en el rango ms bajo o ms alto y el
robot nunca girar en una de las dos direcciones.

Algunas realidades de PIDs.

1. Cuando el error sale del rango proporcional, la derivada pasa a cero.


2. La derivada es sensible al ruido.
3. La derivada funciona mejor cuando la precisin de error es alta. Para nuestro seguidor de lnea el error es un entero entre -5 y +5. Eso es bastante pobre
precisin. Quizs utilice la derivacin de la velocidad del eje de los motores?

También podría gustarte