Aller au contenu


Survivor9898

Inscrit(e) (le) 09 juin 2018
Déconnecté Dernière activité mars 10 2019 03:07
-----

Messages que j'ai postés

Dans le sujet : Asservir en vitesse un robot 4 roues avec un accelerometre

09 mars 2019 - 11:17

Bonsoir,

du coup, je suis aller faire quelques tests avec un accéléromètre (monté sur un arduino), sur le sol de ma chambre (cf image en pièce jointe). Je suis aller le poser à 6 endroits différents (qui correspondent aux plateaux). Les pics correspondent au moment où je déplace l'accéléromètre. A noter que les plusieurs lignes horizontales lors des plateaux sont du au bruit du capteur et/ou au vibrations du sol (à noter que j'ai pas cherché à adapté le calibre pour l'optimiser pour une mesure en statique). Ce bruit pourrait être éliminé en moyennant  plusieurs valeurs successives (vue que je mesure à 100Hz, je peux largement me le permettre).

 

Comment faut-il interpréter ces résultats :

- on remarque que la moyenne des plateaux est environ -0.2 m/s² : cela correspond au fait que le capteur n'est pas horizontal (il est pas monté très droit, sur y c'est plutôt -0.8m/s²), et/ou que le capteur a un offset (c'est sur qu'il en a un, mais probablement pas assez pour expliquer l'erreur sur y, probablement pas non plus toute celle sur x) et/ou que le sol de ma chambre est globalement en pente. A noter que cette erreur peut être compensée (l'offset_x vaut environ la moyenne des 6 plateaux)

- on remarque aussi des écarts de l'ordre de 0.05 m/s² entre cette moyenne des 6 plateaux et les plateaux individuels. Cette "erreur" là vient probablement du fait que le sol de ma chambre n'est pas à 100% plat. Cette erreur là ne peut pas être compensée en restant en 2D (si tu veux pouvoir la compenser, il faut utiliser le gyromètre pour connaître ton orientation en 3D pour ensuite corriger cette erreur).

 

Donc si on suppose que tu calibre ton capteur, et que ton sol est aussi plat que celui de ma chambre, alors il te restera une erreur de l'ordre de da=0.05 m/s².

Du coup dv=0.05 * t et dx=0.5*0.05*t²

Donc à t=10s, tu aurais dv=0.5 m/s et dx = 2.5 m (et à t=15s, dv=0.75 m/s et dx = 5.6m). Est-ce que ça te conviens? A toi de nous le dire, mais probablement pas.

 

A noter qu'en pratique se pose un problème similaire en y et en orientation, donc ce sera probablement encore pire.

 

 

Une autre solution consiste à faire de petites durées puis t'arrêter pour réinitialiser la vitesse avant de reprendre.

Supposons que tu t'arrêtes à chaque fois au bout de T secondes, et que tu fasse N de ces trajets.

Pour un trajet : dv(T)=0.05*T et dx(T)=0.5*0.05*T²

L'erreur en vitesse ne se cumulera pas entre les parcours, par contre les erreurs en positions continueront à se sommer (mais moins vite) :

dx(N*T)=N*dx(T) si les erreurs sont systématiques, ou dx(N*T)=racine(N)*dx(T) si les erreurs sont indépendantes. Je pense qu'en pratique tu sera quelque part entre les deux.

 

Supposons que tu veuilles rouler un temps t (on ne compte pas le temps passé à l'arrêt). Tu doit alors le faire en N=t/T étapes.

Ton erreur sera donc comprise entre dx(t)=(t/T)*dx(T)=0.5*0.05*T*t et dx(t)=racine(t/T)*dx(T)=0.5*0.05*T^(3/2)*t^(1/2)

Si on prend T=1 (tu t'arrête au bout d'une seconde) et t=10, alors tu es entre dx=0.25m et dx=0.08m

Si on prend T=2 (tu t'arrête au bout de 2 secondes) et t=10, alors tu es entre dx=0.5m et dx=0.22m

 

Là pour le coup, on se rapproche de quelque chose de plus acceptable (à toi de nous dire si ça peut faire l'affaire ou non)?

 

Attention, plusieurs points peuvent empirer le résultat :

- si ton robot roule à 2.5 m/s en extérieur, il risque de parcourir une distance assez importante, augmentant le risque que la pente change un peu

- en extérieur, le sol est souvent moins plat qu'en extérieur

- à cette vitesse, tu risque d'avoir des vibrations dans le robot, qui risquent de rajouter du bruit (je sais pas si c'est négligeable ou pas)

- là j'ai pris que en x, mais tu as la même chose en y (du coup pour l'erreur totale tu multiplie par racine carrée de 2)

- et surtout, j'ai supposé que le robot allait bien droit : si tu commence à tourner, tu doit le prendre en compte dans les calculs (le changement de référentiel de celui du robot vers le référentiel lié au sol). Pour cela il faut utiliser ton gyro, mais lui aussi à des erreurs. Le gyro de donne la vitesse de rotation, que tu intègre pour obtenir ton angle de rotation. Si tu as une erreur de 1° sur la direction dans lequel tu avance, et que tu avance 10m, tu te retrouve décalé de dy=sin(1°)*10m=0.17m

 

 

Si j'ai bien compris, tu as déjà ton accéléromètre/gyro? Si c'est le cas, alors je te suggère de faire un test similaire à celui que j'ai fait (ie prendre ton capteur, le poser à divers endroit au sol, et mesurer les valeurs d'accélération ET celles du gyro, sur les 3 axes). Je te conseille de mesurer en continu, et de laisser ton capteur posé pendant 10 secondes à chaque endroit : on identifie ensuite très facilement sur le graphique quand est ce qu'il bouge ou pas.

Avec ces données, il sera possible d'estimer les erreurs que tu peux espérer atteindre avec ton robot en utilisant l'accéléromètre. Si tu as besoin d'aide pour les interpréter, n'hésite pas à demander.

 

 

 

Sinon, est-ce que ton robot est déjà construit? Les pièces sont-elles déjà commandées? Si oui, est-ce que tu pourrais envoyer des photos (en particulier des roues et des moteurs)?

Je te demande cela en pensant à une forme artisanale et très bon marché d'encodeurs : tu prends une LED et une photodiodes que tu mets fasse à fasse, et entre les deux tu fais passer une "roue" avec des trous, et tu mesure le temps entre 2 passages de trous. Sachant que la roue peut soit être celle que tu utilise déjà (si c'est une roue à rayons ou qu'elle a des trous ou que tu peux en percer), soit un simple disque en carton que tu attache d'une manière ou d'une autre à l'axe (ce qui peut être plus ou moins facile/difficile selon comment est construit ton robot).

Ce ne sera pas super précis, mais l'erreur en vitesse ne se cumulera pas sans avoir à t'arrêter. A noter qu'il te faudra aussi 4 résistances (ça ton labo de physique en a très probablement en stock). Il est aussi possible qu'il te faille un moyen de convertir le signal analogique de la photodiode en un signal binaire (ie soit un comparateur, soit un convertisseur analogique numérique, soit un clone d'arduino (tu en pour 6€ sur la boutique)). Mais probablement en testant un peu tu peux te passer de cette conversion et envoyer le signal analogique directement sur une pin numérique du raspberry pi qui la considérera comme 0 si elle est en dessous d'un certain seuil et comme 1 si elle est au dessus (et c'est la seule chose qui nous intéresse). Si ça passe sans convertisseur, alors tu en as pour moins de 10€, il est même possible que ton labo ait déjà tout en stock (à noter qu'une photorésistance ou un phototransistor peut remplacer la photodiode).

 

Bonne soirée

Sandro

 

 

 

 

Bonjour, merci d'avoir pris le temps de faire une expérience pour m'éclaircir les choses =) 

