Table des matières:

Tutoriel accéléromètre et gyroscope : 3 étapes
Tutoriel accéléromètre et gyroscope : 3 étapes

Vidéo: Tutoriel accéléromètre et gyroscope : 3 étapes

Vidéo: Tutoriel accéléromètre et gyroscope : 3 étapes
Vidéo: Anatomie d'un accéléromètre numérique 2024, Juillet
Anonim
Tutoriel accéléromètre et gyroscope
Tutoriel accéléromètre et gyroscope

introduction

Ce guide est destiné à tous ceux qui souhaitent utiliser des accéléromètres et des gyroscopes ainsi que des dispositifs combinés IMU (unité de mesure inertielle) dans leurs projets électroniques.

Nous couvrirons:

  • Que mesure un accéléromètre ?
  • Que mesure un gyroscope (alias gyroscope) ?
  • Comment convertir les lectures analogiques-numériques (ADC) que vous obtenez de ces capteurs en unités physiques (celles-ci seraient g pour l'accéléromètre, deg/s pour le gyroscope)
  • Comment combiner les lectures de l'accéléromètre et du gyroscope afin d'obtenir des informations précises sur l'inclinaison de votre appareil par rapport au plan du sol

Tout au long de l'article, je vais essayer de garder les mathématiques au minimum. Si vous savez ce que sont les sinus/cosinus/tangentes, vous devriez être en mesure de comprendre et d'utiliser ces idées dans votre projet, quelle que soit la plate-forme que vous utilisez: Arduino, Propeller, Basic Stamp, puces Atmel, Microchip PIC, etc.

Il y a des gens qui pensent que vous avez besoin de mathématiques complexes pour utiliser une unité IMU (filtres FIR ou IIR complexes tels que les filtres de Kalman, les filtres Parks-McClellan, etc.). Vous pouvez rechercher tout cela et obtenir des résultats merveilleux mais complexes. Ma façon d'expliquer les choses ne nécessite que des mathématiques de base. Je suis un grand partisan de la simplicité. Je pense qu'un système simple est plus facile à contrôler et à surveiller, en plus de nombreux appareils embarqués n'ont pas la puissance et les ressources nécessaires pour mettre en œuvre des algorithmes complexes nécessitant des calculs matriciels.

Je vais utiliser comme exemple une nouvelle unité IMU, l'accéléromètre Acc_Gyro + Gyro IMU. Nous utiliserons les paramètres de cet appareil dans nos exemples ci-dessous. Cette unité est un bon appareil pour commencer car elle se compose de 2 appareils:

- LIS331AL (fiche technique) - un accéléromètre triaxial 2G - LPR550AL (fiche technique) - un gyroscope à deux axes tangage et roulis, 500 deg/sec

Ensemble, ils représentent une unité de mesure inertielle à 5 degrés de liberté. C'est un nom de fantaisie ! Néanmoins, derrière le nom de fantaisie se cache un appareil combiné très utile que nous couvrirons et expliquerons en détail dans ce guide.

Étape 1: L'accéléromètre

L'accéléromètre
L'accéléromètre

Pour comprendre cette unité, nous allons commencer par l'accéléromètre. Lorsqu'on pense aux accéléromètres, il est souvent utile d'imaginer une boîte en forme de cube avec une boule à l'intérieur. Vous pouvez imaginer autre chose comme un cookie ou un beignet, mais j'imagine une boule:

modèle d'accéléromètre
modèle d'accéléromètre

Si nous prenons cette boîte dans un endroit sans champs de gravitation ou d'ailleurs sans autres champs qui pourraient affecter la position de la balle - la balle flottera simplement au milieu de la boîte. Vous pouvez imaginer que la boîte se trouve dans l'espace extra-atmosphérique, très loin de tout corps cosmique, ou si un tel endroit est difficile à trouver, imaginez au moins un vaisseau spatial en orbite autour de la planète où tout est en état d'apesanteur. D'après l'image ci-dessus, vous pouvez voir que nous attribuons à chaque axe une paire de murs (nous avons supprimé le mur Y+ pour pouvoir regarder à l'intérieur de la boîte). Imaginez que chaque mur est sensible à la pression. Si nous déplaçons brusquement la boîte vers la gauche (nous l'accélérons avec une accélération de 1g = 9.8m/s^2), la balle heurtera le mur X-. Nous mesurons ensuite la force de pression que la balle applique sur le mur et obtenons une valeur de -1g sur l'axe X.

modèle d'accéléromètre
modèle d'accéléromètre

Veuillez noter que l'accéléromètre détectera en fait une force dirigée dans la direction opposée au vecteur d'accélération. Cette force est souvent appelée force d'inertie ou force fictive. Une chose que vous devriez apprendre de ceci est qu'un accéléromètre mesure l'accélération indirectement à travers une force qui est appliquée à l'un de ses murs (selon notre modèle, il peut s'agir d'un ressort ou d'autre chose dans les accéléromètres réels). Cette force peut être causée par l'accélération, mais comme nous le verrons dans l'exemple suivant, elle n'est pas toujours causée par l'accélération.

Si nous prenons notre modèle et le posons sur Terre, la balle tombera sur le mur en Z et appliquera une force de 1g sur le mur du bas, comme le montre l'image ci-dessous:

modèle d'accéléromètre
modèle d'accéléromètre

Dans ce cas, la boîte ne bouge pas mais nous obtenons toujours une lecture de -1g sur l'axe Z. La pression que la balle a appliquée sur le mur a été causée par une force de gravitation. En théorie, cela pourrait être un type de force différent - par exemple, si vous imaginez que notre balle est métallique, placer un aimant à côté de la boîte pourrait déplacer la balle pour qu'elle heurte un autre mur. Cela a été dit juste pour prouver que l'accéléromètre mesure essentiellement la force et non l'accélération. Il arrive juste que l'accélération provoque une force d'inertie qui est captée par le mécanisme de détection de force de l'accéléromètre.

Bien que ce modèle ne corresponde pas exactement à la façon dont un capteur MEMS est construit, il est souvent utile pour résoudre les problèmes liés à l'accéléromètre. Il existe en fait des capteurs similaires contenant des billes métalliques à l'intérieur, ils sont appelés interrupteurs d'inclinaison, mais ils sont plus primitifs et ne peuvent généralement dire que si l'appareil est incliné dans une certaine plage ou non, pas l'étendue de l'inclinaison.

Jusqu'à présent, nous avons analysé la sortie de l'accéléromètre sur un seul axe et c'est tout ce que vous obtiendrez avec un accéléromètre à axe unique. La vraie valeur des accéléromètres triaxiaux vient du fait qu'ils peuvent détecter les forces d'inertie sur les trois axes. Revenons à notre modèle de boîte et faisons pivoter la boîte de 45 degrés vers la droite. La balle va maintenant toucher 2 murs: Z- et X- comme le montre l'image ci-dessous:

modèle d'accéléromètre
modèle d'accéléromètre

Les valeurs de 0,71 ne sont pas arbitraires, elles sont en fait une approximation pour SQRT(1/2). Cela deviendra plus clair lorsque nous présenterons notre prochain modèle d'accéléromètre.

Dans le modèle précédent, nous avons fixé la force de gravitation et fait pivoter notre boîte imaginaire. Dans les 2 derniers exemples, nous avons analysé la sortie dans 2 positions de boîte différentes, tandis que le vecteur de force est resté constant. Bien que cela ait été utile pour comprendre comment l'accéléromètre interagit avec les forces extérieures, il est plus pratique d'effectuer des calculs si nous fixons le système de coordonnées aux axes de l'accéléromètre et imaginons que le vecteur de force tourne autour de nous.

modèle d'accéléromètre
modèle d'accéléromètre

S'il vous plaît jeter un oeil au modèle ci-dessus, j'ai conservé les couleurs des axes afin que vous puissiez faire une transition mentale du modèle précédent au nouveau. Imaginez simplement que chaque axe du nouveau modèle soit perpendiculaire aux faces respectives de la boîte du modèle précédent. Le vecteur R est le vecteur de force que l'accéléromètre mesure (il peut s'agir de la force de gravitation ou de la force d'inertie des exemples ci-dessus ou d'une combinaison des deux). Rx, Ry, Rz sont des projections du vecteur R sur les axes X, Y, Z. Veuillez noter la relation suivante:

R^2 = Rx^2 + Ry^2 + Rz^2 (Éq. 1)

qui est fondamentalement l'équivalent du théorème de Pythagore en 3D.

Rappelez-vous qu'un peu plus tôt je vous ai dit que les valeurs de SQRT(1/2) ~ 0.71 ne sont pas aléatoires. Si vous les branchez dans la formule ci-dessus, après avoir rappelé que notre force de gravitation était de 1 g nous pouvons vérifier que:

1^2 = (-SQRT(1/2))^2 + 0 ^2 + (-SQRT(1/2))^2

simplement en substituant R=1, Rx = -SQRT(1/2), Ry = 0, Rz = -SQRT(1/2) dans l'Eq.1

Après un long préambule théorique, nous nous rapprochons des accéléromètres réels. Les valeurs Rx, Ry, Rz sont en fait liées linéairement aux valeurs que votre accéléromètre réel produira et que vous pouvez utiliser pour effectuer divers calculs.

Avant d'y arriver, parlons un peu de la façon dont les accéléromètres nous fourniront ces informations. La plupart des accéléromètres se divisent en deux catégories: numériques et analogiques. Les accéléromètres numériques vous donneront des informations à l'aide d'un protocole série comme I2C, SPI ou USART, tandis que les accéléromètres analogiques fourniront un niveau de tension dans une plage prédéfinie que vous devrez convertir en valeur numérique à l'aide d'un module ADC (convertisseur analogique-numérique). Je n'entrerai pas dans les détails sur le fonctionnement de l'ADC, en partie parce que c'est un sujet tellement vaste et en partie parce qu'il est différent d'une plate-forme à l'autre. Certains microcontrôleurs auront des modules ADC intégrés, certains d'entre eux auront besoin de composants externes pour effectuer les conversions ADC. Quel que soit le type de module ADC que vous utilisez, vous vous retrouverez avec une valeur dans une certaine plage. Par exemple, un module ADC 10 bits produira une valeur comprise entre 0 et 1023, notez que 1023 = 2^10 -1. Un module ADC 12 bits produira une valeur comprise entre 0 et 4095, notez que 4095 = 2^12-1.

Passons en considérant un exemple simple, supposons que notre module ADC 10 bits nous ait donné les valeurs suivantes pour les trois canaux (axes) de l'accéléromètre:

AdcRx = 586 AdcRy = 630 AdcRz = 561

Chaque module ADC aura une tension de référence, supposons dans notre exemple qu'elle soit de 3,3V. Pour convertir une valeur adc de 10 bits en tension, nous utilisons la formule suivante:

VoltsRx = AdcRx * Vref / 1023

Une note rapide ici: que pour l'ADC 8 bits, le dernier diviseur serait 255 = 2 ^ 8 -1, et pour l'ADC 12 bits, le dernier diviseur serait 4095 = 2 ^ 12 -1.

En appliquant cette formule aux 3 canaux, nous obtenons:

VoltsRx = 586 * 3,3V / 1023 =~ 1,89V (nous arrondissons tous les résultats à 2 décimales) VoltsRy = 630 * 3,3V / 1023 =~ 2,03V VoltsRz = 561 * 3,3V / 1023 =~ 1,81V

Chaque accéléromètre a un niveau de tension de zéro-g, vous pouvez le trouver dans les spécifications, c'est la tension qui correspond à 0g. Pour obtenir une valeur de tension signée, nous devons calculer le décalage à partir de ce niveau. Disons que notre niveau de tension 0g est VzeroG = 1,65V. Nous calculons les décalages de tension à partir de la tension zéro-g comme suit:

DeltaVoltsRx = 1,89V - 1,65V = 0,24V DeltaVoltsRy = 2,03V - 1,65V = 0,38V DeltaVoltsRz = 1,81V - 1,65V = 0,16V

Nous avons maintenant nos lectures d'accéléromètre en Volts, ce n'est toujours pas en g (9,8 m/s^2), pour faire la conversion finale nous appliquons la sensibilité de l'accéléromètre, généralement exprimée en mV/g. Disons que notre sensibilité = 478.5mV/g = 0.4785V/g. Les valeurs de sensibilité peuvent être trouvées dans les spécifications de l'accéléromètre. Pour obtenir les valeurs de force finales exprimées en g, nous utilisons la formule suivante:

Rx = DeltaVoltsRx / Sensibilité

Rx = 0.24V / 0.4785V/g =~ 0.5g Ry = 0.38V / 0.4785V/g =~ 0.79g Rz = 0.16V / 0.4785V/g =~ 0.33g

Nous pourrions bien sûr combiner toutes les étapes dans une seule formule, mais j'ai parcouru toutes les étapes pour expliquer clairement comment vous passez des lectures ADC à une composante de vecteur de force exprimée en g.

Rx = (AdcRx * Vref / 1023 - VzeroG) / Sensibilité (Eq.2) Ry = (AdcRy * Vref / 1023 - VzeroG) / Sensibilité Rz = (AdcRz * Vref / 1023 - VzeroG) / Sensibilité

Nous avons maintenant les 3 composants qui définissent notre vecteur de force d'inertie, si l'appareil n'est pas soumis à d'autres forces que la gravitation, nous pouvons supposer qu'il s'agit de la direction de notre vecteur de force de gravitation. Si vous souhaitez calculer l'inclinaison de l'appareil par rapport au sol, vous pouvez calculer l'angle entre ce vecteur et l'axe Z. Si vous êtes également intéressé par la direction d'inclinaison par axe, vous pouvez diviser ce résultat en 2 composantes: l'inclinaison sur les axes X et Y qui peut être calculée comme l'angle entre le vecteur de gravitation et les axes X/Y. Le calcul de ces angles est plus simple que vous ne le pensez, maintenant que nous avons calculé les valeurs de Rx, Ry et Rz. Revenons à notre dernier modèle d'accéléromètre et faisons quelques notations supplémentaires:

Image
Image

Les angles qui nous intéressent sont les angles entre les axes X, Y, Z et le vecteur de force R. Nous définirons ces angles comme Axr, Ayr, Azr. Vous pouvez remarquer à partir du triangle rectangle formé par R et Rx que:

cos(Axr) = Rx / R, et de même: cos(Ayr) = Ry / R cos(Azr) = Rz / R

On peut déduire de l'équation 1 que R = SQRT(Rx^2 + Ry^2 + Rz^2).

Nous pouvons maintenant trouver nos angles en utilisant la fonction arccos() (la fonction inverse cos()):

Axr = arccos(Rx/R) Ayr = arccos(Ry/R) Azr = arccos(Rz/R)

Nous avons parcouru un long chemin pour expliquer le modèle de l'accéléromètre, juste pour arriver à ces formules. En fonction de vos applications, vous souhaiterez peut-être utiliser les formules intermédiaires que nous avons dérivées. Nous présenterons également bientôt le modèle de gyroscope et nous verrons comment les données d'accéléromètre et de gyroscope peuvent être combinées pour fournir des estimations d'inclinaison encore plus précises.

Mais avant cela, faisons quelques notations plus utiles:

cosX = cos(Axr) = Rx / R cosy = cos(Ayr) = Ry / R cosZ = cos(Azr) = Rz / R

Ce triplet est souvent appelé Cosinus de direction, et il représente essentiellement le vecteur unitaire (vecteur de longueur 1) qui a la même direction que notre vecteur R. Vous pouvez facilement vérifier que:

SQRT(cosX^2 + cosY^2 + cosZ^2) = 1

C'est une propriété intéressante car elle nous dispense de surveiller le module (longueur) du vecteur R. Souvent, si nous nous intéressons uniquement à la direction de notre vecteur inertiel, il est logique de normaliser son module afin de simplifier les autres calculs.

Étape 2: Gyroscope

Gyroscope
Gyroscope

Nous n'allons pas introduire de modèle de boîte équivalent pour le gyroscope comme nous l'avons fait pour l'accéléromètre, au lieu de cela, nous allons passer directement au deuxième modèle d'accéléromètre et nous montrerons ce que le gyroscope mesure selon ce modèle.

Image
Image

Chaque canal du gyroscope mesure la rotation autour d'un des axes. Par exemple, un gyroscope à 2 axes mesurera la rotation autour (ou certains diront "à propos") des axes X et Y. Pour exprimer cette rotation en nombres faisons quelques notations. Définissons d'abord:

Rxz - est la projection du vecteur de force d'inertie R sur le plan XZ Ryz - est la projection du vecteur de force d'inertie R sur le plan YZ

Du triangle rectangle formé par Rxz et Rz, en utilisant le théorème de Pythagore, nous obtenons:

Rxz^2 = Rx^2 + Rz^2, et de même: Ryz^2 = Ry^2 + Rz^2

notez également que:

R^2 = Rxz^2 + Ry^2, cela peut être dérivé des équations Eq.1 et ci-dessus, ou il peut être dérivé du triangle rectangle formé par R et Ryz R^2 = Ryz^2 + Rx^2

Nous n'allons pas utiliser ces formules dans cet article mais il est utile de noter la relation entre toutes les valeurs de notre modèle.

Au lieu de cela, nous allons définir l'angle entre l'axe Z et les vecteurs Rxz, Ryz comme suit:

Axz - est l'angle entre le Rxz (projection de R sur le plan XZ) et l'axe Z Ayz - est l'angle entre le Ryz (projection de R sur le plan YZ) et l'axe Z

Maintenant, nous nous rapprochons de ce que mesure le gyroscope. Le gyroscope mesure le taux de changements des angles définis ci-dessus. En d'autres termes, il produira une valeur qui est linéairement liée au taux de changement de ces angles. Pour expliquer cela, supposons que nous ayons mesuré l'angle de rotation autour de l'axe Y (ce serait l'angle Axz) à l'instant t0, et nous le définissons comme Axz0, ensuite nous avons mesuré cet angle à un instant ultérieur t1 et c'était Axz1. Le taux de variation sera calculé comme suit:

TauxAxz = (Axz1 - Axz0) / (t1 - t0).

Si nous exprimons Axz en degrés et le temps en secondes, alors cette valeur sera exprimée en deg/s. C'est ce que mesure un gyroscope.

En pratique un gyroscope (sauf s'il s'agit d'un gyroscope numérique spécial) vous donnera rarement une valeur exprimée en deg/s. Comme pour l'accéléromètre, vous obtiendrez une valeur ADC que vous devrez convertir en degrés/s en utilisant une formule similaire à l'équation. 2 que nous avons défini pour l'accéléromètre. Présentons la formule de conversion de l'ADC en deg/s pour le gyroscope (nous supposons que nous utilisons un module ADC 10 bits, pour l'ADC 8 bits, remplacez 1023 par 255, pour l'ADC 12 bits, remplacez 1023 par 4095).

RateAxz = (AdcGyroXZ * Vref / 1023 - VzeroRate) / Sensibilité Eq.3 RateAyz = (AdcGyroYZ * Vref / 1023 - VzeroTate) / Sensibilité

AdcGyroXZ, AdcGyroYZ - sont obtenus à partir de notre module adc et ils représentent les canaux qui mesurent la rotation de la projection du vecteur R dans XZ respectivement dans les plans YZ, ce qui équivaut à dire que la rotation a été effectuée autour des axes Y et X respectivement.

Vref - est la tension de référence ADC que nous utiliserons 3,3V dans l'exemple ci-dessous VzeroRate - est la tension à taux zéro, en d'autres termes la tension que le gyroscope délivre lorsqu'il n'est soumis à aucune rotation, pour la carte Acc_Gyro c'est par exemple 1.23V (vous pouvez trouver ces valeurs dans les spécifications) Sensibilité - est la sensibilité de votre gyroscope, elle est exprimée en mV / (deg / s) souvent écrite en mV/deg/s, elle vous indique essentiellement combien de mV seront la sortie du gyroscope augmente si vous augmentez la vitesse de rotation d'un degré/s. La sensibilité de la carte Acc_Gyro est par exemple de 2mV/deg/s ou 0.002V/deg/s

Prenons un exemple, supposons que notre module ADC renvoie les valeurs suivantes:

AdcGyroXZ = 571 AdcGyroXZ = 323

En utilisant la formule ci-dessus et en utilisant les paramètres de spécifications de la carte Acc_Gyro, nous obtiendrons:

RateAxz = (571 * 3,3V / 1023 - 1,23V) / (0,002V/deg/s) =~ 306 deg/s RateAyz = (323 * 3,3V / 1023 - 1,23V) / (0,002V/deg/s) =~ -94 degrés/s

En d'autres termes, l'appareil tourne autour de l'axe Y (ou on peut dire qu'il tourne dans le plan XZ) avec une vitesse de 306 deg/s et autour de l'axe X (ou on peut dire qu'il tourne dans le plan YZ) avec une vitesse de - 94 degrés/s. Veuillez noter que le signe négatif signifie que l'appareil tourne dans le sens inverse du sens positif conventionnel. Par convention un sens de rotation est positif. Une bonne fiche technique du gyroscope vous montrera quelle direction est positive, sinon vous devrez la trouver en expérimentant avec l'appareil et en notant quel sens de rotation entraîne une augmentation de la tension sur la broche de sortie. Il est préférable d'utiliser un oscilloscope car dès que vous arrêtez la rotation, la tension retombe au niveau zéro. Si vous utilisez un multimètre, vous devrez maintenir un taux de rotation constant pendant au moins quelques secondes et noter la tension pendant cette rotation, puis la comparer avec la tension à taux zéro. Si elle est supérieure à la tension à taux zéro, cela signifie que le sens de rotation est positif.

