Aller au contenu


Photo
- - - - -

probleme pour algorithme


  • Veuillez vous connecter pour répondre
21 réponses à ce sujet

#1 julkien

julkien

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 032 messages
  • Gender:Male

Posté 04 mai 2012 - 08:58

Salut aTous

je bosse actuellement sur mon robot en vb mais je but sur un probleme


je vais commencer par vous exposer le probleme :

Fichier joint  bot.PNG   7,95 Ko   36 téléchargement(s)



on peut voir le robot en orange et la cible en bleu turquoise

la distance est mesurer entre les centre de chaque cercle

le robot peut tourner sur 360 degres (de 0 a 359)



ma question :

comment determiner le sens ou il doit tourner, avec le moin de mouvement possible ?



Exemple: quand mon robot est a par exemple a 10° et que la cible ce trouvent a 359°, l'ecart entre les 2 angle est de 11° (facile pour un humain! :D) mais je n'arrive pas a le transcrire en code

Si l'un d'entre vous a une idées?



PS: je ne demande pas a ce que vous ecriviez le code mais juste me donner le principe de raisonnement !

par avance merci

#2 Mike118

Mike118

    Staff Robot Maker

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

Posté 04 mai 2012 - 09:09

Salut aTous

je bosse actuellement sur mon robot en vb mais je but sur un probleme


je vais commencer par vous exposer le probleme :

Fichier joint  bot.PNG   7,95 Ko   36 téléchargement(s)



on peut voir le robot en orange et la cible en bleu turquoise

la distance est mesurer entre les centre de chaque cercle

le robot peut tourner sur 360 degres (de 0 a 359)



ma question :

comment determiner le sens ou il doit tourner, avec le moin de mouvement possible ?



Exemple: quand mon robot est a par exemple a 10° et que la cible ce trouvent a 359°, l'ecart entre les 2 angle est de 11° (facile pour un humain! :D) mais je n'arrive pas a le transcrire en code

Si l'un d'entre vous a une idées?



PS: je ne demande pas a ce que vous ecriviez le code mais juste me donner le principe de raisonnement !

par avance merci


choisis un sens de rotation positif :

pose X ton angle actuel compris entre 0 et 359 degres

Y l'angle que tu veux atteindre entre 0 et 359°


fais le calcul en valeur valeur absolue de (Y - X ) et de (Y -( X+360 ) )

Si le premier est plus petit que le second alors tu regarde le signe de ton expression Y-X et tu tourne dans le sens positif pour un signe positif et dans les sens négatif si le signe est positif

Si les second est le plus petit tu fais les ordre contraire ....

En espérant avoir été claire ...

Mike ;)

EDIT je crois que j'ai commis une petite erreur en oubliant un cas je vérifie et reposterais pour confirmer ou modifier si besoin ^^
En tout cas le principe rester la même ^^

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  

 

 

 


#3 Mike118

Mike118

    Staff Robot Maker

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

Posté 04 mai 2012 - 10:05

Bon il y avait bien une petite erreur dans ce que je proposais ^^

Ma proposition finale est donc :

Tu calcule valeur absolu de ( Y - X )

si c'est inférieur à 180 ° tu regarde le signe de Y-X et tu tourne dans le sens de même signe ;)

Si c'est supérieur à 180° tu tourne dans le sens de signe opposé au signe de Y -X

Plus simple et plus efficace ;)

j'espère avoir été clair ;)

Mike

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  

 

 

 


#4 julkien

julkien

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 032 messages
  • Gender:Male

Posté 04 mai 2012 - 10:37

choisis un sens de rotation positif :

pose X ton angle actuel compris entre 0 et 359 degres

Y l'angle que tu veux atteindre entre 0 et 359°


fais le calcul en valeur valeur absolue de (Y - X ) et de (Y -( X+360 ) )

Si le premier est plus petit que le second alors tu regarde le signe de ton expression Y-X et tu tourne dans le sens positif pour un signe positif et dans les sens négatif si le signe est positif

Si les second est le plus petit tu fais les ordre contraire ....

En espérant avoir été claire ...

Mike ;)

EDIT je crois que j'ai commis une petite erreur en oubliant un cas je vérifie et reposterais pour confirmer ou modifier si besoin ^^
En tout cas le principe rester la même ^^


