部分模糊度固定和多次固定
[部分模糊度固定](RTKLIB模糊度固定模式介绍以及部分模糊度固定技术(附源码,基于RTKLIB) - 知乎 (zhihu.com))
知乎这一篇讲的比较简单清晰,就是在模糊度无法固定的时候,剔除权重最小(按照高度角定权重)的卫星后再去固定,循环直至固定成功或卫星数不足时退出。和模糊度怎么固定无关,不改固定函数,只是修改进入固定的卫星。
Rtklib-demo5,manage_amb_LAMBDA()不进行一个循环操作,而是如果ratio值不如前面的历元好,直接让新加入固定的某卫星某频率,在接下来的几个历元都不进入模糊度固定(通过将lock赋值为负数,因为ddmat()将单差模糊度转换为双差是要判断lock>=0)。
/* skip first try if GLO fix-and-hold enabled and IC biases haven't been set yet */
if (rtk->opt.glomodear != GLO_ARMODE_FIXHOLD || rtk->holdamb) {
/* for inital ambiguity resolution attempt, include all enabled sats
bias and xa are fixed solution outputs and are only updated if the ambiguities are resolved */
gps1 = 1; /* always enable gps for initial pass */
glo1 = rtk->opt.glomodear > GLO_ARMODE_OFF ? 1 : 0;
/* first attempt to resolve ambiguities */
nb = resamb_LAMBDA(rtk, bias, xa, gps1, glo1, glo1);
ratio1 = rtk->sol.ratio;
/* reject bad satellites if AR filtering enabled */
if (rtk->opt.arfilter) {
rerun = 0;
/* if results are much poorer than previous epoch or dropped below ar ratio thresh, remove new sats */
if (nb >= 0 && rtk->sol.prev_ratio2 >= rtk->sol.thres && ((rtk->sol.ratio < rtk->sol.thres) ||
(rtk->sol.ratio < rtk->opt.thresar[0] * 1.1 && rtk->sol.ratio < rtk->sol.prev_ratio1 / 2.0))) {
trace(3, "low ratio: check for new sat\n");
dly = 2;
for (i = 0; i < ns; i++)
/*for (f = 0; f < nf; f++) {*/
for (f = 0; f < n_f; f++) {
/*ssat.fix[] 2是各种高度角高、无周跳、lock>=0等,可以进入固定,
1-不使用这个卫星固定(譬如低高度角、周跳、lock等),3是固定成功,下一个历元保持,不再重新解算固定了*/
if (rtk->ssat[sat[i] - 1].fix[f] != 2) continue;
/* check for new sats */
/* rtk->ssat[sat[i] - 1].lock[f] 相位锁定计数(大于0时代表的是该固定的模糊度hold了多少个历元
,小于0时不会被进入双差模糊度固定,小于0或固定时每个历元+1,
通过高度角周跳等判断会将其置为负数,让其接下来几个历元不进入模糊度解算)
0代表可以使用但之前的历元该卫星的该频率没有进入模糊度固定解算*/
/*如果固定结果不好,就把新加入固定的卫星剔除*/
if (rtk->ssat[sat[i] - 1].lock[f] == 0) {
trace(3, "remove sat %d:%d lock=%d\n", sat[i], f, rtk->ssat[sat[i] - 1].lock[f]);
rtk->ssat[sat[i] - 1].lock[f] = -rtk->opt.minlock - dly; /* delay use of this sat with stagger */
dly += 2; /* stagger next try of new sats */
rerun = 1;
}
}
}
/* rerun if filter removed any sats */
if (rerun) {
trace(3, "rerun AR with new sat removed\n");
/* try again with new sats removed */
nb = resamb_LAMBDA(rtk, bias, xa, gps1, glo1, glo1);
}
}
rtk->sol.prev_ratio1 = ratio1;
}
else {
ratio1 = 0;
nb = 0;
}
但是前面关于
if (rtk->sol.prev_ratio2 < rtk->sol.thres && rtk->nb_ar >= rtk->opt.mindropsats) {
/* find and count sats used last time for AR */
/*for (f = 0; f < nf; f++) */
for (f = 0; f < n_f; f++)
for (i = 0; i < ns; i++)
if (rtk->ssat[sat[i] - 1].vsat[f] && rtk->ssat[sat[i] - 1].lock[f] >= 0 && rtk->ssat[sat[i] - 1].azel[1] >= rtk->opt.elmin) {
arsats[ar++] = i;
}
if (rtk->excsat < ar) {
i = sat[arsats[rtk->excsat]];
/*for (f = 0; f < nf; f++) {*/
for (f = 0; f < n_f; f++) {
lockc[f] = rtk->ssat[i - 1].lock[f]; /* save lock count */
/* remove sat from AR long enough to enable hold if stays fixed */
rtk->ssat[i - 1].lock[f] = -rtk->nb_ar;
}
trace(3, "AR: exclude sat %d\n", i);
excflag = 1;
}
else rtk->excsat = 0; /* exclude none and reset to beginning of list */
}
还有后面的
/* restore excluded sat if still no fix or significant increase in ar ratio */
if (excflag && (rtk->sol.ratio < rtk->sol.thres) && (rtk->sol.ratio < (1.5 * rtk->sol.prev_ratio2))) {
i = sat[arsats[rtk->excsat++]];
/*for (f = 0; f < nf; f++) rtk->ssat[i - 1].lock[f] = lockc[f];*/
for (f = 0; f < n_f; f++) rtk->ssat[i - 1].lock[f] = lockc[f];
trace(3, "AR: restore sat %d\n", i);
}
没有搞懂在干吗