Enfoque para usar PID para que un robot diferencial conduzca directamente

13

Considere un robot de accionamiento diferencial que tiene dos ruedas motorizadas con un codificador conectado a cada una para recibir retroalimentación. Supongamos que hay una función para cada motor de CC que toma un flotador de -1 a 1 y establece las señales PWM para proporcionar una cantidad proporcional de potencia a ese motor. Desafortunadamente, no todos los motores se crean de la misma manera, por lo que enviar a cada motor la misma señal PWM hace que el robot gire a la izquierda o la derecha. Estoy tratando de pensar en cómo conducir el robot directamente usando los codificadores conectados a cada motor como entrada a un bucle PID.

Así es como lo haría: tomaría la diferencia entre los codificadores izquierdo y derecho, vincularía el error entre algún rango, lo normalizaría para que fuera de [-1, 1] y luego lo mapearía a las potencias del motor 0 a 1. Entonces, si I y D fueran cero, y obtenemos un error de 1 (por lo que el motor izquierdo ha girado mucho más que el motor derecho), entonces el motor izquierdo se establecería en 0 y el motor derecho se establecería en 1 (causando un duro izquierda).

¿Hay algún problema con esto? ¿Cuál es un mejor enfoque?

Robz
fuente

Respuestas:

5

¿Hay algún problema con esto?

El principal problema con esto es que, si bien su solución propuesta corregirá instantáneamente una falta de coincidencia entre el rendimiento de los motores, no corregirá el error acumulado, y mucho menos los errores de posición más complejos, como el error de Abbe (ver más adelante).

¿Cuál es un mejor enfoque?

Hay varias cosas que puede hacer, dependiendo de cuál sea su tolerancia a los errores y cuánto esfuerzo desea poner en corregirlos.

El primer paso sería configurar un par de bucles PID, uno para cada rueda, dándoles a ambos la misma posición de demanda. Como sugerí en mi respuesta a una pregunta similar , si mantiene ambas ruedas dentro de un error muy estricto de donde les pide que estén, entonces tomará algún tiempo acumular un error suficiente para causar un viraje notable.

También será mucho más fácil sintonizar dos bucles PID de nivel de motor nominalmente independientes que sintonizar un único sistema combinado complejo e interdependiente. Para soportar cualquier cambio en el control de nivel superior, realmente necesita que cada motor se comporte de la manera más similar posible al otro motor durante la mayor cantidad de tiempo posible, y eso realmente requiere servo bucles separados.

Sin embargo, hay una serie de complicaciones adicionales, y depende de la precisión que necesite y de cuánto esfuerzo esté dispuesto a hacer para corregirlas en cuanto a la solución que elija. Puede ser que Dead Reckoning sea ​​suficiente, o puede que necesite agregar una determinación de posición relativa o absoluta a su robot.

Un problema es que incluso si las ruedas izquierda y derecha mueven 1000 recuentos de codificador, aún puede terminar en una posición diferente en dos carreras diferentes.

Por ejemplo, supongamos que tiene un error de seguimiento máximo de 10 conteos de codificador, y sus motores están funcionando a una velocidad de 10 conteos de codificador por iteración de bucle PID. Su motor izquierdo podría moverse 5,10,10,10 ... 10,5 mientras que su motor derecho podría tener un perfil de 4,11,10,10 ... 10,5 e incluso esa ligera diferencia en la aceleración al inicio del movimiento podría hacer que el robot se dispare ligeramente en la dirección incorrecta. No solo eso, sino que cuanto más avance en esa dirección, mayor será el error en términos absolutos. De esto es de lo que estamos hablando cuando hablamos del error de Abbe , y sin un modelo cinemático complejo o algún tipo de referencia externa, nunca podrá corregirlo.

Para obtener más información, consulte mi respuesta a una pregunta similar pero no muy duplicada: ¿Cómo puedo usar la biblioteca PID de Arduino para conducir un robot en línea recta? y mi respuesta a la optimización de Line Follower también relacionada

Mark Booth
fuente
2

Tengo un bot con 2 ruedas de accionamiento independiente.

Elegí usar un giroscopio para mantener el rumbo en la dirección deseada, los golpes de deslizamiento e incluso levantarlo y darle la vuelta son de poca importancia ya que solo corregirá su rumbo.

Utilizo un solo PID, que suma / resta una corrección a la velocidad de corriente deseada para cada uno de los 2 motores de acuerdo con el error en el rumbo (dirección) actual según lo determinado por el giroscopio.

Por ejemplo, configuré la velocidad al 50% y el rumbo a 20 grados. esto normalmente conduciría ambos motores al 50% de potencia. pero a medida que el rumbo se desvía, el PID hará ajustes agregando algo de potencia a un motor y quitando algo de potencia del otro, por lo que podría terminar con una división de potencia del 45% / 55% entre los motores a medida que el pid corrige el rumbo.

Sin embargo, los giroscopios tienen sus problemas, incluso con algo de tiempo dedicado a la calibración, todavía encuentro que mi gryo tiene una deriva de aproximadamente 1 grado por minuto. Puede deberse a que la Tierra gira 15 grados por hora, esto también debe considerarse a largo plazo.

Como se indicó anteriormente, los codificadores en las ruedas son una gran idea para saber realmente qué tan lejos ha viajado.

Robert Sutton
fuente
Me encantaría ver tu código para esto. Estoy empezando por el mismo camino con un giroscopio / acelerómetro / magnetómetro, pero todavía estoy en la etapa inicial de tratar de dar sentido a las lecturas de estos sensores.
Ron Smith
Aquí hay un enlace a mi código, me temo que puede no ser fácil de entender. github.com/rlsutton1/piBot/blob/master/src/main/java/au/com/…
Robert Sutton