Robot de seguimiento PID y su configuración

Cómo programar un robot seguidor de línea

  1. Cómo programar un robot de seguimiento de ruta (robotresearchlab.com)
  2. Artículo de ajuste de PID: http://robotresearchlab.com/2019/02/16/pid-line-follower-tuning/

Describa las dos formas principales que las personas eligen para programar por cable los robots de seguimiento y compare las dos. Se compararán en detalle "Seguimiento simple" y "Seguimiento PID". A bajas velocidades, el algoritmo de seguimiento simple es perfectamente aceptable, a medida que aumenta la velocidad, el algoritmo de seguimiento simple no es tan bueno como el algoritmo de control PID.

trazado de líneas simples

Primero tenemos el rastreo de cables simple, la premisa general detrás de este tipo de rastreo es que tiene uno o varios sensores y codifica la respuesta del motor en función de lo que el sensor ve en el cable. Este suele ser el primer método que la gente aprende al trazar líneas, porque es fácil de entender y de programar. Comencemos por revisar las opciones típicas de sensores.

un sensor

La idea general detrás de una de las líneas de sensores a continuación es que configura un motor para que funcione a una velocidad de motor ligeramente reducida o aumentada para que el robot esté sesgado en una dirección (hacia la dirección de la línea). Cuando el sensor ve la línea, acelera brevemente el motor más cercano a la línea para evitar cruzarla.
single_sensor_line_follow_path

**ventaja

  • circuito sencillo
  • fácil de programar
  • Haz el trabajo al nivel más bajo
  • No es una mala solución para líneas rectas.

defecto

  • Si te pasas de esta línea una vez podría ser desastroso
  • Funciona bien solo en líneas suaves (sin giros bruscos)
  • Recorrer distancias adicionales (en lugar de ir en línea recta) es una pérdida de tiempo
  • no puedo caminar rápido en absoluto
Código de muestra

Lo siguiente debería darle una idea de cómo se ve este código, no he probado este código, así que proceda con precaución.

#define L_MOTOR         9
#define R_MOTOR         10
#define MAX_SPEED       200
#define SET_SPEED       150
#define MIN_SPEED       135
#define MIDDLE_IR       A1
#define TAPE_THRESHOLD  350   // Anything less is a Black reflectance

void setup() {
  // Intialize pins
  pinMode(MIDDLE_IR, INPUT);
}

void loop() {
  
  if (analogRead(MIDDLE_IR) < TAPE_THRESHOLD) {
    // We are seeing the line under the middle sensor
    analogWrite(L_MOTOR, SET_SPEED);
    analogWrite(R_MOTOR, MAX_SPEED);
    
  } else {
    // Drive slightly right to hug the line
    analogWrite(L_MOTOR, SET_SPEED);
    analogWrite(R_MOTOR, MIN_SPEED);
  }
}

dos sensores

La idea general de rastrear dos cables de sensores es que cuando un sensor ve el cable, reduce la velocidad o detiene el motor del otro lado del sensor que ve el cable. Los sensores trabajan juntos para mantener el robot en marcha. Si usa este método, intente acercar mucho los sensores, cuanto más cerca esté el sensor, menos se moverá el robot mientras conduce, esto le dará una apariencia de conducción más directa y perderá menos tiempo mientras ajusta previamente la distancia a el objetivo era más corto.
ruta_de_seguimiento_de_línea_de_dos_sensores

ventaja

  • circuito sencillo
  • fácil de programar

defecto

  • Si pierde su línea, puede ser difícil recuperarla
  • tiempo perdido viajando de izquierda a derecha
  • no apto para alta velocidad
Código de muestra
#define L_MOTOR         9
#define R_MOTOR         10
#define MAX_SPEED       250
#define SET_SPEED       200
#define MIN_SPEED       50
#define LEFT_IR         A0
#define RIGHT_IR        A2
#define TAPE_THRESHOLD  350   // Anything less is a Black reflectance

void setup() {
  // Intialize pins
  pinMode(LEFT_IR, INPUT);
  pinMode(RIGHT_IR, INPUT);
}

