¿Cómo puedo usar la biblioteca PID de Arduino para conducir un robot en línea recta?


19

Me gustaría crear un robot basado en Arduino con 2 ruedas, codificadores de cuadratura en cada rueda, un chip controlador de puente H (o controlador de motor) y una rueda. Quiero usar la biblioteca PID para asegurar que la velocidad sea proporcional a la distancia a recorrer.

A nivel conceptual, (suponiendo que los motores no responden de manera idéntica a los niveles PWM), ¿cómo puedo implementar el control PID para que viaje en línea recta y a una velocidad proporcional a la distancia que queda por recorrer?


Esta pregunta también tiene su lugar aquí, ya que se basa específicamente en la biblioteca Arduino PID .
Anindo Ghosh

Respuestas:


18

Detalles específicos

Mirando el ejemplo básico de PID , creo que solo necesita instanciar dos copias del controlador PID, una para cada rueda, codificador y pwm:

PID leftPID(&InputLeft, &OutputLeft, &SetpointLeft,2,5,1, DIRECT);
PID rightPID(&InputRight, &OutputRight, &SetpointRight,2,5,1, DIRECT);

Luego, en su loop()equivalente, simplemente lea ambos codificadores, pase cada valor de codificador al correspondiente PIDy finalmente escriba ambos valores PWM.

Por ahora SetpointLefty en SetpointRightrealidad puede apuntar al mismo valor, pero definirlos por separado de esta manera le permite agregar la capacidad de girar más tarde.

Conceptos

Si bien esto puede funcionar para el caso básico, si es suficiente realmente depende de qué tan precisa necesite que sea su línea recta.

Ajuste de cuentas muerto

Dado que tiene codificadores en cada rueda, si ejecuta dos bucles PID y compara el error de seguimiento de cada rueda , entonces puede calcular su error abbe máximo a lo largo de la distancia, suponiendo que sus ruedas no resbalen. Si ese error es menor que sus requisitos, entonces todo lo que necesita es un ajuste de cuentas .

Sin embargo, si sus ruedas son propensas a deslizarse, es posible que haya ocultado el siguiente error que su sistema de control no puede detectar y necesitará alguna forma de detectar un deslizamiento o calcular la posición independientemente de los codificadores de las ruedas y luego usar un software de nivel superior para corregir exigió posiciones / velocidades de las ruedas para mantener una línea recta.

Determinación de posición relativa

Como sugiere John , es posible que pueda usar un acelerómetro para determinar la posición, pero dada su precisión y el efecto de los errores acumulados con el tiempo, es mejor que use los datos del acelerómetro para detectar y corregir el deslizamiento de la rueda.

En la robótica móvil, las técnicas de filtrado de Kalman se utilizan comúnmente para fusionar los datos de múltiples fuentes, como un acelerómetro y los codificadores de rueda para determinar mejor la posición actual.

Sin embargo, haga lo que haga con la determinación de la posición relativa, con el tiempo la posición en la que cree estar , se alejará de su posición física real.

Determinación de posición absoluta

La única forma de evitar esto es tener un punto de referencia fuera del marco de referencia de su vehículo.

Un roomba, por ejemplo, generalmente usa cálculos muertos para moverse por una habitación, pero cada vez que necesita atracar, busca un rayo de luz infrarroja enviado por el muelle de carga. A medida que el roomba se mueve aleatoriamente a través de ese haz, lo detecta, se bloquea en el haz y lo sigue de regreso a su fuente. En combinación con sus sensores de impacto, puede posicionarse con precisión en los contactos de carga.

Para su robot, puede tener una posición inicial, donde puede regresar y detectar que se encuentra en esa ubicación conocida. En ese momento, sabe exactamente dónde está y puede informar a qué distancia está su posición calculada de su posición real.

Otra opción, si necesita que su robot viaje en línea recta a lo largo de cientos de metros, sería cambiar a una técnica diferente, como agregar un escudo GPS Arduino .

Una combinación de técnicas

En última instancia, según sus requisitos de precisión, es posible que deba usar una combinación de estas técnicas.

Si es posible un haz de guía, puede hacer lo que quiera de forma muy simple con una línea invisible siguiendo la técnica . Si necesita moverse en cualquier línea recta arbitraria en un área restringida, entonces, como el roomba, puede usar un par de vigas guía (en ángulo recto entre sí) para permitirle corregir su posición sintetizada en un eje cartesiano cada vez que el robot pasa uno de los rayos.

Aquí hay muchas opciones, y lo que elijas dependerá de lo que necesites.


1

Si no está utilizando un solo eje para conducir ambas ruedas, las únicas soluciones que puedo ver son agregar un acelerómetro de 3 ejes u otro sensor para detectar la orientación del robot y ajustar las señales a cada motor en consecuencia.


0

Como se dijo anteriormente, comienza diciendo a cada rueda que se mueva a la misma velocidad y luego el PID se asegura de que estén funcionando a esa velocidad. Pero esto NO será perfecto. Debe seguir revisando y corrigiendo errores (1), lea y compare periódicamente los recuentos del codificador de dos ruedas y haga que una rueda avance un poco más rápido si es necesario para que los recuentos sean iguales. y (2) los codificadores NUNCA son perfectos, necesita un acelerómetro y una brújula.

Estás mirando un filtro de Kalman. si desea combinar datos de codificador, brújula y acelerómetro para obtener el rumbo.


0

Este enlace da un buen ejemplo sin dos cálculos PID. También puede implementar imu / compass para medir la ruta recta

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.