Optimisation des trames NMEA pour GPS

0

Category : Travaux / Expériences

« »

Le programme sur PDA

Le travail effectué sous VBA m’a permis de valider les différentes fonctions utilisées afin de faciliter au maximum la transition sous le langage .NET. J’ai donc réalisé un « prototype » sur PDA pour l’analyse et la compression des trajets GPS ainsi que l’affichage de ces trajets. Ce prototype est présenté dans cette partie.

Les modules

Le programme sur PDA est basé sur 2 modules :

  • Le module Location qui gère le dialogue avec la puce GPS en utilisant l’outil « GPS Intermediate Driver ». C’est en fait une couche d’abstraction matérielle qui permet d’accéder à n’importe quel GPS (interne ou lié à un port de communication sur Smartphone).

  • Le module GPS Tracker qui contient la classe pour l’optimisation, l’interface graphique, la classe pour l’exportation vers le format GPX, la classe gérant le tableau pour l’affichage des coordonnées GPS

GPS Intermediate Driver

« GPS Intermediate Driver » fournit des fonctionnalités aux applications qui utilisent des appareils GPS. Il le fait en fournissant une couche intermédiaire pour l’interrogation du GPS. Cet outil permet aux développeurs d’écrire du code qui fonctionne avec tout type de matériel GPS.

Sans ce type d’outil

Sans des outils comme « GPS Intermediate Driver », les applications accèdent généralement au matériel GPS par l’intermédiaire d’un port COM. Selon le type de matériel, ce port COM peut être un véritable port série, auquel le matériel GPS est connecté par l’intermédiaire d’un câble série. Mais cela peut aussi être un port série « virtuel » rattachés au matériel GPS grâce à un périphérique, SDIO, Bluetooth, ou autres.

Avec la plupart des dispositifs GPS, une fois la connexion effectuée directement sur ce port, celle-ci est exclusive, de sorte qu’une seule application à la fois peut interagir avec le matériel GPS.

Ce type de connexion permet d’accéder aux données NMEA brutes qu’il faut ensuite « parser » (ou filtrer) afin de récupérer les informations voulues.

Avantages de ce type d’outil

Avec un outil comme « GPS Intermediate Driver », les applications ne dialoguent plus directement avec le matériel GPS. Le pilote se charge de le faire.

Ainsi « GPS Intermediate Driver » offre deux avantages principaux:

  • Il permet à plusieurs applications d’utiliser le matériel GPS en même temps.

  • Il n’est plus nécessaire que chaque application parse les données NMEA provenant du GPS car l’API fournit par « GPS Intermediate Driver » analyse elle-même les chaînes NMEA du GPS et renvoie directement les informations parsées.

D’autre part, ces atouts font qu’il n’est plus nécessaire que l’utilisateur indique à chaque application à quel port est connecté le matériel GPS. Car « GPS Intermediate Driver » récupère directement l’information par l’intermédiaire du panneau de configuration du terminal.

Diagramme de classes

Illustration 17 : Diagramme de classes du module « Location »

Le module « Location » est un module d’exemple de l’utilisation du pilote « GPS Intermediate Driver ». Il permet d’accéder aux données GPS et de déclencher un événement dès que des données sont reçues qui sont ensuite traitées par l’application « GPS Tracker » pour mettre à jour les données et effectuer les traitements.

GPS Tracker

Le projet BÉA a nécessité le développement d’un programme sur PDA afin d’exploiter les données récupérées du GPS intégré. Ce programme sur PDA fonctionne sur Windows Mobile avec le Compact Framework version 3.5 de .NET. L’environnement de développement utilisé fut Visual Studio 2009. La suite de ce chapitre présente les principaux composants de ce programme.

Informations

L’onglet « Infos » permet de voir, en temps réel, différentes informations :

  • nom de la puce GPS (constructeur) ;

  • activation ou non du GPS (On ou Off) ;

  • la latitude décimale ;

  • la longitude décimale ;

  • un tableau récapitulatif des coordonnées au format degrés-minutes (ddmm.mmmm) ainsi que le temps pour chacune de ces coordonnées.