void loop() {
  
  if (analogRead(LEFT_IR) < TAPE_THRESHOLD) {
    // We are seeing the line under the left sensor, turn left
    analogWrite(L_MOTOR, MIN_SPEED);
    analogWrite(R_MOTOR, SET_SPEED);

  } else if (analogRead(RIGHT_IR) < TAPE_THRESHOLD) {
    // We are seeing the line under the right sensor, turn right
    analogWrite(L_MOTOR, SET_SPEED);
    analogWrite(R_MOTOR, MIN_SPEED);
    
  }
}

tres o más sensores

La idea detrás de la siguiente serie de tres sensores es que es más sensible que dos sensores. Por lo general, coloca un tercer sensor en el medio, excepto que puede agregar un tercer o incluso un cuarto caso además de ajustarlo como lo haría con un rastreador de dos sensores. En el tercer caso, si la línea está debajo del sensor central, configure ambos motores a la misma velocidad para mantener una trayectoria recta. Un cuarto caso opcional, si ningún sensor ve la línea, apaga el motor o gira hasta que encuentra la línea nuevamente.

Además, si agrega más sensores, puede agregar capas de ajuste. Suponiendo que tiene cuatro sensores, si el sensor más a la izquierda ve la línea, entonces puede apagar el motor derecho, y si el segundo sensor de la izquierda ve la línea, simplemente puede reducir la velocidad del motor derecho para que reaccione más abruptamente a esquinas afiladas, o si por alguna razón está lejos de la línea.

ventaja

  • El método de seguimiento simple más robusto
  • Capacidad para detectar si se pierde una línea
  • Ajuste gradual con estricto encendido/apagado o alta/baja velocidad
  • fácil de programar

defecto

  • Todavía no es una verdadera respuesta analógica a los errores (el robot a menudo se pone nervioso cuando sigue la línea)
  • no apto para alta velocidad
Código de muestra
#define L_MOTOR         9
#define R_MOTOR         10
#define MAX_SPEED       200
#define SET_SPEED       200
#define MIN_SPEED       50
#define STOP_SPEED      0
#define LEFT_IR         A0
#define MIDDLE_IR       A1
#define RIGHT_IR        A2
#define TAPE_THRESHOLD  350   // Anything less is a Black reflectance

void setup() {
  // Intialize pins
  pinMode(LEFT_IR, INPUT);
  pinMode(MIDDLE_IR, INPUT);
  pinMode(RIGHT_IR, INPUT);
}

void loop() {
  
  if (analogRead(LEFT_IR) < TAPE_THRESHOLD) {
    // We are seeing the line under the left sensor, turn left
    analogWrite(L_MOTOR, MIN_SPEED);
    analogWrite(R_MOTOR, SET_SPEED);

  } else if (analogRead(MIDDLE_IR) < TAPE_THRESHOLD) {
    // We are seeing the line under the middle sensor, go straight
    analogWrite(L_MOTOR, SET_SPEED);
    analogWrite(R_MOTOR, SET_SPEED);
    
  } else if (analogRead(RIGHT_IR) < TAPE_THRESHOLD) {
    // We are seeing the line under the right sensor, turn right
    analogWrite(L_MOTOR, SET_SPEED);
    analogWrite(R_MOTOR, MIN_SPEED);
    
  } else {
    // We don't see the line at all, let's stop
    analogWrite(L_MOTOR, STOP_SPEED);
    analogWrite(R_MOTOR, STOP_SPEED);
  }
}

Seguimiento de PID

Ahora introduzcamos un algoritmo de seguimiento de línea un poco más complejo pero más preciso, el seguimiento de línea PID. He notado que muchos principiantes se desaniman por la complejidad del rastreo de líneas PID y tienden a confiar en las bibliotecas para los cálculos PID. Le sugiero que comience con su propio algoritmo PID simple para que comprenda lo que está sucediendo. Por supuesto, puede salirse con la suya usando la biblioteca PID, pero realmente no comprende cómo funciona, por lo que es difícil ajustar sus valores y saber exactamente cómo afectará esto al resultado.

ventaja

  • Seguimiento de línea muy suave y preciso
  • La línea generalmente se puede seguir más rápido que el método "fácil"
  • Más flexibilidad si desea trazar a lo largo de diferentes posiciones (trazar el centro, ligeramente a la izquierda, ligeramente a la derecha)