Étape 3: Combiner l'accéléromètre et le gyroscope

Combiner l'accéléromètre et le gyroscope
Combiner l'accéléromètre et le gyroscope

Tout mettre ensemble - Combiner les données d'accéléromètre et de gyroscope

Si vous lisez cet article, vous avez probablement acquis ou envisagez d'acquérir un appareil IMU, ou vous envisagez probablement d'en construire un à partir d'accéléromètres et de gyroscopes distincts.

La première étape de l'utilisation d'un dispositif IMU combiné qui combine un accéléromètre et un gyroscope consiste à aligner leurs systèmes de coordonnées. La façon la plus simple de le faire est de choisir le système de coordonnées de l'accéléromètre comme système de coordonnées de référence. La plupart des fiches techniques des accéléromètres affichent la direction des axes X, Y, Z par rapport à l'image de la puce ou du périphérique physique. Par exemple voici les directions des axes X, Y, Z comme indiqué dans les spécifications de la carte Acc_Gyro:

acc_gyro axes
acc_gyro axes

Les prochaines étapes sont:

Identifiez les sorties du gyroscope qui correspondent aux valeurs RateAxz, RateAyz discutées ci-dessus. Déterminez si ces sorties doivent être inversées en raison de la position physique du gyroscope par rapport à l'accéléromètre

