Robot equilibrista ¿PID?

Buenos días a todos.

Estoy haciendo desde hace varios meses (discontinuos) un robot equilibrador. Lleva montado: acelerometro, giroscopio, driver de motores por PWM y motores con encoders.

Calculo los grados mediante acelerometro y el girocopio por separado. Los combino mediante un filtro de Kalman y obtengo la medida del angulo de un modo bastante preciso. Los motores entregan mas o menos potencia dependiendo del angulo obtenido mediante la funcion map(). A todo esto, se produce el calculo (ciclo completo) cada 10ms.

En esta configuración, el robot corrige bien las perturbaciones grandes (choque con pared, con la mano, etc).

El problema está en que no consigue quedarse en la misma posición, si no que SIEMPRE se mueve hacia un lado y hacia otro los metros que quiera. No se cae, pero siempre se esta moviendo.

Mi pregunta es: Añadiendo un PID al control de los motores conseguiré esto que estoy hablando? Imagino que sera siguiendo como referencia el angulo y siendo la salida los motores.

Intentare por ahora que se quede quieto mediante los encoders, pero quería tener otra solución.

Cuando vaya para casa os subo unas fotos del bicho.

Un saludo.

EDITO: una fotillo del robot, aun tengo que incorporarle algunas cosas :smiley:

Ante todo indicar que no tengo ninguna experiencia con robots equilibradores pero siempre he creído que era imprescindible usar PID. Con este control puedes utilizar unos parámetros PID altos cuando las desviaciones del robot sean altas y más bajos cuando esté cerca de la posición de equilibrio y conseguir que apenas oscile.

Gracias por contestar.

Eso pensé yo al comenzar el proyecto.

El caso es que el control que tengo de motores es dependiente del angulo de inclinación , con 30 no se mueven motores y 255 van al máximo. Osea, como dices.

Voy modificando los valores, pero para que os hagáis una idea, para Ángulos mayores (o menores) a 0º meto 40 y para 10º meto 150, esto utilizando la función map().

De este modo se comporta mas o menos bien con perturbaciones fuertes, pero no se queda estático. Para ángulos de (supongamos) 2º-3º se mueve a una velocidad que no se inclina en ningún lado pero desplazándose hasta que colisiona con algo XDD.

He estado buscando en otros robots parecidos al mio y es normal implementar el control PID, pero sinceramente aun no lo tengo del todo claro. Se que lo motores van cambiando de dirección y velocidad en relación al angulo (señal a seguir en la realimentación), pero es que es lo que hago yo en estos momentos aunque mas "basto".

Si alguien puede aportar algo se lo agradecería.

Un saludo.

Es imprescindible el uso del PID.

Lo que tu haces manualmente seria solo la componente P (proporcional) del PID, es decir en funcion del angulo acelero mas o menos los motores. Pero te faltan las componentes I (integral) y D (derivada), que lo que hacen es corregir ese impulso de los motores en base a otros factores.

En terminos coloquiales diriamos que impulsan al motor en función de lo inclinado que este el robot, de lo rapido que esté cayendo, y de si con un pequeño impulso se ha pasado o no ha llegado a la vertical.

Como ves esto es mucho mas completo que solo basarse en un angulo.

En el caso que comentas de que con 2º ó 3º, se mueve a una velocidad constante, es porque necesita un poco mas de empujón del que le tenias programado. Esto con un PID bien ajustado, no ocurre porque el detectaria que no esta volviendo a la vertical y meteria mas fuerza a los motores.