defecto

  • Se requiere ajuste, esto puede llevar algún tiempo
  • Puede parecer incomprensible sin orientación (espero que este artículo lo aclare)
  • Más sensores tomarán más tiempo para capturar lecturas

¿Qué son los PID?

Primero, analicemos qué es un PID. PID es un acrónimo de Proporcional, Integral, Derivado, pero no dejes que eso te asuste, es fácil y no requiere cálculo. La idea detrás de PID es que tiene un valor real y un valor objetivo o un punto de referencia. Puede realizar algunos ajustes en el sistema en función de la diferencia entre el objetivo y los valores reales.

PAG

El primer aspecto de ese ajuste es P, que es solo un coeficiente... es decir, es un número por el cual multiplicas el error y lo aplicas como un ajuste. Digamos que está conduciendo un automóvil y está tratando de mantener una velocidad constante de 55 mph, si lee el velocímetro y ve que actualmente es 55, sabe que está a 5 mph por lo que necesita pisar el acelerador para obtener el acelerar hacia atrás. Suponiendo que está revisando el velocímetro cada segundo y haciendo ajustes, es probable que esté soltando lentamente el acelerador. Entonces, para el valor P, necesitamos determinar un valor para convertir nuestra distancia en cuánto necesitamos ajustar el acelerador.

Por ejemplo, digamos que una pulgada de movimiento del acelerador generalmente aumenta la velocidad en una mph en un segundo. Bueno, haciendo algunas matemáticas simples, podemos llegar a un algoritmo muy simple para esto. Si multiplicamos el error por MPH (millas por hora), el valor P es 1.

adjustment = P*error

adjustment = 1*error

Mira, si la velocidad es inferior a 6 mph, nuestro ajuste será (1 6) o 6 pulgadas, y si es 12 mph, (1 12) o 12 pulgadas para mover el acelerador. Asimismo, si es superior a 8 mph, ajustaremos 8 pulgadas. El punto es que, ahora que tenemos un ajuste basado en algún conocimiento, en lo que respecta a nuestros motores, haríamos ajustes más pequeños si el robot fuera solo un poco más pequeño.

Cualquiera que haya conducido un vehículo alguna vez sabe que no existe una relación lineal entre cuánto mueves el pedal del acelerador y cuánto aumentas la velocidad en un segundo. Aquí es donde entran en juego los otros elementos de PID.

I

Una advertencia que tengo es que no suelo usar este término para los seguidores de fila. El término I es el término más complicado para los principiantes, por lo que, a menos que tenga experiencia, usaría una biblioteca aquí. Pero de nuevo, normalmente no uso i, así que les mostraré un ejemplo que no usa ese término y aún así les da un gran seguimiento.

Los valores p son buenos, pero ¿no es un sistema perfecto, no lo ves? La verdad es que cuando el vehículo va más lento, su aceleración no será la misma que cuando va más rápido. Además, si tiene el pie en un acelerador de 6", lo que sucede cuando golpea una colina, la misma posición del acelerador no mantendrá su velocidad, y ahí es donde entrará en juego el término I. Lo que pasa con el término I es que rastrea su error y tiene en cuenta factores externos. Si su valor P no parece estar cambiando a la velocidad correcta, el término I crecerá lentamente, forzando a que su ajuste sea mayor a medida que suma cada error y lo aplica a su ajuste. Por lo tanto, el algoritmo del controlador PI se ve así:

adjustment = P*error + I*sumOfErrors

donde el error sumado es la acumulación de errores cada vez que se calcula el ajuste. Entonces, volviendo al problema cuesta arriba que mencioné, si puede navegar sin mover el acelerador, luego sube una colina, su velocidad real en comparación con su objetivo aumentará un error cada vez que tenga un error y su término lo dirá le pide que apriete más el acelerador hasta que, finalmente, aumente la velocidad. Una vez que llega a la cima de la colina, ahora ha agregado más aceleración, pero la colina se ha ido y debe comenzar a soltar el acelerador, generalmente en este punto, el término I intentará volver a nivelarse y habrá terminado. objetivo por lo que su error será Negativo, restando así de la suma de sus valores I. El problema con I es que necesita saber cuándo restablecerlo o dejar que funcione solo. Esta es la razón principal por la que no uso I, es difícil de entender para los principiantes, puede afectar drásticamente sus resultados sin proporcionar realmente muchos beneficios en el caso de los bots de seguimiento.

