Calculer un angle d'inclinaison statique avec une IMU

Bonjour, j'ai resement acheter pour un projet une carte Arduino rp 2040. j'ai besoin d'acquérir une mesure d'angle par rapport a un origine donner cependant je n'y arrive pas malgré mes essais avec les différentes méthodes que j'ai trouver. j'ai a ma disposition comme valeur les valeurs d'accélération et accélération angulaire sur les 3 axes. si quelqu'un a une solution sous quelque forme qu'elle soit je prend et merci d'avance.

Hello, I have recently purchased an Arduino rp 2040 card for a project. found. I have at my disposal as value the values ​​of acceleration and angular acceleration on the 3 axes and i want to have the angle of the arduino. if anyone has a solution in any form I take and thank you in advance.

:warning:
Post mis dans la mauvaise section, on parle anglais dans les forums généraux. déplacé vers le forum francophone.

Merci de prendre en compte les recommandations listées dans Les bonnes pratiques du Forum Francophone

Si on n'a que ces valeurs, cela ne suffit pas pour calculer un angle. Il faut au minimum le temps de rotation.
Si avec les mêmes accélérations et les mêmes décélérations le temps de rotation est quasi nul, l'angle sera quasi nul, si le temps est suffisant, on peut faire plusieurs tours.

En gros il manque des données.

j'ai du mal a comprendre ce que tu me dit, il me faut le temp de quelle rotation?

Le problème est peut être mal exprimé. On ne peut en tout cas pas déterminer l'angle fait par la carte si on ne connaît que ses accélérations.

A moins que ce soit la fonction angle en fonction du temps?

Éventuellement, donne une méthode essayée et ce qui ne va pas. Ou un exemple.

Salut!

Peux-tu nous dire s'il s'agit d'un projet scolaire?

J'ai l'impression que tu cherches à fabriquer une sorte de rapporteur ou d'inclinomètre qui indiquerait quel est l'angle fait entre le plan où est posé la carte et le sol? Par exemple, totalement à plat sur le sol, la carte enverrait la mesure "0 degrés d'inclinaison", alors quelle enverrait "90° d'inclinaison" si la carte est dressée à la verticale.
Est-ce que j'ai bon?

Si oui, tu pourras facilement le faire avec ton équipement. En revanche, on ne fera pas le travail d'écrire le code à ta place, mais on pourra t'accompagner même si tu es débutant.

Et les remarques (petits coquins) des membres sur le gyroscope devraient te faire réfléchir à quelle "grandeur" mesure un gryroscope, voir si c'est le capteur le plus adapté à ton besoin.

Au plaisir de t'aider.

je n'ai pas besoin du code, je vais me débrouiller (j'ai de bonne base sur d'autre langage). j'ai besoin de ressortir cette valeur car je souhaite faire un objet qui s'équilibre automatiquement (projet perso pour m'occuper). j'ai trouver plusieurs formule qui me permettent de faire ca cependant j'ai du mal a les comprendre donc les appliquer donc j'ai demander sur le forum pour voir si quelqu'un pouvait éventuellement m'expliquer autrement la facon de faire.

d'ailleurs je sais que je pouvais le faire avec un potentiomètre et un pendule cependant j'ai une IMU sur ma carte donc je souhaite l'utiliser

ça marche, merci pour ces explications complémentaires. là t'es bon pour un petit cours de physique et des maths, mais l'accéléromètre est un outil idéal pour récupérer une donnée à haut débit sur la position relative de ton montage.

:smiling_face_with_three_hearts: :smiling_face_with_three_hearts: :smiling_face_with_three_hearts:

alors y'a l'école avec les angles et les cosinus en radians. Mais y'a aussi une version que je trouve plus accessible, à base Pythagore. On utilisera que des carrés et des racines carrés.

Sur le concept, l'accéléromètre mesure la valeur immédiate d'accélération appliquée sur le détecteur (ton IMU) et le traduit sur les 3 axes X, Y et Z. Je vais reprendre ta proposition du pendule pour me concentrer uniquement sur l'axe Z (le plus "facile) et ne considérer qu'un seul mouvement possible: s'écarter ou pas de la position de repos (la position exactement verticale):

A cause de la gravité terrestre, tous les objets autour de nous subissent une accélération dirigée vers le bas (le centre de la terre) d'une valeur à peu près constante et qui va servir de référence.
Lorsque l'IMU est posé EXACTEMENT à plat sur le sol (rarement atteignable en vérité), on s'attend à ce qu'il donne sur l'axe Z une valeur très proche de la gravité terrestre.

Dès lors que l'IMU est incliné d'un certain angle, son axe Z se trouve "penché" par rapport à la direction de la gravité. La valeur lue sur l'axe Z sera exactement la valeur de la gravité terrestre MULTIPLIEE par un coefficient lié à l'angle qu'il fait avec la direction du sol.

Mesurer la valeur de Z à n'importe quel moment et connaitre la valeur de la gravité permet de calculer le coefficient et donc de connaitre l'angle correspondant. Tu as ton inclinomètre.

je mets déjà ça pour être sur qu'on est d'accord sur le principe.

Je crois maintenant voir compris le problème. Mais comment expliquer autrement quand on a aucune idée des formules et des premières explications?

