Aller au contenu


Photo
- - - - -

robot autonome


88 réponses à ce sujet

#61 Hexa Emails

Hexa Emails

    Membre passionné

  • Membres
  • PipPipPip
  • 439 messages
  • Gender:Male

Posté 27 août 2012 - 08:21

"SimpleTimer" c'est un faux temps réel, tu peux faire aussi bien avec la fonction millis().
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 lordcuty

lordcuty

    Habitué

  • Membres
  • PipPip
  • 298 messages

Posté 27 août 2012 - 08:26

regarde ici: si tu sais lire de l'anglais, c'est un post de jbot:

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

#63 FJProd

FJProd

    Membre

  • Membres
  • 14 messages

Posté 27 août 2012 - 08:30

Pour commencer je vous remercie énormément de votre aide et de vote intérêt pour ce sujet.

J'ai déjà essayé de faire de l'odométrie avec la méthode du "Trapèze", resultat le code fait 120 lignes !!!! :dash2: (sans rire vous pouvez le voir sur le blog ici). Donc quand je constate qu'avec la même méthode le cLubElek plit le problème en 10 lignes et wikipédia en seulement 5 lignes, je veux la même chose. :D

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 :unsure:
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 swolf

swolf

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 626 messages
  • Gender:Male

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?
Notre blog, à FJprod et moi: http://2froblog.wordpress.com/

#65 Hexa Emails

Hexa Emails

    Membre passionné

  • Membres
  • PipPipPip
  • 439 messages
  • Gender:Male

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 swolf

swolf

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 626 messages
  • Gender:Male

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! :@ )
Notre blog, à FJprod et moi: http://2froblog.wordpress.com/

#67 Hexa Emails

Hexa Emails

    Membre passionné

  • Membres
  • PipPipPip
  • 439 messages
  • Gender:Male

Posté 27 août 2012 - 11:06

à confirmer quand il passera dans le coin, ça semble le plus probable. C'est gourmand de faire des sin(float) sur un µ8bits... d'où l'idée de passer par un processeur ARM :P

#68 FJProd

FJProd

    Membre

  • Membres
  • 14 messages

Posté 27 août 2012 - 11:57

Merci beaucoup pour ce lien et ce fameux Jbot !!!
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
Fichier joint  Approximation.tiff   134,57 Ko   163 téléchargement(s)

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.

#69 swolf

swolf

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 626 messages
  • Gender:Male

Posté 28 août 2012 - 12:09

@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...

EDIT: C'est pas le diametre en fait, c'est l'entraxe ce par quoi on divise...
Notre blog, à FJprod et moi: http://2froblog.wordpress.com/

#70 Jbot

Jbot

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 801 messages
  • Gender:Male
  • Location:Paris

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 :P

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 :P


Malédiction du Créatif :
Plus vous avez d’idées et moins vous arrivez à les structurer.


#71 FJProd

FJProd

    Membre

  • Membres
  • 14 messages

Posté 28 août 2012 - 11:02

Visiblement je commencais déjà à dormir en écrivant le post d'hier...

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 Jbot

Jbot

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 801 messages
  • Gender:Male
  • Location:Paris

Posté 28 août 2012 - 12:00

Hummm, non tu peux tout faire sous l'arduino, c'est ce que je fais dans mon code et ça marche trés bien.

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 ;)


Malédiction du Créatif :
Plus vous avez d’idées et moins vous arrivez à les structurer.


#73 Hexa Emails

Hexa Emails

    Membre passionné

  • Membres
  • PipPipPip
  • 439 messages
  • Gender:Male

Posté 28 août 2012 - 01:44

Et en plus, le plus lent dans l'histoire c'est la liaison série non?
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.

#74 Jbot

Jbot

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 801 messages
  • Gender:Male
  • Location:Paris

Posté 28 août 2012 - 01:58

Oui, mon arduino me renvoyait directement X, Y, theta en permanence, et le pc lui donnait X, Y à atteindre.

Vous utilisez quoi comme processeur l'année prochaine ?


Malédiction du Créatif :
Plus vous avez d’idées et moins vous arrivez à les structurer.


#75 Hexa Emails

Hexa Emails

    Membre passionné

  • Membres
  • PipPipPip
  • 439 messages
  • Gender:Male

Posté 28 août 2012 - 02:22

Je sais pas, on votera ^^

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 FJProd

FJProd

    Membre

  • Membres
  • 14 messages

Posté 28 août 2012 - 06:07

Aaaaaaaaaaaah ca marche merci beaucoup pour votre aide !!!! :yahoo: 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 :P

#77 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 985 messages
  • Gender:Male
  • Location:Anglet

Posté 28 août 2012 - 06:14

Bon je pense que certains ont bien fait de demander une explication pour la formule donnée ... j'en propose une : ( EDIT : mon étourderie a été corrigée )


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.imprim ecran demo.png

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é.

Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

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!

 

Les réalisations de Mike118  

 

 

 


#78 swolf

swolf

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 626 messages
  • Gender:Male

Posté 28 août 2012 - 06:34

Aaaaaaaaaaaah ca marche merci beaucoup pour votre aide !!!! :yahoo: 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 :P


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 :) ). La partie "voiture télécommandée" est déjà fonctionnelle mais on a pas encore commencé la partie planification de trajectoire...
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!


Notre blog, à FJprod et moi: http://2froblog.wordpress.com/

#79 swolf

swolf

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 626 messages
  • Gender:Male

Posté 28 août 2012 - 06:52

@mike118: merci pour ces détails, je regarderai à tête reposée avec un papier et un crayon ;)

@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 ;)
Notre blog, à FJprod et moi: http://2froblog.wordpress.com/

#80 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 985 messages
  • Gender:Male
  • Location:Anglet

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 ;) (je te couterais moins cher ;) )

Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

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!

 

Les réalisations de Mike118  

 

 

 




Répondre à ce sujet



  


1 utilisateur(s) li(sen)t ce sujet

0 members, 1 guests, 0 anonymous users