La parte del punto I que es muy útil para los robots que siguen líneas es si su motor falla y su robot sigue yendo hacia un lado. Su término I es sumar todos los errores y, finalmente, esa suma se asentará en un punto en el que compensará ese motor débil y seguirá aplicando ajustes adicionales en esa dirección.

D

El algoritmo de control proporcional es excelente por sí solo, además de ser inestable, nunca alcanza muy bien el valor objetivo. Esto se debe a que es solo un coeficiente simple aplicado al margen de error, cuando en realidad queremos que ese coeficiente reduzca potencialmente su propia efectividad cuando alcancemos nuestro objetivo. Aquí es donde entra el valor D, que calcula la diferencia entre el último error y el error actual. Entonces, por ejemplo, si la primera lectura fue un error de 5 y la nueva lectura es un error de 1, el ajuste derivado sería el factor D multiplicado por la diferencia de error (1-5) o -4. Si agregamos el término D al controlador PI, se verá así:

adjustment = P*error + I*sumOfErrors + D*(error – lastError)

O, si solo tenemos un algoritmo de control de DP

adjustment = P*error + D*(lastError – error)

Entonces, si tratamos de analizar el cálculo que muestra PD, podemos ver que nuestra parte P, como ya sabemos, aplica un factor multiplicativo según la cantidad de error. Sin embargo, el valor D aplica un factor multiplicativo a la diferencia de error, entonces, ¿qué significa eso? Nuestro valor D amortiguará el efecto de P a medida que nos acerquemos al objetivo, para que no lo sobrepasemos. Si observa, nuestro ejemplo tiene valores negativos, por lo que reducirá efectivamente el ajuste a medida que nos acerquemos al error 0.

línea_con_errores

También puede pensarlo de esta manera, si el error crece, entonces P no lo está haciendo lo suficientemente bien, en cuyo caso el nuevo error será mayor que el anterior porque nos estamos alejando del objetivo. Restar el número más pequeño del número más grande dará como resultado un valor positivo que se agregará a la sección P para ayudar a volver a la normalidad. Por otro lado, si nos estamos acercando correctamente al objetivo, tendremos un error actual menor que el error anterior, que se restará de la parte P para asegurarnos de no sobrepasar nuestro objetivo. Consulte la imagen de la derecha para comprender mejor los errores relacionados con la línea.

Algoritmo de seguimiento PID

Ahora que tenemos una comprensión básica de qué es un PID y cómo funciona, volvamos a discutir cómo se puede implementar esto en un robot de seguimiento.

diagrama de flujo

Comencemos repasando un diagrama de flujo que cubre los aspectos básicos del rastreo de líneas PID. Espero que el diagrama de flujo lo ayude a comprender el algoritmo relacionado con el código. Si comprende mejor el código al leer el código en sí, tengo un código de muestra después del diagrama de flujo.

imagen

Código de muestra

Algunas cosas para mencionar por adelantado aquí, este código se basa en el uso de la matriz de sensores Pololu QTR-8RC . Puede modificar esto fácilmente para una matriz QTR-8A, o incluso usarlo con un solo sensor IR QTR-1RC o QTR-1A . He usado hasta cuatro sensores IR en un rastreador de línea PID con gran éxito en los resultados. Simplemente ajuste los NUM_SENSORS y los números de pin pasados ​​al objeto QTRSensorsRC. Además, si tiene una cantidad diferente de sensores, su objetivo será diferente si desea rastrear el centro. Para calcular los centroides, utilice el siguiente algoritmo: (NUM_SENSORS – 1)*500. Por supuesto, no tiene que rastrear el centro, puede rastrear cualquier lugar dentro del alcance del sensor.

Debe tener la biblioteca de sensores QTR, que se puede encontrar aquí , el enlace es un puntero a mi versión personal de la biblioteca. Encontré un error que sugiero que arreglen, pero no lo han hecho, y podría causar algunos valores extraños, por lo que sugiero que usen mi biblioteca modificada y la solución.

