Equilibrio de Quadcopter con algoritmo PID

1

Estoy haciendo un proyecto en un quadcopter de auto balanceo con control Autónomo. Estoy usando Arduino Mega 2560 y MPU6050. Obtuve los ángulos de balanceo y cabeceo de MPU6050 sin la ayuda de DMP y apliqué un filtro complementario para omitir el ruido debido a la vibración. También configurado y capaz de ejecutar los motores BLDC con transmisor y receptor Flysky con la ayuda de interrupciones arduino. Ahora, para equilibrar, me estoy centrando en un solo eje (es decir, rodar). 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. Intenté usar solo el valor kp para que, de alguna manera, pueda equilibrar y luego pasar al término ki y kd. Pero desafortunadamente, para Kp en sí, el quadcopter está experimentando una oscilación agresiva y no se está conformando en absoluto.

Algunas de mis consultas son,

  • si un solo bucle PID es suficiente, o si tenemos que agregar otro
  • qué tipo de método de ajuste puedo implementar para encontrar el kp, ki, kd aparte de prueba y error
  • Programé mi ESC para 1000 a 2000 microsegundos. Mi entrada PID los ángulos estarán dentro del rango +/- 180. Si puedo configurar directamente los límites de salida pid para el rango -1000 a 1000 o -180 a 180 o cualquiera otro valor.

El código se puede leer en la url enlace

    
pregunta Anton Kewin

3 respuestas

2

PID no es una herramienta mágica para realizar todas las tareas, sino un método universal de control. Sus oscilaciones probablemente se deben a un ajuste de Kp demasiado alto. Probablemente a su circuito de control le falte alguna parte trivial que sea una ruta de control de avance que ayudaría mucho.

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

Estosdosmundossepuedencombinarmedianteunarutadecontroldeavance.Elcircuitocerradointentarechazarlaperturbación,mientrasquelarutadeavanceseinyectaenlasalidadelcontrolador.Estarutadeavancepuedeserunvalorestáticoyunvalorquecambiadinámicamente.Porejemplo,siconocelavelocidaddelascuchillasdelhelicóptero"a priori", puede ingresar esta información directamente en la salida. Este sería ahora su punto de trabajo como se muestra en las características anteriores.

    
respondido por el Marko Buršič
1

Muchas oscilaciones suelen ser una pista de que Kp es demasiado grande. Intenta reducirlo. De manera más general, debería poder encontrar buenos valores de K siguiendo un algoritmo de ajuste. Hay bastantes, pero el Ziegler – Nichols method es una opción popular.

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

    
respondido por el Jack B
0

Sospecho que el bucle de control se ejecuta a una velocidad insuficiente (el rango de decenas de hercios), que es demasiado lento para adaptarse adecuadamente a la dinámica del quadcopter.

¿Por qué lo creo? Debido a que la biblioteca PID_v1 hace todo con números de punto flotante, que tardan una eternidad (miles de ciclos por operación) para calcular su AVR de 8 bits a 16 MHz y sin la ayuda de una unidad de punto flotante.

El código del controlador MPU6050 en su página de GitHub también se implementa completamente con matemática de punto flotante, incluidas las funciones trigonométricas. Supongo que adaptó dicho código, Mpu6050_Complementery.ino, en una biblioteca (mpu6050.h, no encontrado en github) con pocas modificaciones.

Intente determinar cuántas actualizaciones realiza su 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 del ciclo es el culpable, debe optimizar su código. Sospecho que podría obtener una mejora de cien (o mejor) si se deshace de las matemáticas de coma flotante en general, y realiza la mayor parte de tu procesamiento con enteros de 8 o 16 bits. Utiliza una tabla de búsqueda de seno y coseno también son órdenes de magnitud más rápidas en relación con las funciones de biblioteca estándar lentas pero precisas.

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

    
respondido por el jms

Lea otras preguntas en las etiquetas