Control de motores con PMW o RPM en robots pesados

Voy a tratar de explicar mi problema lo más claramente posible.

He estado construyendo un robot que tiene cuatro ruedas, 2 motores y 2 ruedas libres. Es un sistema de transmisión diferencial.

O --- O Motor Wheels
|     |
-o---o- Free Wheels.

El objetivo de este robot es seguir algo/alguien. Tengo cámaras que me dan un punto 3D que utilizo para definir una posición y, en función de un punto de ajuste, corrijo el error frontal y el error lateral con dos controladores PID.

1 - Los cálculos básicos para ajustar el robot son

Left Wheel = ( FrontError - SideError ) * Acceleration;
Right Wheel = ( FrontError + SideError ) * Acceleration;

Side Error y Front Error son resultados de dos PID diferentes. Uno para cada eje de un espacio de coordenadas 3D. El frente es un error en Z (distancia), el lado es un error en X (desviación del centro).

P1: Cuando pruebo los dos PID de forma independiente, si solo pruebo la corrección frontal o solo la corrección lateral, todo funciona. Pero cuando uso los dos PID pierdo el control del robot. ¿Alguna idea de por qué? A mayor velocidad, menos control tengo.

2 - Estoy controlando esto a través de un software en una computadora y enviando esos valores a una placa que controla los motores. Lo que estoy enviando son valores PWM. Mi problema es: como dos motores nunca son iguales, y dependiendo de la carga/peso que tenga el robot encima, necesito diferentes valores de PWM para CADA rueda, para que el robot avance. A veces, en una escala de 0 a 1023, si configuro 150 PWM en una rueda y 400 en la otra rueda, el robot no gira como predicen mis cálculos que girará y seguirá adelante.

Llevando a mi segunda pregunta.

P2: Cuando se trata de este tipo de robots y control. ¿Cuál es la mejor manera de resolver este problema? Estoy pensando en codificadores. Controlar a través de RPM en lugar de PWM y tener un PID en cada rueda en la placa del controlador del motor. Lo que lleva a otro problema. Latencia. Tengo un bucle de 175ms. Teniendo eso en cuenta, ¿cuál es la mejor solución para mí?

La latencia de 175ms es enorme; deberías ser capaz de reducir eso mucho. No puede agregar la salida de los controladores PID, como descubrió: el algoritmo asume que tiene control directo de una variable.
De acuerdo, controlamos 3 motores en un ciclo de interrupción de 1 ms con un micro de rango medio de 32 bits. Sin embargo, ir demasiado rápido puede hacer que el lazo PID se vuelva inestable, recorrer el lazo más lento puede tener el efecto de suavizar los errores transitorios o de alta frecuencia y calmar las cosas.
Lo siento, no me aclaré. Quería decir que mi bucle principal está fijo en 175 ms. Es decir, estoy haciendo todos mis cálculos a esa tasa fija. Estoy recuperando información de la imagen, obteniendo las posiciones de los usuarios y luego, calculo los PID en ese intervalo, luego envío la velocidad a la placa de control del motor.

Respuestas (3)

Su segundo problema probablemente esté estrechamente relacionado con el primero. Cuando escribes el cálculo:

Left Wheel = ( FrontError - SideError ) * Acceleration

lo que realmente quieres decir es:

Left Motor Input = ( FrontError - SideError ) * Acceleration

Si hay una diferencia significativa entre la entrada al motor y lo que realmente hace la rueda, tal vez porque hay una carga inesperada en el robot, entonces será difícil o imposible ajustar esos controladores y los PID FrontErroren SideErrorcombinación. Si la respuesta de la rueda no es lineal, no puede simplemente sumar dos salidas PID y esperar que ambas funcionen a la vez.

Aquí tiene dos soluciones generales: desarrollar un modelo para que pueda compensar la diferencia o hacerlo de modo que las ruedas respondan de manera bastante lineal a su entrada. Esta segunda opción es probablemente la mejor y es lo que obtendrá si usa codificadores y controladores PID separados bien ajustados para cada rueda.

Dependiendo de todas las demás variables involucradas, la latencia puede impedir que su sistema de control sea estable . Es posible que un controlador PID de dos polos simple no pueda compensarlo adecuadamente, pero si está experimentando, valdría la pena intentarlo, especialmente si puede arreglar sus ruedas motrices.

¿La vida es un filtro de Kalman? :-)

Es probable que su diseño esté luchando contra sí mismo. Tan pronto como habilite el segundo controlador PID, su función de transferencia para el primer PID cambiará drásticamente.

Cuando solo un controlador PID está funcionando, el error conduce a una decisión de control tomada por ese controlador PID que solo se cumple con un marco de robot complaciente que lo sigue. Con un segundo PID, cada error conduce a que ambos PID tomen decisiones independientes. Ya no se encuentran con un marco de robot complaciente, están peleando o ampliándose entre sí.

Todo lo que necesitas hacer en este caso es considerar el sistema como un todo usando vectores. La función de transferencia de planta que desea usar tomará dos señales de voltaje (x_1(t), x_2(t)) y generará un vector de posición p(t).

Formularía los controladores PID en un espacio diferente, por ejemplo, "espacio de rumbo" y "espacio de velocidad". Entonces, hay un controlador PID que "apunta" hacia el punto y otro controlador PID que "conduce" hacia el punto. De esta manera, son ortogonales y no lucharán entre sí.

Además, para que el robot se mueva en línea recta cuando dice recto, necesita algún tipo de sistema de control de circuito cerrado. Los codificadores ópticos o magnéticos en las ruedas o en el eje del motor generalmente se usan para asegurarse de que el motor funcione a la velocidad que desea.

La parte P de los controladores PID sería:

Delta Heading = (Desired Heading - Current Heading); // plus PID control
Delta Position = (Current Distance - Desired Distance); // plus PID control

Luego deriva los valores de salida reales como:

Output Right = Delta Position + Delta Heading;
Output Left = Delta Position - Delta Heading;

El encabezado es el encabezado normal basado en matemáticas para diestros, donde más grande equivale a girar a la izquierda.