Erreurs de coordonnées avec GPS adafruit

Bonjour,

Je suis entrain de réaliser un traceur GPS installé dans une bétaillère avec visualisation et enregistrement des données depuis le véhicule qui tracte la bétaillère.

Dans la bétaillère il y a donc un ultimate GPS de Adafruit avec un module radio NRF24l01+, le tout monté sur un arduino nano (je vous passe le capteur d'ouverture et de temperature).

Dans la voiture il y a la partie reception/enregistrement équipé d'un NRF24l01+ et d'un lecteur de carte SD pour enregistrer les données GPS.

Dans l'ensemble ca fonctionne, mais par moment j'ai de grosses aberrations au niveau de la longitude/latitude.

La ou j'ai des points en longitude 0, il est assez simple de les éliminer à la source en disant de ne pas enregistrer si la longitude est égale à 0.000000 mais je ne sais pas comment traiter les autres erreurs et je ne trouve pas pourquoi il y a de si grosses erreurs.

Qu'en pensez vous, quelqu'un a il déjà eu ce genre de problème ?

bonjour,
fais la même chose pour la latitude.
les erreurs sont certainement dues au fait d'une rupture de la réception des données gps, certaines zones n'ont pas de couverture gps, ou cela passe très aml.
forêt, tunnel, ligne haute tension, etc...

Bonjour infobarquee,

Merci pour ta réponse j'ai également mis cette consigne pour la longitude et j'ai aussi ajouté une autre condition si il y a 0 satellites.

if (valeurs.satellites > 0 && valeurs.longitude != 0.000000 && valeurs.latitude != 0.000000 && valeurs.annee != 99) {
{
      ecritureSD();
      i++;
 }

Ce qui m'inquiète c'est justement les erreurs quand la longitude ou la latitude sont fausses mais pas à 0, comme on peut le voir sur mon image.

Toutes celles qui sont sur le Havre sont sur une longitude à 0 mais celles qui sont sur Beauvais ou Meaux ?
Je vais déjà essayer avec la portion de code que je viens de mettre en copie.

Dlteck2000:
Ce qui m'inquiète c'est justement les erreurs quand la longitude ou la latitude sont fausses mais pas à 0, comme on peut le voir sur mon image.

Bonjour
Un gps peut renvoyer de la sentence NMEA diluée (cercle d'incertitude) ça c'est "normal"
mais pas renvoyer de la sentence manifestement erronnée.
ton programme verifie bien le FIX avant de t'envoyer les infos ?

Oui une fois au démarrage, je devrais peut être l'ajouter a ma condition.

 if (valeurs.fix && valeurs.satellites > 0 && valeurs.longitude != 0.000000 && valeurs.latitude != 0.000000 && valeurs.annee != 99) {
     ecritureSD();
     i++;
}

Peut être une erreur de transmission entre les deux NRF ?
Ce qui me semble louche, c'est que ce n'est q'une erreur de longitude ou latitude à la fois, pas les deux en même temps :frowning:

Dlteck2000:
Oui une fois au démarrage, je devrais peut être l'ajouter a ma condition.

Peut être une erreur de transmission entre les deux NRF ?
Ce qui me semble louche, c'est que ce n'est q'une erreur de longitude ou latitude à la fois, pas les deux en même temps :frowning:

Je ne pense pas que ton module GPS crache de la data erronée
soit ton FIX est OK et la sentence est utilisable , soit il ne l'est pas et la sentence doit etre ignorée
le FIX n'est valable que pour la sentence analysée

Ok, donc avec le filtre suivant, je ne devrais plus avoir de problèmes :

if (valeurs.fix && valeurs.satellites > 0 && valeurs.longitude != 0.000000 && valeurs.latitude != 0.000000 && valeurs.annee != 99) {
     ecritureSD();
     i++;
}

Si j'en ai encore c'est qu'il y a des erreurs de transmission entre les deux NRF et on ne peut malheureusement rien y faire.

Dlteck2000:
Ok, donc avec le filtre suivant, je ne devrais plus avoir de problèmes :
Si j'en ai encore c'est qu'il y a des erreurs de transmission entre les deux NRF et on ne peut malheureusement rien y faire.

un NRF ne va pas de lui meme injecter de la data 8)
tu traite quoi exactement comme sentences NMEA
RMC et GGA ?

J'utilises la librairie d'Adafruit et passe par le parser d'après ce que j'ai compris oui j'utilise RMC et GGA, comme indiqué ici: Breakout Arduino Parsing | Adafruit Ultimate GPS | Adafruit Learning System

Une fois que j'ai récupéré les données je les stocks dans une structure que j'envois vers le récepteur avec le NRF en utilisant RF24.

Dlteck2000:
J'utilises la librairie d'Adafruit et passe par le parser d'après ce que j'ai compris oui j'utilise RMC et GGA, comme indiqué ici: Breakout Arduino Parsing | Adafruit Ultimate GPS | Adafruit Learning System

Une fois que j'ai récupéré les données je les stocks dans une structure que j'envois vers le récepteur avec le NRF en utilisant RF24.

Ok
fais ton test avec une verif du FIX à chaque sentence
je pense que ça devrait resoudre ton probleme de données erratiques

Oui, je fais ça mardi (le matériel étant installé et plus chez moi) et je vous tiens au courant :slight_smile:

Merci pour vos avis !

Bonsoir,

Me voila de retour parés le test aujourd'hui.

Il y a moins de bugs, mais il reste encore quelque aberrations, dont je vous met un exemple ici :

T 2015-09-29 09:48:52 49.763206000 3.598706000 0 20.60 50 - Temperature : 20.60 - Porte : Ferme
T 1999-11-30 09:49:02 49.762630000 3.599496000 0 20.60 51 - Temperature : 20.60 - Porte : Ferme
T 1999-11-30 09:49:12 49.000072000 3.599618000 0 20.60 52 - Temperature : 20.60 - Porte : Ferme
T 1999-11-30 09:49:22 49.761116000 3.599876000 0 20.60 53 - Temperature : 20.60 - Porte : Ferme
T 2015-09-29 09:49:32 49.760986000 3.600887000 0 20.60 54 - Temperature : 20.60 - Porte : Ferme

Sur cet exemple il y a un point qui merde pour des raisons qui m'échappent complètement....
Je ne vous ai pas tous mis, mais c'est un petit parcours de test de 145 points et il n'y a que ce point qui déconne.

Oups, en regardant ce que j'ai posté, je me rend compte que les dates, une avant, une pendant, une après sont erronées, pourtant j'avais mis un filtre à ce niveau ...

Dlteck2000:
Oups, en regardant ce que j'ai posté, je me rend compte que les dates, une avant, une avant, une après est erroné, pour tant j'avais mis un filtre à ce niveau ...

Ce que tu expose est une "mise en forme" de sentences GPS
Le "FIX" est mal verifié qq part
la mise en forme ne devrait pas pouvoir etre construite/produite/affichée

il faut analyser tes logs bruts (NMEA)

Entre deux j'ai vérifié le le GPX sur la carte SD et la date est à 0000-00-00, c'est GPS Vizauliser qui me la transforme en 1999-11-30.

J'ai donc refait une condition pour virer les dates en 00.

Je vais revoir également la vérif du fix, mais c'est soit 1, soit 0 et je met bien qu'il ne faut rien inscrire à 0.

Dlteck2000:
Entre deux j'ai vérifié le le GPX sur la carte SD

Tu stocke en GPX sur une carte SD directement par l'arduino ?
c'est l'arduino qu gere(rait) la conversion NMEA --> GPX ?

Oui pour le stockage, par-contre, pour la conversion, c'est moi.

Comme je disais j'envoi une structure avec le NRF, que je récupère coté récepteur qui écrit sur la carte.

La structure :

struct Mydata{
  double temperature;
  int heures;
  int minutes;
  int secondes;
  int jour;
  int mois;
  int annee;
  float latitude;
  float longitude;
  boolean porteArr;
  boolean fix;
  int satellites;
};

Mydata valeurs;

Mon écriture sur la carte (en 3 fonctions) :

void entete() 
{                  
//------------ Ouverture fichier ------------
SdFile::dateTimeCallback(dateTime);
File GPStab= SD.open(datafile, FILE_WRITE);    
  if (GPStab) 
  {
    GPStab.println(F("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"));
    GPStab.println(F("<gpx version=\"1.1\" creator=\"Damien Loisel\" "));
    GPStab.println(F("xsi:schemaLocation=\"http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd http://www.garmin.com/xmlschemas/GpxExtensions/v3 http://www.garmin.com/xmlschemas/GpxExtensionsv3.xsd http://www.garmin.com/xmlschemas/TrackPointExtension/v1 http://www.garmin.com/xmlschemas/TrackPointExtensionv1.xsd\">"));
    GPStab.println(F("xmlns=\"http://www.topografix.com/GPX/1/1\""));
    GPStab.println(F("xmlns:gpxtpx=\"http://www.garmin.com/xmlschemas/TrackPointExtension/v1\""));
    GPStab.println(F("xmlns:gpxx=\"http://www.garmin.com/xmlschemas/GpxExtensions/v3\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">"));
    GPStab.println("<metadata>");
    GPStab.print(F("<time>"));
    GPStab.print("20");
    GPStab.print(AAMMJJ);
    GPStab.print(F("T"));
    GPStab.print(hhmmss);
    GPStab.print(F(".000Z"));
    GPStab.println(F("</time>"));
    GPStab.println(F("</metadata>"));
    GPStab.println("<trk>"); //<rte>
    GPStab.print("<name>Transport du :");
    GPStab.print("20");
    GPStab.print(AAMMJJ);
    GPStab.print("</name>");
    GPStab.println("<trkseg>");
    GPStab.close();    
    sd=1;
  }
  else
  {
    sd=0;
  }
}

//------------ enregistrement sur SD ------------    
void ecritureSD() 
{ 
  File GPStab = SD.open(datafile, FILE_WRITE);
  if (GPStab) 
  {
    GPStab.print("<trkpt lon=\""); //rtept lat="
    GPStab.print(valeurs.longitude,6);  
    GPStab.print("\" lat=\""); //" long="
    GPStab.print(valeurs.latitude,6);
    GPStab.println("\">"); //">
    GPStab.print(F("<time>"));
    GPStab.print("20");
    GPStab.print(AAMMJJ);
    GPStab.print(F("T"));
    GPStab.print(hhmmss);
    GPStab.print(F(".000Z"));
    GPStab.println(F("</time>"));
    GPStab.print("<name>"); //name
    GPStab.print(i); //i
    GPStab.print(F(" - Temperature : "));
    GPStab.print(valeurs.temperature);
    GPStab.print(F(" - Porte : "));
    if (valeurs.porteArr == 1){GPStab.print(F("Ouvert"));} else {GPStab.print(F("Ferme"));}
    GPStab.println("</name>"); //name>
    GPStab.println("<extensions>");
    GPStab.println("<gpxtpx:TrackPointExtension>");
    GPStab.print("<gpxtpx:atemp>");
    GPStab.print(valeurs.temperature);
    GPStab.println("</gpxtpx:atemp>");
    GPStab.print("<gpxtpx:cad>");
    GPStab.print(valeurs.porteArr);
    GPStab.println("</gpxtpx:cad>");
    GPStab.println("</gpxtpx:TrackPointExtension>");
    GPStab.println("</extensions>");
    GPStab.println("</trkpt>"); // </rtept>
    GPStab.close();
    sd=1;
  }
  else  
  {
    sd=0;
  }
}

//------------ fermeture SD ------------    
void fermetureSD() 
{ 
  File GPStab = SD.open(datafile, FILE_WRITE);
  if (GPStab) 
  {
    GPStab.println("</trkseg>");
    GPStab.println("</trk>"); // </rte>
    GPStab.println("</gpx>"); // </gpx>
    GPStab.close();
    sd=1;
  }
  else  
  {
    sd=0;
  }
  affAccueil = 0;
}

Ha oui, il manque un morceau.

Mon AAMMJJ, je le construit de cette façon :

sprintf(AAMMJJ, "%02d-%02d-%02d", valeurs.annee, valeurs.mois,valeurs.jour);

Dlteck2000:
Oui pour le stockage, par-contre, pour la conversion, c'est moi.

Je m'en doutais un peu 8)
pourquoi passer par une "usine à gaz" sur l'arduino ?
log/transmet simplement de la "bonne vieille NMEA" eventuellement seulement si verifiée/declarée valide
la charge utile sera peu ou prou la meme
et "depouille" là ensuite

C'est une solution en effet, un peut plus compliqué pour l'utilisateur (ce n'est pas pour moi) à exploiter, mais au moins pour voir d'ou vient le problème.