Bonsoir!
A mes heures perdues je réalise un drone "from scratch" à partir d'un uC de chez ST, le stm32f103 qui est un cortex M3. Il est accompagné de tous les moteurs et les capteurs qui vont bien, c'est-à-dire gyroscope, accéléromètre etc.
Pour ce faire, voici les différentes étapes que j'ai mené:
- j'ai donc récupéré l'attitude (prenons un seul axe en exemple : pitch) de mon drone grâce à un accéléromètre (ADXL345) et gyroscope (ITG3200).
- Je prends une mesure toutes les Dt ms
- Puis je "fusionne" les données des capteurs grâce au filtre Kalman afin d'enlever les problèmes de dérive dans le temps que je rencontrais avec le gyroscope (l'intégrale faussait rapidement la valeur réelle de l'angle (mesure du capteur donnée en °/s à intégrer) et la lenteur de l'adxl345 dont j'effectuais en plus un filtrage passe-bas FIR.
L'oscillogramme suivant présente les données provenant des capteurs ainsi que la sortie du kalman
01.png
Vert : accelero ; fuschia : Gyroscope ; jaune : fusion des données
Le même oscillogramme mais cette fois-ci avec les moteurs qui tournent, l’accéléromètre est bien plus bruité, mais en sortie du kalman (courbe jaune) le bruit est bien filtré
02.jpg
- Je donne cette valeur à mon PID qui possède donc l'erreur précédente, ainsi que la nouvelle erreur obtenue par soustraction avec la consigne
- Les 3 coefficients Kp,Ki,Kd fixés permettent d'obtenir la valeur "control" à partir des calculs du proportionnel, intégrale (simple sommation...) et dérivée
- J'obtiens donc une valeur finale "control = P + I + D" que je viens ajouter à la valeur du PWM d'un de mes moteurs brushless et soustraire au moteur opposé
J'obtiens la courbe suivante qui est le kalman (vert) avec la valeur control (fuschia) obtenue précédemment:
03.jpg
On remarque que dès qu'une rotation a lieu (on n'imagine toujours qu'un seul axe), la valeur de control vient compenser sur les moteurs afin de retrouver la consigne (ici consigne = 0).
Pour vérifier, deux petites pièces grâce à l'imprimante 3D me permettent d'obtenir qu'un seul degré de liberté : un axe de rotation, le pitch.
04.jpg
Mais rien à faire, le drone n'est jamais stable, il devient toujours très rapidement instable.
J'ai beau torturer les coefficients du PID, ça ne va jamais.
Voici quelques détails:
- J'avais fixé la fréquence d’échantillonnage à 100 Hz et je suis passé à 400 Hz en me disant que ça lui permettrait d'être plus réactif
- pas de FPU sur le cortex M3 mais je me suis assuré que j'avais le temps de récupérer les valeurs des capteurs et de faire les calculs avec la fréquence d’échantillonnage correspondante
- J'ai ajouté la batterie à sa place bien que je ne m'en serve pas
- je ne pense pas que les forces exercées par les câbles sur le côté ainsi que la board sur un bras aient un impact
- Les forces de frottements par le contact entre les 2 pièces jaunes et la barre métalliques sont vraiment faibles, ça reste subjectif mais je ne pense pas qu'il y ait d'impact là-dessus non plus.
Je désespère un peu..Avez vous une idée d'où peut venir le problème?
Merci!
-----