Ne supposez pas que si un gyroscope a une sortie marquée X ou Y, elle correspondra à n'importe quel axe du système de coordonnées de l'accéléromètre, même si cette sortie fait partie d'une unité IMU. Le meilleur moyen est de le tester. En supposant que vous ayez fixé la position du gyroscope par rapport à l'accéléromètre. On suppose que les frontières du gyroscope et de l'accéléromètre sont parallèles, c'est-à-dire que vous placez le gyroscope à un angle multiple de 90 degrés par rapport à la puce de l'accéléromètre. Si vous avez acquis une carte IMU, il y a de fortes chances qu'elles soient déjà alignées de cette façon. Nous n'allons pas discuter dans cet article des modèles où le gyroscope est placé à un angle irrégulier par rapport à l'accéléromètre (disons 45 ou 30 degrés), bien que cela puisse être utile dans certaines applications.

Voici un exemple de séquence pour déterminer quelle sortie du gyroscope correspond à la valeur RateAxz décrite ci-dessus.

- commencer par placer l'appareil en position horizontale. Les sorties X et Y de l'accéléromètre produiraient la tension zéro-g (par exemple, pour la carte Acc_Gyro, il s'agit de 1,65 V)

- commencez ensuite à faire pivoter l'appareil autour de l'axe Y, une autre façon de dire que vous faites pivoter l'appareil dans le plan XZ, de sorte que les sorties des accéléromètres X et Z changent et que la sortie Y reste constante. - lors de la rotation de l'appareil à vitesse constante, notez quelle sortie du gyroscope change, les autres sorties du gyroscope doivent rester constantes - la sortie du gyroscope qui a changé pendant la rotation autour de l'axe Y (rotation dans le plan XZ) fournira la valeur d'entrée pour AdcGyroXZ, à partir de laquelle nous calculons RateAxz - la dernière étape consiste à s'assurer que le sens de rotation correspond à notre modèle, dans certains cas, vous devrez peut-être inverser la valeur RateAxz en raison de la position physique du gyroscope par rapport à l'accéléromètre - effectuez à nouveau le test ci-dessus, en faisant tourner l'appareil autour l'axe Y, cette fois surveille la sortie X de l'accéléromètre (AdcRx dans notre modèle). Si AdcRx grandit (les 90 premiers degrés de rotation par rapport à la position horizontale), alors AdcGyroXZ devrait également grandir. Sinon, vous devez inverser RateAxz, vous pouvez y parvenir en introduisant un facteur de signe dans l'équation 3, comme suit:

RateAxz = InvertAxz * (AdcGyroXZ * Vref / 1023 - VzeroRate) / Sensitivity, où InvertAxz est 1 ou -1

le même test peut être effectué pour RateAyz, en faisant pivoter l'appareil autour de l'axe X, et vous pouvez identifier quelle sortie du gyroscope correspond à RateAyz, et si elle doit être inversée. Une fois que vous avez la valeur pour InvertAyz, vous devez utiliser la formule suivante pour calculer RateAyz:

RateAyz = InvertAyz * (AdcGyroYZ * Vref / 1023 - VzeroRate) / Sensibilité

Si vous faisiez ces tests sur la carte Acc_Gyro, vous obtiendriez les résultats suivants:

- la broche de sortie pour RateAxz est GX4 et InvertAxz = -1. - la broche de sortie pour RateAyz est GY4 et InvertAyz = -1

À partir de ce moment, nous considérerons que vous avez configuré votre IMU de manière à pouvoir calculer les valeurs correctes pour Axr, Ayr, Azr (comme défini dans la partie 1. Accéléromètre) et RateAxz, RateAyz (comme défini dans la partie 2. Gyroscope). Ensuite, nous analyserons les relations entre ces valeurs qui s'avèrent utiles pour obtenir une estimation plus précise de l'inclinaison de l'appareil par rapport au plan du sol.

Vous vous demandez peut-être à ce stade, si le modèle de l'accéléromètre nous a déjà donné des angles d'inclinaison d'Axr, Ayr, Azr, pourquoi voudrions-nous nous embêter avec les données du gyroscope ? La réponse est simple: les données de l'accéléromètre ne sont pas toujours fiables à 100 %. Il y a plusieurs raisons, rappelez-vous que l'accéléromètre mesure la force d'inertie, une telle force peut être causée par la gravitation (et idéalement uniquement par la gravitation), mais elle peut aussi être causée par l'accélération (mouvement) de l'appareil. En conséquence, même si l'accéléromètre est dans un état relativement stable, il reste très sensible aux vibrations et aux bruits mécaniques en général. C'est la principale raison pour laquelle la plupart des systèmes IMU utilisent un gyroscope pour lisser les erreurs de l'accéléromètre. Mais comment est-ce que c'est fait ? Et le gyroscope est-il sans bruit ?

Le gyroscope n'est pas exempt de bruit cependant car il mesure la rotation il est moins sensible aux mouvements mécaniques linéaires, le type de bruit dont souffre l'accéléromètre, cependant les gyroscopes ont d'autres types de problèmes comme par exemple la dérive (ne pas revenir à la valeur zéro lorsque la rotation s'arrête). Néanmoins, en faisant la moyenne des données provenant de l'accéléromètre et du gyroscope, nous pouvons obtenir une estimation relativement meilleure de l'inclinaison actuelle de l'appareil que ce que nous obtiendrions en utilisant les données de l'accéléromètre seules.