merci pour ce conseil

a peut de chose pret c'est ce que j'ai fait et ça marche !






Dim deltaRoBot As Integer = angle du robot

Dim deltaCible As Integer = angle vissé

        Dim ecart1 As Integer = 0
        Dim ecart2 As Integer = 0
        ecart1 = (deltaCible - deltaRoBot)
        ecart2 = (deltaCible - (deltaRoBot + 360))

        If Math.Abs(ecart1) < Math.Abs(ecart2) Then
           If ecart1 > 0 Then
                droite(ecart1)
            ElseIf ecart1 < 0 Then
                gauche(Math.Abs(ecart1))

            End If

        ElseIf Math.Abs(ecart1) > Math.Abs(ecart2) Then
            If ecart2 > 0 Then
                droite(ecart2)
            ElseIf ecart2 < 0 Then
                gauche(Math.Abs(ecart2))

            End If

        ElseIf Math.Abs(ecart1) = Math.Abs(ecart2) Then
                gauche(Math.Abs(ecart2))
        End If


#5 Mike118

Mike118

    Staff Robot Maker

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

Posté 04 mai 2012 - 10:54

merci pour ce conseil

a peut de chose pret c'est ce que j'ai fait et ça marche !



Tu es sur que ça marche?

Si tu prend deltarobot=355° et deltacible=1°

tu as abs(ecart1)<abs(ecart2)

et comme deltacible-déltarobot < 0 tu vas tourner à gauche


si tu prend deltarobot = 1° et deltacible = 355°

tu as abs(ecart2)<abs(ecart1) et comme ecart2 = 355 -361 <0 tu vas à gauche aussi ...

ça ne te dérange pas ?

Après je me suis peut être trompé en lisant ton code ^^
Je te rappel avoir fait une petite erreur dans ma première réponse ^^ la seconde est bien meilleure ;)

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  

 

 

 


#6 julkien

julkien

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 032 messages
  • Gender:Male

Posté 04 mai 2012 - 11:35

choisis un sens de rotation positif :

pose X ton angle actuel compris entre 0 et 359 degres

Y l'angle que tu veux atteindre entre 0 et 359°


fais le calcul en valeur valeur absolue de (Y - X ) et de (Y -( X+360 ) )

Si le premier est plus petit que le second alors tu regarde le signe de ton expression Y-X et tu tourne dans le sens positif pour un signe positif et dans les sens négatif si le signe est positif

Si les second est le plus petit tu fais les ordre contraire ....

En espérant avoir été claire ...

Mike ;)

EDIT je crois que j'ai commis une petite erreur en oubliant un cas je vérifie et reposterais pour confirmer ou modifier si besoin ^^
En tout cas le principe rester la même ^^


je mets en ligne l'exe du fichier generer :
http://dl.free.fr/gxK0W766P

ce n'ai qu'un debut !

<br><br>edit je vient de voir ton message<br><br> franchement c'a marche plutot bien enfin pour moi :D<br><br>noter qu'il faut dotnet 4.0 pour l'exe <br><br>

#7 Mike118

Mike118

    Staff Robot Maker

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

Posté 04 mai 2012 - 12:09

tu as lu mon message te mettant en évidence un soucis ?

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  

 

 

 


#8 julkien

julkien

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 032 messages
  • Gender:Male

Posté 04 mai 2012 - 12:15

Tu es sur que ça marche?

Si tu prend deltarobot=355° et deltacible=1°

tu as abs(ecart1)<abs(ecart2)

et comme deltacible-déltarobot < 0 tu vas tourner à gauche


si tu prend deltarobot = 1° et deltacible = 355°

tu as abs(ecart2)<abs(ecart1) et comme ecart2 = 355 -361 <0 tu vas à gauche aussi ...

ça ne te dérange pas ?

Après je me suis peut être trompé en lisant ton code ^^
Je te rappel avoir fait une petite erreur dans ma première réponse ^^ la seconde est bien meilleure ;)


a ben oui ok je vien de piger t'a 2emem formule

j'ai rectifier