Illustration 18 : Onglet « Informations » du programme PDA

if ((position.LatitudeValid) && (position.Latitude!=0)){// On récupère la position courante
GpsPosition currentpos = position;
// On met à jour la latitude
this.txtLatitude.Text = currentpos.Latitude.ToString();
if ((position.LongitudeValid) && (position.Longitude!=0))
{
// On met à jour la longitude
this.txtLongitude.Text = currentpos.Longitude.ToString();

Illustration 19 : Code pour la mise à jour des « TextBox » de latitude et longitude en C#

A chaque nouvelle position, si celle-ci est valide et cohérente, on l’ajoute au tableau « eventLog » de type « ListView ». Cela permet à l’utilisateur de revoir l’ensemble des coordonnées GPS déjà traitées.

if (position.TimeValid){
evtLog.Add(position.Time, position);
}

Illustration 20 : Portion de code pour la mise à jour de la liste des positions GPS en C#

Logs

L’onglet « logs » permet, comme son nom l’indique, de gérer les logs ou fichiers de sortie générés par le programme. Il existe différents types de sorties :

  • GPX qui est un fichier XML spécifique pour les coordonnées GPS, ouvert et compatible avec la plupart des programmes ;

  • GPRMC qui est une des trames d’un fichier NMEA standard, c’est la « Recommended minimum specific GPS/Transit data » qui contient notamment la longitude et la latitude au format degrés-minutes ainsi que la direction (Nord, Sud, Est, Ouest) ;

  • un fichier optimisé qui permet de renvoyer une liste de latitude et longitude soit au format GPRMC (si la case « visu » est cochée) soit une liste brute séparée par des virgules.

Le fichier de sortie « optimisé » se base sur un seuil. Il suffit de renseigner la case « Seuil » pour le spécifier. Il y a 2 types de seuil :

  • en pourcentage si la valeur rentrée est inférieur à 1 ou qu’elle contient le symbole ‘%‘ (exemple : 5%, 10%, 15% ou 0.05, 0.1, 0.15…etc) ;

  • en degrés si la valeur rentrée est supérieur ou égale à 1.

Illustration 21 : Onglet « Logs » du programme PDA

private void Update_Size(SaveFileDialog fd, String type){
long sizeOctets = new FileInfo(fd.FileName).Length;
Double sizeKo = Math.Round((Double)sizeOctets / 1000, 2);
if (type.Equals(« GPRMC »))
{
labTailleGPRMC.Text = string.Format(« Taille : {0} Ko », sizeKo);
}
else
{
if(type.Equals(« GPX »))
{
this.labTailleGPX.Text = string.Format(« Taille : {0} Ko », sizeKo);
}
else
{
if (type.Equals(« OPTIM »))
{
this.labTailleOptim.Text = string.Format(« Taille : {0} Ko », sizeKo);
}
}
}
}

Illustration 22 : Portion de code pour la mise à jour de la taille des fichiers de « Logs » en C#

Seuil

Pour mieux comprendre, l’algorithme permettant de minimiser le nombre de points d’un trajet se base sur une logique simple : Si entre plusieurs points la « direction » reste constante, alors le programme garde le premier et le dernier point de l’ensemble des points composant cette portion de trajet. Le seuil va permettre d’être plus « indulgent » sur cette direction de manière à supprimer encore plus de points. Si un seuil est spécifié alors la direction de référence sera modulée en fonction de ce seuil :

this.newBear = (Double) this.Bearing();if (this.seuil < 0.9999999)
{
//Seuil en pourcentage
if (newBear = ancBear * (1 + this.seuil))
{
this.keep = true;
//On écrit dans le fichier
pos1.WriteGPRMC(output);
// On prend la nouvelle valeur comme référence
ancBear = newBear;
}
else
{
this.keep = false;
}
}
else
{
//Seuil en degrees
if (newBear = (ancBear + this.seuil))
{
this.keep = true;
//On écrit dans le fichier
pos1.WriteGPRMC(output);
}
else
{
this.keep = false;
}
}

Illustration 23 : Optimisation en temps réel en C# sous .NET

La principale difficulté de cette partie fut de « convertir » le code VBA d’Excel qui prenait en entrée un ensemble de coordonnées GPS déjà fournies dans un tableau vers un code C# qui puisse traiter les coordonnées au fur et à mesure en temps réel. Une des solutions fut d’utiliser une variable statique pour stocker la direction précédente.

if (lastpos != null){
// On est sur une nouvelle paire
Optim opt = new Optim(lastpos, currentpos, seuil);
opt.WriteGPRMC(Optimfile, this.visu);
Optimfile.Flush();
Update_Size(savOptim, « OPTIM »);
}

Illustration 24 : Utilisation de la classe « Optim » en C#

Signal

Cette partie permet de visualiser les informations des satellites captés par le GPS :

  • La partie haute montre le positionnement des satellites, le point du milieu indique le zénith ;

  • La partie basse montre la puissance du signal pour chacun des satellites.

Illustration 25 : Onglet « Signal » du programme PDA

private void DrawGSV(){
//Génération des niveaux des différents signaux
int SatCount = position.SatelliteCount;
Bitmap imgSignals = new Bitmap(picGSVSignals.Width, picGSVSignals.Height);
Graphics g = Graphics.FromImage(imgSignals);
g.Clear(Color.White);
Pen penBlack = new Pen(Color.Black, 1);
Pen penGray = new Pen(Color.LightGray, 1);
int iMargin = 4;
//Distance vers la bordure de l’image
int iPadding = 4;
//Distance entre les graphes de signaux
g.DrawRectangle(penBlack, 0, 0, imgSignals.Width - 1, imgSignals.Height - 1);
StringFormat sFormat = new StringFormat();
int barWidth = 1;
if (SatCount > 0)
barWidth = (imgSignals.Width – 2 * iMargin - iPadding * (SatCount - 1)) /SatCount;
//Pour dessiner les lignes horizontales
for (int i = imgSignals.Height - 15; i > iMargin; i -= (imgSignals.Height - 15 - iMargin) / 5)
g.DrawLine(penGray, 1, i, imgSignals.Width - 2, i);
sFormat.Alignment = StringAlignment.Center;
//Pour dessiner les satellites
Satellite[] sat = position.GetSatellitesInView();
for (int i = 0; i < SatCount; i++)
{
int startx = i * (barWidth + iPadding) + iMargin;
int starty = imgSignals.Height - 15;
int height = (imgSignals.Height - 15 - iMargin) / 50 * sat[i].SignalStrength;
g.FillRectangle(new System.Drawing.SolidBrush(Colors[i]), startx, starty, barWidth, -(sat[i].SignalStrength));
if ((position.GetListOfSatellitesInSolution()).Contains(sat[i].Id))
{
g.DrawRectangle(penBlack, startx, starty, barWidth, -height);
}

Illustration 26 : Portion de code pour la generation des signaux satellites en C#

Boussole

Comme son nom l’indique, affiche la direction actuelle du PDA en se basant sur les données GPS. L’utilisation du driver « GPS Intermediate Driver » fait que la récupération de la direction est extrêmement simple. Ce qui n’aurait pas été le cas si j’avais travaillé directement avec les données NMEA. L’image pour la boussole a été récupérée sur Internet, elle n’est pas forcément libre de droit mais il est très simple de la changer dans le programme.

Illustration 27 : Onglet « Boussole » du programme PDA

if (position.HeadingValid){ textBoxHeading.Text = position.Heading.ToString();
//Pour la boussole
pictureBoxPoint.Left = (int)(116 + 100 * Math.Sin(position.Heading * Math.PI / 180));
pictureBoxPoint.Top = (int)(116 - 100 * Math.Cos(position.Heading * Math.PI / 180));
}

Illustration 28 : Affichage de la boussole et positionnement du point de déplacement en C#

Route

Cette partie fut une des plus longues à implémenter, elle affiche une carte de la France et dessine les points GPS au fur et à mesure sur celle-ci. Pour se faire, le programme utilise une libraire appelée «

SharpMap » qui a été « portée » sur le Compact Framework 3.5 de .NET. Cette carte permet plusieurs choses :

  • de zoomer (ZoomIn et ZoomOut)

  • de se déplacer sur la carte (Pan)

Le menu, en bas à gauche, permet aussi de :

  • centrer automatiquement la vue sur l’ensemble du chemin parcouru grâce au bouton « centrer »

  • charger une carte au format NMEA

  • sauvegarder une carte au format GPX contenant les points optimisés (en fonction du seuil indiqué dans la partie « Logs »)

D’autre part, si l’utilisateur clique sur un point de la carte sans avoir sélectionner les options de « Zoom » ou de « Pan », alors un label s’affiche en bas de la carte et renvoie les coordonnées du point sélectionné.

Le choix de l’utilisation de la librairie SharpMap a été longuement réfléchi, j’ai d’abord tenté d’effectuer l’affichage des coordonnées GPS sans aucune librairie. J’ai malheureusement été confronté à différents problèmes et notamment celui de la transformation de la latitude et longitude décimales pour qu’elle s’affiche dans un cadre graphique en C#.

Par la suite, pour des raisons de pérennité du programme, j’ai décidé de faire appel à une librairie libre. Mon choix s’est porté sur SharpMap car cette librairie est librement utilisable même dans un programme payant (grâce à sa licence LGPL). D’autre part, une partie du code avait déjà été porté sur le Compact Framework .NET pour les applications embarquées.

J’ai utilisé une carte « shapefile » de la France pour l’affichage du trajet. La possibilité de concaténer différentes couches de « shapefile » fait que l’utilisateur peut avoir accès à des informations complémentaires visibles sur la carte (tel que les routes, les fleuves, etc). Pour le prototype, j’ai choisi de garder une carte très simple donc de taille restreinte. Celle-ci n’affiche que les régions. J’ai aussi ajouté une carte mondiale pour une utilisation faite en dehors de la France, à terme.

Illustration 29 : Onglet « Route » du programme PDA

if (_points != null){
//Calculate bounding rectangle
double maxLat = -90, minLat = 90, maxLon = -180, minLon = 180;
//Calculate bounding box for array of locations
for (int i = 0; i < _points.Count; i++) { //get latitudes if (_points[i].Y > maxLat)
maxLat = _points[i].Y;
if (_points[i].Y < minLat) minLat = _points[i].Y; //get longitudes if (_points[i].X > maxLon)
maxLon = _points[i].X;
if (_points[i].X < minLon)
minLon = _points[i].X;
}
BoundingBox bbox = new BoundingBox(minLon, minLat, maxLon, maxLat);
myMap.ZoomToBox(bbox);
this.imgMap.Refresh();
}

Illustration 30 : Partie du code pour « centrer » la carte au niveau du parcours en C#

SharpMap

SharpMap est un moteur de rendu cartographique qui permet à partir de différentes sources de données SIG d’en obtenir le rendu graphique dans la projection souhaitée. SharpMap est écrit en C#, basé sur le framework .Net 2.0 et distribué sous la licence « GNU Lesser General Public License ». Le moteur de rendu peut être utilisé pour les clients légers, riches et même mobiles avec une librairie allégée.

Les bases de l’utilisation de SharpMap consistent à définir les différentes couches de données, les styles qui leurs correspondent, la projection et le niveau d’affichage de la carte. La génération de la carte utilise l’API GDI+ pour afficher les éléments cartographiques et laisse un large choix pour la personnalisation du style de chaque couche. SharpMap permet de faire la conversion entre les coordonnées graphiques et les coordonnées spatiales afin de pouvoir interagir avec la carte.

Illustration 31 : Affichage du trajet piéton sur PDA avec SharpMap

Diagramme de classes

Illustration 32 : Diagramme de classes du module « GPS Tracker »

La classe sans doute la plus importante de ce diagramme est « Optim » c’est elle qui est chargée de déterminer, en temps réel, les coordonnées GPS à sauvegarder ou à supprimer en fonction de la direction de référence. Elle calcule le « cap » (direction ou bearing en anglais) pour déterminer, en fonction du seuil, si les nouvelles coordonnées GPS sont significatives ou non.

Transmission des données en ASN.1

Suite au développement des différentes parties du programme, j’ai intégré une solution de transmission des données au format ASN.1 (toujours dans un souci d’optimisation) développé par un collègue stagiaire. J’ai donc modifié le programme en sauvegardant l’ensemble des données optimisés dans un tableau qui est ensuite encodé au format ASN.1 et envoyé à un serveur écrit en Java. Ce serveur décode les données ASN.1 transmises et écrit dans un fichier les latitudes et longitudes des coordonnées GPS.

J’ai comparé les données en entrée et en sortie afin de valider la transmission des données ASN.1. Nous avons ensuite fait une démonstration à notre responsable : Mr Pascal PEDIRODA qui s’est déroulée avec succès.

Vous avez trouvé cet article utile? Alors pourquoi ne pas m'offrir un café? (ou carrément le petit déj! ;) en cliquant ici.

Page précédente Page suivante

Pages: 1 2 3 4 5 6 7 8 9

Sélection d'articles

Domotique - ma solution domotique sous vera lite Comme le nom de l'article l'indique, cela fait un peu moins d'1 an que je me suis installé une petite solution domotique chez moi dans mon appartement. Mais qu'est ce que la domotique, notre ami wikipedia...

Read more

Raspberry Pi & Navi-x : une solution média center... Sans mettre en avant le prix imbattable du raspberry pi, j'ai vite pensé à l'utiliser comme media center. Car vous allez pouvoir installer le media center bien connu : xbmc ainsi qu'un plugin indispensable...

Read more

BOXI - Utilisation InfoView et création de rapports... Ce support de cours permet d'apprendre à utiliser les outils indispensables sous la nouvelle version BOXI3. Il s'adresse particulièrement aux créateurs de rapports (ou de requêtes) pour leur permettre...

Read more

Initiation à l’outil informatique L'informatique est la science de traitement de l'information au moyen de l'ordinateur. Elle est considérée comme le support des connaissances dans les domaines scientifiques, économiques, sociaux. Un...

Read more

Outils de monitoring réseau Un réseau informatique peut être l'objet de nombreux problèmes : que ce soit l'indisponibilité d'un serveur ou une défaillance physique du réseau, les risques sont multiples, et les conséquences...

Read more

Les commandes et connaissances indispensables sous... Linux : comment utiliser le système et l'administrer. Revue du partitionnement, de l'utilisation d'aptitude, de l'installation d'un serveur...

Read more

Assurer la sécurité des réseaux Il est nécessaire d'instaurer une architecture de contrôle de la sécurité afin de déceler les attaques et les failles potentielles internes pour y remédier mais également détecter les attaques...

Read more

Domotique - Event2Gcal ou recevoir des alertes SMS... Le plugin Event2Gcal ou comment envoyer des sms gratuitement depuis votre vera...J'ai pensé à une solution toute simple : pourquoi ne pas créer automatiquement des événements sur son calendrier google...

Read more

Cake PHP - Apprentissage par la pratique Nous allons voir comment utiliser Cake PHP pour réaliser un site Web simple. Nous verrons que ce framework va nous permettre de le réaliser très rapidement. Nous allons réaliser ce site exemple dont...

Read more

Ma solution NAS via ESXI (Univention, Owncloud, Nginx) Dans notre exemple, nous souhaitons avoir un reverse proxy (pour l'accès au site Web interne type owncloud ou autre), un accès SSH (sécurisé sur le port 2222), un NAS (via samba et nfs) et un VPN (pour...

Read more

Active Directory libre avec Univention ! Un des principaux reproches que l'on fait au monde Linux est le suivant : il n'existe pas d'AD. Simple, efficace, réflexion gratuite mais bien réelle, ce reproche est difficile à contredire. En effet,...

Read more

2 step verification - sécurisez l'accès à votre... Depuis un certain temps, vous pouvez fortement améliorer la sécurité à vos différents comptes grâce à la mise en place d'un système d'authentification à 2 étapes appelé "2 step verification"...

Read more

Laisser un commentaire