Dans les prochaines étapes, je présenterai un algorithme inspiré de certaines idées utilisées dans le filtre de Kalman, mais il est de loin plus simple et plus facile à implémenter sur des appareils embarqués. Avant cela, voyons d'abord ce que nous voulons que notre algorithme calcule. Eh bien, c'est la direction du vecteur force de gravitation R = [Rx, Ry, Rz] à partir de laquelle nous pouvons dériver d'autres valeurs comme Axr, Ayr, Azr ou cosX, cosY, cosZ qui nous donnera une idée sur l'inclinaison de notre appareil par rapport au plan de masse, nous discutons de la relation entre ces valeurs dans la partie 1. On pourrait dire - n'avons-nous pas déjà ces valeurs Rx, Ry, Rz de l'équation 2 dans la partie 1 ? Eh bien oui, mais n'oubliez pas que ces valeurs sont dérivées des données de l'accéléromètre uniquement, donc si vous deviez les utiliser directement dans votre application, vous pourriez obtenir plus de bruit que votre application ne peut tolérer. Pour éviter toute confusion supplémentaire, redéfinissons les mesures de l'accéléromètre comme suit:

Racc - est le vecteur de force d'inertie mesuré par un accéléromètre, qui se compose des composants suivants (projections sur les axes X, Y, Z):

