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 PID
y finalmente escriba ambos valores PWM.
Por ahora SetpointLeft
y en SetpointRight
realidad 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.
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.