3 votos

Control del motor con PMW o RPM en el robot pesado

Voy a intentar 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 accionamiento diferencial.

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

El objetivo de este robot es seguir a algo/alguien. Tengo cámaras que me dan un punto 3D que utilizo para definir una posición, y en base a una consigna, 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 resultados de dos PID diferentes. Uno para cada eje de un espacio de coordenadas 3D. Front es el error en Z ( distancia ), Side es el error en X ( desviación del centro ).

P1: Cuando pruebo los dos PIDs independientemente, si sólo pruebo la corrección frontal, o sólo la corrección lateral, todo funciona. Pero cuando uso los dos PIDs 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 un ordenador, 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 PWM para CADA rueda, para que el robot avance. A veces, en una escala de 0-1023, si pongo 150 PWM a una rueda y 400 a la otra, el robot no gira como mis cálculos predicen que lo haría y va hacia adelante.

Lo que me lleva a mi segunda pregunta.

P2: Cuando se trata de este tipo de robots y de 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 nos lleva a otra cuestión. La latencia. Tengo un bucle de 175ms. Teniendo en cuenta esto, ¿cuál es la mejor solución para mí?

3voto

Wye Puntos 151

Su segundo problema está probablemente 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 la rueda realmente hace, tal vez porque hay una carga inesperada en el robot, entonces va a ser difícil o imposible de 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.

Hay dos soluciones generales: desarrollar un modelo para compensar la diferencia, o hacer que las ruedas respondan de forma bastante lineal a su entrada. Esta segunda opción es probablemente la mejor y es la que obtendrás si utilizas codificadores y controladores PID separados y bien ajustados para cada rueda.

Dependiendo de todas las demás variables implicadas, la latencia puede impedir que su sistema de control sea estable . Un simple controlador PID de dos polos podría no ser capaz de compensarlo adecuadamente, pero si estás experimentando valdría la pena intentarlo, especialmente si puedes arreglar tus transmisiones de rueda.

1voto

SomeEE Puntos 923

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

Cuando sólo funciona un controlador PID, el error lleva a una decisión de control tomada por ese controlador PID que sólo se encuentra con un marco de robot complaciente que lo sigue. Con un segundo PID cada error lleva a ambos PID a tomar decisiones independientes. Ya no se encuentran con un marco de robot complaciente, sino que luchan o se amplifican mutuamente.

Lo único que hay que hacer en este caso es considerar el sistema como un todo utilizando vectores. La función de transferencia de la planta que quieres utilizar tomará dos señales de tensión (x_1(t), x_2(t)) y dará como resultado un vector de posición p(t).

0voto

Van Gale Puntos 387

Yo formularía el/los controlador/es 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 tú dices que lo haga, necesitas algún tipo de sistema de control de bucle cerrado. Normalmente se utilizan codificadores ópticos o magnéticos en las ruedas o en el eje del motor para asegurarse de que el motor funciona a la velocidad deseada.

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, se obtienen los valores reales de salida como:

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

El rumbo es el normal basado en las matemáticas de la derecha, donde mayor es igual a girar a la izquierda.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X