Optimización de seguidor de línea

9

Estoy trabajando en la construcción de un robot seguidor de línea y quiero optimizar su rendimiento. Se sugirió que usara un algoritmo PID. Leí mucho sobre PID pero estoy un poco confundido con respecto a lo siguiente:

He calculado el error_value usando kpagspagsropagsortyoonorteunal+... Pero con respecto al cambio en la velocidad del motor, estoy confundido sobre qué usar durante la comparación, la diferencia (es decir, la posición actual - punto de ajuste) o el valor de error. Eso es si debería usar

if (difference > 0)
{ //code for changing appropriate motor's speed using error_value }

o

if (error_value > 0)
{ //code for changing appropriate motor's speed using error_value }

También hay algún rango especificado para los valores de las constantes kpags, kyo y kre? Estoy usando un robot diferencial con ruedas para mi seguidor de línea.

También sería feliz si alguien me sugiriera algún otro algoritmo de optimización avanzado para mejorar el robot seguidor de línea.

meteoros
fuente
No estoy seguro de qué terminología está utilizando, pero lo normal en la terminología de los sistemas de control es que su "diferencia" es el valor de error y (por lo que puedo decir) su "valor_error" es el comando de control.
TimWescott
Hola, la variable Kpags, por ejemplo, es su ganancia proporcional. ¿Conoces la teoría del control?
leCrazyEngineer
@leCrazyEngineer No recuerdo la mayor parte de esta pregunta, ya que era como hace 3 años. Tampoco tengo idea sobre la teoría del control. Tal vez los chicos que respondieron tendrían alguna pista.
meteoros

Respuestas:

8

Cuando use un bucle PID para dirigir usando el seguimiento de línea, entonces su punto de ajuste siempre será el mismo. Siempre querrá que la línea esté en la misma posición con respecto al robot, por ejemplo, en el centro de su sensor.

Entonces, si su sensor de línea genera un valor de -1 a 1 con 0 como el centro del sensor, entonces querrá que su punto de ajuste sea cero (y la lectura del sensor y la diferencia serán las mismas). Si su sensor de línea genera un valor de 0 a 10, entonces querrá que su punto de ajuste sea 5 (y la lectura de su sensor y la diferencia serán diferentes).

Debido a que está dirigiendo las ruedas para que giren a diferentes velocidades, para seguir una línea suavemente a una velocidad constante, es probable que desee ajustar las velocidades de ambas ruedas según el error. Por ejemplo, si necesita girar a la izquierda para mantenerse en la línea, reducirá la velocidad de la rueda izquierda y acelerará la rueda derecha. Cuanto más necesite girar, más tendrá que reducir la velocidad de la rueda interior y más tendrá que acelerar la rueda exterior.

Considere la situación en la que necesita girar θ radianes a la izquierda para corregir errores mi y tu velocidad actual es S0 0:

Dirección diferencial

Entonces su rueda izquierda necesita viajar a SL=rθ y su rueda derecha necesita viajar a SR=(r+si)θ.

Para mantener la misma velocidad general S0 0, necesitas S0 0=(r+si/ /2)θ, por lo que la rueda izquierda deberá desplazarse a SL=S0 0-(si/ /2)θ mientras que la rueda derecha deberá viajar a SR=S0 0+(si/ /2)θ.

A medida que su error tiende a cero, las velocidades de cada motor también tenderán hacia el otro. A medida que aumenta el error, también crecerán los diferenciales de velocidad.

Incluso es posible que necesite que su rueda interior gire hacia atrás si su sensor le dice que la línea se curva más apretada que la distancia entre sus ruedas. Sin embargo, estas son complicaciones que puede resolver paso a paso a medida que su control se vuelve más sofisticado.

Además, dado que su error tendrá valores positivos y negativos (para representar el continuo desde fuera de la escala a la izquierda ... demasiado a la izquierda ... en la línea ... demasiado a la derecha ... fuera de la escala, entonces debería nunca es necesario preguntar si ifel error es positivo o negativo, solo debe calcular nuevos valores basados ​​en el valor del error, ya que un valor positivo y un valor negativo deben tener efectos opuestos y simétricos en los motores.

Tenga en cuenta que para el seguimiento de la línea, puede salirse con la suya solo con el término de ganancia proporcional (es decir, dejar los otros términos en cero). La implementación de un término derivado puede permitirle elevar el término de ganancia proporcional más alto para obtener un sistema más receptivo, pero es poco probable que un término integral ayude. El hecho de que si su robot va en la dirección equivocada, el error se agravará significa que sus movimientos físicos actuarán como un término integral de todos modos.

Los valores específicos de P, D y I estarán determinados por la capacidad de respuesta de su sistema. Para obtener consejos generales sobre el ajuste de los parámetros PID, consulte mi respuesta y otras sobre ¿Cuáles son las buenas estrategias para ajustar los bucles PID?

Mark Booth
fuente
de acuerdo con usted "simplemente debe calcular nuevos valores basados ​​en el valor de error, ya que un valor positivo y un valor negativo deben tener efectos opuestos y simétricos en los motores". pero, ¿cómo determino qué motor debería tener efecto en el error?
meteoros del
@AnkitShah Ambos lo hacen. Espero que mi actualización lo explique un poco mejor.
Mark Booth
Gracias @Mark Booth que realmente explicó las cosas. No tengo suficiente representante. en el sitio para votar tu respuesta, pero realmente fue agradable.
meteoros
Me alegro de poder ayudar a @AnkitShah: si edita su pregunta para eliminar parte de la ambigüedad (como si está usando un diferencial o una dirección ackermann), recibirá al menos un voto positivo de mí y posiblemente de otros. No debería llevar mucho tiempo obtener 15 repeticiones si escuchas las sugerencias que hacen las personas.
Mark Booth
Gracias @ Mark ¿Hay algún otro algoritmo que ayude a reducir el error y haga que el bot se mueva más suavemente y siga la línea?
meteoros
3

Es posible que desee consultar esta pregunta sobre cómo ajustar los PID .

Parece que estás confundiendo el papel de erroren este cálculo. La ecuación PID toma la medición del error (posición real - posición deseada) y determina cuánta "respuesta" se debe ordenar en el controlador (por ejemplo, cuánta fuerza).

Entonces, en lugar de decir if (error_value > 0) { }, deberías decir algo como response = get_PID_calculation(error_value). Dependiendo de la construcción de su vehículo específico, esa respuesta se enviaría al motor de accionamiento como la cantidad de aceleración, la dirección como ángulo deseado o alguna otra entrada de control.

Ian
fuente
Este es el enlace a mi código arduino, ¿qué sugieres? www1.datafilehost.com/d/5dcbdd4e
meteoritos del
Eso depende, ¿qué está haciendo mal el robot?
Ian