readLine(sensorValues) La función devuelve un (NUM_SENSORS – 1)*1000valor entre 0 y . Si tiene 8 sensores, la lectura será 0-7000, y 6 sensores serán 0-5000. En cada caso, 0 significa el sensor más a la izquierda y cada incremento de 1000 después de eso significa otro sensor. 0== primer sensor, 1000== segundo sensor, también tienen un rango intermedio. 500 significa que la línea está entre el 1.° y el 2.° sensor, 1200 significa que está entre el 2.° y el 3.° sensor pero más cerca del 2.° sensor... ¿Estás pensando bien?

Al final, lo más probable es que mis valores de KP y KD no se apliquen a su robot, ya que cada robot es diferente. Estos valores dependen de la velocidad del motor, el peso del robot, el tamaño de la rueda, la posición del sensor con respecto a la rueda, etc.

#include <QTRSensors.h>

#define SETPOINT    3500  // The goal for readLine (center)
#define KP          0.2   // The P value in PID
#define KD          1     // The D value in PID
#define L_MOTOR     9     // Left motor pin
#define R_MOTOR     10    // Right motor pin
#define MAX_SPEED   200   // The max speed to set motors to
#define SET_SPEED   200   // The goal speed to set motors to
#define MIN_SPEED   0     // The min speed to set motors to
#define NUM_SENSORS 8     // The number of QTR sensors
#define TIMEOUT     2500  // Timeout for the QTR sensors to go low
#define EMITTER_PIN 2     // Emitter pin for QTR sensor emitters

// PID **************************************
int lastError = 0;  // For storing PID error

// SENSORS **********************************
// sensors 0 through 7 are connected to digital pins 3 through 10, respectively
QTRSensorsRC qtrSensors((unsigned char[]) {3, 4, 5, 6, 7, 8, 9, 10}, NUM_SENSORS, TIMEOUT, EMITTER_PIN);
unsigned int sensorValues[NUM_SENSORS];   // For sensor values of readLine()

void setup() {
  // Initialize Pins
  pinMode(L_MOTOR, OUTPUT);
  pinMode(R_MOTOR, OUTPUT);
}

void loop() {
  // Take a reading
  unsigned int linePos = qtrSensors.readLine(sensorValues);

  // Compute the error
  int error = SETPOINT - linePos;

  // Compute the motor adjustment
  int adjust = error*KP + KD*(error - lastError);

  // Record the current error for the next iteration
  lastError = error;

  // Adjust motors, one negatively and one positively
  analogWrite(L_MOTOR, constrain(SET_SPEED - adjust, MIN_SPEED, MAX_SPEED));
  analogWrite(R_MOTOR, constrain(SET_SPEED + adjust, MIN_SPEED, MAX_SPEED));
}
sintonización PID

El ajuste de los valores P y D del algoritmo de control de PD está fuera del alcance de este documento. Como se mencionó anteriormente, es posible que estos valores de KP y KD no se apliquen a su robot, ya que cada robot es diferente. El ajuste de PID es un aspecto importante del algoritmo y cada robot debe ajustarse de acuerdo con un conjunto de parámetros específicos de ese robot. Incluiré un artículo en los próximos días y proporcionaré un enlace cuando esté listo. Como consejo antes de que se publique ese artículo, configure KD en 0 (esto solo le dará un controlador P) e intente obtener valores de KP que sigan esa línea, no se preocupe por KD hasta que KP funcione. Además, intente sintonizar con el motor configurado al menos a la mitad de la velocidad que necesita, es difícil sintonizar a toda velocidad a menos que su velocidad máxima ya sea lenta.

Actualización: el artículo de ajuste de PID se puede encontrar aquí: http://robotresearchlab.com/2019/02/16/pid-line-follower-tuning/

Ajuste del seguidor de línea PID

Ajuste del seguidor de línea PID (robotresearchlab.com)

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 PID después del ajuste del robot . Este artículo asume que comprende qué es PID y cómo implementar un lazo de control PID o PD. Hay algunas referencias (como el objetivo y el punto de ajuste) específicas para los valores que obtiene usando la biblioteca QTRSensors de Pololu, no tiene que usar sus sensores, solo use la biblioteca para algunas de las referencias hechas en este artículo. ¡Aprendamos cómo ajustar un robot de seguimiento PID!

