Dans la continuité de la question que j'ai posée ici: instabilité des quadcoptères avec décollage simple en mode autonome ... Je voudrais poser quelques questions sur l'implémentation d'un PID de base pour un quadrirotor contrôlé par un module APM 2.6. (J'utilise un cadre de 3DRobotics)
J'ai réduit l'ensemble du système de contrôle à seulement deux blocs PID, un pour contrôler le roulis et un autre pour contrôler le tangage (lacet et tout le reste ... j'y penserais plus tard).
Je teste cette configuration sur une plate-forme qui consiste en un faisceau tournant librement, dans lequel j'ai attaché deux des bras du quadrirotor. Les deux autres sont libres de se déplacer. Donc, je teste en fait un degré de liberté (roulis ou tangage) à la fois.
Vérifiez l'image ci-dessous: ici A, B marque le faisceau tournant librement sur lequel l'installation est montée.
Avec un réglage minutieux des paramètres P et D, j'ai réussi à atteindre un vol soutenu d'environ 30 secondes.
Mais par «soutenu», je veux simplement dire un test où le drone ne bascule pas d'un côté. Le vol stable n'est encore nulle part en vue, et plus de 30 secondes de vol semblent également assez difficiles. Il vacille depuis le début. Au moment où il atteint 20 à 25 secondes, il commence à s'incliner d'un côté. En 30 secondes, il s'est incliné d'un côté d'une marge inacceptable. Bientôt, je le trouve à l'envers
Quant au code PID lui-même, je calcule l'erreur proportionnelle à partir d'un «filtre complémentaire» de données gyro + accéléromètre. Le terme intégral est mis à zéro. Le terme P s'élève à environ 0,39 et le terme D à 0,0012. (Je n'utilise pas la bibliothèque PID Arduino à dessein, je veux juste implémenter un de mes propres PID ici.)
Regardez cette vidéo, si vous voulez voir comment cela fonctionne.
http://www.youtube.com/watch?v=LpsNBL8ydBA&feature=youtu.be [Ouais, la configuration est assez ancienne! Je suis d'accord. :)]
Veuillez me faire savoir ce que je pourrais éventuellement faire pour améliorer la stabilité à ce stade.
@Ian: Parmi les nombreux tests que j'ai faits avec ma configuration, j'ai tracé des graphiques pour certains des tests en utilisant la lecture du moniteur série. Voici un exemple de lecture de Roll vs 'Motor1 & Motor2 - PWM input' (les deux moteurs contrôlant le rouleau):
Quant à l'entrée / sortie:
Entrée: valeurs de roulis et de tangage (en degrés), obtenues par une combinaison d'accéléromètre + gyroscope
Sortie: valeurs PWM pour les moteurs, fournies à l'aide de la fonction motor.write () de la bibliothèque de servomoteurs
Résolution
J'ai résolu le problème. Voici comment:
Le nœud du problème résidait dans la façon dont j'ai implémenté le programme Arduino. J'utilisais la fonction write () pour mettre à jour les angles d'asservissement, qui n'acceptent que des étapes entières dans l'argument (ou ne répondent que d'une manière ou d'une autre à une entrée entière, 100 et 100.2 produisent le même résultat). Je l'ai changé en writeMicroseconds () et cela a rendu l'hélicoptère considérablement plus stable.
J'additionnais des RPM sur un moteur tout en maintenant l'autre à une valeur constante. J'ai changé cela pour augmenter le régime d'un moteur tout en diminuant le moteur opposé. Cela garde un peu la poussée horizontale totale inchangée, ce qui pourrait m'aider lorsque j'essaie de maintenir l'altitude verticale sur cette chose.
Je poussais le régime à la limite maximale, c'est pourquoi le quadcopter perdait toujours le contrôle à plein régime. Il n'y avait pas de place pour que le régime augmente quand il détectait une inclinaison.
J'ai observé que l'un des moteurs était intrinsèquement plus faible que l'autre, je ne sais pas pourquoi. J'ai codé en dur un décalage dans l'entrée PWM de ce moteur.
Merci pour tout le support.
Code source:
Si vous êtes intéressé, voici le code source de mon implémentation PID bare-bones: PID Source Code
N'hésitez pas à le tester dans votre matériel. Toute contribution au projet serait la bienvenue.