Ajuste del seguidor de línea PID
Este artículo es una continuación de mi artículo anterior sobre Cómo programar un robot seguidor de línea y cubrirá el ajuste del seguidor de línea PID . Este artículo supone que comprende qué es PID y cómo implementar un bucle de control PID o PD. Hay algunas referencias (como el objetivo y el punto de ajuste) que son específicas de los valores que obtiene al usar la biblioteca QTRSensors de Pololu; no tiene que usar sus sensores, solo su biblioteca para algunas de las referencias realizadas en este artículo. ¡Aprendamos a ajustar un robot seguidor de línea PID!
Configuración
Trabajar solo con P
Para ajustar un PID o cualquier combinación de PI y D, siempre empiezo ajustando solo P. El valor proporcional es el que más contribuirá a seguir correctamente la línea, por lo que es importante que este valor sea correcto. Si tiene I o D incluidos, no sabe si su P está causando el problema o algo más, así que elimine los otros dos y quédese solo con su valor proporcional o KP.
Velocidad
Uno de los mayores errores que veo es que la gente intenta ajustar a la velocidad máxima prevista. Ajustar un PID es muy difícil a la velocidad máxima. Siempre recomiendo reducir la velocidad al menos al 50 % de la velocidad máxima prevista, a menos que la velocidad máxima ya sea muy lenta. Es posible que deba realizar ajustes en los valores de PID a medida que aumenta la velocidad, pero ajustar a la velocidad máxima con valores ya decentes es mucho más fácil que ajustar a la velocidad máxima con valores ya decentes. Además, las velocidades más altas introducen otros problemas que pueden dificultar el ajuste, uno de los cuales es la tracción. Si no puede estar seguro de que está obteniendo la tracción máxima, entonces no puede descartar que su valor de KP sea el factor contribuyente total en sus problemas de ajuste. Estoy ajustando a la velocidad máxima por algunas razones: los efectos de los valores de PID se muestran más con velocidades más rápidas (por eso recomiendo ir más lento), por lo que esto hace que sea más fácil mostrarlo en el video. Otra razón es porque mi robot no es muy rápido para empezar.
Otra nota que quiero hacer aquí es que mi velocidad es de 0 a 100 porque estoy usando una biblioteca que escribí que funciona con algunos controladores de motor comunes y usa un rango de "potencia" de 0 a 100. Si no estuviera usando una biblioteca, probablemente tendría un rango de 0 a 255, que es el rango PWM completo.
Mi velocidad inicial es del 100% (100)
Determinar un punto de partida
COMPRENDA EL RANGO DEL SENSOR
Entonces, la pregunta más importante que me hacen es, ¿cómo elijo un valor inicial para KP? Mi método es bastante sencillo e implica solo algunas matemáticas básicas. La función readLine() de la biblioteca QTRSensors devuelve un valor entre 0 y 1000*(NUM_SENSORS – 1) ¿de acuerdo? Entonces, con mi robot tengo ocho sensores y, por lo tanto, mi resultado readLine() estará en algún lugar entre 0 y 1000*(8-1) o 7000. Eche un vistazo a la imagen para ver un ejemplo, 0 significa que la línea está debajo del sensor más a la izquierda, 1000 significa que la línea está debajo del segundo sensor y así sucesivamente hasta el octavo sensor, que es un valor de 7000. La belleza de la función readLine() es que ofrece un rango "analógico", puede tener un valor de 1200, lo que significa que está debajo del segundo sensor, pero ligeramente hacia el tercero. Podría tener un valor de 3538, lo que significa que está aproximadamente en el medio del cuarto y quinto sensor.
Mi rango es de 0 a 7000
DETERMINAR UNA META
Ahora que entiendes los valores que vienen de readLine(), si quiero seguir en el centro, entonces mi objetivo será MAX_VALUE/2 o 7000/2 o 3500. Eso debería tener sentido, ya que tengo ocho sensores que me gustaría seguir entre el cuarto y el quinto sensor para seguir en el centro y el valor de readLine() entre el cuarto y el quinto sensor será 3500. Solo una nota aquí, no tengo que seguir en el centro, si hubiera un obstáculo al lado de la línea, podría seguir hacia la izquierda o la derecha del centro para superar este obstáculo, esa es otra belleza de PID, es fácil cambiar tu objetivo.
Mi meta es 3500
DETERMINAR SU KP INICIAL
Finalmente, podemos determinar un buen punto de partida para nuestro valor KP. Lo que hago es calcular el error más alto posible que podría obtener y encontrar el coeficiente que convierte ese error máximo en un valor igual a mi velocidad. Para aclararlo un poco, aquí viene un poco más de matemática básica. Digamos que me desvío de la línea hacia la derecha, lo más lejos que podría llegar es al punto donde readLine() devuelve un 0 ya que es cuando el sensor más a la izquierda verá la línea. Entonces, mi objetivo (3500) menos este error máximo es 3500 – 0 o 3500. Lo mismo en la otra dirección, si me desvío hacia la izquierda, lo más lejos que podría llegar es al punto donde readLine() devuelve un 7000 ya que es cuando el sensor más a la derecha verá la línea. Entonces, mi objetivo menos este máximo es 3500 – 7000 o -3500. En cualquier caso, mi error máximo es un valor de 3500 (sin tener en cuenta el negativo).
Ahora bien, si la velocidad de mi motor es 100 (como en 100 %), obtengo un valor para convertir 3500 a 100. Para que entiendas por qué, observa la imagen mientras lees la siguiente oración. Cuando el sensor más a la izquierda o el sensor más a la derecha ve la línea, mi ajuste (KP*error) será 100, por lo que apagaremos el motor si el robot está tan lejos, ya que restaremos ese ajuste de un motor y lo sumaremos al otro. Para determinar un valor KP inicial, mi cálculo básico es el siguiente.
- VELOCIDAD MÁXIMA = ERROR MÁXIMO * KP
- Complete nuestros valores conocidos
- 100 = 3500 * PK
- Para resolver KP, movemos los 3500 al otro lado y obtenemos
- 100 / 3500 = PK
Mi KP es 0,028
Solo una nota final aquí, generalmente solo voy al lugar de las milésimas, a veces solo a las centésimas, pero en este caso quiero la granularidad, así que usaré el 0.028 completo.
¡Vamos a ponernos a punto!
Al continuar en esta sección debes conocer la siguiente información
- Su rango de sensores
- Su posición objetivo (punto de ajuste)
- La velocidad de su motor es del 50 % o menos
- Su KP calculado a partir de arriba
Después de introducir mi información en el código (puede encontrar un ejemplo en este artículo ), veamos cómo va mi primera ejecución. Tenga en cuenta que necesitaremos al menos dos ejecuciones de prueba antes de poder comenzar a tomar decisiones sobre cómo ajustar KP.
Prueba 1
La primera prueba tendrá nuestro valor KP inicial de 0,028
| KP | 0,028 |
| KD | 0.0 |
| VELOCIDAD MÁXIMA | 100 |
| VELOCIDAD MÍNIMA | 0 |
| ESTABLECER_VELOCIDAD | 100 |
ANÁLISIS
Me sorprendió mucho la precisión con la que mi robot siguió la línea con solo un valor KP inicial. Probablemente se deba a que estoy acostumbrado a trabajar con robots más pesados, por lo que no responden tan bien como este pequeño robot liviano. Sin embargo, en este punto no tenemos nada por lo que juzgar, por lo que me gusta ir subiendo y bajando para determinar en qué dirección final debe ir el valor KP. Nuestro KP objetivo nos dará un patrón de seguimiento de línea que se parece a la imagen que ves aquí. La ruta debe mantener el curso de la línea con un patrón ajustado y mantenerse constante.
A la prueba 2…
Prueba 2
Primero, me gustaría bajar el valor para ver qué sucedería. Al reducir el KP a 0,018, los motores no se apagarán hasta que alcancemos un error de ~5500, pero como nuestro error máximo es 3500, eso significa que nunca llegaremos al punto en el que un motor se apague. El ajuste máximo que haríamos es 3500*0,018= 63 , por lo que nuestros motores nunca bajarán de un valor de 47 con este KP.
| KP | 0,018 |
| KD | 0.0 |
| VELOCIDAD MÁXIMA | 100 |
| VELOCIDAD MÍNIMA | 0 |
| ESTABLECER_VELOCIDAD | 100 |
ANÁLISIS
Como puedes ver en el video, el KP más bajo ha aumentado la cantidad de balanceo en el seguimiento de la línea, lo cual no es bueno; queremos algo que siga la línea un poco más agresivamente que nuestro valor inicial. Otra cosa a tener en cuenta es que tuve que agregar otra pieza de "pista" ya que el KP más bajo permitió que mi robot se saliera tanto de la línea que se saldría de la pista si no lo hubiera hecho. Un valor de PD bajo te dará un patrón como el que ves en la imagen, puede ser consistente o no, pero lo más importante es que no sigue la línea muy bien. Una vez que llegas a una curva, un robot con un KP demasiado bajo puede perder completamente la curva y nunca volver a la línea.
Prueba 3
Ahora recorreré la misma distancia desde mi valor inicial en la otra dirección. Al observar la prueba 1 y la prueba 2, debería esperar que este KP siga más de cerca la línea, pero ¿será un KP demasiado alto?
| KP | 0,038 |
| KD | 0.0 |
| VELOCIDAD MÁXIMA | 100 |
| VELOCIDAD MÍNIMA | 0 |
| ESTABLECER_VELOCIDAD | 100 |
ANÁLISIS
Aunque puede que no se note tanto en el video, este es más agresivo que mi valor inicial. Esto no sobrepasa la línea, lo cual es bueno, así que creo que este es el valor que voy a usar. Si solo estuviera usando KP, podría quedarme con mi valor inicial de 0.028, pero como voy a agregar un KD, quiero que sea un poco más agresivo, ya que el valor de KD lo suavizará un poco.
Prueba 4
Un artículo instructivo no estaría completo sin incluir un ejemplo de lo que verías con un valor demasiado alto.
| KP | 0,8 |
| KD | 0.0 |
| VELOCIDAD MÁXIMA | 100 |
| VELOCIDAD MÍNIMA | 0 |
| ESTABLECER_VELOCIDAD | 100 |
ANÁLISIS
Como puedes ver, el robot se sale de la línea de izquierda a derecha (sin juego de palabras). No pude obtener un KP lo suficientemente alto como para mostrártelo con este robot, pero con robots más pesados es muy común que un KP demasiado alto siga por un período corto y eventualmente se vuelva tan errático que se salga de la línea por completo. Esta es una forma de saber que tu KP es demasiado alto, mira la imagen, muestra un posible patrón que verías con un KP demasiado alto.
Prueba 5
En general, un buen punto de partida para un valor de KD es de 10 a 20 veces el valor de KP. Por lo tanto, comencé con un KD de diez veces mi valor de KP.
| KP | 0,038 |
| KD | 0,38 |
| VELOCIDAD MÁXIMA | 100 |
| VELOCIDAD MÍNIMA | 0 |
| ESTABLECER_VELOCIDAD | 100 |
ANÁLISIS
Este es un valor bastante bueno para KD, incluso podría inclinarme a detenerme aquí, pero noto una respuesta un poco retrasada cuando el robot llega a los giros y sé que aumentar mi KD ayudará con eso.
Prueba 6
| KP | 0,038 |
| KD | 0,76 |
| VELOCIDAD MÁXIMA | 100 |
| VELOCIDAD MÍNIMA | 0 |
| ESTABLECER_VELOCIDAD | 100 |
ANÁLISIS
No creo que pueda mejorar mucho más que esto y, para los fines de este robot, no es necesario. Es posible que desees dedicar más tiempo a ajustar tu robot, ya que gran parte de esto dependerá de la velocidad a la que te desplaces y del aspecto de tu pista. Para una pista con curvas cerradas, tendrás que ajustar mucho más que para una pista con curvas suaves.
Prueba 7
Al igual que con un KP alto, un artículo instructivo no estaría completo sin un ejemplo de un KD que sea demasiado alto.
| KP | 0,038 |
| KD | 2,76 |
| VELOCIDAD MÁXIMA | 100 |
| VELOCIDAD MÍNIMA | 0 |
| ESTABLECER_VELOCIDAD | 100 |
ANÁLISIS
Puede que no sea totalmente obvio en el vídeo, pero el robot ha comenzado a oscilar de nuevo como lo hacía con el KP alto, tanto que ha aumentado el tiempo de vuelta en medio segundo. No parece mucho, pero si estás compitiendo con tu robot, esa podría ser la diferencia entre el primero y el segundo.
Este es un ejemplo que demuestra que, si ajustas ambos números al mismo tiempo, es difícil saber cuál es el incorrecto. Como he ajustado mi KP por separado, sé que el culpable es mi valor KD.
Notas finales
Hay algunas cuestiones finales que quería cubrir, ya que es importante conocer los aspectos más comunes que afectan a un algoritmo PID. Estén atentos a lo siguiente.
- Tracción: si no tienes una buena tracción, tu KP nunca te permitirá seguir la línea.
- Velocidad: si vas demasiado rápido, especialmente con curvas en tu pista, será difícil ajustar los valores iniciales, esto se combina con una velocidad del procesador por debajo
- Posición del sensor: si el sensor está más lejos de las ruedas, es posible que necesite un KP más alto porque la distancia desde el punto de cambio (punto de apoyo) es mayor, por lo que tiene un mayor impacto.
- Velocidad del procesador: sí, esto puede marcar una gran diferencia. Si tienes una velocidad de procesamiento lenta y un robot rápido, tu frecuencia de muestreo será muy baja. Por ejemplo, si te desplazas a 3 pies/s y puedes hacer ajustes 50 veces por segundo, entonces estás leyendo la línea cada 3/4″, lo que no está tan mal. Pero si tienes un procesador lento o tienes muchas otras cosas en marcha en tu programa y solo estás actualizando 10 veces por segundo, estás leyendo la línea cada 3,6″, esto significa que podrías estar 3,6 pulgadas fuera de la línea antes de darte cuenta. Al ajustar PID, intenta mantener tu código limitado solo al código PID, evita también las declaraciones de impresión
No hay comentarios:
Publicar un comentario