Add NMEA GGA option
This commit is contained in:
parent
a55476985d
commit
196c75b1d7
115
gpssim.c
115
gpssim.c
@ -1185,6 +1185,7 @@ int readUserMotion(double xyz[USER_MOTION_SIZE][3], const char *filename)
|
|||||||
{
|
{
|
||||||
FILE *fp;
|
FILE *fp;
|
||||||
int numd;
|
int numd;
|
||||||
|
char str[MAX_CHAR];
|
||||||
double t,x,y,z;
|
double t,x,y,z;
|
||||||
|
|
||||||
if (NULL==(fp=fopen(filename,"rt")))
|
if (NULL==(fp=fopen(filename,"rt")))
|
||||||
@ -1192,7 +1193,10 @@ int readUserMotion(double xyz[USER_MOTION_SIZE][3], const char *filename)
|
|||||||
|
|
||||||
for (numd=0; numd<USER_MOTION_SIZE; numd++)
|
for (numd=0; numd<USER_MOTION_SIZE; numd++)
|
||||||
{
|
{
|
||||||
if (EOF==fscanf(fp, "%lf,%lf,%lf,%lf", &t, &x, &y, &z)) // Read CSV file
|
if (fgets(str, MAX_CHAR, fp)==NULL)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (EOF==sscanf(str, "%lf,%lf,%lf,%lf", &t, &x, &y, &z)) // Read CSV line
|
||||||
break;
|
break;
|
||||||
|
|
||||||
xyz[numd][0] = x;
|
xyz[numd][0] = x;
|
||||||
@ -1205,12 +1209,94 @@ int readUserMotion(double xyz[USER_MOTION_SIZE][3], const char *filename)
|
|||||||
return (numd);
|
return (numd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int readNmeaGGA(double xyz[USER_MOTION_SIZE][3], const char *filename)
|
||||||
|
{
|
||||||
|
FILE *fp;
|
||||||
|
int numd = 0;
|
||||||
|
char str[MAX_CHAR];
|
||||||
|
char *token;
|
||||||
|
double llh[3],pos[3];
|
||||||
|
char tmp[8];
|
||||||
|
|
||||||
|
if (NULL==(fp=fopen(filename,"rt")))
|
||||||
|
return(-1);
|
||||||
|
|
||||||
|
while (1)
|
||||||
|
{
|
||||||
|
if (fgets(str, MAX_CHAR, fp)==NULL)
|
||||||
|
break;
|
||||||
|
|
||||||
|
token = strtok(str, ",");
|
||||||
|
|
||||||
|
if (strncmp(token+3, "GGA", 3)==0)
|
||||||
|
{
|
||||||
|
token = strtok(NULL, ","); // Date and time
|
||||||
|
|
||||||
|
token = strtok(NULL, ","); // Latitude
|
||||||
|
strncpy(tmp, token, 2);
|
||||||
|
tmp[2] = 0;
|
||||||
|
|
||||||
|
llh[0] = atof(tmp) + atof(token+2)/60.0;
|
||||||
|
|
||||||
|
token = strtok(NULL, ","); // North or south
|
||||||
|
if (token[0]=='S')
|
||||||
|
llh[0] *= -1.0;
|
||||||
|
|
||||||
|
llh[0] /= R2D; // in radian
|
||||||
|
|
||||||
|
token = strtok(NULL, ","); // Longitude
|
||||||
|
strncpy(tmp, token, 3);
|
||||||
|
tmp[3] = 0;
|
||||||
|
|
||||||
|
llh[1] = atof(tmp) + atof(token+3)/60.0;
|
||||||
|
|
||||||
|
token = strtok(NULL, ","); // East or west
|
||||||
|
if (token[0]=='W')
|
||||||
|
llh[1] *= -1.0;
|
||||||
|
|
||||||
|
llh[1] /= R2D; // in radian
|
||||||
|
|
||||||
|
token = strtok(NULL, ","); // GPS fix
|
||||||
|
token = strtok(NULL, ","); // Number of satellites
|
||||||
|
token = strtok(NULL, ","); // HDOP
|
||||||
|
|
||||||
|
token = strtok(NULL, ","); // Altitude above meas sea level
|
||||||
|
|
||||||
|
llh[2] = atof(token);
|
||||||
|
|
||||||
|
token = strtok(NULL, ","); // in meter
|
||||||
|
|
||||||
|
token = strtok(NULL, ","); // Geoid height above WGS84 ellipsoid
|
||||||
|
|
||||||
|
llh[2] += atof(token);
|
||||||
|
|
||||||
|
// Convert geodetic position into ECEF coordinates
|
||||||
|
llh2xyz(llh, pos);
|
||||||
|
|
||||||
|
xyz[numd][0] = pos[0];
|
||||||
|
xyz[numd][1] = pos[1];
|
||||||
|
xyz[numd][2] = pos[2];
|
||||||
|
|
||||||
|
// Update the number of track points
|
||||||
|
numd++;
|
||||||
|
|
||||||
|
if (numd>=USER_MOTION_SIZE)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fclose(fp);
|
||||||
|
|
||||||
|
return (numd);
|
||||||
|
}
|
||||||
|
|
||||||
void usage(void)
|
void usage(void)
|
||||||
{
|
{
|
||||||
printf("Usage: gps-sdr-sim [options]\n"
|
printf("Usage: gps-sdr-sim [options]\n"
|
||||||
"Options:\n"
|
"Options:\n"
|
||||||
" -e <gps_nav> RINEX navigation file for GPS ephemerides (required)\n"
|
" -e <gps_nav> RINEX navigation file for GPS ephemerides (required)\n"
|
||||||
" -u <user_motion> User motion file (dynamic mode)\n"
|
" -u <user_motion> User motion file (dynamic mode)\n"
|
||||||
|
" -g <nmea_gga> NMEA GGA stream (dynamic mode)\n"
|
||||||
" -l <location> Lat,Lon,Hgt (static mode) e.g. 30.286502,120.032669,100\n"
|
" -l <location> Lat,Lon,Hgt (static mode) e.g. 30.286502,120.032669,100\n"
|
||||||
" -o <output> I/Q sampling data file (default: gpssim.bin)\n"
|
" -o <output> I/Q sampling data file (default: gpssim.bin)\n"
|
||||||
" -s <frequency> Sampling frequency [Hz] (default: 2600000)\n"
|
" -s <frequency> Sampling frequency [Hz] (default: 2600000)\n"
|
||||||
@ -1266,9 +1352,11 @@ int main(int argc, char *argv[])
|
|||||||
int iumd;
|
int iumd;
|
||||||
int numd;
|
int numd;
|
||||||
char umfile[MAX_CHAR];
|
char umfile[MAX_CHAR];
|
||||||
bool staticLocationMode = false;
|
|
||||||
double xyz[USER_MOTION_SIZE][3];
|
double xyz[USER_MOTION_SIZE][3];
|
||||||
|
|
||||||
|
bool staticLocationMode = false;
|
||||||
|
bool nmeaGGA = false;
|
||||||
|
|
||||||
char navfile[MAX_CHAR];
|
char navfile[MAX_CHAR];
|
||||||
char outfile[MAX_CHAR];
|
char outfile[MAX_CHAR];
|
||||||
|
|
||||||
@ -1295,7 +1383,7 @@ int main(int argc, char *argv[])
|
|||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
while ((result=getopt(argc,argv,"e:u:l:o:s:b:"))!=-1)
|
while ((result=getopt(argc,argv,"e:u:g:l:o:s:b:"))!=-1)
|
||||||
{
|
{
|
||||||
switch (result)
|
switch (result)
|
||||||
{
|
{
|
||||||
@ -1304,6 +1392,11 @@ int main(int argc, char *argv[])
|
|||||||
break;
|
break;
|
||||||
case 'u':
|
case 'u':
|
||||||
strcpy(umfile, optarg);
|
strcpy(umfile, optarg);
|
||||||
|
nmeaGGA = false;
|
||||||
|
break;
|
||||||
|
case 'g':
|
||||||
|
strcpy(umfile, optarg);
|
||||||
|
nmeaGGA = true;
|
||||||
break;
|
break;
|
||||||
case 'l':
|
case 'l':
|
||||||
// Static geodetic coordinates input mode
|
// Static geodetic coordinates input mode
|
||||||
@ -1349,8 +1442,8 @@ int main(int argc, char *argv[])
|
|||||||
|
|
||||||
if (umfile[0]==0 && !staticLocationMode)
|
if (umfile[0]==0 && !staticLocationMode)
|
||||||
{
|
{
|
||||||
printf("User motion file is not specified.\n");
|
printf("User motion file / NMEA GGA stream is not specified.\n");
|
||||||
printf("Or you may use -l to specify llh coordinate directly.\n");
|
printf("You may use -l to specify the static location directly.\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1368,19 +1461,23 @@ int main(int argc, char *argv[])
|
|||||||
if (!staticLocationMode)
|
if (!staticLocationMode)
|
||||||
{
|
{
|
||||||
// Read user motion file
|
// Read user motion file
|
||||||
numd = readUserMotion(xyz, umfile);
|
if (nmeaGGA==true)
|
||||||
|
numd = readNmeaGGA(xyz, umfile);
|
||||||
|
else
|
||||||
|
numd = readUserMotion(xyz, umfile);
|
||||||
|
|
||||||
if (numd==-1)
|
if (numd==-1)
|
||||||
{
|
{
|
||||||
printf("Failed to open user motion file.\n");
|
printf("Failed to open user motion / NMEA GGA file.\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
else if (numd==0)
|
else if (numd==0)
|
||||||
{
|
{
|
||||||
printf("Failed to read user motion data.\n");
|
printf("Failed to read user motion / NMEA GGA data.\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("User motion data = %d\n", numd);
|
printf("Track points = %d\n", numd);
|
||||||
|
|
||||||
// Initial location in Geodetic coordinate system
|
// Initial location in Geodetic coordinate system
|
||||||
xyz2llh(xyz[0], llh);
|
xyz2llh(xyz[0], llh);
|
||||||
|
Loading…
Reference in New Issue
Block a user