Establecer

Usar solo P

Para sintonizar PID o cualquier combinación de PI y D, siempre empiezo sintonizando P. El valor de escala es el que más contribuye al seguimiento de línea correcto, por lo que es muy importante obtener este valor correctamente. Si incluye I o D, no sabe si su P está causando el problema o algo más, así que elimine los otros dos y solo considere la escala o el valor de KP.

velocidad

Uno de los mayores errores que veo es que las personas intentan ajustarse a la velocidad máxima esperada. Sintonizar el PID a toda velocidad es muy difícil. Siempre recomiendo reducir la velocidad al menos al 50 % de la velocidad máxima prevista, a menos que su velocidad máxima ya sea muy lenta. Es posible que deba modificar los valores de PID a medida que aumenta la velocidad, pero es mucho más fácil sintonizar a toda velocidad con valores que ya son buenos que con valores que ya son buenos. Además, las velocidades más rápidas vienen con 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 total, entonces no puede usar el valor de KP como un factor completo en su problema de ajuste. Sintonicé a toda velocidad por varias razones, el efecto del valor PID se muestra más a velocidades más rápidas (por eso recomiendo ir más lento). Otra razón es que, para empezar, mi bot no era muy rápido.

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 usara la biblioteca, probablemente tendría un rango de 0 a 255, que es el rango completo de PWM.

Mi velocidad inicial es 100% (100)

determinar el punto de partida

Más información sobre los rangos de los sensores

array_readline_values

Entonces, la gran pregunta que recibo es, ¿cómo elijo un valor inicial para KP? Mi método es muy simple y solo involucra algunas matemáticas básicas. La función readLine() en la biblioteca QTRSensors devuelve un 1000*(NUM_SENSORS – 1)valor entre 0 y Entonces, para mi robot tengo ocho sensores, por lo que mi readLine()resultado estará entre 0 y 1000*(8-1)7000. Usando la imagen como 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 que el octavo sensor tenga un valor de 7000. readLine()La belleza de la función es que proporciona un rango "analógico", que puede tener un valor de 1200, lo que significa que está por debajo del segundo sensor, pero un poco más cerca del tercer sensor. Su valor posible es 3538, lo que significa que está aproximadamente a medio camino entre el cuarto y el quinto sensor.

Mi rango es de 0 a 7000

Determinar el objetivo

Ahora que entiendes readLine()los valores de , si quisiera enfocarme en el centro, entonces mi objetivo sería MAX_VALUE/2 或 7000/2 o 3500. Esto debería tener sentido ya que tengo ocho sensores y quiero realizar un seguimiento entre el 4.º y el 5.º sensor para seguir el centro y el valor entre el 4.º y el 5.º sensor será 3500 readLine(). Solo una nota aquí, no tengo que seguir el centro, si hay un obstáculo al lado de la línea, puedo seguir la izquierda o la derecha del centro a través de este obstáculo, otra belleza de PID, es fácil cambiar tu apuntar.

Mi objetivo es 3500

Determine su KP inicial

array_motor_speeds

Finalmente, podemos encontrar un buen punto de partida para nuestro valor KP. Lo que hago es calcular el error más alto que puedo obtener y encontrar el coeficiente que convierte el error máximo en un valor igual a mi velocidad. Para aclarar esto, aquí hay algunas matemáticas más básicas. Suponiendo que me desvíe de la línea a la derecha, lo más lejos que puedo llegar es readLine() el punto donde devuelve 0, porque ahí 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 或 3500. Lo mismo al revés, si me desvío hacia la izquierda, lo más lejos que puedo llegar es el readLine()punto que devuelve 7000, porque ahí es cuando el sensor más a la derecha verá la línea. Así que mi objetivo para restar este máximo es 3500 – 7000 或 -3500. En cualquier caso, mi error máximo es 3500 el valor de (ignorar los números negativos).