RxAcc = (AdcRx * Vref / 1023 - VzeroG) / Sensibilité RyAcc = (AdcRy * Vref / 1023 - VzeroG) / Sensibilité RzAcc = (AdcRz * Vref / 1023 - VzeroG) / Sensibilité

Jusqu'à présent, nous avons un ensemble de valeurs mesurées que nous pouvons obtenir uniquement à partir des valeurs ADC de l'accéléromètre. Nous appellerons cet ensemble de données un "vecteur" et nous utiliserons la notation suivante.

Racc = [RxAcc, RyAcc, RzAcc]

Étant donné que ces composants de Racc peuvent être obtenus à partir des données de l'accéléromètre, nous pouvons les considérer comme une entrée dans notre algorithme.

Veuillez noter que parce que Rac mesure la force de gravitation, vous aurez raison si vous supposez que la longueur de ce vecteur défini comme suit est égale ou proche de 1g.

|Racc| = SQRT(RxAcc^2 +RyAcc^2 + RzAcc^2), Cependant, pour être sûr, il est logique de mettre à jour ce vecteur comme suit:

Racc(normalisé) = [RxAcc/|Racc|, RyAcc/|Racc|, RzAcc/|Racc|].

Cela garantira que la longueur de votre vecteur Rcc normalisé est toujours de 1.

