IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Algorithmes et structures de données Discussion :

Calcul différence entre deux caps Gps autour du 0-360 degrés


Sujet :

Algorithmes et structures de données

  1. #1
    Membre à l'essai
    Homme Profil pro
    Retraité projets robotique
    Inscrit en
    Novembre 2005
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Retraité projets robotique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 17
    Points : 10
    Points
    10
    Par défaut Calcul différence entre deux caps Gps autour du 0-360 degrés
    Bonjour, mon Rover suit un cap. Sur un WPoint il doit tourner à gauche pour suivre le nouveau cap. Lors de la rotation, en passant par le nord, le différentiel de cap autour du Nord (ou du Sud) prend une valeur avec 360°.
    De ce fait le différentiel de cap ne peut continuer à évoluer sans erreur pour valider la nouvelle position.
    Le passage 0\360 semble de l'ordre des "statistiques circulaires avec sens" que je ne sais pas appliquer à ma fonction().
    Auriez-vous une solution à ce problème? Je vous remercie.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    float DifferentielCapsGps() {// cap_Rover est le cap théorique à suivre  et angle_getAngleRover_Degre est le cap courant du rover
    //Situation 1: WP2 cap_Rover:180 à 360° _ angle_getAngleRover_Degre:0 à 180°
    if( (cap_Rover >= 180) && (angle_getAngleRover_Degre <= 180) ){
      differentielCapsGps = -1*( (360-(float)cap_Rover) + (float) angle_getAngleRover_Degre );
      } 
     
    //Situation 2: WP3 cap_Rover:0 à 180° _ angle_getAngleRover_Degre:180 à 360°
    if( (cap_Rover <= 180) && (angle_getAngleRover_Degre <= 180) ){
    differentielCapsGps = -360+( (float)cap_Rover - (float)angle_getAngleRover_Degre) ;
      } 
    return differentielCapsGps; } //FIN DifferentielCapsGps

  2. #2
    Expert confirmé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 478
    Points : 4 677
    Points
    4 677
    Par défaut
    Bonjour,

    Quels sont les types des variable ? Les angles semblent initialement en int ou unsigned. Si c'est le cas, pourquoi les transformer en float ? Le résultat d'additions, soustractions et multiplications d'entiers reste entier.

    La multiplication par -1 sert à quoi ? Le même résultat pourrait être obtenu par : differentielCapsGps = (float) cap_Rover - (float) angle_getAngleRover_Degre - 360.0;.

    Si les angles sont des entiers, on pourrait écrire (en C):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int delta = cap_Rover - angle_getAngleRover_Degre;
    if(delta > 180) delta -= 360; else if(delta < -180) delta += 360;
    return (float) delta; // Si on tient absolument à renvoyer un flottant
    il y a une solution plus concise mais moins rapide (à cause de la division) : return (float)((540 + cap_Rover - angle_getAngleRover_Degre) %360 - 180); // 540 = 180 modulo 360.

    Salutations
    Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better. (Samuel Beckett)

  3. #3
    Membre à l'essai
    Homme Profil pro
    Retraité projets robotique
    Inscrit en
    Novembre 2005
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Retraité projets robotique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 17
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par Guesset Voir le message
    Bonjour,

    Quels sont les types des variable ? Les angles semblent initialement en int ou unsigned. Si c'est le cas, pourquoi les transformer en float ? Le résultat d'additions, soustractions et multiplications d'entiers reste entier.

    La multiplication par -1 sert à quoi ? Le même résultat pourrait être obtenu par : differentielCapsGps = (float) cap_Rover - (float) angle_getAngleRover_Degre - 360.0;.

    Si les angles sont des entiers, on pourrait écrire (en C):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int delta = cap_Rover - angle_getAngleRover_Degre;
    if(delta > 180) delta -= 360; else if(delta < -180) delta += 360;
    return (float) delta; // Si on tient absolument à renvoyer un flottant
    il y a une solution plus concise mais moins rapide (à cause de la division) : return (float)((540 + cap_Rover - angle_getAngleRover_Degre) %360 - 180); // 540 = 180 modulo 360.

    Salutations
    Merci Guesset pour ton retour rapide et précis.
    La 1ere variable est un float extrait de ma table.csv:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    //ANGLE EXTRAIT DE LA BASE.CSV   ANGLE THEORIQUE COURSE Rover
    float getAngle(){TableRow row = table.getRow(idCoordonneesWpDep);
    cap_Rover = row.getFloat("CAP_ROVER");
    La 2eme variable est un double calculé à partir de la formule Haversine. Les décimales sont nécessaires pour la précision du positionnement final.

    La multiplication par -1 servait à signer le delta_angles pour le rendre négatif et activer la rotation anti-horaire.
    En fait le résultat de la "Situation 1" semble fonctionner (à retester).
    Le résultat de la "Situation 3" qui lui aussi comporte un "-1*" n'est pas bon. Je vais modifier cette ligne selon ta proposition avec le "-360".
    Je vais également tester avec le modulo 360.
    Encore merci. Cordialement.

  4. #4
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 145
    Points : 9 607
    Points
    9 607
    Par défaut
    Le code proposé est trop compliqué...
    S'il n'y avait pas ce problème de 'cycle', on aurait simplement Delta =Cap-Angle
    Mais on veut un nombre entre -180 et +180
    Donc le code proposé par Guesset me paraît bien.

    Dans les 3 cas que tu as proposés, tu as bien un truc du genre Delta=Cap-Angle+ -180 dans les 2 premières propositions, mais tu as Delta=Angle-Cap dans le dernier.

    Les -1 ... c'est très lourdingue.
    Plutôt que differentielCapsGps = -1*( (360-(float)cap_Rover) + (float) angle_getAngleRover_Degre );
    Tu peux écrire : differentielCapsGps = (float)cap_Rover) - (float) angle_getAngleRover_Degre -360;
    Et tes 3 cas seront assez similaires :
    differentielCapsGps = (float)cap_Rover) - (float) angle_getAngleRover_Degre -360;
    differentielCapsGps = (float)cap_Rover) - (float) angle_getAngleRover_Degre +360;
    differentielCapsGps = (float)cap_Rover) - (float) angle_getAngleRover_Degre ;
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Retraité projets robotique
    Inscrit en
    Novembre 2005
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Retraité projets robotique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 17
    Points : 10
    Points
    10
    Par défaut
    Encore merci Guesset. Ta solution avec le modulo 360 fonctionne à elle seule pour valider ma fin de positionnement.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. calcul distance entre deux points GPS
    Par DevNoTensai dans le forum Excel
    Réponses: 1
    Dernier message: 09/01/2019, 13h35
  2. Calcul distance entre deux coordonnées GPS
    Par hamdouch89 dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 03/05/2012, 16h14
  3. calcul délais entre deux dates avec plages horaires
    Par leila eco dans le forum SAP Crystal Reports
    Réponses: 3
    Dernier message: 03/01/2007, 17h51
  4. diffrence entre deux TIME
    Par mrkinfo dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 31/07/2006, 16h18
  5. [Requete] Calcul Somme entre deux temps pour chaque jour
    Par nico33307 dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 21/03/2006, 01h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo