Control de motor con PMW o RPM en un robot pesado

3

Voy a intentar explicar mi problema tan claramente como pueda.

He estado construyendo un robot que tiene cuatro ruedas, 2 motores y 2 ruedas libres. Es un sistema de accionamiento 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, según 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;

El error lateral y el error frontal son el resultado de dos PID diferentes. Una para cada eje de un espacio de coordenadas 3D. El frente es error en Z (distancia), el lado es error en X (desviación del centro).

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

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

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 los codificadores. Controlando a través de RPM en lugar de PWM, y teniendo un PID en cada rueda en la placa del controlador del motor. Lo que lleva a otro tema. Latencia Tengo un bucle de 175ms. Teniendo eso en cuenta, ¿cuál es la mejor solución para mí?

    
pregunta Mikea15

3 respuestas

3

Tu segundo problema probablemente esté estrechamente relacionado con el primero. Cuando escriba 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, será difícil o imposible ajustar esos FrontError y SideError controladores PID en combinació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: desarrolle un modelo para poder compensar la diferencia o haga que las ruedas respondan de forma bastante lineal a su entrada. Esta segunda opción es probablemente la mejor y es lo que obtendrás si usas codificadores y controladores PID bien ajustados y separados para cada rueda.

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

    
respondido por el Tom
1

Es probable que tu diseño se pelee solo. 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 cumple con un marco de robot complaciente que 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 luchando o amplificándose entre sí.

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

    
respondido por el SomeEE
0

Formularía el / los controlador / es de PID en un espacio diferente, por ejemplo, "espacio de rumbo" y "espacio de velocidad". Así que 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 usted dice en línea recta, 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 se utilizan normalmente para asegurarse de que el motor funcione a la velocidad que desee.

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

A continuación, 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.

    
respondido por el Jon Watte

Lea otras preguntas en las etiquetas