Ahora, si la velocidad de mi motor es 100 (como 100%), obtendría un valor para convertir 3500 a 100. Para que te hagas una idea del por qué, mira la imagen mientras lees la siguiente frase. Cuando el sensor más a la izquierda o el sensor más a la derecha ve esta línea, mi ajuste (KP*error)va a 100, así que si el robot está tan lejos, apague los motores porque vamos a restar ese ajuste de un motor y agregarlo a otro motor. Para determinar el valor inicial de KP, mis cálculos básicos son los siguientes.

  1. MAX_SPEED = MAX_ERROR * KP
  2. Complete nuestros valores conocidos
  3. 100 = 3500 * KP
  4. Para resolver KP, movemos 3500 al otro lado y obtenemos
  5. 100 / 3500 = KP

Mi KP es 0.028

Como nota final, generalmente solo voy en milésimas, a veces en centésimas, pero en este caso, quiero granularidad, así que usaré el 0.028 completo

¡Empecemos a afinar!

Al ingresar a esta sección, debe conocer la siguiente información

  • Tu familia de sensores
  • Su ubicación de destino (valor de configuración)
  • La velocidad de su motor es del 50% o menos
  • KP calculado desde arriba

Con mi información en el código (puedes encontrar un ejemplo en este artículo ), veamos cómo va mi primera ejecución. Tenga en cuenta que necesitamos al menos dos ejecuciones de prueba antes de que podamos comenzar a tomar decisiones sobre cómo ajustar KP.

Prueba 1

El valor inicial de KP del experimento 1 es 0.028

KP 0.028
KD 0.0
MÁXIMA VELOCIDAD 100
MIN_VELOCIDAD 0
VELOCIDAD FIJADA 100
analizar

p_just_right

Estoy realmente sorprendido de cuán preciso es mi bot al rastrear la línea usando solo el valor KP inicial. Probablemente porque estoy acostumbrado a robots más pesados, por lo que no responden tan bien como este pequeño robot liviano. En este punto no tenemos nada que juzgar, así que me gusta bajar más y más para determinar en qué dirección final debe ir el valor de KP. Nuestro KP objetivo nos dará un patrón de rastro que se parece a la imagen que ves aquí. Las rutas deben permanecer enrutadas y consistentes en la línea en un patrón ajustado.

Ir a Prueba 2…

Prueba 2

Primero, me gusta devaluar y ver qué pasa. Al reducir KP a 0.018, los motores no se apagarán hasta que alcancemos un error de ~5500, pero dado que nuestro error máximo es 3500, eso significa que nunca llegaremos al punto en que los motores se apagan. El mayor ajuste que haremos es 3500*0.018=63que nuestro motor nunca caiga por debajo de un valor de 47 en este KP.

KP 0.018
KD 0.0
MÁXIMA VELOCIDAD 100
MIN_VELOCIDAD 0
VELOCIDAD FIJADA 100
analizar

p_demasiado_bajo

Como puede ver, el KP más bajo aumenta la cantidad de bamboleo en el seguimiento, lo cual no es bueno, queríamos algo más agresivo que nuestro valor inicial. Otra cosa a tener en cuenta es que tuve que agregar otra pieza de "pista" porque el KP más bajo permitió que mi robot se saliera demasiado de la línea y, si no lo hacía, se saldría de la pista. Un valor de PD bajo le dará un patrón como el que ve en la imagen, puede que sea consistente o no, pero lo que es más importante, no sigue la línea muy bien. Una vez que llega a un giro, un robot con un KP demasiado bajo puede perder el giro por completo y nunca volver a la línea.

Prueba 3

Ahora, voy a mantener la misma distancia del valor inicial en la otra dirección. Al observar la Prueba 1 y la Prueba 2, debo esperar que este KP siga más de cerca, pero ¿sería un KP demasiado alto?

KP 0.038
KD 0.0
MÁXIMA VELOCIDAD 100
MIN_VELOCIDAD 0
VELOCIDAD FIJADA 100
analizar

Si bien es posible que no se note tanto en el video, es más agresivo que mi valor inicial. Esto no pasa de la línea buena, así que creo que ese es el valor que voy a usar. Si solo estuviera usando KP, probablemente me quedaría con mi valor original de 0.028, pero como estoy agregando un KD, me gustaría que fuera un poco más agresivo, ya que el valor de KD será un poco más suave.

Prueba 4

