コード例 #1
0
ファイル: rtkpos.c プロジェクト: ndhuan/GPSRTK
static void udbias(rtk_t *rtk, double tt, const obsd_t *obs, const int *sat,
                   const int *iu, const int *ir, int ns, const nav_t *nav,char **msg)
{
    double cp,pr,*bias,offset;
    int i,j,slip,reset;

    for (i=0; i<ns; i++)
    {
        /* detect cycle slip by LLI */
        rtk->ssat[sat[i]-1].slip&=0xFC;
        detslp_ll(rtk,obs,iu[i],1,msg);
        detslp_ll(rtk,obs,ir[i],2,msg);
    }

    /* reset phase-bias if expire obs outage counter */
    for (i=1; i<=MAX_SAT; i++) {

        reset=++rtk->ssat[i-1].outc>(unsigned int)rtk->opt.maxout;
        if (reset&&rtk->x[IB(i,0,&rtk->opt)]!=0.0) {
            initx(rtk,0.0,0.0,IB(i,0,&rtk->opt));
        }
        if (reset) {
            rtk->ssat[i-1].lock=-rtk->opt.minlock;
        }
    }
    /* reset phase-bias if instantaneous AR or expire obs outage counter */
    for (i=1; i<=MAX_SAT; i++) {

        reset=++rtk->ssat[i-1].outc>(unsigned int)rtk->opt.maxout;

        if (reset&&rtk->x[IB(i,0,&rtk->opt)]!=0.0) {
            initx(rtk,0.0,0.0,IB(i,0,&rtk->opt));
        }
        if (rtk->opt.modear!=ARMODE_INST&&reset) {
            rtk->ssat[i-1].lock=-rtk->opt.minlock;
        }
    }
    /* reset phase-bias if detecting cycle slip */
    for (i=0; i<ns; i++) {
        j=IB(sat[i],0,&rtk->opt);
        rtk->P[j+j*rtk->nx]+=rtk->opt.prn[0]*rtk->opt.prn[0]*tt;
        slip=rtk->ssat[sat[i]-1].slip;
        if (!(slip&1)) continue;
        rtk->x[j]=0.0;
        rtk->ssat[sat[i]-1].lock=-rtk->opt.minlock;
    }
    bias=zeros(ns,1);

    /* estimate approximate phase-bias by phase - code */
    for (i=j=0,offset=0.0; i<ns; i++)
    {
        cp=sdobs(obs,iu[i],ir[i],0); /* cycle */
        pr=sdobs(obs,iu[i],ir[i],1);

        if (cp==0.0||pr==0.0) continue;

        bias[i]=cp-pr*FREQ1/CLIGHT;

        if (rtk->x[IB(sat[i],0,&rtk->opt)]!=0.0) {
            offset+=bias[i]-rtk->x[IB(sat[i],0,&rtk->opt)];
            j++;
        }
    }
    /* correct phase-bias offset to enssure phase-code coherency */
    if (j>0)
    {
        for (i=1; i<=MAX_SAT; i++)
        {
            if (rtk->x[IB(i,0,&rtk->opt)]!=0.0)
                rtk->x[IB(i,0,&rtk->opt)]+=offset/j;
        }
    }
    /* set initial states of phase-bias */
    for (i=0; i<ns; i++)
    {
        if (bias[i]==0.0||rtk->x[IB(sat[i],0,&rtk->opt)]!=0.0) continue;
        initx(rtk,bias[i],SQR(rtk->opt.std[0]),IB(sat[i],0,&rtk->opt));
    }
    free(bias);

}
コード例 #2
0
ファイル: ppp.c プロジェクト: AlfaroP/isr-uc-ros-pkg
/* temporal update of phase biases -------------------------------------------*/
static void udbias_ppp(rtk_t *rtk, const obsd_t *obs, int n, const nav_t *nav)
{
    double meas[2],var[2],bias[MAXOBS]={0},offset=0.0,pos[3]={0};
    int i,j,k,sat,brk=0;
    
    trace(3,"udbias  : n=%d\n",n);
    
    for (i=0;i<MAXSAT;i++) for (j=0;j<rtk->opt.nf;j++) {
        rtk->ssat[i].slip[j]=0;
    }
    /* detect cycle slip by LLI */
    detslp_ll(rtk,obs,n);
    
    /* detect cycle slip by geometry-free phase jump */
    detslp_gf(rtk,obs,n,nav);
    
    /* reset phase-bias if expire obs outage counter */
    for (i=0;i<MAXSAT;i++) {
        if (++rtk->ssat[i].outc[0]>(unsigned int)rtk->opt.maxout) {
            initx(rtk,0.0,0.0,IB(i+1,&rtk->opt));
        }
    }
    ecef2pos(rtk->sol.rr,pos);
    
    for (i=k=0;i<n&&i<MAXOBS;i++) {
        sat=obs[i].sat;
        j=IB(sat,&rtk->opt);
        if (!corrmeas(obs+i,nav,pos,rtk->ssat[sat-1].azel,&rtk->opt,NULL,NULL,
                      0.0,meas,var,&brk)) continue;
        
        if (brk) {
            rtk->ssat[sat-1].slip[0]=1;
            trace(2,"%s: sat=%2d correction break\n",time_str(obs[i].time,0),sat);
        }
        bias[i]=meas[0]-meas[1];
        if (rtk->x[j]==0.0||
            rtk->ssat[sat-1].slip[0]||rtk->ssat[sat-1].slip[1]) continue;
        offset+=bias[i]-rtk->x[j];
        k++;
    }
    /* correct phase-code jump to enssure phase-code coherency */
    if (k>=2&&fabs(offset/k)>0.0005*CLIGHT) {
        for (i=0;i<MAXSAT;i++) {
            j=IB(i+1,&rtk->opt);
            if (rtk->x[j]!=0.0) rtk->x[j]+=offset/k;
        }
        trace(2,"phase-code jump corrected: %s n=%2d dt=%12.9fs\n",
              time_str(rtk->sol.time,0),k,offset/k/CLIGHT);
    }
    for (i=0;i<n&&i<MAXOBS;i++) {
        sat=obs[i].sat;
        j=IB(sat,&rtk->opt);
        
        rtk->P[j+j*rtk->nx]+=SQR(rtk->opt.prn[0])*fabs(rtk->tt);
        
        if (rtk->x[j]!=0.0&&
            !rtk->ssat[sat-1].slip[0]&&!rtk->ssat[sat-1].slip[1]) continue;
        
        if (bias[i]==0.0) continue;
        
        /* reinitialize phase-bias if detecting cycle slip */
        initx(rtk,bias[i],VAR_BIAS,IB(sat,&rtk->opt));
        
        trace(5,"udbias_ppp: sat=%2d bias=%.3f\n",sat,meas[0]-meas[1]);
    }
}