
robot autonome
#61
Posté 27 août 2012 - 08:21
Si tu veux du vrai temps réel, regarde du coté des interruptions overflow de l'ATMega, mais là ça commence à être un peu compliqué.
Vous avez fait des essais pour voir s'il n'y avais pas un souci au niveau du protocole série (en particulier comme tu l'as dit de convertir les codes ASCII des nombre de type char en valeur de type int)?
Tu le réutilises où "duree"
[suite hs] c'est moins la classe quand elle te sort des bouses ^^ [/hs]
#62
Posté 27 août 2012 - 08:26
http://www.instructables.com/id/Position-estimation-of-a-wheeled-bot-with-arduino/step3/The-source-code/
sinon pour comprendre les calculs résonne en radiant:
pour les angles que fait chaque roue pour que le robot fasse pi rad:
gauche va par exemple faire pi et droite - pi
se qui fait (pi - (-pi)) /2=pi
pour la distance c'est plus simple tu fais l'avancement moyen des roue
- swolf aime ceci
#63
Posté 27 août 2012 - 08:30
J'ai déjà essayé de faire de l'odométrie avec la méthode du "Trapèze", resultat le code fait 120 lignes !!!!


Voici le code java de la méthode wiki :
public void add(double roueG, double roueD,int temps, int angleCapteur, int distance) { //---------------------------------------------------------- // Reperer sur la carte le robot, et son angle //---------------------------------------------------------- double v = (roueD+roueG)/2; double R = (D/2)*(roueD+roueG)/(roueD-roueG); double da = ((roueD*temps+roueG*temps)/2)/R; double Xo = X_Robot-R*sin(a); double Yo = Y_Robot+R*sin(a); a = a+da; X_Robot = Xo +R*sin(a); Y_Robot = Yo - R*cos(a); System.out.println("X_Robot : "+X_Robot+" Y_Robot : "+Y_Robot+ " a : "+a); //---------------------------------------------------------------------- // Le robot est placé dans le repére. // Il faut maintenant placer l'obsatcle dans ce repére. // Pour ce faire nous disposons de la distance de l'obstacle et son angle. //---------------------------------------------------------------------- // On transforme la position trigonométrique de l'obstacle en position // cartésienne avec le robot comme origine. double x_obstacle = distance*cos(a+angleCapteur); double y_obstacle = distance*sin(a+angleCapteur); // On passe du robot comme origine à celui de la carte. // On change de repère donc on modifie les coordonnées int X_Obstacle = (int) (X_Robot + x_obstacle); int Y_Obstacle = (int) (Y_Robot + y_obstacle); // On ajoute à la liste, sauvegarde et dessine sur l'écran liste.add(new Obstacle(X_Obstacle ,Y_Obstacle)); sauv.enregistrer(liste); wifi.drawWifi(X_Obstacle, Y_Obstacle, (int) X_Robot, (int) Y_Robot); graphique.draw((int) X_Robot, (int) Y_Robot, 'R'); }
Lorsque j'utilise la méthode add avec VitGauche = 0.8 m/s, VitDroite = 0.5m/s, temps = 0.065s, 100 fois de suite. le déplacement du robot ne correspond pas à un cercle. Pourtant l'odométrie devrait percevoir que le robot tourne à droite, mais je ne vois rien.
Au cours de ce "déplacement" la postion de X varit de quelques centièmes, par contre celle de Y chute pour atteindre les -4000

Je suis actuellement entrain de vérifier si je n'ai pas mélangé mon code "Trapèze" avec celui là, ou si j'ai gardé les même unités tout le long. On ne sait jamais avec moi

Meric de votre réponse pour toute autre proposition ou si vous pouvez m'expliquer les calculs de wikipédia.
#64
Posté 27 août 2012 - 09:14
regarde ici: si tu sais lire de l'anglais, c'est un post de jbot:
http://www.instructa...he-source-code/
sinon pour comprendre les calculs résonne en radiant:
pour les angles que fait chaque roue pour que le robot fasse pi rad:
gauche va par exemple faire pi et droite - pi
se qui fait (pi - (-pi)) /2=pi
pour la distance c'est plus simple tu fais l'avancement moyen des roue
Merci beaucoup! grâce au code de JBot j'ai presque tout compris (mais toujours pas l'histoire de (left_mm -right_mm)/D = theta en radian... Si quelqu'un a la demo mathématique et que c'est pas trop trop compliqué je suis preneur

Merci à toi et a JBot s'il passe par là!
Et quelqu'un sait sinon pourquoi la méthode wikipedia ne fonctionne pas?
#65
Posté 27 août 2012 - 09:43
Merci beaucoup! grâce au code de JBot j'ai presque tout compris (mais toujours pas l'histoire de (left_mm -right_mm)/D = theta en radian... Si quelqu'un a la demo mathématique et que c'est pas trop trop compliqué je suis preneur
)
Merci à toi et a JBot s'il passe par là!
Et quelqu'un sait sinon pourquoi la méthode wikipedia ne fonctionne pas?
... approximation de sin(x) par x pour théta très petit? ... mais ça n'explique pas la soustraction, si?
#66
Posté 27 août 2012 - 10:21
... approximation de sin(x) par x pour théta très petit? ... mais ça n'explique pas la soustraction, si?
ah ouais l'approximation de gauss... Donc on aurait sin(x)=left_mm-right_mm/2 = x? c'est ça? (je déteste la trigo! :@ )
#68
Posté 27 août 2012 - 11:57
Son algorithme est très bien, mais je bloque encore sur cette ligne :
theta += (right_mm - left_mm) / Entraxe;
Donc d-theta = (Droite-Gauche)/Entraxe

Si d-theta est faible, nous pouvons supposer que le triangle est rectangle en I.
Donc sin(d-theta) = (Droite-Gauche)/Entraxe
Si d-theta est faible, on utilise également l'approximation de Gauss :
sin(d-theta- = d-theta = (Droite-Gauche)/Entraxe.
Est-ce cela derrière cette ligne de code ?
A partir de combien peut-on considèrer que d-theta est faible, pour évité que sa valeur soit trop "arrondie" ?
Cette valeur va par la suite servir à localiser le robot et l'obstacle, le degrès d'erreur ne risque pas de fausser la cartographie ?
Je sais ça fais beaucoup de questions, merci à l'avance pour vos réponses.
- swolf aime ceci
#69
Posté 28 août 2012 - 12:09
EDIT: C'est pas le diametre en fait, c'est l'entraxe ce par quoi on divise...
#70
Posté 28 août 2012 - 08:49
@francois: ah ouais, bien vu pour le schéma, je pense que t'as raison... par contre il va falloir qu'on gere le calcul directement dans la arduino pour que l'intervalle de temps soit régulier, qu'on puisse effectuer le calcul à a une frequence supérieure à 2Hz et que la trame ne soit pas remplie par le nombre de ticks...
D'ou l'interet des interruptions timers

EDIT: C'est pas le diametre en fait, c'est l'entraxe ce par quoi on divise...
C'est en effet le diametre DU ROBOT, et non le diametre des roues ^^ (donc c'est bien l'entraxe entre les deux roues comme tu le dis)
Et c'est Jbot, pas Jbob

Malédiction du Créatif :
Plus vous avez d’idées et moins vous arrivez à les structurer.
#71
Posté 28 août 2012 - 11:02
Les calculs simples comme ceux de "left_mm" et "right_mm" peuvent être fait sur l'arduino. Mais ensuite il vaut mieux envoyer ses valeurs à l'ordi pour les calculs faisant intervenir des cos ou sin, sinon l'arduino va être débordée.
#72
Posté 28 août 2012 - 12:00
Autant on en voit qui sur-estime l'arduino en voulant faire du traitement de l'image dessus, autant vous vous la sous-estimez totalement, c'est pas quelques multiplications qui vont la mettre à plat non plus

- swolf aime ceci
Malédiction du Créatif :
Plus vous avez d’idées et moins vous arrivez à les structurer.
#73
Posté 28 août 2012 - 01:44
Au final ce que l'ATMega2560 envoyait à ton PC Jbot c'est tes coordonnées X, Y et ton cap?
L'année prochaine à la coupe on devrait avoir un µC dédié au positionnement, on pourra lui demander la position du robot quand on veut.
#75
Posté 28 août 2012 - 02:22
Probablement des ATMega en DIP28 ou PDIP, et/ou arduino MEGA. J'aimerai bien faire des tests avec le MK802 aussi, et j'ai entendu qu'un de nos profs avait un RPi... C'est pas tant sur le matos mais sur la manière de l'utiliser qu'on a des progrès a faire je pense.
#76
Posté 28 août 2012 - 06:07

PS : @Hexa Emails, je me suis pris une ChipKit Uno32, elle à la même forme q'une aruino, le même code, le même prix , sauf qu'elle à 2X plus d'entrée/sortie, et un PIC 32bit. Par contre vu que c'est un PIC, certaines libraries arduino ne sont pas encore compatibles, et dans ce cas il faut la programmer par MPLAB.... on peut pas tout avoir

#77
Posté 28 août 2012 - 06:14
Déjà il faut savoir que l'approximation faite ici est que les mesures soient prises assez rapidement pour qu'on puissent approximé la vitesse de chacune des roues constante entre deux mesures et ainsi assimiler la trajectoire du robot à une succession d'arc de cercles.
Donc : notons A le centre du cercle de la trajectoire entre deux mesures B le centre de la roue gauche C le centre de la roue droite.
la roue gauche va parcourir la distance BD et la roue droite la distance CF sous forme d'arc de cercles.
Le codeur placé sur chacune des roues va mesurer ces distances "arquée"
Or comme ce sont des arc de cercles, en notant alpha l'angle des arc de cercle la formule est donc : alpha*AB= l'arc BD et alpha*AC= l'arc CF
on pourrait ainsi connaitre alpha en connaissant AB ou AC ! vu qu'on a la mesure des arc CF et BD donné par les capteurs. Or on connait ni l'un ni l'autre ! Mince alors !
Heureusement : on connait BC puisque c'est l'entre axe entre la roue gauche et la roue droite ! et comme on a : AC-AB = BC onc on peut faire :
alpha*AC -alpha*AB= l'arc CF - l'arc BD
= alpha*BC
donc alpha = (arc CF -arc BD)/(BC)
je joins un schémas fait sur géo gébra avec les instruction pour le reproduire si vous voulez faire bouger les points.

Pour plus d'explications n'hésitez pas à demander.
Si vous n'êtes pas d'accord avec cette proposition : ne nous emportons pas et discutons

Pour info : ici la précision du calcul dépendra le l'accélération du véhicule : plus l'accélération sera faible plus l'angle sera correctement calculé.
- swolf aime ceci
Si mon commentaire vous a plus laissez nous un avis !
Nouveau sur Robot Maker ?
Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope aux articles, à la boutique et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être !
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!
#78
Posté 28 août 2012 - 06:34
Aaaaaaaaaaaah ca marche merci beaucoup pour votre aide !!!!
Pour l'instant il est en java, mais on le mettra sur arduino en plus ce n'est pas un 8bit que l'on a mais un 32bit... Pour ceux qui veulent une vidéo c'est ici. Pfou voilà une bonne chose de faite... encore merci !!!!!
PS : @Hexa Emails, je me suis pris une ChipKit Uno32, elle à la même forme q'une aruino, le même code, le même prix , sauf qu'elle à 2X plus d'entrée/sortie, et un PIC 32bit. Par contre vu que c'est un PIC, certaines libraries arduino ne sont pas encore compatibles, et dans ce cas il faut la programmer par MPLAB.... on peut pas tout avoir
petit addendum:
La répartition des tâches d'odométrie/cartographie entre les µc se fera de la façon suivante:
La Arduino (chipkit) calcule x, y et Theta et l'envoie à mk802 en boucle, aussi vite qu'elle peut
Toutes les 50ms (@Hexa email: je vois pas trop comment faire juste avec millis() à part en faisant des conditions...) elle envoie la distance captée par un des capteurs us
La mk802 récupère ces valeurs et les renvoie via WiFi à un ordinateur disant sur lequel ce trouve une GUI en Java qui affiche une petite carte de la pièce et permet également à l'utilisateur de diriger le robot, soit en le dirigeant comme une voiture téléguidée, soit en cliquant sur un point de la carte pour que le robot y aille (comme dans les RPG sur ordi

Les ordres utilisateurs sont envoyées dans le sens inverse:
"voiture télécommandée": GUI-->mk802-->arduino
point de coordonnées: il faut encore qu'on décide comment on procède mais l'algo de planif se ferait dans l'ordinateur distant, il envoie la trajectoire (sous quelle forme??) à la mk802 qui la divise en "morceaux" de droite puis les envoie à la arduino pour qu'elle s'occupe de donner les ordres bas niveau (vitesses moteurs)
nous devons encore acheter une batterie (on va attendre un peu car c'est super cher!), 8 capteurs (on achète ça ce soir, 1.73€ pièce on peut y aller), pour les ball-caster j'en ai une et on ira en acheter une autre à Lextronic et normalement ce sera bon pour le hardware

voilaaaa!
#79
Posté 28 août 2012 - 06:52

@JBot: si tu as le temps, tu pourras juste m'expliquer ton timer ISR(TIMER1_OVF_vect): tu dis que ça permet d'être très précis mais je ne comprends pas pourquoi tu met le sei() dedans, ni où tu as réglé la fréquence d'exécution du timer...
et aussi tes opérations sur l'oscillateur de la arduino, la raison pour laquelle tu affectes les entrées sorties manuellement, et pourquoi tu inclues des libs qui le sont déjà automatiquement!
Avec ça déjà je serai moins con XD
Je te payerai une bière sans faute le jour où on se rencontre IRL

#80
Posté 28 août 2012 - 06:57
Je te payerai une bière sans faute le jour où on se rencontre IRL
pour moi ça sera un simple coca


Si mon commentaire vous a plus laissez nous un avis !
Nouveau sur Robot Maker ?
Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope aux articles, à la boutique et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être !
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!
Répondre à ce sujet

1 utilisateur(s) li(sen)t ce sujet
0 members, 1 guests, 0 anonymous users