Si j'ai bien compris il ne s'agit pas du tout du gyroscope comme l'indique le titre " Calculer un angle d’inclinaison avec le gyroscope de l’arduino nano rp 2040)", mais de l'accéléromètre qui lui peut mesurer la gravité sur les trois axes et donc en déduire l'angle. Ce serait bien de corriger le titre.

j'ai mis gyroscope car la doc l'appelle come ça mais oui je vais changer le titre.
( ps:j'ai aussi comme valeur les accélération angulaire donc c'est un gyroscope)

tout compris pour le moment.

cool. j'attendais un retour avant de pousser plus avant.

Je ne sais pas si tu as remarqué, mais lorsque le module est penché, la valeur lue sur l'axe Z est inférieure j'ai essayé de le représenter sur mon schéma).

En pratique: la valeur maximale que tu pourras lire sur l'axe Z est celle strictement à la verticale. A moins de secouer l'IMU, tu ne pourras pas obtenir de valeur plus grande.
Ensuite, il y'a des valeurs qu'on peut qualifier de REMARQUABLE:

  • si tu tiens exactement l'IMU à l'envers (sur le dos), tu devrais lire exactement - (moins) la valeur maximale, parceque la gravité est vue "à l'envers" par ton capteur, mais sa valeur est fixe.
  • quand le capteur est sur le flanc, formant un angle droit avec le sol, la valeur lue sur Z est nulle. A l'opposé de la position de repos, où l'axe Z et la gravité forment un angle nul (et la valeur maximale est lue), la projection sur l'axe Z de la gravité est nulle ou négligeable.
  • et enfin, plutôt intuitif: à 60°, la valeur lue est exactement la moitié de la valeur maximale

donc on a:
capteur à plat: je lis (+g) sur mon capteur soit 9,81m/s²
capteur sur le flanc: je lis zéro (ça sera un axe X ou Y qui lira +g à la place)
capteur à 60°: je lis 0,5 * (+g) (EDIT: merci @vileroi pour la correction)
capteur à l'envers: je lis (-g)

et toutes les valeurs intermédiaires, elles viennent des lois de trigonométrie, et comme je disais, j'utilise une méthode (de feignasse).
une remarque pour compléter: chacun des 3 axes de ton capteur X, Y et Z sont perpendiculaires entre eux. Les explications plus haut leur sont applicables, notamment les valeurs remarquables en fonction de l'inclinaison de ton capteur. Sauf qu'elles n'apparaitront jamais en meme temps (il est impossible que les 3 axes soit alignés en meme temps avec le sol) et qu'on va pouvoir se servir de ce phénomène pour s'orienter "intuitivement" dans l'espace.

Tu devrais déjà, si mes explications apportent quelque chose, jouer avec ce que tu as sous la main pour exporter des valeurs sur le moniteur série, et secouer et incliner le capteur dans tous les sens pour voir le résultat.

La prochaine étape consiste en lire la donnée telle que la donnera le capteur (et ça peut dépendre de son modèle) et le convertir en une donnée lisible pour toi, c'est à dire un angle en degrés.

Deja merci pour ce que tu m'a deja expliquer. je me suis ammuser avec mon moniteur de serie et j'observe ce que tu vien de m'expliquer (mes valeurs vont de [-1;1] juste en inclinaison en excluan les acceleration que je lui applique) mais ducoup, comment puis-je utiliser cette valeurs pour en resortir un angle en degrés?

Bon parfait, tu ne pouvais pas mieux faire que d'essayer par toi même :+1: pour constater le fonctionnement, et j'espère que mes explications y donnent un peu de substance.

On peut résoudre ton problème d'angle rapidement, et il faudra potasser un peu plus si tu veux utiliser ton accéléromètre à son plein potentiel, mais une chose après l'autre:

D'un simple point de vue mathématique: si je m'intéresse aux valeurs entre la position horizontale (à plat) et à angle droit avec le sol je devrais avoir ça:

axe Z: +1 // 0 // 0,5
angle : 0° // 90° // 45°

j'ai donc une table de correspondance, ou un moyen de conversion entre la valeur lue sur l'axe Z et l'angle que forme l'IMU avec le sol.
j'en déduis une petite formule :
angle = 90 - (axe_Z *90);

Merci beaucoup (je me sent vraiment con*e), maintenant ca me parais complètement logique , ça marche avec la proportionnalité (j'avais vu d'autre methode avec des formule de trigo mais j'avais pas totalement compris).

A 45° c'est 70% de la valeur et pas 50%. Les 50% on les a pour un angle de 60°

Rien n'est linéaire, c'est pour cela que les formules utilisent la trigonométrie.


En rouge la courbe réelle. En bleu l'approximation si on prend la formule linéaire
angle = 90 - (axe_Z *90);

La méthode donnée ne fonctionne que si on se penche sur un seul axe Si la carte est inclinée suivant deux axes la lecture sera lus faible et on croira à un angle plus grand.

Maintenant cette méthode fonctionne sur un seul axe si une erreur de 15° est acceptable.

merci pour l'apport. je corrige pour la valeur sin(60)

pour mon projet je ne peut pas me permettre une erreur de 15° mais ce seras incliné sur un seul axe