コード例 #1
0
ファイル: estiono.c プロジェクト: thesamprice/RTKLIB
/* estimate ionosphere -------------------------------------------------------*/
static int est_iono(obs_t *obs, nav_t *nav, double *rr, FILE *fp)
{
    ssat_t ssat[MAXSAT]={{0}};
    double tt,*x,*P,*v,*H,*R,pos[3],azel[MAXOBS*2];
    int i,n,info,nx=NX,nv=MAXSAT*2;
    
    x=zeros(nx,1); P=zeros(nx,nx); v=mat(nv,1); H=mat(nx,nv); R=mat(nv,nv);
    
    /* receiver position */
    ecef2pos(rr,pos);
    
    for (i=0;i<obs->n;i++) {
        for (n=1;i+n<obs->n;n++) {
            if (timediff(obs[i].time,obs->data[i+n].time)>1E-3) break;
        }
        /* satellite azimuth/elevation angle */
        sat_azel(obs+i,n,nav,pos,azel);
        
        /* time update of parameters */
        ud_state(obs+i,n,azel,x,P,nx,ssat);
        
        /* ionosphere residuals */
        if ((nv=res_iono(obs+i,n,azel,x,nx,v,H,R))<=0) break;
        
        /* filter */
        if ((info=rtklib_filter(x,P,H,v,R,nx,nv))) break;
        
        /* output ionopshere parameters */
        out_iono(obs[i].time,x,P,nx,fp);
    }
    free(x); free(P); free(v); free(H); free(R);
    
    return 1;
}
コード例 #2
0
ファイル: genstec.c プロジェクト: Andreas-Krimbacher/rtklib
/* estimate ionosphere -------------------------------------------------------*/
static int est_iono(obs_t *obs, nav_t *nav, const pcv_t *pcv, double *rr,
                    double tint, FILE *fp)
{
    sstat_t sstat[MAXSAT]={{{0}}};
    ekf_t *ekf;
    gtime_t time;
    double pos[3],rs[MAXOBS*6],dts[MAXOBS*2],var[MAXOBS],e[3],azel[MAXOBS*2];
    double *v,*H,*R,phw[MAXSAT]={0};
    int i,j,n=0,info,nx=NX,nv=MAXSAT*2,svh[MAXOBS];
    
    ekf=ekf_new(NX); v=mat(nv,1); H=mat(nx,nv); R=mat(nv,nv);
    
    /* receiver position */
    ecef2pos(rr,pos);
    
    out_head(obs->data[0].time,pos,fp);
    
    for (i=0;i<obs->n;i+=n) {
        for (n=1;i+n<obs->n;n++) {
            if (timediff(obs->data[i+n].time,obs->data[i].time)>1E-3) break;
        }
        time=obs->data[i].time;
        
        /* satellite positions and clocks */
        satposs(time,obs->data+i,n,nav,EPHOPT_BRDC,rs,dts,var,svh);
        
        /* satellite azimuth/elevation angle */
        for (j=0;j<n;j++) {
            if (geodist(rs+j*6,rr,e)>0.0) satazel(pos,e,azel+j*2);
            else azel[j*2]=azel[1+j*2]=0.0;
        }
        /* time update of parameters */
        ud_state(obs->data+i,n,nav,pos,azel,ekf,sstat);
        
        /* ionosphere residuals */
        if ((nv=res_iono(obs->data+i,n,nav,rs,rr,pos,azel,pcv,ekf,phw,v,H,R))<=0) {
            continue;
        }
        /* filter */
        if ((info=filter(ekf->x,ekf->P,H,v,R,ekf->nx,nv))) {
            fprintf(stderr,"filter error: info=%d\n",info);
            break;
        }
        /* output ionopshere parameters */
        if (tint<=0.0||fmod(time2gpst(time,NULL)+0.005,tint)<0.01) {
            out_iono(obs->data[i].time,ekf,sstat,fp);
        }
    }
    ekf_free(ekf); free(v); free(H); free(R);
    
    return 1;
}