Projet

Général

Profil

« Précédent | Suivant » 

Révision 491

Ajouté par Awa Semou FAYE il y a environ 3 ans

Voir les différences:

tag/rc-1/faye_awasemou/sp4a12/main.c
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include "trame.h"
//Trames de tests ? modifier si n?cessaire.
char * trames[]= {"$GPGSV,3,2,10,15,03,077,,18,04,041,42,19,85,271,,20,08,214,*7C",
"$GPGSV,3,3,10,22,39,053,50,28,15,320,*7E",
"$GPRMC,141914.00,A,4545.6424,N,00306.6036,E,0.4,99.4,010206,,*0C",
"$GPGLL,4545.6424,N,00306.6036,E,141914.00,A*0E",
"$GPGGA,141914.00,4545.0000,N,00306.6036,E,1,05,3.4,499.3,M,,M,,*7D",
"$GPGSA,A,3,,03,,22,14,,01,,18,,,,3.9,3.4,1.9*39",
"$GPVTG,99.4,T,,M,0.4,N,0.7,K*57",
"$GPZDA,141914.00,01,02,2006,00,00*69",
0};
//declaration de la structure position contenant la latitude et la longitude
typedef struct {
float latitude;
float longitude;
} Position ;
// declaration d'une stucture permettant de decrire une zone renseignant la position et la vitesse limite associ?e
typedef struct {
Position rpos;
float vitmax;
} Zone ;
//cr?ation d'une table de zone dangereuse
Zone zones[] = {
{{44.7887762, -3.012}, 50}, /* Descripteur de la premi?re zone */
{{44.7891220, -3,013}, 70},
{{45.7891220, 3,013}, 90},
};
//fonction qui permet de savoir si la trame commence par la chaine de caractere type(GPGGA)
int trame_cmp(char* trame, char* type) //prise en paramete de la trame envoy?e et du type
{
int i;//variable permettant de faire l'iteration du tableau de caractere trame et type(on parcoure l'int?gralit? du tableau)
int ok;//variable qui permet de retourner si la trame commence par le bon format(cad GPGGA) ou non
ok=0|1;
for (i=0;i<4;i++)// on tient en compte des 5 caracteres du debut de la trame car ce sont eux qui permettent de caract?riser le bon format de la trame
{
if (trame[i+1]==type[i])//on compare la trame recu et le type (GPGGA) en ignorant le caractere $ du debut de la trame
{
ok=1; //ok prend la valeur 1 si la trame commence par le bon format 0 sinon
}else
{
ok=0; //0 sinon
}
}
return ok;// on retourne resultat de ok pour connaitre si la trame a le bon format ou non(je dis le bon format car ici ce sont les trames commencant par GPGGA qui nous interessent)
}
//fonction qui permet de renvoyer la valeur d?cimale associ?e ? un caract?re donn? en param?tre
int decode_int(char c) //prise en parametre d'un caractere c
{
int Vdecimal; //valeur en decimal du caractere pass? en parametre
if ( c <= '9' && c >='0' ) //comparaison pour savoir si le parametre recu est compris entre 0 et 9
{
Vdecimal =c-48; // si oui affectation(methode permettant de donner la valeur en decimal du caractere)
}else
{
Vdecimal=-1; //si le caractere pass? en parametre n'est pas compris entre 0 et9 on renvoie -1
}
return Vdecimal; //on retourne la valeur decimal du caractere
}
//fonction qui permet de renvoyer la valeur d?cimale des n premiers caract?res de la cha?ne ch
int decode_nombre(char* ch, int n )
{
int i,s=0; //i=variable permettant de faire l'iteration du tableau de caractere ch(on parcoure tout le tableau en incrementant la valeur de i qui est initialis? a 0 pour un tableau)
//s variable somme initialis?e a 0 permettant de recuperer le nombre n de caractere qu'on veut recuperer sur une chaine de caractere ch
for(i=0;i<n;i++)//la boucle est execut?e de 0 a n fois
{
s=s*10 + decode_int(ch[i]);// on fait la somme des valeurs decimales apres avoir calculer la valeur d?cimale associ?e au caract?re en utilisant la fonction decode_int
}
return s;// on retourne la somme;
}
// fonction qui convertit la latitude en un nombre flottant
float conversionLatitude(char* latitude)
{
//exemple latitude=3723.2475--> 37valDegre, 23Min_Entiere, (0.2475=2475*0.0001)2475MinDecimal donc 37,387458=37+(23+2475*0.0001)/60
int valDegre,MinEntiere,MinDecimal; //declaration des variables permettant de recuperer les valeurs en degre,minutes entieres et minutes decimales de la latitude
float resultatConversion ;
valDegre=decode_nombre(latitude,2); //recuperer la valeur degre de la latitude
MinEntiere=decode_nombre(&latitude[2],2); //recuperer la valeur minute entiere de la latitude
MinDecimal=decode_nombre(&latitude[5],4); //recuperer la valeur minute decimal de la latitude
resultatConversion=valDegre+((MinEntiere+MinDecimal*0.0001)/60);// operation de calcul du resultat du conversion de la latitude en valeur reelle
return resultatConversion;//on renvoie la valeur du resultat de la convertion
}
// fonction qui convertit la longitude en un nombre flottant
float conversionLongitude(char* longitude)
{
//exemple longitude =00306.6036,E signifie 3valDegre 06=MinEntiere , MinDecimal=6036' de longitude Est, soit 3,11006?
int valDegre, MinEntiere,MinDecimal; //declaration des variables permettant de recuperer les valeurs en degre,minutes entieres et minutes decimales de la longitude
float resultatConversion;
valDegre=decode_nombre(longitude,3); //recuperer la valeur degre de la longitude
MinEntiere=decode_nombre(&longitude[3],2); //recuperer la valeur minute entiere de la longitude
MinDecimal=decode_nombre(&longitude[6],4); //recuperer la valeur minute decimal de la longitude
resultatConversion=valDegre +((MinEntiere+MinDecimal*0.0001)/60);// resultat de la conversion de la longitude en valeur reelle
return resultatConversion;//on renvoie la valeur du resultat de la convertion
}
// fonction qui convertit la latitude ou la longitude en flottant
float fonctionGenerique(char* chaine)
{
float resultatConversion; // resultat de la conversion de la longitude ou la latitude en valeur reelle
if(chaine[4]=='.') //comparaison pour connaitre si la 4ieme variable de la chaine est un point comme le montre cet exemple 3723.2475
{
resultatConversion=conversionLatitude(chaine);// appel de la fonction qui permet de faire la conversion en flottant de la latitute; le resultat de la conversion est mis dans la variable resutatConversion
}
else
if(chaine[5]=='.') //comparaison pour connaitre si la 5ieme variable de la chaine est un point comme le montre cet exemple 00306.6036
{
resultatConversion=conversionLongitude(chaine);// appel de la fonction qui permet de faire la conversion en flottant de la longitute; le resultat de la conversion est mis dans la variable resutatConversion
}
return resultatConversion;//on renvoie la valeur du resultat de la convertion de la latitude ou de la longitude
}
// fonction qui permet de savoir si les trames sont au bon format "GPGGA" en renvoyant 1 et d'afficher la position cad la latitude et la longitude
int decode_trame(char* trame,Position * position)
{
//exempletrame="$GPGGA,141914.00,4545.0000,N,00306.6036,E,1,05,3.4,499.3,M,,M,,*7D",
if (trame_cmp(trame,"GPGGA")) //on utilise la fonction trame_cmp pour savoir si la trame a le bon format GPGGA
{
int i;
char ch[10];// tableau dans lequel on stocke la longitude de la trame
for (i=0;i<10;i++) ch[i]=trame[29+i];// on recupere la valeur de la longitude et on le met dans le tableau ch
position->latitude=conversionLatitude(trame+17);//on fait la conversion de la latitude apres avoir recuperer la latitude
position->longitude=conversionLongitude(ch);//on fait la conversion de la longitude
return 1;//on retourne 1 pour montrer qu'on a la trame type GPGGA et qu'on a recuper? la position en latitude et longitude
}
return 0;//on retourne 0 sinon, la trame est ignor?e
}
//fonction qui permet de calculer la distance en deux points P1 et P2 en connaissant leurs latitudes et longitudes
float calcul_distance(Position P1, Position P2)
{
float distance;//variable contenant la distance calcul?e entre ces deux points
distance=(40000/360)*sqrt((P2.latitude-P1.latitude)*(P2.latitude-P1.latitude)+ (P2.longitude-P1.longitude)*(P2.longitude-P1.longitude));//40000(perimetre de la terre)/360(degr?)=111km ->1?=111km sur terre
return distance; //on revoie la valeur du la distance calcul?e
}
//fonction qui calcule la vitesse correspondant au parcours de la distance entre deux points P1 et P2
float calcul_vitesse(Position P1, Position P2)// on prend en parametre les positions des deux points en latitude et longitude
{
float vitesse;//Variable contenant la vitesse resultante entre les deux points
vitesse=3600*calcul_distance(P1,P2);//on affecte a la vitesse la methode de calcul correspondante cad vitesse =distance /temps en faisant appel a la fonction calcul_distance sachant que le temps c'est 1s on a directement la vitesse en km/s donc on miltiplie par 3600 pour avoir la vitesse km/heure vu que 1h=3600s
return vitesse; //on revoie la valeur du la vistesse calcul?e
}
//fonction qui calcule la distance ? la plus proche zone
int distance_a_la_proche_zone(Position p, Zone r[],int nb_zones, float *d)
{
float diCalculee;// variables contenant la valeur de la distance calculee entre la position courante et l element[i] du tableau de zones dangereuses
int i, index=0;//i=variable pour parcourir tout le tableau de zones et index=i qui minimise le tableau de zones par rapport a la distance calculee, elle correspond a la valeur de i pour laquelle on se situe a la zone la plus proche
*d=calcul_distance(p,r[0].rpos);//on calcule la distance entre la position courante du vehicule et le premier element du tableau de zones dangereuses
if(nb_zones>0)
{
for (i=1;i<nb_zones;i++)// on parcoure le tableau de zones de 1 a la valeurs maximales de zones
{
diCalculee=calcul_distance(p,r[i].rpos);//on calcule la distance entre la position courante du vehicule et l'element[i] du tableau de zones dangereuses
if(*d>diCalculee) //si la distance calcul?e a partir du 1ere element du tableau est superieur a la distance calculee avec lelement dindice i du table
{
*d=diCalculee;// alors on affecte a la variable d la nouvelle distance la plus proche des zones dangereuses
index=i;//a index on affecte la valeur de i qui minimise le tableau
}
}
return index;
}
return -1;// on retourne -1 si la table est vide
}
//Fonction ? modifier !!!!!
void traitement(char * trame)
{
static int cpt=0;
cpt++;
Position p;
Position p_initiale; // on declare une position a laquelle on initialise la latitude et la longitude avec des valeurs
p_initiale.latitude=45.750403;
p_initiale.longitude= 3.110065;
float distance; //distance a laquelle se trouve le vehicule
float vitesse;
float seuil=710;//seuil que le distance du vehicule ne doit pas depasser
int index;
if (decode_trame(trame,&p)) // on regarde si la trame est valide
{
printf ("> %s\n",trame);// on affiche la trame recue
vitesse=calcul_vitesse(p_initiale,p);//on calcule la vitesse entre la position du vehicule et une position premiere d'une zone dangereuse
index=distance_a_la_proche_zone(p,zones,sizeof(zones),&distance);// on calcule la distance la plus proche pour trouver l'index
if ((distance<seuil) && (vitesse>zones[index].vitmax))// on compare si la distance est inferieur au seuil donne et si la vitesse est superieur a celle definie pour cette zone
{
//si cest cas on affiche la distance et la vistance puis on declenche une alarme
printf(" La vitesse est egale a %f\n ",vitesse);
printf("La distance est egale a %f \n ",distance);
printf("Alarme ON \n");
printf(" Zone numero %d \n ",index);
}
else
//sinon l'alarme reste eteinte
printf("Alarme OFF \n ");
p_initiale = p;// on affecte a la position initiale la nouvelle position du vehicule car plus le vehicule roule plus il s'approche des zones dangereuses
}
return 0;
}
//Ajouter vos tests unitaires dans cette fonction.
void tests_unitaires(void)
{
//variables concernant les tests unitaires calcul_vitesse et calcul_distance
Position P1={45.75040333,3.110065};
Position P2={45.7500,3.11006};
//variable concernant le test unitaire decode_trame
Position * position;
//variables concernant le test unitaire distance_a_la_proche_zone
int nb_zones=3;
float d;
//test unutaire basique
if (5!=5){
printf ("Erreur Test unitaire basique.\n");
exit(-1);
}
//tests unutaires de la fonction trame_cmp
if (trame_cmp("$GPGGA suite chaine","GPGGA")!=1){
printf ("Erreur Test unitaire trame_cmp.\n");
exit(-1);
}
if (trame_cmp("$GPRMC suite chaine","GPGGA")!=0){
printf ("Erreur Test unitaire trame_cmp.\n");
exit(-1);
}
if (trame_cmp("$GPRMC... ", "GPRMC" )!=1){
printf ("Erreur Test unitaire trame_cmp.\n");
exit(-1);
}
if (trame_cmp("$APRMC...", "GPGGA")!=0){
printf ("Erreur Test unitaire trame_cmp.\n");
exit(-1);
}
//tests unutaires de la fonction decode_int
if (decode_int('0')!=0){
printf ("Erreur Test unitaire decode_int.\n");
exit(-1);
}
if (decode_int('7')!=7){
printf ("Erreur Test unitaire decode_int.\n");
exit(-1);
}
if (decode_int('A')!=-1){
printf ("Erreur Test unitaire decode_int.\n");
exit(-1);
}
//tests unutaires de la fonction decode_nombre
if (decode_nombre("7541",2)!=75){
printf ("Erreur Test unitaire decode_nombre.\n");
exit(-1);
}
if (decode_nombre("7541",3)!=754){
printf ("Erreur Test unitaire decode_nombre.\n");
exit(-1);
}
//tests unutaires de la fonction conversionLatitude
if (conversionLatitude("3723.2475")-37.38745833 > 0.0001){
printf ("Erreur Test unitaire conversion Latitude.\n");
exit(-1);
}
if (conversionLatitude("4545.0000")-45.7500 > 0.0001){
printf ("Erreur Test unitaire conversion Latitude.\n");
exit(-1);
}
//tests unutaires de la fonction conversionLongitude
if (conversionLongitude("00306.6039")- 3.110065 > 0.0001){
printf ("Erreur Test unitaire conversion Longitude.\n");
exit(-1);
}
if (conversionLongitude("00306.6036")- 3.11006 > 0.0001){
printf ("Erreur Test unitaire conversion Longitude.\n");
exit(-1);
}
//tests unutaires de la fonction decode_trame
if(decode_trame("$GPGGA,141914.00,4545.0000,N,00306.6036,E,1,05,3.4,499.3,M,,M,,*7D",&position)!=1){
printf("Erreur Test decode trame \n");
exit(-1);
}
//tests unutaires de la fonction calcul_distance
if (calcul_distance(P1,P2)- 0.04481788787 > 0.001){
printf ("Erreur Test unitaire calcul_distance.\n");
exit(-1);
}
//tests unutaires de la fonction calcul_vitesse
if (calcul_vitesse(P1,P2)-1613.443 > 0.01){
printf ("Erreur Test unitaire calcul_vitesse.\n");
exit(-1);
}
//tests unutaires de la fonction distance_a_la_proche_zone
if (distance_a_la_proche_zone(P1,zones,nb_zones,&d)!=2){
printf ("Erreur Test unitaire distance_a_la_proche_zone.\n");
exit(-1);
}
// Test unitaire de la fonctionGenerique
if (fonctionGenerique("4545.0242") - 45.75040333 > 0.0001 )
{
printf("Erreur Test unitaire conversion latitude !!! \n");
exit(-1);
}
if (fonctionGenerique("00306.6039")- 3.110065 > 0.0001)
{
printf("Erreur Test unitaire conversion longitude !!! \n");
exit(-1);
}
}
// Ne pas modifier cette fonction
int main(int argc,char ** argv)
{
tests_unitaires();
// Affichage des trames definies dans la table trames.
printf ("Trames de tests tableau trames:\n");
int i=0;
while (trames[i])
traitement(trames[i++]);
if (!trame_init())
exit(-1);
// Affichage des trames du fichier gps.log
char *trame;
printf ("Trames de tests du fichier gps.log\n");
while ((trame = trame_suivante()))
traitement(trame);
return 0;
}
tag/rc-1/faye_awasemou/sp4a12/gps.log
$GPGSV,3,2,10,15,03,077,,18,04,041,42,19,85,271,,20,08,214,*7C
$GPGSV,3,3,10,22,39,053,50,28,15,320,*7E
$GPRMC,141914.00,A,4545.6424,N,00306.6036,E,0.4,99.4,010206,,*0C
$GPGLL,4545.6424,N,00306.6036,E,141914.00,A*0E
$GPGGA,141914.00,4545.0000,N,00306.6036,E,1,05,3.4,499.3,M,,M,,*79
$GPGSA,A,3,,03,,22,14,,01,,18,,,,3.9,3.4,1.9*39
$GPVTG,99.4,T,,M,0.4,N,0.7,K*57
$GPZDA,141914.00,01,02,2006,00,00*69
$GPGSV,3,1,10,01,13,142,46,03,48,144,47,11,41,277,,14,27,104,42*75
$GPGSV,3,2,10,15,03,077,,18,04,041,41,19,85,271,,20,08,214,*7F
$GPGSV,3,3,10,22,39,053,48,28,15,320,*77
$GPRMC,141915.00,A,4545.6423,N,00306.6039,E,0.6,110.2,010206,,*31
$GPGLL,4545.6423,N,00306.6039,E,141915.00,A*07
$GPGGA,141915.00,4545.0242,N,00306.6039,E,1,05,3.4,499.5,M,,M,,*75
$GPGSA,A,3,,03,,22,14,,01,,18,,,,3.9,3.4,1.9*39
$GPVTG,110.2,T,,M,0.6,N,1.2,K*67
$GPZDA,141915.00,01,02,2006,00,00*68
$GPGSV,3,1,10,01,13,142,45,03,48,144,47,11,41,277,,14,27,104,41*75
$GPGSV,3,2,10,15,03,077,,18,04,041,42,19,85,271,,20,08,214,*7C
$GPGSV,3,3,10,22,39,053,49,28,15,320,*76
$GPRMC,141916.00,A,4545.6422,N,00306.6037,E,0.1,211.1,010206,,*3B
$GPGLL,4545.6422,N,00306.6037,E,141916.00,A*0B
$GPGGA,141916.00,4545.0484,N,00306.6037,E,1,05,3.4,500.0,M,,M,,*70
$GPGSA,A,3,,03,,22,14,,01,,18,,,,3.9,3.4,1.9*39
$GPVTG,211.1,T,,M,0.1,N,0.2,K*60
$GPZDA,141916.00,01,02,2006,00,00*6B
$GPGSV,3,1,10,01,13,142,45,03,48,144,48,11,41,277,,14,27,104,43*78
$GPGSV,3,2,10,15,03,077,,18,04,041,44,19,85,271,,20,08,214,*7A
$GPGSV,3,3,10,22,39,053,48,28,15,320,*77
$GPRMC,141917.00,A,4545.6422,N,00306.6039,E,0.3,122.3,010206,,*37
$GPGLL,4545.6422,N,00306.6039,E,141917.00,A*04
$GPGGA,141917.00,4545.0726,N,00306.6039,E,1,05,3.4,499.6,M,,M,,*73
$GPGSA,A,3,,03,,22,14,,01,,18,,,,3.9,3.4,1.9*39
$GPVTG,122.3,T,,M,0.3,N,0.5,K*64
$GPZDA,141917.00,01,02,2006,00,00*6A
$GPGSV,3,1,10,01,13,142,45,03,48,144,46,11,41,277,,14,27,104,41*74
$GPGSV,3,2,10,15,03,077,,18,04,041,42,19,85,271,,20,08,214,*7C
$GPGSV,3,3,10,22,39,053,48,28,15,320,*77
$GPRMC,141918.00,A,4545.6421,N,00306.6034,E,0.5,252.2,010206,,*35
$GPGLL,4545.6421,N,00306.6034,E,141918.00,A*05
$GPGGA,141918.00,4545.0968,N,00306.6034,E,1,05,3.4,498.8,M,,M,,*7A
$GPGSA,A,3,,03,,22,14,,01,,18,,,,3.9,3.4,1.9*39
$GPVTG,252.2,T,,M,0.5,N,1.0,K*63
$GPZDA,141918.00,01,02,2006,00,00*65
$GPGSV,3,1,10,01,13,142,45,03,48,144,48,11,41,277,,14,27,104,42*79
$GPGSV,3,2,10,15,03,077,,18,04,041,42,19,85,271,,20,08,214,*7C
$GPGSV,3,3,10,22,38,053,49,28,15,320,*77
$GPRMC,141919.00,A,4545.6420,N,00306.6040,E,0.6,95.2,010206,,*0C
$GPGLL,4545.6420,N,00306.6040,E,141919.00,A*06
$GPGGA,141919.00,4545.1210,N,00306.6040,E,1,05,3.4,500.2,M,,M,,*77
$GPGSA,A,3,,03,,22,14,,01,,18,,,,3.9,3.4,1.9*39
$GPVTG,95.2,T,,M,0.6,N,1.2,K*5B
$GPZDA,141919.00,01,02,2006,00,00*64
$GPGSV,3,1,10,01,13,142,46,03,48,144,49,11,41,277,,14,27,104,42*7B
$GPGSV,3,2,10,15,03,077,,18,04,041,43,19,85,271,,20,08,214,*7D
$GPGSV,3,3,10,22,38,053,49,28,15,320,*77
$GPRMC,141920.00,A,4545.6419,N,00306.6039,E,0.2,133.1,010206,,*38
$GPGLL,4545.6419,N,00306.6039,E,141920.00,A*08
$GPGGA,141920.00,4545.1410,N,00306.6039,E,1,05,3.4,500.0,M,,M,,*77
$GPGSA,A,3,,03,,22,14,,01,,18,,,,3.9,3.4,1.9*39
$GPVTG,133.1,T,,M,0.2,N,0.4,K*66
$GPZDA,141920.00,01,02,2006,00,00*6E
$GPGSV,3,1,10,01,13,142,45,03,48,144,46,11,41,277,,14,27,104,43*76
$GPGSV,3,2,10,15,03,077,,18,04,041,41,19,85,271,,20,08,214,*7F
$GPGSV,3,3,10,22,38,053,50,28,15,320,*7F
$GPRMC,141921.00,A,4545.6419,N,00306.6043,E,0.6,103.1,010206,,*33
$GPGLL,4545.6419,N,00306.6043,E,141921.00,A*04
$GPGGA,141921.00,4545.1610,N,00306.6043,E,1,05,3.4,499.8,M,,M,,*70
$GPGSA,A,3,,03,,22,14,,01,,18,,,,3.9,3.4,1.9*39
$GPVTG,103.1,T,,M,0.6,N,1.1,K*65
$GPZDA,141921.00,01,02,2006,00,00*6F
$GPGSV,3,1,10,01,13,142,46,03,48,144,48,11,41,277,,14,27,104,42*7A
$GPGSV,3,2,10,15,03,077,,18,04,041,42,19,85,271,,20,08,214,*7C
$GPGSV,3,3,10,22,38,053,48,28,15,320,*76
$GPRMC,141922.00,A,4545.6418,N,00306.6046,E,0.7,96.9,010206,,*00
$GPGLL,4545.6418,N,00306.6046,E,141922.00,A*03
$GPGGA,141922.00,4545.1810,N,00306.6046,E,1,05,3.4,500.6,M,,M,,*77
$GPGSA,A,3,,03,,22,14,,01,,18,,,,3.9,3.4,1.9*39
$GPVTG,96.9,T,,M,0.7,N,1.3,K*53
$GPZDA,141922.00,01,02,2006,00,00*6C
$GPGSV,3,1,10,01,13,142,47,03,48,144,46,11,41,277,,14,27,104,43*74
$GPGSV,3,2,10,15,03,077,,18,04,041,43,19,85,271,,20,08,214,*7D
$GPGSV,3,3,10,22,38,053,48,28,15,320,*76
$GPRMC,141923.00,A,4545.6417,N,00306.6046,E,0.3,113.6,010206,,*39
$GPGLL,4545.6417,N,00306.6046,E,141923.00,A*0D
$GPGGA,141923.00,4545.2010,N,00306.6046,E,1,05,3.4,500.6,M,,M,,*7D
$GPGSA,A,3,,03,,22,14,,01,,18,,,,3.9,3.4,1.9*39
$GPVTG,113.6,T,,M,0.3,N,0.7,K*61
$GPZDA,141923.00,01,02,2006,00,00*6D
$GPGSV,3,1,10,01,13,142,45,03,48,144,47,11,41,277,,14,27,104,41*75
$GPGSV,3,2,10,15,03,077,,18,04,041,43,19,85,271,,20,08,214,*7D
$GPGSV,3,3,10,22,38,053,49,28,15,320,*77
$GPRMC,141924.00,A,4545.6416,N,00306.6044,E,0.2,197.7,010206,,*31
$GPGLL,4545.6416,N,00306.6044,E,141924.00,A*09
$GPGGA,141924.00,4545.2210,N,00306.6044,E,1,05,3.4,500.5,M,,M,,*79
$GPGSA,A,3,,03,,22,14,,01,,18,,,,3.9,3.4,1.9*39
$GPVTG,197.7,T,,M,0.2,N,0.4,K*6E
$GPZDA,141924.00,01,02,2006,00,00*6A
$GPGSV,3,1,10,01,13,142,45,03,48,144,47,11,41,277,,14,27,104,40*74
$GPGSV,3,2,10,15,03,077,,18,04,041,43,19,85,271,,20,08,214,*7D
$GPGSV,3,3,10,22,38,053,49,28,15,320,*77
$GPRMC,141925.00,A,4545.6415,N,00306.6046,E,0.2,130.8,010206,,*33
$GPGLL,4545.6415,N,00306.6046,E,141925.00,A*09
$GPGGA,141925.00,4545.2410,N,00306.6046,E,1,05,3.4,501.4,M,,M,,*7C
$GPGSA,A,3,,03,,22,14,,01,,18,,,,3.9,3.4,1.9*39
$GPVTG,130.8,T,,M,0.2,N,0.5,K*6D
$GPZDA,141925.00,01,02,2006,00,00*6B
$GPGSV,3,1,10,01,13,142,45,03,48,144,47,11,41,277,,14,27,104,40*74
$GPGSV,3,2,10,15,03,077,,18,04,041,41,19,85,271,,20,08,214,*7F
$GPGSV,3,3,10,22,38,053,47,28,15,320,*79
$GPRMC,141926.?E,0.2,260.8,010206,,*34
tag/rc-1/faye_awasemou/sp4a12/trame.c
/* Fichier trames.c - Gestion et decodage des trames */
/* Ce fichier sera fourni */
#include <stdio.h>
#include <stdlib.h>
#include "trame.h"
#define FICHIER_TRAMES "gps.log" /* Par exemple */
#define MAX_FRAME_LENGTH 80
static char trame_buf[MAX_FRAME_LENGTH];
static FILE *trame_fic;
int trame_init(void)
{
trame_fic = fopen(FICHIER_TRAMES, "r");
if (trame_fic)
return 1;
fprintf(stderr, "Impossible d'ouvrir le fichier %s\n", FICHIER_TRAMES);
return 0;
}
char *trame_suivante(void)
{
return fgets(trame_buf, MAX_FRAME_LENGTH-1, trame_fic);
}
tag/rc-1/faye_awasemou/sp4a12/sp4a.cbp
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<CodeBlocks_project_file>
<FileVersion major="1" minor="6" />
<Project>
<Option title="sp4a" />
<Option pch_mode="2" />
<Option compiler="gcc" />
<Build>
<Target title="Debug">
<Option output="sp4a" prefix_auto="1" extension_auto="1" />
<Option object_output=".\debug" />
<Option type="1" />
<Option compiler="gcc" />
<Compiler>
<Add option="-g" />
</Compiler>
</Target>
</Build>
<Compiler>
<Add option="-Wall" />
</Compiler>
<Unit filename="gps.log" />
<Unit filename="main.c">
<Option compilerVar="CC" />
</Unit>
<Unit filename="trame.c">
<Option compilerVar="CC" />
</Unit>
<Unit filename="trame.h" />
<Extensions>
<code_completion />
<envvars />
<debugger />
<lib_finder disable_auto="1" />
</Extensions>
</Project>
</CodeBlocks_project_file>
tag/rc-1/faye_awasemou/sp4a12/trame.h
int trame_init(void);
char * trame_suivante(void);
tag/rc-1/faye_awasemou/sp4a3/sp4a3_kalman.c
// Pour compiler : gcc sp4a3_kalman.c -lm
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include "sp4a3_kalman_extra.h"
void Add_Mat_Mat(int na,int ma,double A[na][ma],int nb,int mb,double B[nb][mb], double R[na][ma]){
int i,j;//i=variable permettant de parcourir les lignes et j=variable permettant de parcourir les colonnes
for(i=0;i<na;i++)
{
for(j=0;j<nb;j++)
{
R[i][j]=A[i][j]+B[i][j];
}
}
}
void Inverse_Mat_22(int n,int m,double A[n][m],double B[n][m]){
float detA;
detA=1/((A[0][0]*A[1][1])-(A[1][0]*A[0][1]));
B[0][0]=A[1][1]*detA;
B[0][1]=-A[0][1]*detA;
B[1][0]=-A[1][0]*detA;
B[1][1]=A[0][0]*detA;
}
void Transpose_Mat(int n,int m,double A[n][m],double R[m][n]){
int i,j;
for (i=0;i<n;i++)
for (j=0;j<m;j++)
R[j][i]=A[i][j];
}
void Sub_Mat_Mat(int na,int ma,double A[na][ma],int nb,int mb,double B[nb][mb], double R[na][ma]){
int i,j;//i=variable permettant de parcourir les lignes et j=variable permettant de parcourir les colonnes
for(i=0;i<na;i++)
{
for(j=0;j<mb;j++)
{
R[i][j]=A[i][j]-B[i][j];
}
}
}
void Mul_Mat_Mat(int na,int ma,double A[na][ma], int nb,int mb,double B[nb][mb], double R[na][mb]){
int i,j,k;//i=variable permettant de parcourir les lignes et j=variable permettant de parcourir les colonnes
for(i=0;i<na;i++)
{
for(j=0;j<mb;j++)
{
R[i][j]=0;
for(k=0;k<ma;k++)
{
R[i][j]=R[i][j]+ A[i][k]*B[k][j];
}
}
}
}
void tests_unitaires(void){
//Matrices d'entrée
double T21a[2][1]={{7},{-5}};
double T21b[2][1]={{-3},{46}};
double T22a[2][2]={{12,78},{-5,13}};
double T22b[2][2]={{-25,36},{7,42}};
double T24[2][4]={{7,-71,-12,3},{41,123,-5,10}};
double T41a[4][1]={{45},{-123},{-78},{-410}};
double T41b[4][1]={{-10},{45},{27},{-9}};
double T42a[4][2]={{-73,45},{10,12},{-41,-35},{8,-23}};
double T44a[4][4]={{1,2,7,4},{6,5,7,8},{9,8,7,6},{5,4,3,2}};
double T44b[4][4]={{12,13,14,15},{21,22,23,40},{78,45,12,3},{54,10,12,47}};
//Matrices résultat
double R21[2][1],R22[2][2],R24[2][4],R41[4][1],R42[4][2],R44[4][4];
//Matrices de validation
double RST21[2][1]={{10},{-51}};
double RInvT22[2][2]={{0.02380952380952381,-0.1428571428571428},{0.009157509157509158,0.02197802197802198}};
double RAT22[2][2]={{-13,114},{2,55}};
double RTT24[4][2]={{7,41},{-71,123},{-12,-5},{3,10}};
double RMT24T41[2][1]={{8754},{-16994}};
double RMT24T42[2][2]={{-705,-186},{-1478,3266}};
double RMT24T44[2][4]={{-512,-425,-523,-606},{784,697,1143,1138}};
double RAT41[4][1]={{35},{-78},{-51},{-419}};
double RMT42T21[4][1]={{-736},{10},{-112},{171}};
double RMT42T22[4][2]={{-1101,-5109},{60,936},{-317,-3653},{211,325}};
double RMT42T24[4][4]={{1334,10718,651,231},{562,766,-180,150},{-1722,-1394,667,-473},{-887,-3397,19,-206}};
double RTT44[4][4]={{1,6,9,5},{2,5,8,4},{7,7,7,3},{4,8,6,2}};
double RMT44T41[4][1]={{-2387},{-4171},{-3585},{-1321}};
double RMT44T42[4][2]={{-308,-268},{-611,-99},{-816,118},{-432,122}};
double RAT44[4][4]={{13,15,21,19},{27,27,30,48},{87,53,19,9},{59,14,15,49}};
double RST44[4][4]={{-11,-11,-7,-11},{-15,-17,-16,-32},{-69,-37,-5,3},{-49,-6,-9,-45}};
double RMT44T44[4][4]={{816,412,192,304},{1155,583,379,687},{1146,668,466,758},{486,308,222,338}};
printf("Execution des tests unitaires.\n");
Transpose_Mat(2,4,T24,R42); if (!Equal_Mat_Mat(RTT24,R42)) error("Erreur calcul Transposition 2x4");
Transpose_Mat(4,4,T44a,R44); if (!Equal_Mat_Mat(RTT44,R44)) error("Erreur calcul Transposition 4x4");
Inverse_Mat_22(2,2,T22a,R22); if (!Equal_Mat_Mat(RInvT22,R22)) error("Erreur calcul Inversion 2x2");
Add_Mat_Mat(2,2,T22a,2,2,T22b,R22); if (!Equal_Mat_Mat(RAT22,R22)) error("Erreur calcul Addition 2x2");
Add_Mat_Mat(4,4,T44a,4,4,T44b,R44); if (!Equal_Mat_Mat(RAT44,R44)) error("Erreur calcul Addition 4x4");
Add_Mat_Mat(4,1,T41a,4,1,T41b,R41); if (!Equal_Mat_Mat(RAT41,R41)) error("Erreur calcul Addition 4x1");
Sub_Mat_Mat(2,1,T21a,2,1,T21b,R21); if (!Equal_Mat_Mat(RST21,R21)) error("Erreur calcul Soustraction 2x1");
Sub_Mat_Mat(4,4,T44a,4,4,T44b,R44); if (!Equal_Mat_Mat(RST44,R44)) error("Erreur calcul Soustraction 4x4");
Mul_Mat_Mat(4,4,T44a,4,4,T44b,R44); if (!Equal_Mat_Mat(RMT44T44,R44)) error("Erreur calcul Multiplication 4x4 4x4");
Mul_Mat_Mat(4,4,T44a,4,1,T41a,R41); if (!Equal_Mat_Mat(RMT44T41,R41)) error("Erreur calcul Multiplication 4x4 4x1");
Mul_Mat_Mat(4,4,T44a,4,2,T42a,R42); if (!Equal_Mat_Mat(RMT44T42,R42)) error("Erreur calcul Multiplication 4x4 4x2");
Mul_Mat_Mat(4,2,T42a,2,1,T21a,R41); if (!Equal_Mat_Mat(RMT42T21,R41)) error("Erreur calcul Multiplication 4x2 2x1");
Mul_Mat_Mat(4,2,T42a,2,2,T22a,R42); if (!Equal_Mat_Mat(RMT42T22,R42)) error("Erreur calcul Multiplication 4x2 2x2");
Mul_Mat_Mat(4,2,T42a,2,4,T24,R44); if (!Equal_Mat_Mat(RMT42T24,R44)) error("Erreur calcul Multiplication 4x2 2x4");
Mul_Mat_Mat(2,4,T24,4,1,T41a,R21); if (!Equal_Mat_Mat(RMT24T41,R21)) error("Erreur calcul Multiplication 2x4 4x1");
Mul_Mat_Mat(2,4,T24,4,2,T42a,R22); if (!Equal_Mat_Mat(RMT24T42,R22)) error("Erreur calcul Multiplication 2x4 4x2");
Mul_Mat_Mat(2,4,T24,4,4,T44a,R24); if (!Equal_Mat_Mat(RMT24T44,R24)) error("Erreur calcul Multiplication 2x4 4x4");
printf("Test unitaires OK.\n");
}
int main(int argc,char **argv){
tests_unitaires();
FILE* fichier = fopen("pos_t_x_y.dat","r");
if (fichier == NULL)
error("Impossible d'ouvrir le fichier GPGGA_data.dat");
FILE * Fout = Fout = fopen("output.dat","w");
if (fichier == NULL)
error("Impossible d'ouvrir le fichier output.dat");
printf("Kalman\n");
double t = 0;
double t0,x0,y0;
double xobs,yobs;
double oldx,oldy;
double dx=0,dy=0,dt=0.1;
int cpt = 0;
// kalman param
double sigma_etat = 10.0;
double sigma_observation = 2.0;
double X[4][1] = {{0},{0},{0},{0}};
double P[4][4] = {{sigma_etat*sigma_etat, 0, 0, 0},
{0, sigma_etat*sigma_etat, 0, 0},
{0, 0, 0, 0},
{0, 0, 0, 0}};
double Q[4][4] = {{0, 0, 0, 0},
{0, 0, 0, 0},
{0, 0, 0.1, 0},
{0, 0, 0, 0.1}};
double R[2][2] = {{sigma_observation*sigma_observation, 0},
{0 , sigma_observation*sigma_observation}};
double K[4][2];
double H[2][4] = {{1, 0, 0, 0},
{0, 1, 0, 0}};
double HT[4][2];
Transpose_Mat(2,4,H,HT);
double F[4][4] = {{1, 0, dt, 0},
{0, 1, 0, dt},
{0, 0, 1, 0},
{0, 0, 0, 1}};
double FT[4][4];
double X1[4][1];
double X2[4][1];
double X3[4][1];
double A1[4][4];
double A2[4][4];
double P1[4][4];
double P2[4][4];
double G1[2][4];
double G2[2][2];
double G3[2][2];
double G4[2][2];// inversion de G3
double G5[4][2];
double DELTA1[2][1];
double DELTA[2][1];
double M1[2][1];
double M2[4][1];
double obs[2][1]={{xobs}, {yobs}};
double M3[4][4];
double M4[4][4];
Transpose_Mat(4,4,F,FT);
while(fscanf(fichier, "%lf %lf %lf", &t, &xobs, &yobs)>0){
printf("-------------%04d--------------\n",cpt);
if (cpt ==0)
{
t0=t;x0=xobs;y0=yobs;
xobs=xobs-x0;yobs=yobs-y0;
Plot_Mat(F,"F = ");
Plot_Mat(H,"H = ");
Plot_Mat(R,"R = ");
}
else
{
t -= t0;xobs -= x0;yobs -= y0;
debug=1; ///Mettre à 1 pour afficher les matrices.
///Ajouter votre code ci-dessous///
// Kalman
Plot_Mat(X," X(k|k) = ");
//PREDICTION
// X = F*X
Mul_Mat_Mat(4,4,F,4,1,X,X1);// X1=F*X
Plot_Mat(X1," X(k+1|k) = ");
Plot_Mat(P," P(k|k) = ");
//P = F*P*F'+Q;
Mul_Mat_Mat(4,4,F,4,4,P,A1);// A1=F*P
Mul_Mat_Mat(4,4,A1,4,4,FT,A2);// A2=F*P*FT
Add_Mat_Mat(4,4,A2,4,4,Q,P1);// P1=F*P*FT+Q
Plot_Mat(P,"P(k+1|k) = F.P(k|k).FT + Q = ");
//GAIN
// K = P*H' / ( H*P*H' + R);
Mul_Mat_Mat(4,4,H,4,4,P1,G1);//G1=H*P1
Mul_Mat_Mat(4,4,G1,4,4,HT,G2);//G2=H*P1*HT
Add_Mat_Mat(4,4,G2,4,4,R,G3);//G2=H*P1*HT
Plot_Mat(G3," H.P(k+1|k).HT+R = ");
Inverse_Mat_22(2,2,G3,G4);//G3=(H*P1*HT+R)
Mul_Mat_Mat(4,4,P1,4,2,HT,G5);//G5=P1*TH
Mul_Mat_Mat(4,2,G5,2,2,G3,K);//K=G5*G3
Plot_Mat(G4," INV(H.P(k+1|k).HT+R) = ");
Plot_Mat(K,"K = ");
//MISE A JOUR
//X = X + K*([xobs(i);yobs(i)]-H*X);
//Plot_Mat(Delta,"DELTA = Obs - H.X(k+1|k)");
Mul_Mat_Mat(2,4,H,4,1,X1,M1);
Sub_Mat_Mat(2,1,obs,2,1,M1,DELTA1);
Mul_Mat_Mat(4,2,K,2,1,DELTA1,M2);
Add_Mat_Mat(4,1,X,4,1,M2,X3);
Sub_Mat_Mat(2,1,obs,2,1,M1,DELTA);
Plot_Mat(obs," obs = ");
Plot_Mat(DELTA,"DELTA =obs -H.X(k+1|k) ");
Plot_Mat(X," X(k+1|k+1) = X(k+1|k) + K.Delta = ");
// P = P - K*H*P;
Mul_Mat_Mat(4,2,K,2,4,H,M3);
Mul_Mat_Mat(4,4,M3,4,4,P,M4);
Sub_Mat_Mat(4,4,P1,4,4,M4,P2);
Plot_Mat(P," P(k+1|k+1) = P(k+1|k) - K.H.P(k+1|k) = ");
/// La matrice X doit contenir la position filtrée ///
}
t = cpt * dt;
dx = (xobs - oldx)/dt;
dy = (yobs - oldy)/dt;
fprintf(Fout,"%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\n",t,xobs,yobs,sqrt(dx*dx+dy*dy)*dt,X[0][0],X[1][0],X[2][0],X[3][0],sqrt(X[2][0]*X[2][0]+X[3][0]*X[3][0])*dt);
oldx = xobs;
oldy = yobs;
cpt ++;
}
fclose(Fout);
fclose(fichier);
system ("gnuplot -p -e \"plot 'output.dat' u 5:6 w l, '' u 2:3 w l\";");
system ("gnuplot -p -e \"plot 'output.dat' u 1:9 w l, '' u 1:4 w l\";");
system ("gnuplot -p -e \"plot 'output.dat' u 9 w l , 'vitesse_reelle.dat' u 2 w l\";");
return 0;
}
tag/rc-1/faye_awasemou/sp4a3/sp4a3_kalman.cbp
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<CodeBlocks_project_file>
<FileVersion major="1" minor="6" />
<Project>
<Option title="sp4a3_kalman" />
<Option pch_mode="2" />
<Option compiler="gcc" />
<Build>
<Target title="Debug">
<Option output="./test_kalman" prefix_auto="1" extension_auto="1" />
<Option object_output="." />
<Option type="1" />
<Option compiler="gcc" />
<Option parameters="debug" />
<Compiler>
<Add option="-g" />
</Compiler>
</Target>
<Target title="Release">
<Option output="./test_kalman" prefix_auto="1" extension_auto="1" />
<Option object_output="." />
<Option type="1" />
<Option compiler="gcc" />
<Compiler>
<Add option="-O2" />
</Compiler>
<Linker>
<Add option="-s" />
</Linker>
</Target>
</Build>
<Compiler>
<Add option="-Wall" />
</Compiler>
<Unit filename="sp4a3_kalman.c">
<Option compilerVar="CC" />
</Unit>
<Unit filename="sp4a3_kalman_extra.c">
<Option compilerVar="CC" />
</Unit>
<Unit filename="sp4a3_kalman_extra.h" />
<Extensions>
<code_completion />
<envvars />
<debugger />
<lib_finder disable_auto="1" />
</Extensions>
</Project>
</CodeBlocks_project_file>
tag/rc-1/faye_awasemou/sp4a3/sp4a3_kalman_extra.c
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#define error(a) _error(__LINE__,a)
void _error(int l,char * r){
printf("Erreur Ligne (%d) : %s",l,r);
exit(1);
}
int debug=1;
void _Plot_Mat(int n,int m,double in[n][m], const char* name){
int i,j;
if (!debug) return;
printf("\n%s[%d][%d]\n",name,n,m);
for (i=0;i<n;i++)
{
for (j=0;j<m;j++)
printf("%f\t",in[i][j]);
printf("\n");
}
}
#define Equal_Mat_Mat(Mat_A,Mat_B) _Equal_Mat_Mat(sizeof(Mat_A)/sizeof(Mat_A[0]),sizeof(Mat_A[0])/sizeof(Mat_A[0][0]),Mat_A,sizeof(Mat_B)/sizeof(Mat_B[0]),sizeof(Mat_B[0])/sizeof(Mat_B[0][0]),Mat_B)
int _Equal_Mat_Mat(int na,int ma,double A[na][ma],int nb,int mb,double B[nb][mb]){
int i,j;
if (na!=nb) return 0;
if (ma!=mb) return 0;
for(i=0;i<na;i++)
for(j=0;j<ma;j++){
if (fabs(A[i][j]-B[i][j])>1e-6)
return 0;
}
return 1;
}
tag/rc-1/faye_awasemou/sp4a3/vitesse_reelle.dat
120000.100000 0.000000
120000.200000 0.000000
120000.300000 0.000000
120000.400000 0.000000
120000.500000 0.000000
120000.600000 0.000000
120000.700000 0.000000
120000.800000 0.000000
120000.900000 0.000000
120001.000000 0.000000
120001.100000 0.000000
120001.200000 0.000000
120001.300000 0.000000
120001.400000 0.000000
120001.500000 0.000000
120001.600000 0.000000
120001.700000 0.000000
120001.800000 0.000000
120001.900000 0.000000
120002.000000 0.000000
120002.100000 0.000000
120002.200000 0.000000
120002.300000 0.000000
120002.400000 0.000000
120002.500000 0.000000
120002.600000 0.000000
120002.700000 0.000000
120002.800000 0.000000
120002.900000 0.000000
120003.000000 0.000000
120003.100000 0.000000
120003.200000 0.000000
120003.300000 0.000000
120003.400000 0.000000
120003.500000 0.000000
120003.600000 0.000000
120003.700000 0.000000
120003.800000 0.000000
120003.900000 0.000000
120004.000000 0.000000
120004.100000 0.000000
120004.200000 0.000000
120004.300000 0.000000
120004.400000 0.000000
120004.500000 0.000000
120004.600000 0.000000
120004.700000 0.000000
120004.800000 0.000000
120004.900000 0.000000
120005.000000 0.000000
120005.100000 0.000000
120005.200000 0.000000
120005.300000 0.000000
120005.400000 0.000000
120005.500000 0.000000
120005.600000 0.000000
120005.700000 0.000000
120005.800000 0.000000
120005.900000 0.000000
120006.000000 0.000000
120006.100000 0.000000
120006.200000 0.000000
120006.300000 0.000000
120006.400000 0.000000
120006.500000 0.000000
120006.600000 0.000000
120006.700000 0.000000
120006.800000 0.000000
120006.900000 0.000000
120007.000000 0.000000
120007.100000 0.000000
120007.200000 0.000000
120007.300000 0.000000
120007.400000 0.000000
120007.500000 0.000000
120007.600000 0.000000
120007.700000 0.000000
120007.800000 0.000000
120007.900000 0.000000
120008.000000 0.000000
120008.100000 0.000000
120008.200000 0.000000
120008.300000 0.000000
120008.400000 0.000000
120008.500000 0.000000
120008.600000 0.000000
120008.700000 0.000000
120008.800000 0.000000
120008.900000 0.000000
120009.000000 0.000000
120009.100000 0.000000
120009.200000 0.000000
120009.300000 0.000000
120009.400000 0.000000
120009.500000 0.000000
120009.600000 0.000000
120009.700000 0.000000
120009.800000 0.000000
120009.900000 0.000000
120010.000000 0.000000
120010.100000 0.000000
120010.200000 0.000000
120010.300000 0.000000
120010.400000 0.000000
120010.500000 0.000000
120010.600000 0.000000
120010.700000 0.000000
120010.800000 0.000000
120010.900000 0.000000
120011.000000 0.000000
120011.100000 0.000000
120011.200000 0.000000
120011.300000 0.000000
120011.400000 0.000000
120011.500000 0.000000
120011.600000 0.000000
120011.700000 0.000000
120011.800000 0.000000
120011.900000 0.000000
120012.000000 0.000000
120012.100000 0.000000
120012.200000 0.000000
120012.300000 0.000000
120012.400000 0.000000
120012.500000 0.000000
120012.600000 0.000000
120012.700000 0.000000
120012.800000 0.000000
120012.900000 0.000000
120013.000000 0.000000
120013.100000 0.000000
120013.200000 0.000000
120013.300000 0.000000
120013.400000 0.000000
120013.500000 0.000000
120013.600000 0.000000
120013.700000 0.000000
120013.800000 0.000000
120013.900000 0.000000
120014.000000 0.000000
120014.100000 0.000000
120014.200000 0.000000
120014.300000 0.000000
120014.400000 0.000000
120014.500000 0.000000
120014.600000 0.000000
120014.700000 0.000000
120014.800000 0.000000
120014.900000 0.000000
120015.000000 0.000000
120015.100000 0.000000
120015.200000 0.000000
120015.300000 0.000000
120015.400000 0.000000
120015.500000 0.000000
120015.600000 0.000000
120015.700000 0.000000
120015.800000 0.000000
120015.900000 0.000000
120016.000000 0.000000
120016.100000 0.000000
120016.200000 0.000000
120016.300000 0.000000
120016.400000 0.000000
120016.500000 0.000000
120016.600000 0.000000
120016.700000 0.000000
120016.800000 0.000000
120016.900000 0.000000
120017.000000 0.000000
120017.100000 0.000000
120017.200000 0.000000
120017.300000 0.000000
120017.400000 0.000000
120017.500000 0.000000
120017.600000 0.000000
120017.700000 0.000000
120017.800000 0.000000
120017.900000 0.000000
120018.000000 0.000000
120018.100000 0.133414
120018.200000 0.000000
120018.300000 0.000000
120018.400000 0.186168
120018.500000 0.000000
120018.600000 0.133414
120018.700000 0.133414
120018.800000 0.186168
120018.900000 0.133414
120019.000000 0.133414
120019.100000 0.186168
120019.200000 0.186168
120019.300000 0.133414
120019.400000 0.296744
120019.500000 0.186168
120019.600000 0.296744
120019.700000 0.186168
120019.800000 0.372337
120019.900000 0.186168
120020.000000 0.372337
120020.100000 0.296744
120020.200000 0.372337
120020.300000 0.296744
120020.400000 0.372337
120020.500000 0.296744
120020.600000 0.477108
120020.700000 0.296744
120020.800000 0.420777
120020.900000 0.400243
120021.000000 0.420777
120021.100000 0.420777
120021.200000 0.420777
120021.300000 0.420777
120021.400000 0.420777
120021.500000 0.477107
120021.600000 0.477107
120021.700000 0.477107
120021.800000 0.660699
120021.900000 0.558505
120022.000000 0.558505
120022.100000 0.660699
120022.200000 0.558505
120022.300000 0.593487
120022.400000 0.660699
120022.500000 0.593487
120022.600000 0.660699
120022.700000 0.660699
120022.800000 0.593486
120022.900000 0.660699
120023.000000 0.660699
120023.100000 0.772474
120023.200000 0.660699
120023.300000 0.660699
120023.400000 0.772474
120023.500000 0.772474
120023.600000 0.744674
120023.700000 0.772474
120023.800000 0.772474
120023.900000 0.660699
120024.000000 0.772474
120024.100000 0.890229
120024.200000 0.772474
120024.300000 0.715834
120024.400000 0.810945
120024.500000 0.841552
120024.600000 0.810944
120024.700000 0.679588
120024.800000 0.810944
120024.900000 0.969329
120025.000000 0.810944
120025.100000 0.841551
120025.200000 0.841551
120025.300000 0.942878
120025.400000 0.841551
120025.500000 0.969328
120025.600000 0.969328
120025.700000 0.942877
120025.800000 0.969327
120025.900000 0.969327
120026.000000 0.969327
120026.100000 0.969327
120026.200000 1.011875
120026.300000 1.011875
120026.400000 1.068601
120026.500000 1.137385
120026.600000 1.137385
120026.700000 1.137385
120026.800000 1.137385
120026.900000 1.137385
120027.000000 1.249252
120027.100000 1.137385
120027.200000 1.249251
120027.300000 1.137385
120027.400000 1.249251
120027.500000 1.137384
120027.600000 1.249251
120027.700000 1.321395
120027.800000 1.249251
120027.900000 1.249251
120028.000000 1.321395
120028.100000 1.249250
120028.200000 1.321394
120028.300000 1.431316
120028.400000 1.249250
120028.500000 1.321394
120028.600000 1.431315
120028.700000 1.249250
120028.800000 1.431315
120028.900000 1.431315
120029.000000 1.321394
120029.100000 1.431315
120029.200000 1.431315
120029.300000 1.431314
120029.400000 1.431314
120029.500000 1.431314
120029.600000 1.431314
120029.700000 1.431314
120029.800000 1.483704
120029.900000 1.364991
120030.000000 1.483704
120030.100000 1.431655
120030.200000 1.431655
120030.300000 1.483703
120030.400000 1.483702
120030.500000 1.483702
120030.600000 1.544937
120030.700000 1.614314
120030.800000 1.544937
120030.900000 1.661506
120031.000000 1.544936
120031.100000 1.544936
120031.200000 1.604724
120031.300000 1.604724
120031.400000 1.604723
120031.500000 1.544935
120031.600000 1.661504
120031.700000 1.661504
120031.800000 1.661503
120031.900000 1.604722
120032.000000 1.604721
120032.100000 1.604721
120032.200000 1.683079
120032.300000 1.727569
120032.400000 1.556722
120032.500000 1.727568
120032.600000 1.727567
120032.700000 1.604719
120032.800000 1.840959
120032.900000 1.726200
120033.000000 1.840959
120033.100000 1.797962
120033.200000 1.840958
120033.300000 1.840958
120033.400000 1.840958
120033.500000 1.780433
120033.600000 1.851873
120033.700000 1.780432
120033.800000 1.851872
120033.900000 1.810438
120034.000000 1.810438
120034.100000 1.810437
120034.200000 1.777543
120034.300000 1.810436
120034.400000 1.851869
120034.500000 1.851869
120034.600000 1.977364
120034.700000 1.901284
120034.800000 1.958076
120034.900000 1.851867
120035.000000 2.023716
120035.100000 1.810431
120035.200000 1.977361
120035.300000 1.977360
120035.400000 1.938609
120035.500000 1.851863
120035.600000 1.938608
120035.700000 1.977358
120035.800000 2.067448
120035.900000 1.907923
120036.000000 1.938605
120036.100000 2.017920
120036.200000 1.907920
120036.300000 2.005346
120036.400000 1.885696
120036.500000 2.017917
120036.600000 2.017916
120036.700000 2.017916
120036.800000 2.017915
120036.900000 2.017914
120037.000000 1.885692
120037.100000 2.150280
120037.200000 2.017911
120037.300000 2.017911
120037.400000 2.017910
120037.500000 2.038691
120037.600000 2.017908
120037.700000 2.067433
120037.800000 2.196818
120037.900000 2.103811
120038.000000 2.067431
120038.100000 2.067430
120038.200000 2.169785
120038.300000 2.150269
120038.400000 2.017901
120038.500000 2.150268
120038.600000 2.169781
120038.700000 2.150266
120038.800000 2.150265
120038.900000 2.150264
120039.000000 2.017896
120039.100000 2.150262
120039.200000 1.885675
120039.300000 2.017894
120039.400000 1.885673
120039.500000 2.017892
120039.600000 1.885672
120039.700000 2.017890
120039.800000 1.885670
120039.900000 1.885669
120040.000000 1.753629
120040.100000 1.753628
120040.200000 1.753628
120040.300000 1.621812
120040.400000 1.621811
120040.500000 1.647597
120040.600000 1.490278
120040.700000 1.359111
120040.800000 1.359111
120040.900000 1.490277
120041.000000 1.389779
120041.100000 1.389779
120041.200000 1.389779
120041.300000 1.262274
120041.400000 1.136125
120041.500000 1.262273
120041.600000 1.011840
120041.700000 1.136124
120041.800000 0.969284
120041.900000 0.890199
120042.000000 0.969284
120042.100000 0.841515
120042.200000 0.890199
120042.300000 0.890199
120042.400000 0.890199
120042.500000 0.954193
120042.600000 0.845408
120042.700000 1.030649
120042.800000 1.117011
120042.900000 1.025643
120043.000000 1.127450
120043.100000 1.127450
120043.200000 1.234531
120043.300000 1.345627
120043.400000 1.284732
120043.500000 1.284733
120043.600000 1.358796
120043.700000 1.358796
120043.800000 1.483381
120043.900000 1.483381
120044.000000 1.453078
120044.100000 1.563924
120044.200000 1.434588
120044.300000 1.693339
120044.400000 1.563924
120044.500000 1.558224
120044.600000 1.693339
120044.700000 1.693339
120044.800000 1.563924
120044.900000 1.693339
120045.000000 1.734870
120045.100000 1.709031
120045.200000 1.580901
120045.300000 1.734870
120045.400000 1.861460
120045.500000 1.709031
120045.600000 1.734869
120045.700000 1.861460
120045.800000 1.709030
120045.900000 1.861459
120046.000000 1.861459
120046.100000 1.861459
120046.200000 1.837401
120046.300000 1.861459
120046.400000 1.861459
120046.500000 2.019552
120046.600000 1.861458
120046.700000 1.936435
120046.800000 1.936435
120046.900000 1.815081
120047.000000 1.929158
120047.100000 1.868231
120047.200000 1.929158
120047.300000 1.868231
120047.400000 1.929158
120047.500000 1.868230
120047.600000 1.929157
120047.700000 1.929157
120047.800000 1.868229
120047.900000 2.043747
120048.000000 1.929156
120048.100000 1.929156
120048.200000 1.986337
120048.300000 1.929156
120048.400000 2.043746
120048.500000 1.929155
120048.600000 2.043746
120048.700000 1.986336
120048.800000 2.043745
120048.900000 1.929154
120049.000000 2.043745
120049.100000 2.043744
120049.200000 2.043744
120049.300000 2.043744
120049.400000 2.043744
120049.500000 2.043743
120049.600000 2.043743
120049.700000 2.043743
120049.800000 2.043743
120049.900000 2.043742
120050.000000 2.043742
120050.100000 2.043742
120050.200000 2.043742
120050.300000 2.160059
120050.400000 2.108042
120050.500000 2.043741
120050.600000 2.043741
120050.700000 2.160058
120050.800000 2.108041
120050.900000 2.160057
120051.000000 2.043739
120051.100000 2.108040
120051.200000 2.160056
120051.300000 2.160056
120051.400000 2.108039
120051.500000 2.160055
120051.600000 2.108039
120051.700000 2.220991
120051.800000 2.108038
120051.900000 2.108038
120052.000000 2.071505
120052.100000 2.071505
120052.200000 2.178619
120052.300000 1.967131
120052.400000 2.151577
120052.500000 2.051282
120052.600000 1.954470
120052.700000 2.047853
... Ce différentiel a été tronqué car il excède la taille maximale pouvant être affichée.

Formats disponibles : Unified diff