Aller au contenu


Photo
- - - - -

Comment gérer le passage d'angle 0 360° dans un robot ?


  • Veuillez vous connecter pour répondre
1 réponse à ce sujet

#1 estello

estello

    Nouveau membre

  • Membres
  • 5 messages

Posté 16 mai 2019 - 09:55

Bonjour,

 

Je construis un robot avec arduino mega et un cmps03 avec 12c.
Je voudrais placer le robot à un endroit différent, et m'assurer qu'il tourne pour un nombre spécifique de degrés (90, 45 et ainsi de suite). Dans le programme, je vais faire tourner le robot CW ou CCW (non basé sur la valeur du compas, je vais sélectionner la direction chaque fois dans le programme).
 
Je n'ai aucun problème pour lire la valeur de la boussole, mais je ne sais pas comment la logique qui la sous-tend.
Ma boussole est entre 0 et 360, il n'y a donc pas de valeurs négatives.
Ainsi, par exemple, je veux faire pivoter le robot de 90 degrés.
Si la valeur de départ de la boussole est 0, j'attendrai que la lecture de la boussole soit supérieure à 90.
Mais si le numéro de boussole est 280 degrés, la lecture finale devrait être de 10 degrés (280+360-90=10) et c'est pourquoi je ne peux pas simplement soustraire les valeurs actuelles et de départ, sinon je vais obtenir 
Le robot serait dans différents anges donc je veux savoir si vous avez une suggestion de programmation.
Actuellement, je n'ai pensé qu'à ces situations, mais je suis sûr qu'il y en a beaucoup d'autres que je n'ai même pas pensées (comme quand je veux que le robot fasse tourner CCW au lieu de CW).
 
Encore une fois, je n'ai pas de code actuellement, je veux juste comprendre la logique derrière lui, mais je suis sûr qu'il y en a beaucoup d'autres que je n'ai même pas eues à l'esprit si les cas comme (valeur actuelle valeur de départ valeur de départ >=180) mais je ne peux pas comprendre cela.
Merci pour les aides


#2 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 934 messages
  • Gender:Male
  • Location:Anglet
  • Interests:Robotique, Entrepreneuriat, Innovation, Programmation, Résolution de problème, Recherche de solutions, Mécanique, Electronique, Créer, Concevoir

Posté 16 mai 2019 - 12:32

Alors il y a une fonction mathématique qui est le " Modulo " , qui permet de rester dans une plage donnée et de repartir au début quand on déborde =) 
C'est super intéressant pour ce genre de cas . 


Quels que exemple : 

1 modulo 360  = 1 

 

15 modulo 15 = 0 

25 modulo 20 = 5  

 

390 modulo 360 = 30. 


Bon attention les informaticiens et les mathématiciens ne sont pas d'accord sur leur implémentation avec les nombres négatifs ... 

En maths : 

-1 modulo 10 = 9 

 

en informatique généralement tu as  -1 modulo 10 = -1 .... 

Du coup pour ce que tu souhaites faire ça peut poser problèmes dans certains cas ... Quand tu as des nombres en entré qui peuvent être négatif ^^ 

Pour la suite tout ce que je vais dire est valable pour le " modulo mathématique " qui se note %   ...   donc on a : -1 % 10 = 9 ;

Revenons à nos angles et faisons le lien avec les "modulo" . 

On a notre angle actuel, l'angle courant et notre angle consigne. Ce qui nous intéresse c'est le delta entre les deux ! =) 

Donc on commence par faire : Delta Angle = Angle consigne - Angle courant.

 

Sur le papier ça a l'air bien : 

si on est dans le sens trigo que je dois aller à 15° et que je suis à 0°  j'obtiens Delta Angle = 15 donc je dois tourner dans le sens positif de 15°...
par contre ce calcul marche moins bien quand je dois aller à 359° alors que je suis à 0° j'obtiens Delta Angle = 359 c'est positif  c'est bien ... Mais j'aurais préféré comme résultat " -1 " qui indique dans quel sens tourner ... et de combien de degré ... 

 

En exploitant un peu les différents cas on comprend que dans un cas " normal " où les deux angles sont compris entre 0 et 360° on peut avoir un delta angle qui va varier entre -360° et 360° ... 

Et que du coup quand on a delta angle compris entre -180° et 180° on peut garder le résultat direct mais que quand on est entre 180° et 360° il faut faire regarder delta angle - 360° ... et que quand on a delta angle entre -180° et -360° il faut regarder delta angle + 360° .

Chouette ! On a donc notre bonne formule avec 3 cas à distinguer. On a fini on peut s'arrêter là ! =) Hourra ! 

Hey minute papillon ... Pourquoi on a parlé de modulo au début si à la fin on les utilise pas ??? 

 

à la fin on ne les utilise pas car on a fait que traité le cas particulier avec les deux angles d'entrées entre 0 et 360° !! Mais souvent on peut avoir n'importe quel type d'angle , compris entre -180° et +180° par exemple, on on peut sommer plusieurs angles à la suite et dépasser les 3 tours et il faudrait que ça marche à chaque fois ;) et c'est là qu'intervient le modulo, qui permet de généraliser la formule ! =) 

delta angle =  ( Angle consigne - Angle cible) % 360  et ensuite on peut séparer notre cas si delta angle est >180 ou pas ... 

si on est inférieur à 180 on garde notre delta angle tel quel, si on est supérieur à 180 il faut regarder delta angle - 360°  ... 

Je vous laisse essayer la formule avec différentes valeurs d'angle pour vérifier que ça marche même sur plusieurs tours =)

 

 

ça marche sur la papier ? Cool !
Comment on fait un modulo "mathématique" en  informatique ? 

Je connais pas de lib qui le fait, en fait j'ai jamais cherché ... J'ai toujours fait un truc du genre : 

 

while ( angle < 0) 

 angle += 360; 

while (angle >= 360)

 angle -=360; 

 

 




 


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  

 

 

 





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

0 members, 0 guests, 0 anonymous users