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.
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):
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:
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.
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.
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.
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.