Alog rotation d'un angle donné (sur place) d'un robot muni d'un compas
Répondre à la discussion
Affichage des résultats 1 à 16 sur 16

Alog rotation d'un angle donné (sur place) d'un robot muni d'un compas



  1. #1
    mweber

    Alog rotation d'un angle donné (sur place) d'un robot muni d'un compas


    ------

    Bonjour,

    Je galère un peu avec les modulos 360°

    Quelqu’un a t'il vu ou réalisé un programme (genre en C) qui commande un robot pour qu'il effectue une rotation de N degrés sur place (deux moteurs tournant en sens opposés)

    Données:

    - On a une boussole donnant un azimut compris entre 0 et 359.9°
    - On entre une consigne N = Angle de rotation demandé (c'est une rotation relative à la position de départ)
    => Par ex: N = +90: Le robot tourne à droite dans le sens horaire de 90°: il fait donc un quart de tour
    => Par ex: N = -180: Le robot tourne à gauche dans le sens antihoraire de 180°: il fait donc un demi-tour

    Dans ma fonction (non bloquante ou boucle itérative peu importe...) je voudrais juste connaitre en temps réel l'écart angulaire pour gréer mes moteurs (PWM réglé par un PID..)
    Si l'écart (°départ <=> °arrivé) est positif, je tourne dans un sens
    Si l'écart (°départ <=> °arrivé) devient négatif, je dois tourner dans l'autre sens car j'ai dépassé le nouveau cap souhaité
    Si l'écart (°départ <=> °arrivé) est proche de +/-0 => Fin

    J'ai bricolé un code qui marche uniquement dans un sens de rotation (horaire c-a-d angle augmentant) et qui "dérape" si l'écart devient négatif (fait plusieurs tours jusqu’à ce que l'on tombe sur zéro en écart!)

    Code:
    #include <stdio.h>
    
    int bouger(const int _argument); // Fonction non bloquante qui renvoie 0 lorsque je suis arrivé à destination sinon renvoie 1
    
    int main()
      {
      while (bouger(100));  // Boucle jusqu’à l'arrivée à destination  (100° sur la droite)
      return 0;
      }
    
    
    
    int bouger(const int _argument) // Cette fonction est un prototype qui ne marche qu'avec _argument > 0 
    {
    static int   consigne_cap           = 0;   // Consigne cap à suivre lors des déplacements
    static unsigned long compteur_deplc = 0;
    static int init = 1; 
    int Angle_ecart = 0;                       // calcul de l'écart entre la trajectoire souhaitée et la réelle ou écart en degré par rapport au cap voulu lors des rotations
    
    static int boussole  = 300;   // Simule la boussole => Ici on démarre à l’azimut 300°
    
    
    boussole +=11;          // Simule la boussole => Simule le déplacement et donc le changement des valeurs de cap lut par la boussole
    boussole  = boussole %360;   // 0° < boussole < 360° 
    
    
     if (init)   // Exécuté au 1er appel de la fonction (mémorise l'azimut actuel, et RAZ des valeurs de calculs)
        {
        init = 0;    
     
        consigne_cap = boussole  + _argument;
        if (consigne_cap > 360) consigne_cap-= 360;  
        }
      
     Angle_ecart = consigne_cap - boussole ;              // calcul de l'écart entre l'orientation initiale et la finale
     
     if (Angle_ecart < 0)  Angle_ecart+= 360;  // Evite les bugs lorsque boussole + consigne_cap  > 360
    
     printf("\n\nCap: %d    D: %d    consigne_cap: %d", boussole , Angle_ecart, consigne_cap); // Affiche le déroulement du programme
    
      if      (Angle_ecart <   1)  {printf("\n\nFINI "); return 0;}   // STOP car fin du mouvement   
      else return (1);  // On a pas fini...
    }
    Vous pouvez tester le code ici : https://www.onlinegdb.com/online_c_compiler

    ...et on vois que l'on fait plusieurs tours avant d'y arriver (et évidemment je de gère pas les angles négatifs pour tourner à gauche)

    Merci d'avance, cela me permettra de tondre ma pelouse sans faire trop de ronds

    Matthieu

    -----
    Dernière modification par mweber ; 15/01/2022 à 17h01.

  2. #2
    jiherve

    Re : Alog rotation d'un angle donné (sur place) d'un robot muni d'un compas

    bonsoir
    il faut utiliser un codage strictement binaire des angles aligné sur la taille des donnée traitées par l’arithmétique du µC : 0 = 0x0 , 359.999 = 0xFFFF_FFFF pour une machine travaillant sur 32 bits signés mais on peut choisir plus court mais toujours signé et ensuite le signe d'une bête différence donne la direction du mouvement car on bénéficie du "bouclage" naturel du calcul.
    Ensuite pour sortir de la boucle il faut une tolérance assez grande sur l’écart absolu car il y a pas mal de retards et d’imprécisions dans la chaine de retour.
    JR
    l'électronique c'est pas du vaudou!

  3. #3
    umfred

    Re : Alog rotation d'un angle donné (sur place) d'un robot muni d'un compas

    dans tous les cas, l'angle final sera égal à (position_initiale+N) modulo 360
    et sinon pour le sens, il faut détecter et conserver le signe de N tant que l'on a pas atteint (ou dépasser) la position

  4. #4
    mweber

    Re : Alog rotation d'un angle donné (sur place) d'un robot muni d'un compas

    Merci pour vos suggestions, j'ai modifié le code, ça commence à "venir"

    mais je fais encore plusieurs tours avant de m'arrêter

    (boussole_deg est l'image en degrés de la boussole contrairement à boussole qui est le mapping en signed short (16 bits))


    Code:
    #include <stdio.h>
    #include <limits.h>
    
    int bouger(const double _argument); // Fonction non bloquante qui renvoie 0 lorsque je suis arrivé à destination sinon renvoie 1
    
    int main()
      {
      while (bouger(359.99));  // Boucle jusqu’à l'arrivée à destination  (100° sur la droite)
      return 0;
      }
    
    
    
    int bouger(const double _argument)                       // Cette fonction est un prototype qui ne marche qu'avec _argument > 0 
    {
    static signed short   consigne_cap           = 0;         // Consigne cap à suivre lors des déplacements
    static unsigned long compteur_deplc = 0;
    static short init = 1; 
    int signed Angle_ecart = 0;                                    // calcul de l'écart entre la trajectoire souhaitée et la réelle ou écart en degré par rapport au cap voulu lors des rotations
    
    static double boussole_deg = 100;                         // position (azimut) initial du robot
    signed short boussole  = 0;
    
    boussole = boussole_deg / 359.99 * SHRT_MAX ;   // conversion en short signé pour simplifier les modulos
    
    boussole_deg +=1;          // Simule la boussole => Simule le déplacement et donc le changement des valeurs de cap lut par la boussole
    
     if (init)   // Exécuté au 1er appel de la fonction mémorise l'azimut actuel
        {
        init = 0;    
     
        consigne_cap = boussole  + (_argument / 359.99 * SHRT_MAX);  // conversion en short signé pour simplifier les modulos
        }
      
     Angle_ecart = consigne_cap - boussole ;                                       // calcul de l'écart entre l'orientation initiale et la finale
     
     
     printf("\nBoussole: %d     boussole deg: %d     D: %d     consigne_cap: %d", boussole, (int)boussole_deg%360 , Angle_ecart, consigne_cap); // Affiche le déroulement du programme
     
     if ((Angle_ecart <   1) && (Angle_ecart >   -1))  {printf("\n\nFINI "); return 0;}   // STOP car fin du mouvement 
      
     else return (1);  // On a pas fini...
    }
    Dernière modification par mweber ; 18/01/2022 à 11h12.

  5. A voir en vidéo sur Futura
  6. #5
    jiherve

    Re : Alog rotation d'un angle donné (sur place) d'un robot muni d'un compas

    bonjour,
    si les angles sont maintenant codés sur 16 bits signés alors 1 lsb représente 19 secondes d'arc soit peanuts avec un robot fait maison il ne faut pas espérer mieux que le degré soit environ +- 200 lsb mais il faudra avoir calibré le capteur avant ce qui n'est pas une mince affaire.
    à noter que classiquement le capteur magnétique doit nativement fournir un codage sur 16 bits signés.
    JR
    l'électronique c'est pas du vaudou!

  7. #6
    mweber

    Re : Alog rotation d'un angle donné (sur place) d'un robot muni d'un compas

    Bonjour,

    Oui 1 degré ce sera amplement suffisant pour tondre une pelouse.

    Le cap est fourni par une IMU BNO055

    Pour calibrer le compas (nécessite d'effectuer une rotation axe Z et Y) (lacet / tangage) je fais tourner le robot sur lui-même et, en même temps à l'aide d'un servomoteur, je fais pivoter l'IMU d'avant en arrière.
    C'est un peu orthodoxe mais ça marche.

    J'ai d'ailleurs remarqué qu'il faut pas hésiter à prolonger un peu cette danse après que l'IMU se déclare calibrée sinon il arrive que le cap dérive entre 0 et 90° les secondes qui suivent..
    Le robot fait environ 2 ou 3 tours sur lui-même

    Matthieu
    Dernière modification par mweber ; 18/01/2022 à 17h54.

  8. #7
    jiherve

    Re : Alog rotation d'un angle donné (sur place) d'un robot muni d'un compas

    bonsoir
    c'est une Rolls ton capteur moi je galère avec des modules basiques.
    JR
    l'électronique c'est pas du vaudou!

  9. #8
    mweber

    Re : Alog rotation d'un angle donné (sur place) d'un robot muni d'un compas

    Oui

    Le calcul du cap a un bon algorithme (fusion des 6 degrés de liberté)

  10. #9
    umfred

    Re : Alog rotation d'un angle donné (sur place) d'un robot muni d'un compas

    Je pense qu'il faut aussi à un moment, regarder le signe de la consigne ou le dépassement de 360° dans le sens positif (et en dessous de 0 dans le sens opposé) pour calculer l'écart
    si tu es à 350° que la consigne est de +20°, l'angle final est de +10°, mais si tu calcules l'écart tu trouves 340° (il faudrait soustraire de 360° ensuite)
    si tu es à 10°, que la consigne est de -20°, l'angle final devrait être de 350°, mais pareil, l'écart est de 340° (il faut là aussi le soustraire de 360°)
    Je pense que ça peut expliquer le tour supplémentaire.

  11. #10
    jiherve

    Re : Alog rotation d'un angle donné (sur place) d'un robot muni d'un compas

    bonsoir
    c'est pour çà qu'il faut travailler avec des données calées sur celles natives de l'ALU . Moi je bricole presque toujours en ASM et je n'ai jamais de surprise, bon c'est moins convivial mais çà pousse!
    JR
    l'électronique c'est pas du vaudou!

  12. #11
    mweber

    [RESOLU] Re : Algo rotation d'un angle donné (sur place) d'un robot muni d'un compas

    Hé hé ! ne vous battez pas !

    J'ai trouvé la solution :

    2 bugs :

    Le 1er:
    En simulant la rotation, et donc le changement de cap vu par la boussole (boussole_deg +=1) une fois arrivé à destination, si je la dépasse, je suis (censé) inverser le sens de rotation du robot et donc voir ma boussole "tourner dans l'autre sens" ...sauf que je ne n'avais pas intégré ce changement de sens, dans cette simulation !

    Le 2eme:
    Bah si je veux un codage en 0x00->0 ° 0xFFFF->359.999° faut utiliser USHRT_MAX (#define USHRT_MAX 65535) et non pas SHRT_MAX (#define SHRT_MAX 32767) ça c'est à trop se dire: Ah bein c'est des signés short alors on utilise SHRT_MAX, parce que c'est signé et que ça va avec !

    @JiHervé: Héhé en 2022, tu vas passer pour un terroriste à coder en ASM Déjà que chez nous, ils adorent ...Labview...

    Voici donc la soluce:

    Code:
    #include <stdio.h>
    #include <limits.h>
    
    int bouger(const double _argument); // Fonction non bloquante qui renvoie 0 lorsque je suis arrivé à destination sinon renvoie 1
    
    int main()
      {
      while (bouger(355));  // Boucle jusqu’à l'arrivée à destination  (xxx° azimuth final)
      return 0;
      }
    
    
    
    int bouger(const double _argument)                       // Cette fonction est un prototype qui ne marche qu'avec _argument > 0 
    {
    static signed short   consigne_cap           = 0;         // Consigne cap à suivre lors des déplacements
    static unsigned long compteur_deplc = 0;
    static short init = 1; 
    int signed Angle_ecart = 0;                                    // calcul de l'écart entre la trajectoire souhaitée et la réelle ou écart en degré par rapport au cap voulu lors des rotations
    
    static double boussole_deg = 10;                         // position (azimut) initial du robot
    signed short boussole  = 0;
    
    boussole = boussole_deg / 359.999 * USHRT_MAX;            // conversion en short signé pour simplifier les modulos
    
    
    
     if (init)   // Exécuté au 1er appel de la fonction mémorise l'azimut actuel
        {
        init = 0;    
        consigne_cap = boussole  + (_argument / 359.999 * USHRT_MAX);  // conversion en short signé pour simplifier les modulos
        }
      
    Angle_ecart = consigne_cap - boussole ;                          // calcul de l'écart entre l'orientation initiale et la finale
     
     
     printf("\nBoussole: %d     boussole deg: %d     D: %d     consigne_cap: %d", boussole, (int)boussole_deg%360 , Angle_ecart, consigne_cap); // Affiche le déroulement du programme
     
          if ((Angle_ecart <=   2) && (Angle_ecart >=   -2))  {printf("\n\nFINI "); return 0;}   // STOP car fin du mouvement 
          
    // Simulation de la boussole :      
        if        ( Angle_ecart <   -1) boussole_deg -=1;          // Simule la boussole => Simule le déplacement et donc le changement des valeurs de cap lut par la boussole
        else if ( Angle_ecart >    1) boussole_deg +=1;          // Simule la boussole => Simule le déplacement et donc le changement des valeurs de cap lut par la boussole
        if (boussole_deg < 0)  boussole_deg=359.999;
    // fin simulation de la boussole
     
      
    else return (1);  // On a pas fini...
    }
    Merci de votre aide en tout ca

    Cheers
    Matt
    Dernière modification par mweber ; 19/01/2022 à 09h48.

  13. #12
    mweber

    Re : Alog rotation d'un angle donné (sur place) d'un robot muni d'un compas

    Pour compléter :

    Avec une consigne positive 0 <= X <= 179.9° vous tournerez vers la droite de X degrés

    Avec une consigne négative -179.9° <= X <= 0 vous tournerez vers la gauche de X degrés

    Si vous dépassez (en valeur absolue) les 179.9° de consigne, le robot tournera dans le sens opposé pour faire le moins de distance (feignasse !)

  14. #13
    jiherve

    Re : Alog rotation d'un angle donné (sur place) d'un robot muni d'un compas

    bonjour,
    en effet lorsque le calcul est bien mené la direction indiquée sera toujours celle la plus courte (distance curviligne bien sur).
    moi pour le moment je me bas avec l'accéléromètre pour detecter le blocage de mon petit robot chenillé d’intérieur (les chenilles patinent bien sur le carrelage) avec sa faible vitesse et le raffut vibratoire du au moteur ce n'est pas facile d'aller sortir le signal du bruit enfin çà m'occupe.
    qu'utilises tu comme détection d'obstacles ?
    JR
    l'électronique c'est pas du vaudou!

  15. #14
    mweber

    Re : Alog rotation d'un angle donné (sur place) d'un robot muni d'un compas

    Si fait !

    Pas bête d'utiliser l'accéléro mais tu dois avoir du bruit (mécanique)
    Peut être une moyenne glissante des 2 dernières secondes que tu compare à ta dernière mesure (détection de pic de décélération) ?

    Regardes du coté des télémètres (modules Time of flight) (https://www.adafruit.com/product/3317) tu peux faire un vrai lidar et ça marche bien (mieux que les US d'ailleurs)

    Nom : robot.jpg
Affichages : 141
Taille : 212,3 Ko
    Dernière modification par mweber ; 19/01/2022 à 12h15.

  16. #15
    jiherve

    Re : Alog rotation d'un angle donné (sur place) d'un robot muni d'un compas

    re
    belle bidouille, je vois que tu utilises des capteurs mécaniques pour detecter les obstacles proches car le capteur US est souvent aveugle à courte distance. J'ai doublé le mien d'un capteur IR mais là encore les pieds de chaise passent souvent en zone aveugle.
    JR
    l'électronique c'est pas du vaudou!

  17. #16
    mweber

    Re : Alog rotation d'un angle donné (sur place) d'un robot muni d'un compas

    Merci !
    Reste à peigner les fils pour que ce soit moins bordélique
    Dernière modification par mweber ; 19/01/2022 à 16h42.

Discussions similaires

  1. Quelle puissance de 2 dépasse la tangente d'un angle donné?
    Par geometrodynamics_of_QFT dans le forum Mathématiques du supérieur
    Réponses: 8
    Dernier message: 07/03/2016, 22h10
  2. Position d'un objet en rotation placé sur un support en rotation
    Par invite787a858d dans le forum Physique
    Réponses: 30
    Dernier message: 30/07/2015, 12h27
  3. Surface projeté d'un volume (avec un angle donné)
    Par herman dans le forum Mathématiques du supérieur
    Réponses: 17
    Dernier message: 12/06/2013, 17h49
  4. Règle et Compas ( Construction approximative trisection angle de 60° )
    Par Guimzo dans le forum Mathématiques du collège et du lycée
    Réponses: 0
    Dernier message: 04/09/2012, 19h02
  5. Longueur d'une spirale pour un angle donné
    Par invitefd41cdf1 dans le forum Mathématiques du supérieur
    Réponses: 3
    Dernier message: 11/06/2011, 21h36