Aller au contenu


FJProd

Inscrit(e) (le) 03 juin 2012
Déconnecté Dernière activité sept. 09 2012 02:00
-----

Messages que j'ai postés

Dans le sujet : robot autonome

29 août 2012 - 05:36

@mike118 : Je ne comprend pas comment tu as trouvé 2*alpha*AB = arc BD ?
Lorsque j'utilise un produit en croix pour retrouver la formule :
un tour ----> perimètre
d'où
2*PI ----> 2*PI*AB
alpha ----> arc BD= (2*PI*AB*alpha)/2*PI = AB*alpha

Et par la suite,

arc CF - arc BD = alpha*BC
alpha = (arc CF - arc BD)/BC

Bref, j'aurais besoin d'explication sur ton post, car je perds le facteur 2 lorsque j'essaye de comprend. Merci à l'avance !

Dans le sujet : robot autonome

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

Dans le sujet : robot autonome

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.

Dans le sujet : robot autonome

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

Dans le sujet : robot autonome

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.