Sub visercible()
        Dim deltaRoBot As Integer = Math.Abs(Polaire(centre, direction))
        Dim deltaCible As Integer = Math.Abs(Polaire(centre, coordonnéeViser))


        Dim ecart1 As Integer = 0
        
        ecart1 = (deltaCible - deltaRoBot)
        

        If Math.Abs(ecart1) < 180 Then
               If ecart1 > 0 Then
                droite(ecart1)
            ElseIf ecart1 < 0 Then
                gauche(Math.Abs(ecart1))
            End If

        ElseIf Math.Abs(ecart1) >= 180 Then
            If ecart1 > 0 Then
                droite(ecart1)
            ElseIf ecart1 < 0 Then
                gauche(Math.Abs(ecart1))

            End If
        End If
    End Sub


#9 Mike118

Mike118

    Staff Robot Maker

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

Posté 04 mai 2012 - 01:14

a ben oui ok je vien de piger t'a 2emem formule

j'ai rectifier

Sub visercible()
        Dim deltaRoBot As Integer = Math.Abs(Polaire(centre, direction))
        Dim deltaCible As Integer = Math.Abs(Polaire(centre, coordonnéeViser))


        Dim ecart1 As Integer = 0
        
        ecart1 = (deltaCible - deltaRoBot)
        

        If Math.Abs(ecart1) < 180 Then
               If ecart1 > 0 Then
                droite(ecart1)
            ElseIf ecart1 < 0 Then
                gauche(Math.Abs(ecart1))
            End If

        ElseIf Math.Abs(ecart1) >= 180 Then
            If ecart1 > 0 Then
                droite(ecart1)
            ElseIf ecart1 < 0 Then
                gauche(Math.Abs(ecart1))

            End If
        End If
    End Sub


hum il me semble que là encore ça ne marchera pas : il faut inverser les ordres dans un des deux cas ... essaye de faire un dessin avec plusieurs situation avec ton algorithme il me semble que c'est pas bon ... selon moi la bonne solution est :

Sub visercible()
Dim deltaRoBot As Integer = Math.Abs(Polaire(centre, direction))
Dim deltaCible As Integer = Math.Abs(Polaire(centre, coordonnéeViser))


Dim ecart1 As Integer = 0

ecart1 = (deltaCible - deltaRoBot)


If Math.Abs(ecart1) < 180 Then
If ecart1 > 0 Then
droite(ecart1)
ElseIf ecart1 < 0 Then
gauche(Math.Abs(ecart1))
End If

ElseIf Math.Abs(ecart1) >= 180 Then
If ecart1 < 0 Then
droite(ecart1)
ElseIf ecart1 > 0 Then
gauche(Math.Abs(ecart1))

End If
End If
End Sub[/code]

ou bien

Sub visercible()
Dim deltaRoBot As Integer = Math.Abs(Polaire(centre, direction))
Dim deltaCible As Integer = Math.Abs(Polaire(centre, coordonnéeViser))


Dim ecart1 As Integer = 0

ecart1 = (deltaCible - deltaRoBot)


If Math.Abs(ecart1) < 180 Then
If ecart1 < 0 Then
droite(ecart1)
ElseIf ecart1 > 0 Then
gauche(Math.Abs(ecart1))
End If

ElseIf Math.Abs(ecart1) >= 180 Then
If ecart1 > 0 Then
droite(ecart1)
ElseIf ecart1 < 0 Then
gauche(Math.Abs(ecart1))

End If
End If
End Sub[/code]

dans un cas il prendra toujours le chemin le plus long dans l'autre le chemin le plus court ... tout dépend du sens que tu as considéré "positif "

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  

 

 

 


#10 julkien

julkien

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 032 messages
  • Gender:Male

Posté 04 mai 2012 - 01:36

hum il me semble que là encore ça ne marchera pas : il faut inverser les ordres dans un des deux cas ... essaye de faire un dessin avec plusieurs situation avec ton algorithme il me semble que c'est pas bon ... selon moi la bonne solution est :

Sub visercible()
Dim deltaRoBot As Integer = Math.Abs(Polaire(centre, direction))
Dim deltaCible As Integer = Math.Abs(Polaire(centre, coordonnéeViser))


Dim ecart1 As Integer = 0

ecart1 = (deltaCible - deltaRoBot)


If Math.Abs(ecart1) < 180 Then
If ecart1 > 0 Then
droite(ecart1)
ElseIf ecart1 < 0 Then
gauche(Math.Abs(ecart1))
End If

ElseIf Math.Abs(ecart1) >= 180 Then
If ecart1 < 0 Then
droite(ecart1)
ElseIf ecart1 > 0 Then
gauche(Math.Abs(ecart1))

End If
End If
End Sub[/code]

ou bien

Sub visercible()
Dim deltaRoBot As Integer = Math.Abs(Polaire(centre, direction))
Dim deltaCible As Integer = Math.Abs(Polaire(centre, coordonnéeViser))


Dim ecart1 As Integer = 0

ecart1 = (deltaCible - deltaRoBot)


If Math.Abs(ecart1) < 180 Then
If ecart1 < 0 Then
droite(ecart1)
ElseIf ecart1 > 0 Then
gauche(Math.Abs(ecart1))
End If

ElseIf Math.Abs(ecart1) >= 180 Then
If ecart1 > 0 Then
droite(ecart1)
ElseIf ecart1 < 0 Then
gauche(Math.Abs(ecart1))

End If
End If
End Sub[/code]

dans un cas il prendra toujours le chemin le plus long dans l'autre le chemin le plus court ... tout dépend du sens que tu as considéré "positif "


je ne comprend pas ton dernier message

as tu aissayer mon exe ?

Elle marche bien !(pourtant avec la 1ere Formule)

je laisse un 2eme lien avec la solution N°2

#11 Mike118

Mike118

    Staff Robot Maker

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

Posté 04 mai 2012 - 01:53

je ne comprend pas ton dernier message

as tu aissayer mon exe ?

Elle marche bien !(pourtant avec la 1ere Formule)

je laisse un 2eme lien avec la solution N°2


je n'arrive pas à télécharger tes fichiers ... ton lien me renvoit directement ici " http://dl.free.fr/getfile.pl " et ça marche pas...

Donc non je n'ai pas télécharger ton exe mais je lit le code écrit et ma "logique" et l'expérience me montre que ton programme ne marche pas comme il me semble que tu le voudrais.

fais un dessin ... à la main des différents cas et regarde si ton programme t'indique le bon sens de rotatation. Moi j'en ai fais et à moins de me tromper sur l'interprétation de ton second programme qui selon moi ne traduit pas exatement ce que je t'ai dit dans mon second message, ton programme se trompe dans certaine configurations. reprend l'exemple que je t'ai donné !

Mais avant toute chose dis moi quel est le sens posititf ? sens horaire ou sens anti horaire ?

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  

 

 

 


#12 julkien

julkien

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 032 messages
  • Gender:Male

Posté 04 mai 2012 - 02:27

Bon il y avait bien une petite erreur dans ce que je proposais ^^

Ma proposition finale est donc :

Tu calcule valeur absolu de ( Y - X )

si c'est inférieur à 180 ° tu regarde le signe de Y-X et tu tourne dans le sens de même signe ;)

Si c'est supérieur à 180° tu tourne dans le sens de signe opposé au signe de Y -X

Plus simple et plus efficace ;)

j'espère avoir été clair ;)

Mike

bon j'ai commenter le code

et j'ai fini par comprendre!

merci

Sub visercible()



'je
recupereles angles


Dim

deltaRoBot As Integer = Math.Abs(Polaire(centre,
direction))


Dim
deltaCible As Integer = Math.Abs(Polaire(centre,
coordonnéeViser))





Dim
ecart1 As Integer = (deltaCible - deltaRoBot) ' je declare ma
variable "(y-X)




If Math.Abs(ecart1) < 180 Then 'si la valeur absolue de (Y-X) est
inferrieur a 180°



If
ecart1 > 0 Then 'si (Y-X) est possitif ( en dessus de
0!)

droite(ecart1)
'je tourne a droite avec
l'ecrat trouver


ElseIf
ecart1 < 0 Then 'si (Y-X) est negatif ( en dessous de
0!)



gauche(Math.Abs(ecart1)) 'je tourne a
gauche



End
If




ElseIf Math.Abs(ecart1) >= 180 Then 'si la valeur absolue de (Y-X) est
superieur a 180°



If
ecart1 < 0 Then 'si (Y-X) est negatif ( en dessous de
0!)



droite(ecart1) 'je tourne a droite avec l'ecrat
trouveR




ElseIf
ecart1 > 0 Then 'si (Y-X) est possitif ( en dessus de
0!)



gauche(Math.Abs(ecart1)) 'je tourne a
gauch



End
If





End
If




End Sub



#13 julkien

julkien

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 032 messages
  • Gender:Male

Posté 04 mai 2012 - 02:33

bon j'ai commenter le code

et j'ai fini par comprendre!

merci




desoler pour ma lourdeur et ma precédante mise en page :D

#14 Mike118

Mike118

    Staff Robot Maker

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

Posté 04 mai 2012 - 03:15

là en lisant ton code ça traduit ce que je t'ai dit en prenant " tourner à droite" comme sens positif => sens horaire = sens positif ;)

( c'est bon ton code marche comme tu le voulais ? )

Je suis ravi d'avoir pu t'aider ;) Et puis je suis curieux de voir ton robot et ton programme en fonctionnement :P tu nous poste des vidéo ? :P

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  

 

 

 


#15 julkien

julkien

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 032 messages
  • Gender:Male

Posté 04 mai 2012 - 05:52

là en lisant ton code ça traduit ce que je t'ai dit en prenant " tourner à droite" comme sens positif => sens horaire = sens positif ;)

( c'est bon ton code marche comme tu le voulais ? )

Je suis ravi d'avoir pu t'aider ;) Et puis je suis curieux de voir ton robot et ton programme en fonctionnement :P tu nous poste des vidéo ? :P



je fini le chassi ( tourret de cable reseau en plastique) et je posterais juste apres !
le code fonctionne bien mais juste su le robot virtuel maintenant je bosse sur la com avec l'arduino
A+

#16 julkien

julkien

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 032 messages
  • Gender:Male

Posté 04 mai 2012 - 05:55

je n'arrive pas à télécharger tes fichiers ... ton lien me renvoit directement ici " http://dl.free.fr/getfile.pl " et ça marche pas...

Donc non je n'ai pas télécharger ton exe mais je lit le code écrit et ma "logique" et l'expérience me montre que ton programme ne marche pas comme il me semble que tu le voudrais.

fais un dessin ... à la main des différents cas et regarde si ton programme t'indique le bon sens de rotatation. Moi j'en ai fais et à moins de me tromper sur l'interprétation de ton second programme qui selon moi ne traduit pas exatement ce que je t'ai dit dans mon second message, ton programme se trompe dans certaine configurations. reprend l'exemple que je t'ai donné !

Mais avant toute chose dis moi quel est le sens posititf ? sens horaire ou sens anti horaire ?



il faut visualiser le film pour telecharger

#17 Jbot

Jbot

    Membre chevronné

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

Posté 04 mai 2012 - 06:41

Salut, j'ai écris ce code pour mon robot qui tourne sous arduino.

Il calcul l'angle a effectuer en prennant en compte, l'angle de départ et la position x, y de départ, et la position d'arrivée.

Il marche parfaitement (utilisé a la coupe Eurobot l'année derniere et re utilisé cette année), par contre je pense qu'il n'est pas du tout optimisé ^^

// Compute the angle to do to go to (x, y)
double angle_coord(struct robot *my_robot, double x1, double y1)
{
    double angletodo = 0;
    if ((x1 < my_robot->pos_X) && (y1 < my_robot->pos_Y)) {
        angletodo =
            -PI / 2 -
            atan(fabs((x1 - my_robot->pos_X) / (y1 - my_robot->pos_Y)));
    } else if ((x1 > my_robot->pos_X) && (y1 < my_robot->pos_Y)) {
        angletodo =
            -atan(fabs((y1 - my_robot->pos_Y) / (x1 - my_robot->pos_X)));
    } else if ((x1 > my_robot->pos_X) && (y1 > my_robot->pos_Y)) {
        angletodo =
            atan(fabs((y1 - my_robot->pos_Y) / (x1 - my_robot->pos_X)));
    } else if ((x1 < my_robot->pos_X) && (y1 > my_robot->pos_Y)) {
        angletodo =
            PI / 2 +
            atan(fabs((x1 - my_robot->pos_X) / (y1 - my_robot->pos_Y)));
    } else if ((x1 < my_robot->pos_X) && (y1 == my_robot->pos_Y)) {     // 
        angletodo = -PI;
    } else if ((x1 > my_robot->pos_X) && (y1 == my_robot->pos_Y)) {     // 
        angletodo = 0;
    } else if ((x1 == my_robot->pos_X) && (y1 < my_robot->pos_Y)) {     // 
        angletodo = -PI / 2;
    } else if ((x1 == my_robot->pos_X) && (y1 > my_robot->pos_Y)) {     // 
        angletodo = PI / 2;
    } else
        angletodo = 0;

    angletodo = angletodo - my_robot->theta;

    if (angletodo > PI)
        angletodo = angletodo - 2 * PI;
    if (angletodo < -PI)
        angletodo = 2 * PI + angletodo;

    return angletodo;
}


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


#18 Mike118

Mike118

    Staff Robot Maker

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

Posté 04 mai 2012 - 06:49

Salut, j'ai écris ce code pour mon robot qui tourne sous arduino.

Il calcul l'angle a effectuer en prennant en compte, l'angle de départ et la position x, y de départ, et la position d'arrivée.

Il marche parfaitement (utilisé a la coupe Eurobot l'année derniere et re utilisé cette année), par contre je pense qu'il n'est pas du tout optimisé ^^

// Compute the angle to do to go to (x, y)
double angle_coord(struct robot *my_robot, double x1, double y1)
{
    double angletodo = 0;
    if ((x1 < my_robot->pos_X) && (y1 < my_robot->pos_Y)) {
        angletodo =
            -PI / 2 -
            atan(fabs((x1 - my_robot->pos_X) / (y1 - my_robot->pos_Y)));
    } else if ((x1 > my_robot->pos_X) && (y1 < my_robot->pos_Y)) {
        angletodo =
            -atan(fabs((y1 - my_robot->pos_Y) / (x1 - my_robot->pos_X)));
    } else if ((x1 > my_robot->pos_X) && (y1 > my_robot->pos_Y)) {
        angletodo =
            atan(fabs((y1 - my_robot->pos_Y) / (x1 - my_robot->pos_X)));
    } else if ((x1 < my_robot->pos_X) && (y1 > my_robot->pos_Y)) {
        angletodo =
            PI / 2 +
            atan(fabs((x1 - my_robot->pos_X) / (y1 - my_robot->pos_Y)));
    } else if ((x1 < my_robot->pos_X) && (y1 == my_robot->pos_Y)) {     // 
        angletodo = -PI;
    } else if ((x1 > my_robot->pos_X) && (y1 == my_robot->pos_Y)) {     // 
        angletodo = 0;
    } else if ((x1 == my_robot->pos_X) && (y1 < my_robot->pos_Y)) {     // 
        angletodo = -PI / 2;
    } else if ((x1 == my_robot->pos_X) && (y1 > my_robot->pos_Y)) {     // 
        angletodo = PI / 2;
    } else
        angletodo = 0;

    angletodo = angletodo - my_robot->theta;

    if (angletodo > PI)
        angletodo = angletodo - 2 * PI;
    if (angletodo < -PI)
        angletodo = 2 * PI + angletodo;

    return angletodo;
}

au passage on te l'optimise ou ... PI ? ( PI :pas intéressé ^^ )

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  

 

 

 


#19 Jbot

Jbot

    Membre chevronné

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

Posté 04 mai 2012 - 06:51

au passage on te l'optimise ou ... PI ? ( PI :pas intéressé ^^ )


Comme vous voulez, moi j'ai juste donné ça pour aider ^^ (au cas ou sa solution ne marche pas dans tous les cas)


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


#20 julkien

julkien

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 032 messages
  • Gender:Male

Posté 04 mai 2012 - 07:14

Comme vous voulez, moi j'ai juste donné ça pour aider ^^ (au cas ou sa solution ne marche pas dans tous les cas)



je te remerci Jbot et je souligne le faite que ce code a deja fait ces preves !"de mes yeux vue.... a travers la toile^^

les calcul seront fait directement par le pc qui seras embarquer sur le robot. mon arduino ne servira qua envoyer les ordre a au controleur moteur

ps : apres avoir lu ce code un certain mal de tete ma pris ! ;)




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

0 members, 0 guests, 0 anonymous users