Ensuite, nous allons introduire un nouveau vecteur et nous l'appellerons

Reste = [RxEst, RyEst, RzEst]

Ce sera la sortie de notre algorithme, ce sont des valeurs corrigées basées sur les données du gyroscope et basées sur les données estimées passées.

Voici ce que va faire notre algorithme: - l'accéléromètre nous dit: "Vous êtes maintenant à la position Racc" - nous disons "Merci, mais laissez-moi vérifier", - puis corrigez cette information avec les données du gyroscope ainsi qu'avec les données Rest passées et nous sortons un nouveau vecteur estimé Rest. - nous considérons Rest comme notre "meilleur pari" quant à la position actuelle de l'appareil.

Voyons comment nous pouvons le faire fonctionner.

Nous allons commencer notre séquence en faisant confiance à notre accéléromètre et en lui attribuant:

Reste(0) = Racc(0)

Au fait, rappelez-vous que Rest et Racc sont des vecteurs, donc l'équation ci-dessus n'est qu'un moyen simple d'écrire 3 ensembles d'équations et d'éviter les répétitions:

RxEst(0) = RxAcc(0) RyEst(0) = RyAcc(0) RzEst(0) = RzAcc(0)

Ensuite, nous ferons des mesures régulières à des intervalles de temps égaux de T secondes, et nous obtiendrons de nouvelles mesures que nous définirons comme Racc(1), Racc(2), Racc(3) et ainsi de suite. Nous émettrons également de nouvelles estimations à chaque intervalle de temps Rest(1), Rest(2), Rest(3) et ainsi de suite.

Supposons que nous soyons à l'étape n. Nous avons deux ensembles de valeurs connus que nous aimerions utiliser:

Rest(n-1) - notre estimation précédente, avec Rest(0) = Racc(0) Racc(n) - notre mesure actuelle de l'accéléromètre

Avant de pouvoir calculer Rest(n), introduisons une nouvelle valeur mesurée, que nous pouvons obtenir à partir de notre gyroscope et d'une estimation précédente.

Nous l'appellerons Rgyro, et c'est aussi un vecteur composé de 3 composants:

Rgyro = [RxGyro, RyGyro, RzGyro]

Nous allons calculer ce vecteur une composante à la fois. Nous allons commencer par RxGyro.

modèle de gyroscope
modèle de gyroscope

Commençons par observer la relation suivante dans notre modèle de gyroscope, à partir du triangle rectangle formé par Rz et Rxz, nous pouvons en déduire:

tan(Axz) = Rx/Rz => Axz = atan2(Rx, Rz)

Atan2 est peut-être une fonction que vous n'avez jamais utilisée auparavant, elle est similaire à atan, sauf qu'elle renvoie des valeurs dans la plage (-PI, PI) par opposition à (-PI/2, PI/2) comme renvoyé par atan, et cela prend 2 arguments au lieu d'un. Il nous permet de convertir les deux valeurs de Rx, Rz en angles dans la gamme complète de 360 degrés (-PI à PI). Vous pouvez en savoir plus sur atan2 ici.

Donc connaissant RxEst(n-1), et RzEst(n-1) on peut trouver:

Axz(n-1) = atan2(RxEst(n-1), RzEst(n-1)).

Rappelez-vous que le gyroscope mesure le taux de changement de l'angle Axz. On peut donc estimer le nouvel angle Axz(n) comme suit:

Axz(n) = Axz(n-1) + TauxAxz(n) * T

N'oubliez pas que RateAxz peut être obtenu à partir des lectures ADC de notre gyroscope. Une formule plus précise peut utiliser un taux de rotation moyen calculé comme suit:

TauxAxzMoy = (RateAxz(n) + TauxAxz(n-1)) / 2 Axz(n) = Axz(n-1) + TauxAxzMoy * T

De la même manière on peut trouver:

Ayz(n) = Ayz(n-1) + TauxAyz(n) * T

Ok donc maintenant nous avons Axz(n) et Ayz(n). Où allons-nous d'ici pour déduire RxGyro/RyGyro ? De l'éq. 1 on peut écrire la longueur du vecteur Rgyro comme suit:

|Rgyro| = SQRT(RxGyro^2 + RyGyro^2 + RzGyro^2)

De plus, parce que nous avons normalisé notre vecteur Racc, nous pouvons supposer que sa longueur est de 1 et qu'il n'a pas changé après la rotation, il est donc relativement sûr d'écrire:

|Rgyro| = 1

Adoptons une notation temporaire plus courte pour les calculs ci-dessous:

x =RxGyro, y=RyGyro, z=RzGyro

En utilisant les relations ci-dessus, nous pouvons écrire:

x = x / 1 = x / CARRÉ(x^2+y^2+z^2)

Divisons le numérateur et le dénominateur de la fraction par SQRT(x^2 + z^2)

x = (x / CARRÉ(x^2 + z^2)) / CARRÉ((x^2 + y^2 + z^2) / (x^2 + z^2))

Notez que x / SQRT(x^2 + z^2) = sin(Axz), donc:

x = sin(Axz) / SQRT (1 + y^2 / (x^2 + z^2))

Maintenant, multipliez le numérateur et le dénominateur de la fraction à l'intérieur de SQRT par z^2

x = sin(Axz) / SQRT (1 + y^2 * z ^2 / (z^2 * (x^2 + z^2)))

Notez que z / SQRT(x^2 + z^2) = cos(Axz) et y / z = tan(Ayz), donc finalement:

x = sin(Axz) / SQRT (1 + cos(Axz)^2 * tan(Ayz)^2)

En revenant à notre notation, nous obtenons:

RxGyro = sin(Axz(n)) / SQRT (1 + cos(Axz(n))^2 * tan(Ayz(n))^2)

de la même manière on trouve que

RyGyro = sin(Ayz(n)) / SQRT (1 + cos(Ayz(n))^2 * tan(Axz(n))^2)

Maintenant, enfin, nous pouvons trouver:

RzGyro = Signe(RzGyro)*SQRT(1 - RxGyro^2 - RyGyro^2).

Où Sign(RzGyro) = 1 lorsque RzGyro>=0 et Sign(RzGyro) = -1 lorsque RzGyro<0.

Une façon simple d'estimer cela est de prendre:

Signe(RzGyro) = Signe(RzEst(n-1))

En pratique, soyez prudent lorsque RzEst(n-1) est proche de 0. Vous pouvez sauter complètement la phase gyroscopique dans ce cas et attribuer: Rgyro = Rest(n-1). Rz est utilisé comme référence pour calculer les angles Axz et Ayz et lorsqu'il est proche de 0, les valeurs peuvent déborder et déclencher de mauvais résultats. Vous serez dans le domaine des grands nombres à virgule flottante où les implémentations des fonctions tan() / atan() peuvent manquer de précision.

Récapitulons donc ce que nous avons jusqu'à présent, nous sommes à l'étape n de notre algorithme et nous avons calculé les valeurs suivantes:

Racc - lectures actuelles de notre accéléromètre Rgyro - obtenues à partir de Rest(n-1) et des lectures actuelles du gyroscope

Quelles valeurs utilisons-nous pour calculer l'estimation mise à jour Rest(n) ? Vous avez probablement deviné que nous utiliserons les deux. Nous utiliserons une moyenne pondérée, de sorte que:

Reste(n) = (Racc * w1 + Rgyro * w2) / (w1 + w2)

Nous pouvons simplifier cette formule en divisant à la fois le numérateur et le dénominateur de la fraction par w1.

Reste(n) = (Racc * w1/w1 + Rgyro * w2/w1) / (w1/w1 + w2/w1)

et après avoir substitué w2/w1 = wGyro on obtient:

Reste(n) = (Racc + Rgyro * wGyro) / (1 + wGyro)

Dans le forum ci-dessus, wGyro nous dit à quel point nous faisons confiance à notre gyroscope par rapport à notre accéléromètre. Cette valeur peut être choisie expérimentalement, généralement des valeurs comprises entre 5..20 déclencheront de bons résultats.

La principale différence entre cet algorithme et le filtre de Kalman est que ce poids est relativement fixe, alors que dans le filtre de Kalman, les poids sont mis à jour en permanence en fonction du bruit mesuré des lectures de l'accéléromètre. Le filtre de Kalman vise à vous donner "les meilleurs" résultats théoriques, alors que cet algorithme peut vous donner des résultats "assez bons" pour votre application pratique. Vous pouvez implémenter un algorithme qui ajuste wGyro en fonction de certains facteurs de bruit que vous mesurez, mais les valeurs fixes fonctionneront bien pour la plupart des applications.

Nous sommes à un pas d'obtenir nos valeurs estimées mises à jour:

RxEst(n) = (RxAcc + RxGyro * wGyro) / (1 + wGyro) RyEst(n) = (RyAcc + RyGyro * wGyro) / (1 + wGyro) RzEst(n) = (RzAcc + RzGyro * wGyro) / (1 + wGyro)

Maintenant, normalisons à nouveau ce vecteur:

R = SQRT(RxEst(n) ^2 + RyEst(n)^2 + RzEst(n)^2)

RxEst(n) = RxEst(n)/R RyEst(n) = RyEst(n)/R RzEst(n) = RzEst(n)/R

Et nous sommes prêts à répéter notre boucle à nouveau.

Ce guide est apparu à l'origine sur starlino.com, j'ai fait quelques modifications légères et je l'ai republié avec permission. Merci Starlino !

Conseillé: