Ajuste PID Quadcopter

13

En la continuación de la pregunta que hice aquí: inestabilidad de Quadcopter con despegue simple en modo autónomo ... Me gustaría hacer algunas preguntas sobre la implementación de un PID básico para un quadrotor controlado por un módulo APM 2.6. (Estoy usando un marco de 3DRobotics)

He reducido todo el sistema de control a solo dos bloques PID, uno para controlar el balanceo y otro para controlar el tono (guiñada y todo lo demás ... pensaría en ellos más adelante).

Estoy probando esta configuración en una plataforma que consiste en un haz que gira libremente, en el que he atado dos de los brazos del quadrotor. Los otros dos son libres de moverse. Entonces, en realidad estoy probando un grado de libertad (roll o pitch) a la vez.

Verifique la imagen a continuación: aquí A, B marca el haz que gira libremente sobre el cual está montada la configuración. ingrese la descripción de la imagen aquí

Con un ajuste cuidadoso de los parámetros P y D, he logrado alcanzar un vuelo sostenido de aproximadamente 30 segundos.

Pero por 'sostenido', me refiero a una prueba en la que el dron no se cae hacia un lado. El vuelo estable de roca todavía no está a la vista, y más de 30 segundos de vuelo también parece bastante difícil. Se tambalea desde el principio. Para cuando alcanza los 20-25 segundos, comienza a inclinarse hacia un lado. En 30 segundos, se inclinó hacia un lado por un margen inaceptable. Muy pronto, lo encuentro descansando boca abajo

En cuanto al código PID en sí, estoy calculando el error proporcional de un 'filtro complementario' de datos de giroscopio + acelerómetro. El término integral se establece en cero. El término P llega a aproximadamente 0.39 y el término D está en 0.0012. (No estoy usando la biblioteca PID de Arduino a propósito, solo quiero tener uno de mis propios PID implementados aquí).

Mira este video, si quieres ver cómo funciona.

http://www.youtube.com/watch?v=LpsNBL8ydBA&feature=youtu.be [¡Sí, la configuración es bastante antigua! Estoy de acuerdo. :)]

Avíseme qué podría hacer para mejorar la estabilidad en esta etapa.

@ Ian: De las muchas pruebas que hice con mi configuración, tracé gráficos para algunas de las pruebas usando la lectura del monitor en serie. Aquí hay una lectura de muestra de Roll vs 'Motor1 & Motor2 - PWM input' (los dos motores que controlan el rodillo):

Entrada Roll vs Motor PWM

En cuanto a la entrada / salida:

Entrada: valores de balanceo y cabeceo (en grados), obtenidos mediante una combinación de acelerómetro + giroscopio

Salida: valores PWM para los motores, entregados utilizando la función motor.write () de la biblioteca Servo


Resolución

Resolví el problema. Así es cómo:

  1. El quid de la cuestión radica en la forma en que implementé el programa Arduino. Estaba usando la función write () para actualizar los ángulos del servo, que solo acepta pasos enteros en el argumento (o de alguna manera solo responde a la entrada entera, 100 y 100.2 produce el mismo resultado). Lo cambié a writeMicroseconds () y eso hizo que el helicóptero sea considerablemente más estable.

  2. Estaba sumando RPM en un motor mientras mantenía el otro a un valor constante. Cambié esto para aumentar las RPM en un motor mientras disminuía el motor opuesto. Eso mantiene el empuje horizontal total sin cambios, lo que podría ayudarme cuando estoy tratando de mantener la altitud vertical en esta cosa.

  3. Estaba subiendo las RPM al límite máximo, por lo que el quadcopter siguió perdiendo el control a toda velocidad. No había espacio para que aumentaran las RPM cuando detectaba una inclinación.

  4. Observé que uno de los motores era inherentemente más débil que el otro, no sé por qué. Codifiqué un desplazamiento en la entrada PWM de ese motor.

Gracias por todo el apoyo.


Código fuente:

Si está interesado, aquí está el código fuente de mi implementación PID básica: Código fuente PID

Por favor, siéntase libre de probarlo en su hardware. Cualquier contribución al proyecto sería bienvenida.

Metsburg
fuente
1
¿Cuál es la entrada y cuál es la salida del bucle?
Guy Sirton
@GuySirton: Actualicé mi pregunta
metsburg
¿Cuáles son esas secciones planas en los comandos de su motor? Parece que algo está saturando. Desplaza los cambios como una función continua, pero sus comandos se ven muy bruscos. Además, ¿por qué ambos comandos PWM del motor se desplazan hacia arriba mientras su entrada de rollo permanece en lo que parece ser el mismo rango? ¿Cuál es la escala de tiempo aproximada por cierto?
Guy Sirton el
1
La razón por la que está perdiendo el control después de 30 segundos probablemente esté relacionada con el aumento de sus comandos. Creo que estás tratando de controlar la diferencia entre los comandos, pero no puedes permitir que sigan subiendo.
Guy Sirton el
@GuySirton: No están subiendo, lo estoy incrementando hacia arriba desde cero, para que alcance un estado estable particular en 3/4 segundos. Sin embargo, creo que tienes razón cuando dices "la razón por la que estás perdiendo el control después de 30 segundos probablemente esté relacionada con el aumento de tus comandos". Si no uso este incremento gradual, si corrijo mi entrada PWM a un cierto nivel (más bajo que la entrada máxima que se muestra arriba), el problema de perder el control después de 30 segundos desaparece.
Metsburg

Respuestas:

6
  1. Parece que tu ganancia proporcional es demasiado alta.
  2. Parece estar aumentando constantemente las RPM en un motor mientras se bloquea en el otro para hacer que el sistema gire. Esta no es una buena estrategia de control, ya que eventualmente se saturarán y perderás el control. Además, a medida que aumenta el tiempo, disminuye su capacidad para ordenar el sistema. Entonces necesita un mejor modelo del sistema.
  3. Si trata con el n. ° 1 y el n. ° 2, tendrá un sistema más estable, pero es posible que no esté satisfecho con el ancho de banda de control. Para lidiar con eso, debe hacer que su sistema sea más rígido, lo que incluye deshacerse de cualquier retraso en el lado del sensor y en el lado de control de las cosas.
Guy Sirton
fuente
3

Comenzaría leyendo esta pregunta: ¿Cuáles son buenas estrategias para ajustar los bucles PID?

Si tuviera que adivinar, diría que tiene un problema en la forma en que se construye su filtro complementario. Con los motores quadcopter apagados, debe inclinar el cuadro hacia adelante y hacia atrás y ver si los valores de balanceo / inclinación que se informan son realmente precisos.

Para mí, parece que hay un retraso entre la entrada del acelerómetro y la salida de su filtro; la oscilación podría explicarse por reacciones tardías a los datos de entrada. El eventual cambio parece un posible error de integración que se acumula con el tiempo; en otras palabras, mientras su quadcopter está de lado, realmente piensa que está flotando de manera nivelada.

(Actualización) Con respecto a su gráfico, el hecho de que las velocidades de su motor continúen aumentando (en lugar de mantenerse equilibrado) significa que tiene un error en alguna parte. Quizás su término integral esté creciendo sin límites, y debería especificar un máximo razonable para él.

Ian
fuente
Actualicé mi pregunta con los valores del rollo, al inclinarme hacia adelante y hacia atrás. Resolví el eventual cambio bajando mi entrada máxima de PWM. Parece que los valores de corrección no funcionan a RPM muy altas. Puedo girar fácilmente la plataforma con la mano cuando trabajo a altas RPM. A bajas RPM, siento una resistencia considerable y el quadcopter parece oscilar nuevamente a su posición original (lo cual es bueno, supongo). Por lo tanto, el problema de "cambio" probablemente se resuelva reduciendo las RPM (no sé si el dron despegará o no, espero que lo haga). El problema de la oscilación aún persiste.
Metsburg
Si estoy leyendo este gráfico correctamente, su sensor de balanceo piensa que comienza en , oscila y termina alrededor de . Pero en el video, el quadcopter está de lado en . ¿De dónde viene esta discrepancia? - 5 ± 90 35±90
Ian
Bueno, el gráfico no es exactamente para la prueba que se muestra en el video. Como se mencionó anteriormente, el gráfico es de una de las muchas pruebas que hice con esta configuración y no recuerdo exactamente cómo se veía este caso en particular. El gráfico es solo para darle una idea de cómo se comporta la respuesta de entrada vs salida, y también quería establecer que no hay mucho retraso entre la entrada y la salida (dado que el ciclo se ejecuta a más de 150 Hz). Hacer coincidir el video con el gráfico puede no tener mucho sentido. No tengo el conjunto de datos exactos para la prueba en el video.
Metsburg
Me di cuenta de que el gráfico es un poco engañoso, lo siento. Intentaré actualizar el gráfico con uno más preciso. En realidad, como estaba trazando datos desde el puerto serie, cuando creé este gráfico, la placa Arduino estaba atada con la computadora portátil. Después de una cierta oscilación, tuve que intervenir y reducir la oscilación manualmente. Es por eso que lo ves establecerse a - 5 grados, mientras que en realidad es alrededor de 90 grados. Intentaré actualizar un gráfico más preciso más adelante.
Metsburg
Otra cosa que veo en el gráfico es que su empuje combinado siempre está aumentando. Eso parece mal.
Ian
1

Bueno, podría haber una serie de cosas sucediendo aquí ...

1) ¿Son correctos sus ángulos informados? ¿ruidoso? Puede verificarlo fácilmente inclinando manualmente su quad y monitoreando los valores que salen.

2) su propia implementación PID tiene un error. Puede usar la implementación confiable para verificar su código.

3) Atrezzo, motores montados al revés.

4) ...

dm76
fuente
1) He inclinado y verificado los ángulos informados, casi correcto, pero definitivamente ruidoso. 2) muy probable ... de hecho, creo que eso lo resume por completo: P 3) no muy probable, dos en sentido horario, dos en sentido antihorario ... He revisado los accesorios varias veces + Supongo que este tipo de error han resultado en errores salvajes, mucho más allá del control. 4) ....
metsburg
4) ... ¡un ajuste PID incorrecto puede empeorar las cosas si no tuviera un PID!
dm76
Sí, ya veo eso ahora. Voy a trabajar en eso mañana. Mi primer plan es usar la biblioteca PID de confianza y el segundo es cambiar la salida del PID de las señales PWM a la corrección roll.pitch.
Metsburg