1
0
mirror of https://github.com/gnss-sdr/gnss-sdr synced 2025-01-07 07:50:32 +00:00

add more work on rtklib functions

This commit is contained in:
Carles Fernandez 2017-05-12 17:47:09 +02:00
parent 5d9ba16293
commit 9da436ec87
7 changed files with 926 additions and 912 deletions

View File

@ -66,7 +66,6 @@
const int FILEPATHSEP = '/'; const int FILEPATHSEP = '/';
const double RE_WGS84 = 6378137.0; //!< earth semimajor axis (WGS84) (m) const double RE_WGS84 = 6378137.0; //!< earth semimajor axis (WGS84) (m)
const double FE_WGS84 = (1.0 / 298.257223563); //!< earth flattening (WGS84) const double FE_WGS84 = (1.0 / 298.257223563); //!< earth flattening (WGS84)

View File

@ -1703,6 +1703,13 @@ void deg2dms(double deg, double *dms, int ndec)
dms[0]*=sign; dms[0]*=sign;
} }
void deg2dms(double deg, double *dms)
{
double sign=deg<0.0?-1.0:1.0,a=fabs(deg);
dms[0]=floor(a); a=(a-dms[0])*60.0;
dms[1]=floor(a); a=(a-dms[1])*60.0;
dms[2]=a; dms[0]*=sign;
}
/* convert deg-min-sec to degree ----------------------------------------------- /* convert deg-min-sec to degree -----------------------------------------------
* convert degree-minute-second to degree * convert degree-minute-second to degree

View File

@ -174,6 +174,7 @@ int adjgpsweek(int week);
unsigned int tickget(void); unsigned int tickget(void);
void sleepms(int ms); void sleepms(int ms);
void deg2dms(double deg, double *dms, int ndec); void deg2dms(double deg, double *dms, int ndec);
void deg2dms(double deg, double *dms);
double dms2deg(const double *dms); double dms2deg(const double *dms);
void ecef2pos(const double *r, double *pos); void ecef2pos(const double *r, double *pos);
void pos2ecef(const double *pos, double *r); void pos2ecef(const double *pos, double *r);
@ -182,8 +183,6 @@ void ecef2enu(const double *pos, const double *r, double *e);
void enu2ecef(const double *pos, const double *e, double *r); void enu2ecef(const double *pos, const double *e, double *r);
void covenu(const double *pos, const double *P, double *Q); void covenu(const double *pos, const double *P, double *Q);
void covecef(const double *pos, const double *Q, double *P); void covecef(const double *pos, const double *Q, double *P);
void ast_args(double t, double *f); void ast_args(double t, double *f);
void nut_iau1980(double t, const double *f, double *dpsi, double *deps); void nut_iau1980(double t, const double *f, double *dpsi, double *deps);
void eci2ecef(gtime_t tutc, const double *erpv, double *U, double *gmst); void eci2ecef(gtime_t tutc, const double *erpv, double *U, double *gmst);

View File

@ -6,13 +6,13 @@
#include "rtklib_sbas.h" #include "rtklib_sbas.h"
#include "rtklib_preceph.h" #include "rtklib_preceph.h"
#include "rtklib_stream.h" #include "rtklib_stream.h"
#include "rtklib_rtcm.h"
/* write solution header to output stream ------------------------------------*/ /* write solution header to output stream ------------------------------------*/
void writesolhead(stream_t *stream, const solopt_t *solopt) void writesolhead(stream_t *stream, const solopt_t *solopt)
{ {
unsigned char buff[1024]; unsigned char buff[1024];
int n; int n;
n = outsolheads(buff,solopt); n = outsolheads(buff,solopt);
strwrite(stream,buff,n); strwrite(stream,buff,n);
} }
@ -179,7 +179,8 @@ void updatesvr(rtksvr_t *svr, int ret, obs_t *obs, nav_t *nav, int sat,
} }
else if (ret == 3) else if (ret == 3)
{ /* sbas message */ { /* sbas message */
if (sbsmsg&&(sbssat==sbsmsg->prn||sbssat==0)) { if (sbsmsg && (sbssat == sbsmsg->prn || sbssat == 0))
{
if (svr->nsbs<MAXSBSMSG) if (svr->nsbs<MAXSBSMSG)
{ {
svr->sbsmsg[svr->nsbs++] = *sbsmsg; svr->sbsmsg[svr->nsbs++] = *sbsmsg;
@ -357,7 +358,8 @@ void decodefile(rtksvr_t *svr, int index)
/* check file path completed */ /* check file path completed */
if ((nb = svr->nb[index]) <= 2 || if ((nb = svr->nb[index]) <= 2 ||
svr->buff[index][nb-2]!='\r'||svr->buff[index][nb-1]!='\n') { svr->buff[index][nb-2] != '\r' || svr->buff[index][nb-1] != '\n')
{
rtksvrunlock(svr); rtksvrunlock(svr);
return; return;
} }
@ -370,7 +372,8 @@ void decodefile(rtksvr_t *svr, int index)
/* read sp3 precise ephemeris */ /* read sp3 precise ephemeris */
readsp3(file,&nav,0); readsp3(file,&nav,0);
if (nav.ne<=0) { if (nav.ne <= 0)
{
tracet(1,"sp3 file read error: %s\n",file); tracet(1,"sp3 file read error: %s\n",file);
return; return;
} }

View File

@ -53,6 +53,8 @@
#include <ctype.h> #include <ctype.h>
#include "rtklib_solution.h" #include "rtklib_solution.h"
#include "rtklib_rtkcmn.h"
#include "rtklib_rtksvr.h"
/* constants and macros ------------------------------------------------------*/ /* constants and macros ------------------------------------------------------*/
@ -60,16 +62,15 @@
#define SQR_SOL(x) ((x)<0.0?-(x)*(x):(x)*(x)) #define SQR_SOL(x) ((x)<0.0?-(x)*(x):(x)*(x))
#define SQRT_SOL(x) ((x)<0.0?0.0:sqrt(x)) #define SQRT_SOL(x) ((x)<0.0?0.0:sqrt(x))
#define MAXFIELD 64 /* max number of fields in a record */ const int MAXFIELD = 64; /* max number of fields in a record */
#define MAXNMEA 256 /* max length of nmea sentence */ const int MAXNMEA = 256; /* max length of nmea sentence */
#define KNOT2M 0.514444444 /* m/knot */ const double KNOT2M = 0.514444444; /* m/knot */
static const int solq_nmea[] = { /* nmea quality flags to rtklib sol quality */ static const int solq_nmea[] = { /* nmea quality flags to rtklib sol quality */
/* nmea 0183 v.2.3 quality flags: */ /* nmea 0183 v.2.3 quality flags: */
/* 0=invalid, 1=gps fix (sps), 2=dgps fix, 3=pps fix, 4=rtk, 5=float rtk */ /* 0=invalid, 1=gps fix (sps), 2=dgps fix, 3=pps fix, 4=rtk, 5=float rtk */
/* 6=estimated (dead reckoning), 7=manual input, 8=simulation */ /* 6=estimated (dead reckoning), 7=manual input, 8=simulation */
SOLQ_NONE ,SOLQ_SINGLE, SOLQ_DGPS, SOLQ_PPP , SOLQ_FIX, SOLQ_NONE ,SOLQ_SINGLE, SOLQ_DGPS, SOLQ_PPP , SOLQ_FIX,
SOLQ_FLOAT,SOLQ_DR , SOLQ_NONE, SOLQ_NONE, SOLQ_NONE SOLQ_FLOAT,SOLQ_DR , SOLQ_NONE, SOLQ_NONE, SOLQ_NONE
}; };
@ -899,7 +900,7 @@ void initsolbuf(solbuf_t *solbuf, int cyclic, int nmax)
if (cyclic) if (cyclic)
{ {
if (nmax <= 2) nmax=2; if (nmax <= 2) nmax=2;
if (!(solbuf->data=malloc(sizeof(sol_t)*nmax))) if (!(solbuf->data = (sol_t*)malloc(sizeof(sol_t)*nmax)))
{ {
trace(1,"initsolbuf: memory allocation error\n"); trace(1,"initsolbuf: memory allocation error\n");
return; return;
@ -952,7 +953,8 @@ int sort_solstat(solstatbuf_t *statbuf)
if (statbuf->n <= 0) return 0; if (statbuf->n <= 0) return 0;
if (!(statbuf_data=realloc(statbuf->data,sizeof(solstat_t)*statbuf->n))) { if (!(statbuf_data = (solstat_t*)realloc(statbuf->data,sizeof(solstat_t)*statbuf->n)))
{
trace(1,"sort_solstat: memory allocation error\n"); trace(1,"sort_solstat: memory allocation error\n");
free(statbuf->data); statbuf->data = NULL; statbuf->n = statbuf->nmax = 0; free(statbuf->data); statbuf->data = NULL; statbuf->n = statbuf->nmax = 0;
return 0; return 0;
@ -1140,7 +1142,7 @@ int outpos(unsigned char *buff, const char *s, const sol_t *sol,
covenu(pos,P,Q); covenu(pos,P,Q);
if (opt->height == 1) if (opt->height == 1)
{ /* geodetic height */ { /* geodetic height */
pos[2]-=geoidh(pos); // pos[2] -= geoidh(pos);
} }
if (opt->degf) if (opt->degf)
{ {
@ -1205,7 +1207,7 @@ int outnmea_rmc(unsigned char *buff, const sol_t *sol)
time2epoch(time,ep); time2epoch(time,ep);
ecef2pos(sol->rr,pos); ecef2pos(sol->rr,pos);
ecef2enu(pos,sol->rr+3,enuv); ecef2enu(pos,sol->rr+3,enuv);
vel=norm(enuv,3); vel = norm_rtk(enuv,3);
if (vel >= 1.0) if (vel >= 1.0)
{ {
dir = atan2(enuv[0],enuv[1])*R2D; dir = atan2(enuv[0],enuv[1])*R2D;
@ -1249,7 +1251,7 @@ int outnmea_gga(unsigned char *buff, const sol_t *sol)
if (time.sec >= 0.995) {time.time++; time.sec = 0.0;} if (time.sec >= 0.995) {time.time++; time.sec = 0.0;}
time2epoch(time,ep); time2epoch(time,ep);
ecef2pos(sol->rr,pos); ecef2pos(sol->rr,pos);
h=geoidh(pos); h = 0;//geoidh(pos);
deg2dms(fabs(pos[0])*R2D,dms1); deg2dms(fabs(pos[0])*R2D,dms1);
deg2dms(fabs(pos[1])*R2D,dms2); deg2dms(fabs(pos[1])*R2D,dms2);
p += sprintf(p,"$GPGGA,%02.0f%02.0f%05.2f,%02.0f%010.7f,%s,%03.0f%010.7f,%s,%d,%02d,%.1f,%.3f,M,%.3f,M,%.1f,", p += sprintf(p,"$GPGGA,%02.0f%02.0f%05.2f,%02.0f%010.7f,%s,%03.0f%010.7f,%s,%d,%02d,%.1f,%.3f,M,%.3f,M,%.1f,",
@ -1281,7 +1283,8 @@ int outnmea_gsa(unsigned char *buff, const sol_t *sol,
} }
/* GPGSA: gps/sbas */ /* GPGSA: gps/sbas */
for (sat=1,nsat=0;sat<=MAXSAT&&nsat<12;sat++) { for (sat = 1,nsat = 0;sat <= MAXSAT&&nsat<12;sat++)
{
if (!ssat[sat-1].vs || ssat[sat-1].azel[1] <= 0.0) continue; if (!ssat[sat-1].vs || ssat[sat-1].azel[1] <= 0.0) continue;
sys = satsys(sat,prn+nsat); sys = satsys(sat,prn+nsat);
if (sys != SYS_GPS && sys != SYS_SBS) continue; if (sys != SYS_GPS && sys != SYS_SBS) continue;
@ -1633,7 +1636,7 @@ int outsols(unsigned char *buff, const sol_t *sol, const double *rb,
if (opt->nmeaintv[0]<0.0) return 0; if (opt->nmeaintv[0]<0.0) return 0;
if (!screent(sol->time,ts,ts,opt->nmeaintv[0])) return 0; if (!screent(sol->time,ts,ts,opt->nmeaintv[0])) return 0;
} }
if (sol->stat<=SOLQ_NONE||(opt->posf==SOLF_ENU&&norm(rb,3)<=0.0)) if (sol->stat <= SOLQ_NONE || (opt->posf == SOLF_ENU && norm_rtk(rb,3) <= 0.0))
{ {
return 0; return 0;
} }

View File

@ -55,6 +55,9 @@
#include "rtklib.h" #include "rtklib.h"
#define COMMENTH "%" /* comment line indicator for solution */
#define MSG_DISCONN "$_DISCONNECT\r\n" /* disconnect message */
const char *opt2sep(const solopt_t *opt); const char *opt2sep(const solopt_t *opt);
int tonum(char *buff, const char *sep, double *v); int tonum(char *buff, const char *sep, double *v);
double sqvar(double covar); double sqvar(double covar);