Pour la vitesse j'ai essayé de trouver un ordre de grandeur et je me suis rendu compte que je l'avais surestimé , en fait c'est plutôt environ 1m/s. 

Et oui on a déjà construit notre robot ( binôme ) d'ailleurs je te mets des photos juste en dessous. Vu que mon robot représente une sorte de prototype, normalement dans le cadre de mon tipe, je ne suis pas obligé d'avoir quelque chose de très sophistiqué, normalement la mesure de la vitesse devrait me permettre de l'asservir et donc d'appliquer une partie de notre programme de SI dans la pratique. Donc c'est vraiment l'apport scientifique qui est important pour moi. Hier j'ai essayé de faire une mesure avec l’accéléromètre juste pour avoir une idée de son fonctionnement, j'ai pu remarquer qu'on pouvait choisir le nombre de mesures effectuées par unité de temps, mais du coup je voulais savoir quand on met par exemple 1 mesure tous les 5 secondes, est ce que ca mesure l’accélération à l'instant t = 5s , t= 10s, t=15s etc ou est ce que ca fait une sorte de moyenne des 5 premières secondes pour la première valeur puis une moyenne de de t=5s à t=10s pour la 2ieme valeur etc  ? 

Ensuite est ce que c'est normal que ça affiche des valeurs super grandes ? genre de l ordre de 1000 des fois pour une accélération, je suppose que c'est parce qu’il n'est pas calibré c'est ça ? Si c'est le cas comment je peux le calibrer ?

Enfin vu que mon but n'est pas l'accélération mais la vitesse, pour intégrer faut-il utiliser une simple méthode des trapèzes ? ou est ce que c'est plus dur que ça ?

 

 

53711553_423657468396520_787023594164060

 

 

 

Petit lien qui peut aider  éventuellement aider : 

Accéléromètres et Applications 
 

 J'arrive pas à accéder au lien :/ ( page introuvable )


Dans le sujet : Asservir en vitesse un robot 4 roues avec un accelerometre

06 mars 2019 - 07:48

En fait pour le gyroscope qui est intégré avec l'accéléromètre il mesure la vitesse de rotation de quoi ? Je me demande si on peut l'utiliser pour mesurer la vitesse du robot ? 


Dans le sujet : Asservir en vitesse un robot 4 roues avec un accelerometre

05 mars 2019 - 08:04

Par rapport à la vitesse oui peut etre que c'est beaucoup, mais c'est un robot d’extérieur donc c'est normal, mais du coup si je persiste à utiliser accéléromètre pour déterminer la vitesse, et et si je diminue la durée d'utilisation et si je fais en sorte de savoir quand est ce qu'il est en arrêt et quand est ce qu'il bouge est ce que l erreur sera toujours importante ?   


Dans le sujet : Asservir en vitesse un robot 4 roues avec un accelerometre

04 mars 2019 - 11:30

Donc si je comprends bien, tu poudrais suivre une trajectoire au sol : si c'est bien ça, alors c'est encore plus compliqué car tu intègre pas une fois mais deux fois tes erreurs, donc si tu ne fais pas de calibration, tu as une erreur de position en t² (sinon en t^(3/2) si je me trompe pas).

 

Si en plus tu as des pentes alors soit tu fais les intégrations en 3D (et là ça devient très très moche), ou alors tu cumule super vite des erreurs.

Prenons l'exemple d'une pente de 1° : sur l'axe vertical, tu as la gravité, donc 9.81 m/s². Vue que tu es penché de 1°, tu as une erreur de da=sin(1°)*9.81 = 0.17 m/s² sur l'accélération. Du coup ton erreur sur la vitesse est dv=da*t : au bout d'un 6 secondes, tu as une erreur en vitesse de plus de 1 m/s (ce qui est probablement plus que la vitesse maximale de ton robot), et ton erreur en position est dx=0.5*da*t² (soit 1m en 3.5 secondes). A noter que même si tu retourne sur du plat, ton erreur de vitesse reste, donc ton erreur en position croit encore (même si c'est plus que proportionnellement au temps).

