rtklib中仅以第一个频率是否有效判断卫星有效,修改为小于NFERQ的任意频率的观测值有效,即为有效卫星。
原函数(存在bug):
/* update solution status ----------------------------------------------------*/
static void update_stat(rtk_t *rtk, const obsd_t *obs, int n, int stat)
{
const prcopt_t *opt=&rtk->opt;
int i,j;
/* test # of valid satellites */
rtk->sol.ns=0;
for (i=0;i<n&&i<MAXOBS;i++) {
for (j=0;j<opt->nf;j++) {
if (!rtk->ssat[obs[i].sat-1].vsat[j]) continue;
vs=1;
rtk->ssat[obs[i].sat-1].lock[j]++;
rtk->ssat[obs[i].sat-1].outc[j]=0;
if (j==0) rtk->sol.ns++;
}
}
rtk->sol.stat=rtk->sol.ns<MIN_NSAT_SOL?SOLQ_NONE:stat;
if (rtk->sol.stat==SOLQ_FIX) {
for (i=0;i<3;i++) {
rtk->sol.rr[i]=rtk->xa[i];
rtk->sol.qr[i]=(float)rtk->Pa[i+i*rtk->na];
}
rtk->sol.qr[3]=(float)rtk->Pa[1];
rtk->sol.qr[4]=(float)rtk->Pa[1+2*rtk->na];
rtk->sol.qr[5]=(float)rtk->Pa[2];
}
else {
for (i=0;i<3;i++) {
rtk->sol.rr[i]=rtk->x[i];
rtk->sol.qr[i]=(float)rtk->P[i+i*rtk->nx];
}
rtk->sol.qr[3]=(float)rtk->P[1];
rtk->sol.qr[4]=(float)rtk->P[2+rtk->nx];
rtk->sol.qr[5]=(float)rtk->P[2];
if (rtk->opt.dynamics) { /* velocity and covariance */
for (i=3;i<6;i++) {
rtk->sol.rr[i]=rtk->x[i];
rtk->sol.qv[i-3]=(float)rtk->P[i+i*rtk->nx];
}
rtk->sol.qv[3]=(float)rtk->P[4+3*rtk->nx];
rtk->sol.qv[4]=(float)rtk->P[5+4*rtk->nx];
rtk->sol.qv[5]=(float)rtk->P[5+3*rtk->nx];
}
}
rtk->sol.dtr[0]=rtk->x[IC(0,opt)]; /* GPS */
rtk->sol.dtr[1]=rtk->x[IC(1,opt)]-rtk->x[IC(0,opt)]; /* GLO-GPS */
rtk->sol.dtr[2]=rtk->x[IC(2,opt)]-rtk->x[IC(0,opt)]; /* GAL-GPS */
rtk->sol.dtr[3]=rtk->x[IC(3,opt)]-rtk->x[IC(0,opt)]; /* BDS-GPS */
for (i=0;i<n&&i<MAXOBS;i++) for (j=0;j<opt->nf;j++) {
rtk->ssat[obs[i].sat-1].snr_rover[j]=obs[i].SNR[j];
rtk->ssat[obs[i].sat-1].snr_base[j] =0;
}
for (i=0;i<MAXSAT;i++) for (j=0;j<opt->nf;j++) {
if (rtk->ssat[i].slip[j]&3) rtk->ssat[i].slipc[j]++;
if (rtk->ssat[i].fix[j]==2&&stat!=SOLQ_FIX) rtk->ssat[i].fix[j]=1;
}
}
修复后函数:
/* update solution status ----------------------------------------------------*/
static void update_stat(rtk_t *rtk, const obsd_t *obs, int n, int stat)
{
const prcopt_t *opt=&rtk->opt;
int i,j;
int vs;
/* test # of valid satellites */
rtk->sol.ns=0;
for (i=0;i<n&&i<MAXOBS;i++) {
for (j=0,vs=0;j<opt->nf;j++) {
if (!rtk->ssat[obs[i].sat-1].vsat[j]) continue;
vs=1;
rtk->ssat[obs[i].sat-1].lock[j]++;
rtk->ssat[obs[i].sat-1].outc[j]=0;
}
if (vs==1) rtk->sol.ns++;
}
rtk->sol.stat=rtk->sol.ns<MIN_NSAT_SOL?SOLQ_NONE:stat;
if (rtk->sol.stat==SOLQ_FIX) {
for (i=0;i<3;i++) {
rtk->sol.rr[i]=rtk->xa[i];
rtk->sol.qr[i]=(float)rtk->Pa[i+i*rtk->na];
}
rtk->sol.qr[3]=(float)rtk->Pa[1];
rtk->sol.qr[4]=(float)rtk->Pa[1+2*rtk->na];
rtk->sol.qr[5]=(float)rtk->Pa[2];
}
else {
for (i=0;i<3;i++) {
rtk->sol.rr[i]=rtk->x[i];
rtk->sol.qr[i]=(float)rtk->P[i+i*rtk->nx];
}
rtk->sol.qr[3]=(float)rtk->P[1];
rtk->sol.qr[4]=(float)rtk->P[2+rtk->nx];
rtk->sol.qr[5]=(float)rtk->P[2];
if (rtk->opt.dynamics) { /* velocity and covariance */
for (i=3;i<6;i++) {
rtk->sol.rr[i]=rtk->x[i];
rtk->sol.qv[i-3]=(float)rtk->P[i+i*rtk->nx];
}
rtk->sol.qv[3]=(float)rtk->P[4+3*rtk->nx];
rtk->sol.qv[4]=(float)rtk->P[5+4*rtk->nx];
rtk->sol.qv[5]=(float)rtk->P[5+3*rtk->nx];
}
}
rtk->sol.dtr[0]=rtk->x[IC(0,opt)]; /* GPS */
rtk->sol.dtr[1]=rtk->x[IC(1,opt)]-rtk->x[IC(0,opt)]; /* GLO-GPS */
rtk->sol.dtr[2]=rtk->x[IC(2,opt)]-rtk->x[IC(0,opt)]; /* GAL-GPS */
rtk->sol.dtr[3]=rtk->x[IC(3,opt)]-rtk->x[IC(0,opt)]; /* BDS-GPS */
for (i=0;i<n&&i<MAXOBS;i++) for (j=0;j<opt->nf;j++) {
rtk->ssat[obs[i].sat-1].snr_rover[j]=obs[i].SNR[j];
rtk->ssat[obs[i].sat-1].snr_base[j] =0;
}
for (i=0;i<MAXSAT;i++) for (j=0;j<opt->nf;j++) {
if (rtk->ssat[i].slip[j]&3) rtk->ssat[i].slipc[j]++;
if (rtk->ssat[i].fix[j]==2&&stat!=SOLQ_FIX) rtk->ssat[i].fix[j]=1;
}
}