Un artículo de instrucciones no estaría completo sin incluir ejemplos en los que los valores son demasiado altos.

KP 0.8
KD 0.0
MÁXIMA VELOCIDAD 100
MIN_VELOCIDAD 0
VELOCIDAD FIJADA 100
analizar

p_demasiado_alta

Como puede ver, el robot se está sobrepasando de izquierda a derecha (sin juego de palabras). No pude obtener el KP lo suficientemente alto como para mostrarles este bot, pero con los bots más pesados ​​es muy común que el KP sea demasiado alto para seguirlo durante períodos cortos de tiempo y termine siendo tan inestable que se desconecte por completo. Esta es una forma de saber que su KP es demasiado alto, mire la imagen, muestra los posibles patrones que ve cuando su KP es demasiado alto.

Prueba 5

En general, un buen punto de partida para el valor KD es de 10 a 20 veces el valor KP. Entonces, empiezo con un KD que es diez veces mi valor de KP.

KP 0.038
KD 0.38
MÁXIMA VELOCIDAD 100
MIN_VELOCIDAD 0
VELOCIDAD FIJADA 100
analizar

Ese es un valor bastante bueno para KD, incluso podría estar inclinado a detenerme aquí, pero noté una respuesta un poco retrasada cuando el bot llega a un giro, sé que aumentar mi KD ayudará con este problema.

juicio 6

KP 0.038
KD 0.76
MÁXIMA VELOCIDAD 100
MIN_VELOCIDAD 0
VELOCIDAD FIJADA 100
analizar

No creo que sea mejor que eso, y para los propósitos de este bot, no necesito hacerlo. Probablemente querrá pasar un poco más de tiempo ajustando su robot, mucho del cual se reducirá a qué tan rápido viaja y cómo se ve su trayectoria. Necesitará más ajustes para una pista con curvas pronunciadas que para una pista con curvas más suaves.

juicio 7

Al igual que con KP alto, ningún artículo instructivo estaría completo sin un ejemplo de KD demasiado alto.

KP 0.038
KD 2.76
MÁXIMA VELOCIDAD 100
MIN_VELOCIDAD 0
VELOCIDAD FIJADA 100
analizar

Puede que no sea del todo obvio, pero el robot ha comenzado a oscilar nuevamente, como lo hizo con KP alto, hasta el punto de que agrega medio segundo a su tiempo de vuelta. Puede que no parezca mucho, pero si estás compitiendo contra tus bots, podría ser la diferencia entre el número uno y el número dos.

Aquí hay un ejemplo para mostrar, si está modificando dos números al mismo tiempo, es difícil saber cuál es malo. Dado que he ajustado mi KP individualmente, sé que el culpable es mi valor de KD.

epílogo

Finalmente quiero cubrir algo porque es importante entender los aspectos más comunes que afectan al algoritmo PID. Por favor, preste atención a lo siguiente.

  • Tracción: si no tiene una buena tracción, su KP nunca le permitirá seguir la línea.
  • Velocidad: si vas demasiado rápido, especialmente al tomar turnos en la pista, será difícil ajustar el valor inicial, que es el mismo que la velocidad del procesador a continuación.
  • Ubicación del sensor: si el sensor está más lejos de la rueda, es posible que se necesite un KP más alto, ya que la distancia desde el punto de cambio (punto de apoyo) es mayor y, por lo tanto, tiene un efecto mayor.
  • Velocidad del procesador: sí, esto puede marcar una gran diferencia. Si tiene un proceso lento y un robot rápido, la frecuencia de muestreo será muy baja. Por ejemplo, si viaja a 3 pies/s y puede hacer ajustes 50 veces por segundo, está leyendo la línea cada 3/4 de pulgada, lo cual no está mal. Sin embargo, si su procesador es lento, o tiene muchas otras cosas en marcha en su programa, y ​​solo está actualizando 10 veces por segundo, está leyendo filas cada 3,6 pulgadas, lo que significa que podría estar desconectado antes de darse cuenta de que 3,6 pulgadas. Al ajustar el PID, intente limitar el código solo al código PID y también evite imprimir declaraciones.

Supongo que te gusta

Origin blog.csdn.net/acktomas/article/details/130356508
Recomendado
Clasificación