Bienvenue aux nouveaux arrivants sur FantasPic !

- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.

--- L’équipe FantasPic ---
Forum général sur le langage C !

Modérateur : Jérémy

récupération d'une Trames GPS
PieM
Membre
Membre
Messages : 21
Enregistré en : juin 2016

#31 Message par PieM » sam. 1 déc. 2018 14:25 lien vers la Data-Sheet : Cliquez ici

Essaie de faire correctement ta conversion DDMM.mmmm en DD.ddddd
C'est MM.mmmm /60 + DD
4851.5026 doit te donner 48.858376 avec une résolution de 11cm. Et inutile de s'exciter avec des résultats avec 32 chiffres significatifs qui ne correspondent à rien!

Il faut comprendre que dans les calculs, la résolution des données GPS est de 1/10000 de minute, soit 0.18m. cela n'a rien à voir avec la précision.
Si tu sors un résultat en DD.dddddd tu as beau avoir une flopée de décimales, la résolution sera toujours au mieux celle de la donnée de base.
Si tu ajoutes 12.3 m à 6.542 m ça ne donne pas 18.842 m mais 18.8 m

récupération d'une Trames GPS
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#32 Message par Jérémy » sam. 1 déc. 2018 17:02 lien vers la Data-Sheet : Cliquez ici

Une chanson de genre Georges Brassens me viens en tête quand je pense a moi !
C'est en faisant des erreurs, que l'on apprend le mieux !!!

récupération d'une Trames GPS
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#33 Message par Jérémy » sam. 1 déc. 2018 19:34 lien vers la Data-Sheet : Cliquez ici

Je n'y arrive pas !!!

Je suis quelqu'un qui aime comprendre et la ca me dépasse.

J'effectue un calcul avec la calculatrice Windows :
4851,617 - 4851,500 = 0,117 / 60 = 0,00195 * 11131700 = 21706

J'essaye d'effectuer le même calcul avec mon PIC.

Premier probléme que je rencontre quand je lui rentre :
Lat1 = 4851.502 ;
Lat2 = 4851.619 ;

il m'affiche 4851.501 et 4851.618 à l’écran .
Pourquoi il arrondi à 0.001 en dessous ????? :idea: Je me dis que mikroC à du mal avec les flottant.
Ok pas grave.
je vais modifier mes valeurs pour obtenir le même calcul que la calculette .

Je vais mette 4851.501 pour qu'il m’affiche 4851.5 comme la calculette et 4851.618 pour qu'il m'affiche 4851.617

Je fais donc

Code : Tout sélectionner


      Lat1 
= 4851.501 ;
      Lat2 = 4851.618 ;
      
      FloatToStr
(Lat1, Texte);
      Glcd_Write_Text_Adv(Texte,60,0);

      FloatToStr(Lat2, Texte);
      Glcd_Write_Text_Adv(Texte,0,0);

      // Latitude
      if (Lat2 >= Lat1) LatX = ((Lat2 - Lat1)/60)*11131700 ;
      else  LatX = ((Lat1 - Lat2)/60)*11131700 ;
      Glcd_Write_Text_Adv("LatX=",0,16);
      FloatToStr(LatX, Texte);
      Glcd_Write_Text_Adv(Texte,25,16); 


20181201_191716.jpg

21741.6 c'est pas sérieux il me le sort dou ce résultat !
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
C'est en faisant des erreurs, que l'on apprend le mieux !!!

récupération d'une Trames GPS
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2586
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#34 Message par paulfjujo » sam. 1 déc. 2018 21:35 lien vers la Data-Sheet : Cliquez ici

bonsoir


tu arrives aux limites du quantum flottantt 32 bits
en multipliant Lat1 et LAt2 par 1000 pour avoir un delta plus consequent

Code : Tout sélectionner


     Lat1 
4851500  ;
      
Lat2 =  4851617 ;
       
Float2Ascii(Lat1TEXTE,5);
      
UART1_Write_Text(TEXTE);
      
CRLF1();
       
Float2Ascii(Lat2TEXTE,5);
      
UART1_Write_Text(TEXTE);
      
CRLF1();
      
// Latitude
      
if (Lat2 >= Lat1)
       
LatX = (Lat2 Lat1);
      else
        
LatX = (Lat1 Lat2) ;
      
       
UART1_Write_CText("DeltaX=");
        
Float2Ascii(LatXTEXTE,5);
      
UART1_Write_Text(TEXTE);
      
CRLF1();

      
       
UART1_Write_CText("coeff=");
      
LatZ=11131700.0/60.0;
        
Float2Ascii(LatZTEXTE,5);
      
UART1_Write_Text(TEXTE);
      
