1 votos

Equilibrio del cuadricóptero con el algoritmo PID

Estoy haciendo un proyecto de cuadricóptero autoequilibrado con control autónomo. Estoy utilizando Arduino Mega 2560 y MPU6050. He obtenido los ángulos de balanceo y cabeceo del MPU6050 sin la ayuda de DMP y he aplicado un filtro de complemento para omitir el ruido debido a la vibración. También configuré y pude hacer funcionar los motores BLDC con el transmisor y receptor Flysky con la ayuda de las interrupciones de arduino. Ahora para el equilibrio me estoy centrando en un solo eje (es decir, rollo). También he construido un soporte de equilibrio para el movimiento libre del eje de balanceo por el motor.

Para la parte de control, estoy implementando el algoritmo PID. Traté de usar sólo el valor de kp para que, de alguna manera puedo equilibrar y luego pasar a ki y kd término. Pero, por desgracia, para Kp sí, el quadcopter está experimentando una oscilación agresiva y no se está estableciendo en absoluto.

Algunas de mis preguntas son,

  • si un solo bucle PID es suficiente, o tenemos que añadir otro
  • qué tipo de método de sintonía, puedo implementar, para encontrar el kp, ki, kd que no sea el de prueba y error
  • He programado mi ESC para 1000 a 2000 microsegundos. Mis ángulos de entrada PID de entrada del PID estarán dentro del rango +/- 180. Si puedo programar directamente los límites de salida del pid para el rango -1000 a 1000 o -180 a 180 o cualquier otro valor.

El código puede leer desde la url https://github.com/antonkewin/quadcopter/blob/master/quadpid.ino

0 votos

Su "filtrado complejo" de balanceo y cabeceo podría afectan negativamente al control PID.

0 votos

"Programé mi ESC para 1000 a 2000 microsegundos". La frecuencia estándar (tasa de repetición) para un pulso de servo de 1~2ms es de 50Hz, pero teóricamente podría ser de casi 500Hz (2ms on, >0mS off). Cuanto más rápido puedas enviar los pulsos, más rápido responderá el ESC. ¿Cuál es la mayor frecuencia de servo que puede manejar tu ESC?

1voto

Jack B Puntos 278

Mucha oscilación suele ser un indicio de que Kp está ajustado demasiado grande. Prueba a reducirlo. En general, deberías ser capaz de encontrar buenos valores de K siguiendo un algoritmo de ajuste. Hay bastantes, pero el Método Ziegler-Nichols es una opción popular.

Un bucle PID por eje debería ser suficiente, si se actualiza lo suficientemente rápido y está bien ajustado.

1voto

Marko Buršič Puntos 1524

El PID no es una herramienta mágica para realizar todas las tareas, sino un método universal de control. Sus oscilaciones se deben probablemente a un ajuste de Kp demasiado alto. Probablemente a tu bucle de control le falta alguna parte trivial que es la ruta de control feedforward que ayudaría mucho.

La imagen siguiente representa una característica estática en la que se diferencian dos mundos: la teoría de control de bucle cerrado (ger. Regulierung) y la teoría de bucle abierto (ger. Steuerung) Las letras minúsculas se refieren al bucle cerrado, que se superpone a las características estáticas en el punto de trabajo.

enter image description here

Estos dos mundos pueden combinarse entre sí por medio de la vía de control feedforward. El lazo cerrado trata de rechazar la perturbación, mientras que el camino de alimentación se inyecta a la salida del controlador. Este camino de alimentación puede ser un valor estático así como un valor que cambia dinámicamente. Por ejemplo, si usted conoce la velocidad de las palas del helicóptero "a priori", entonces usted puede alimentar esta información en la salida. Este sería ahora su punto de trabajo como se muestra en las características anteriores.

enter image description here

0voto

Asher M Puntos 11

Sospecho que el bucle de control funciona a una velocidad insuficiente (en el rango de las decenas de hertzios), que es demasiado lenta para adaptarse adecuadamente a la dinámica del cuadricóptero.

¿Por qué lo pienso? Porque el PID_v1 lo hace todo con números de punto flotante, que tardan una eternidad (miles de ciclos por operación) en calcularse en su AVR de 8 bits funcionando a 16 MHz y sin la ayuda de una unidad de punto flotante.

El código del controlador del MPU6050 en su página de GitHub está igualmente implementado por completo con matemáticas de punto flotante, incluyendo funciones trigonométricas. Supongo que has adaptado dicho código, Mpu6050_Complemento.ino, en una biblioteca (mpu6050.h, no se encuentra en github) con pocas modificaciones.

Intenta determinar cuántas actualizaciones realiza tu bucle de control cada segundo. Por ejemplo:

int cycleCounter;
void setup()
{
    cycleCounter = 0;
    ... 
}
void loop()
{
    ... 
    ++cycleCounter;
    if(cycleCounter >= 100)
    {
        Serial.print("time after 100 cycles:");
        Serial.println(millis());
        cycleCounter = 0;
    }
}

Si el tiempo de ciclo es efectivamente el culpable, necesitas optimizar tu código. Sospecho que podrías conseguir una mejora cien veces mayor (o mejor) deshaciéndote de las matemáticas en coma flotante en general, y haciendo la mayor parte de su procesamiento con enteros de 8 o 16 bits. Utilizando un tabla de búsqueda para el seno y el coseno es también órdenes de magnitud más rápido en relación con las lentas pero precisas funciones de la biblioteca estándar.

Una alternativa es cambiar a una placa con un microcontrolador más rápido que tenga soporte de punto flotante por hardware.

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