Bref, il y a de fortes chances que ça ne fasse pas l'affaire.

 

Après, il y a des astuces qui pourraient permettre d'améliorer un peu les choses, mais même comme ça ça reste assez moyen :

- supposer que si l'accélération ne change pas pendant plus que dt, c'est que tu es sur du plat (car il te faut moins que dt secondes pour parcourir ta plus longue pente) : du coup, si tu connais ta vitesse sur le plat, tu peut remplacer ta vitesse calculée par la vitesse "nominale"

- juste détecter si le capteur est penché, et essayer de calculer la pente et d'adapter la commande des moteurs en conséquence (commande en boucle ouverte)

- avancer par petits à coups (vu les calculs ci-dessus, je dirais pas plus d'une seconde à chaque fois), pour remettre la vitesse à 0 à chaque fois que tu t'arrête

 

Une "solution" serait de combiner avec un autre capteur qui te donne une information éventuellement plus bruité mais qui se cumule moins, et ensuite de fusionner ces données (dans ce cas tu peux regarder du coté des filtres de Kalman). En gros, il te faut un capteur qui te donne dans l'idéal la position, ou au moins la vitesse, même si c'est de manière imprécise. Si tu rajoute des objets fixes, tu peux peut-être te servir du capteur infrason (d'ailleurs, s'en est un qui mesure les distances (effet doppler?) ou un plus classique qui calcule les distances?

 

Mais globalement, sauf si le but de ton projet est de faire de la navigation avec un accéléromètre, ou que tu ne veux pas rouler plus que 1-2 secondes (éventuellement un petit peu plus si ton sol est parfaitement plat et que tu es prêt à faire une calibration avant chaque usage), je te déconseille d'utiliser un accéléromètre pour la navigation (certainement pas sans un autre capteur, en combinaison ça peut donner de bon résultats mais au prix d'un effort important).

 

A ta place, si le but est de te déplacer pendant des durées pas trop longues, alors je te conseillerais de regarder du coté des encodeurs (je te mets les 2 premiers liens que j'ai trouvé qui expliquent un peu plus ce que c'est : https://www.robot-maker.com/shop/blog/32_Utilisation-des-encodeurs.html et https://www.generati...botique-mobile/ ). En gros c'est un dispositif qui mesure de combien a tourné une roue, ce qui te permet de connaître facilement ton déplacement (tu cumule aussi des erreurs mais beaucoup plus lentement) et ta vitesse (l'erreur sur la norme de ta vitesse n'augmente pas, par contre la direction si, car tu cumule des erreurs sur ton orientation en racine carre du temps). Il y a 2 types d'encodeurs : ceux qui sont directement intégrés au moteurs, et ceux qui sont séparés (dans quel cas tu peux toi même les relier à tes roues (souvent via un petit axe qui sort exprès à l'arrière de certains moteurs), ou alors à des roues qui ne servent qu'à ça). Tu as des encodeurs avec tout type de résolution (en général entre 1/10 de tour et 1/1000 voir mieux).

Avec un bon encodeur (enfin 2, vu qu'il en faut 1 de chaque coté), et une bonne mécanique (il faut s'assurer que la roue reste toujours en contact avec le sol sans glisser), j'ai déjà réussi à avoir moins d'un mètre d'erreur après plusieurs minutes. Après, un bon encoder, il faut compter aux alentours de 50€ pièce (et il en faut 2).

 

Après, si tu veux que je te conseille mieux, je vais avoir besoin de connaître vraiment précisément ton cahier des charges:

- vitesse de ton robot (à peu près)

- durée d'utilisation que l'utilisateur ait à lui re-donner sa vrai position ou le replacer à un endroit connu

- possibilité ou pas de s'arrêter très souvent (idéalement plusieurs fois par seconde) pour savoir qu'on est à vitesse 0

- distance à parcourir

- précision souhaitée

- budget disponible

- temps que tu es prêt à consacrer à cet asservicement

 

Bonne soirée

Sandro

 

PS : @Mike118 :  C'est moi ou tu n'as aucun encodeur non monté sur un moteur dans la boutique?

Merci encore pour ces explications :)

Pour la vitesse du robot je dirai que c'est environ 2.5m/s ou quelque chose comme ça, et pour la durée d'utilisation je pourrai me limiter pour l'instant à une durée d'environ 10-15 secondes vu que mon projet n'est qu'un prototype. Et oui j'avoue que pour les encodeurs ça coûte qd même assez cher, je préféré utilisé uniquement mon accéléromètre. Du coup, dans le cas ou le sol est parfait c'est a dire 0 pente 0 conditions défavorables, est ce que l’accéléromètre peut quand même me permettre de mesurer la vitesse du robot ? Et dans ce cas la précision est de combien? 


Dans le sujet : Asservir en vitesse un robot 4 roues avec un accelerometre

04 mars 2019 - 08:21

Merci pour ta réponse Sandro

 

Bonjour,

quelques informations supplémentaires :

- un accéléromètre mesure l'accélération dans le référentiel du robot, du coup si tu veux connaître la vitesse dans le référentiel terrestre, tu vas devoir changer de référentiel (pour ça tu aura besoin de mesurer les vitesses de rotations grâce au gyroscope (qui est inclus)

- en plus de mesurer l'accélération, le gyromètre mesure aussi l'accélération de la pesanteur (g) : tant que tu es sur un support horizontal et que ton accéléromètre n'est pas penché, ça pose pas de problème (tu ne lis l'accélération qu'en x et y, pas en z), dans le cas contraire ça devient compliqué

- Un accéléromètre à 2 types d'erreurs : des offsets (dus à des imperfections du capteur et/ou au fait que ton capteur non soit pas monté parfaitement droit sur ton robot et/ou au fait que ton sol ne soit pas parfaitement horizontal) et des erreurs aléatoires. Les premières te donnent une erreur en vitesse qui croit proportionnellement au temps (mais tu peut t'en débarrasser en calibrant ton capteur, à condition que la surface sur laquelle tu roule soit bien planaire) ; les secondes te donnent une erreur croissant comme la racine carré du temps, mais tu ne peut pour ainsi dire rien faire contre (sauf en rajoutant d'autres capteurs). Donc tout dépend de la durée pendant laquelle tu veux contrôler ainsi la vitesse de ton robot : pendant une courte durée ça ira bien, sur une longue durée c'est mort (sauf si tu couple avec d'autres informations, par exemple arrêter le robot, ce qui permet de remettre à 0 la vitesse et donc l'erreur).

 

Est-ce que tu pourrais nous en dire plus sur l'utilisation prévue de ton robot? (durée d'utilisation (entre 2 arrêts), type de terrain, précision souhaitée/nécessaire, ...)?

Car selon les réponses, l'utilisation d'un accéléromètre peut être une solution satisfaisante ou être complètement hors de question (sauf si tu veux utiliser un accéléromètre à 100 000€ et écrire un programme qui pourrait faire l'affaire d'un TIPE à lui tout seul).

 

bonne soirée

Sandro

Merci pour ta réponse Sandro, en fait mon robot ressemble à une voiture télécommandée que je contrôle à partir d'une interface graphique, il est équipé d'un capteur ultrason qui sert à mesurer la vitesse de n'importe quelle cible proche de lui ( dans l idéal ça devrait ressembler à un radar-mobile ), avec un camarade de classe on est entrain d'essayer d'écrire un programme qui lui permettra de reproduire une trajectoire prédéfinie. Du coup l'accéléromètre devrait me permettre  de mesurer la vitesse du robot que je compte asservir pour une vitesse plus précise et aussi pour lui permettre de garder la même vitesse dans le cas d'une pente .... ( petite pente ). Je pense que le calcul de la vitesse se fera surement sur des petites périodes donc ça posera pas de problème pour ça , par contre pour le reste avec les informations que je t'ai donné qu'est ce que t'en penses stp ?