CRLF1();

      
LatX=LatX*LatZ/1000.0 ;
      
UART1_Write_CText("LatX=");
       
Float2Ascii(LatXTEXTE,5);
      
UART1_Write_Text(TEXTE);
      
CRLF1();
 


resultat= 21706.80999
Aide toi, le ciel ou FantasPic t'aidera

récupération d'une Trames GPS
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#35 Message par Jérémy » dim. 2 déc. 2018 10:41 lien vers la Data-Sheet : Cliquez ici

Bonjour à tous ,

Bon allez , j'abdique !

J'obtiens entre 80 et 90 mètres de distance entre ma position ( donnée par le GPS) et un carrefour à coté de chez moi qui est donné à 114 mètres d’après Google MAPS !

20 mètres d’écart sur 100m ca me parait gros mais bon .

Code : Tout sélectionner


     
// Mon croisement ou point de référence
     Lat1 = valeur de votre croisement en DDMM. mmmm     
     Lon1 
= valeur de votre croisement en DDMM. mmmm 

//################################################################################
//#######################    BOUCLE PRINCIPALE     ###############################
//################################################################################
  while(1) {

      
     Lat2 
= atof(T_Lat) ;  // Récupération des valeurs du GPS en DDMM.mmmm
     Lon2 = atof(T_Lon) // Récupération des valeurs du GPS en DDMM.mmmm

     // Latitude
     if (Lat2 >= Lat1) LatX = ((Lat2 - Lat1)/60)*11131700;
     else  LatX = ((Lat1 - Lat2)/60)*11131700;

     // Coefficient
     Coef = cos(((Lat2 + Lat1)/200)*0.0174533);  // en radian

     // Longitude
     if (Orientation_Lon == 'W') Lon1 = abs(Lon1);
     if (Orientation_Lat == 'S') Lon2 = abs(Lon2);
     if (Lon2 >= Lon1) LonX = (Lon2 - Lon1)*Coef*111317;
     else  LonX = (Lon1 - Lon2)*Coef*111317;

     Distance = (sqrt( (LonX*LonX) + (LatX*LatX)))/100;  // en mètre

C'est en faisant des erreurs, que l'on apprend le mieux !!!

récupération d'une Trames GPS
PieM
Membre
Membre
Messages : 21
Enregistré en : juin 2016

#36 Message par PieM » dim. 2 déc. 2018 10:58 lien vers la Data-Sheet : Cliquez ici

Bonjour,
Jérémy a écrit :Source du message Pourquoi il arrondi à 0.001 en dessous ????? :idea: Je me dis que mikroC à du mal avec les flottant.

Ce n'est pas mickroC qui est en cause, c'est le problème des calculs en nombres flottants non traités par une FPU comme c'est le cas sur un PC .
Et une calculatrice à 5€ sera aussi plus précise car pourvue d'un µP spécialisé.
On peut s'amuser à faire 10.0/5.0 et être parfois surpris du résultat !
Et même sur un PC certains résultats doivent être pris après réflexion!
si je fais sur la calculatrice Windows tan(91°) j'obtiens -57.29... si je fais atan(-57.29) j'obtiens -89° !

Je rappelle également que faire un calcul comme 4851,617 - 4851,500 = 0,117 / 60 = 0,00195 * 11131700 n'a aucun sens puisque 4851 est un mélange de degrés et minutes ... ça donne l'illusion de marcher car les valeurs de degrés sont identiques
si ton GPS te donne 4859.9999 et que tu te déplaces tu vas obtenir 4900. 00.... et non 4860...

Cette transformation en #31 est obligatoire quelle que soit la méthode de calcul, y compris la formule Haversine avec la trigo sphérique.
de même il est obligatoire de détecter le signe +/- de l'angle avant tout calcul .
Calculer la valeur absolue de la donnée issue du GPS n'a pas de sens car c'est par définition déjà une valeur absolue.

récupération d'une Trames GPS
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#37 Message par Jérémy » dim. 2 déc. 2018 18:20 lien vers la Data-Sheet : Cliquez ici

Merci pour ces précisions !

Je pense que cette fois si c'est bon ! enfin ....

J'ai modifié la capture des données pour différencier les DD des MM.mmmm .
Ainsi je stockes la valeur des degrés reçus dans les variables Latx_DD . et le reste dans le Tableau MM.mmmm
Ensuite je convertis mes MM.mmmm en DD.dddd

Code : Tout sélectionner

     
     Lat1_DD 
=sa referebce en DDD;
     Lat1 = sa reference en MM.mmmm ;
     Lat1 = (Lat1/60) + Lat1_DD ;

     
     Lon1_DD 
= sa referebce en DDD;
     Lon1 = sa reference en MM.mmmm ;
     Lon1 = (Lon1/60) + Lon1_DD ;


     Lat2 = atof(T_Lat) ;                // Je récupere les MM.mmmm
     Lat2 = (Lat2/60) + Lat2_DD ;  // Je converti en DD.dddd

     Lon2 = atof(T_Lon) ;                 // Je récupere les MM.mmmm
     Lon2 = (Lon2/60) + Lon2_DD ;  // Je converti en DD.dddd

     // Latitude
     if (Lat2 >= Lat1)  LatX = (Lat2 - Lat1)* 111317 ;
     else                     LatX = (Lat1 - Lat2)* 111317 ;

     // Coefficient  1° = 0.0174533 rad
     Coef = cos(((Lat2 + Lat1)/2)*0.0174533);

     // Longitude
     if (Orientation_Lon == 'W') Lon2 = abs(Lon2);
     if (Lon2 >= Lon1) LonX = (Lon2 - Lon1)*Coef*111317;
     else  LonX = (Lon1 - Lon2)*Coef*111317;

     Distance = (sqrt( (LonX*LonX) + (LatX*LatX)));
C'est en faisant des erreurs, que l'on apprend le mieux !!!

récupération d'une Trames GPS
PieM
Membre
Membre
Messages : 21
Enregistré en : juin 2016

#38 Message par PieM » dim. 2 déc. 2018 20:30 lien vers la Data-Sheet : Cliquez ici

C'est presque bon ...

Tes DD.dddd doivent être affectés du signe +/- en fonction de N/S E/W AVANT tout calcul
Tu comprends bien que la différence entre -4 et 2 est 6 et non 2.
Donc si une des valeurs est négative, la différence est la somme des valeurs absolues
si les deux sont négatives, c'est la différence valeurs absolues.

je répète: if (Orientation_Lon == 'W') Lon2 = abs(Lon2); n'a pas de sens !! Lon2 est une valeur absolue

Si Orientation_Lon1 == 'W', et Orientation_Lon2 == 'E' ou l'inverse , alors la différence est la somme de lon1 et de lon2.

récupération d'une Trames GPS
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#39 Message par Jérémy » lun. 3 déc. 2018 10:10 lien vers la Data-Sheet : Cliquez ici

Bonjour ,

Oui tu as raison j'ai posté bien trop vite .

Voici la modification que j'ai effectué .
PS : je ne prends en compte que la longitude car je ne pense pas passé sous l'équateur un jour, donc peu de chance de voir un signe ''South" en Latitude :sifflotte:
Pour le moment dans la récupération de la trame Home il n'y a pas de différence. Cela ce fera quand le GPS sera monté sur le Robot .

Soit je ferais enregistré la première trame en tant que "Home", soit je l'enregistrerai sur l'appui d'un bouton par exemple genre " Enregistrer votre point Home" ;

J'ai essayé de faire au plus court . ces calculs sont effectués avant ceux sur les longitudes.

Code : Tout sélectionner

     // Longitude
     
if ( Orientation_Lon_Home == Orientation_Lon2 ){
          if (
Lon2 >= Lon_HomeLonX = (Lon2 Lon_Home)*Coef*111317;
          else 
LonX = (Lon_Home Lon2)*Coef*111317;
     }
     else{
          if (
Lon2 >= Lon_HomeLonX = (Lon2 Lon_Home)*Coef*111317;
     } 
C'est en faisant des erreurs, que l'on apprend le mieux !!!

récupération d'une Trames GPS
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#40 Message par Jérémy » lun. 3 déc. 2018 11:14 lien vers la Data-Sheet : Cliquez ici

Si c'est bon j'aurais quelques questions pour avancer un peu !

Concernant la trame GGA qui est un super indicateur ! En l'état des choses après avoir activé cette trame , je remarque qu'à la maison j'ai donc 6 satellites avec un HDOP de 1.31 ?

Comment interprétè ce 1.31 ? car si les valeurs vont de 1 à 100 , c'est vraiment très bien ( grosse précision) mais si les valeurs vont de 1 à 1.5 , c'est pas terrible ?
Et du coup l'information sur le nombre de satellites est obsolète ?

Sur la trame GPRMC j'ai une information "Data Valid" que je n'ai pas sur ma trame GGA. Dois je en déduire que les infos fournis par la trame GGA ne sont pas sûr ?

Dans la trame GPRMC , j'ai également une info COG et magnetic variation puis je en déduire un cap ?
C'est en faisant des erreurs, que l'on apprend le mieux !!!


Retourner vers « Langage C »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 5 invités