前言
周跳探测是卫星定位解算中非常重要的数据预处理步骤,基本上把周跳问题处理好,整个数据干净了,后面的模糊度固定就能省事不少,因此,把相关的方法整理一下,以后看到有新的论文方法也记录下来,不断提高自己的水平。
一、LLI标志
LLI(Loss of Lock Indicator)表示失锁标识符,它的范围为0~7,转化为二进制格式000-111,即有3个bit位。其中bit 0和bit 1仅用于相位。
官方解释:【北斗/全球卫星导航系统(GNSS)接收机数据自主交换格式】
(1)0 或空格:正常或未知
(2)Bit0 置位:先前与当前观测值之间失锁,可能发生了周跳(只针对相位观测值)。
(3)Bit1 置位:接收机进行半周模糊度解算,或程序不能处理半周数据而跳过该观测值的记录(只对当前历元有效)。
(4)Bit2 置位:bit 2置1表示为反欺骗(AS)下的观测值(可能会受到噪声增加的影响)[官方说明书上没有说明,今天用某型号的板卡才发现有这个问题,标志位LLI=4的时候,伪距和载波观测值有问题,用上面其他周跳探测方法没有探测出来]。
rtklib中代码和增加AS探测代码如下:
/* detect cycle slip by LLI --------------------------------------------------*/
static void detslp_ll(rtk_t *rtk, const obsd_t *obs, int i, int rcv)
{
uint32_t slip,LLI;
int f,sat=obs[i].sat;
trace(4,"detslp_ll: i=%d rcv=%d\n",i,rcv);
for (f=0;f<rtk->opt.nf;f++)
{
//------没有载波数据和标志为0,或者前后历元时间间隔大---------------
if ((obs[i].L[f]==0.0&&obs[i].LLI[f]==0)||
fabs(timediff(obs[i].time,rtk->ssat[sat-1].pt[rcv-1][f]))<DTTOL)
{
continue;
}
/* restore previous LLI */
if (rcv==1) LLI=getbitu(&rtk->ssat[sat-1].slip[f],0,2); /* rover */
else LLI=getbitu(&rtk->ssat[sat-1].slip[f],2,2); /* base */
/* detect slip by cycle slip flag in LLI */
if (rtk->tt>=0.0)
{ /* forward */
if (obs[i].LLI[f]&1) //------bit0为1,表明当前历元可能发生了周跳-----------
{
errmsg(rtk,"slip detected forward (sat=%2d rcv=%d F=%d LLI=%x)\n",
sat,rcv,f+1,obs[i].LLI[f]);
}
slip=obs[i].LLI[f];
}
else
{ /* backward */
if (LLI&1)//-----------前一历元bit0位为1,表明前一历元发生可能发生了周跳
{
errmsg(rtk,"slip detected backward (sat=%2d rcv=%d F=%d LLI=%x)\n",
sat,rcv,f+1,LLI);
}
slip=LLI;
}
/* detect slip by parity unknown flag transition in LLI */
//----(LLI&2)&&!(obs[i].LLI[f]&2)--前一历元bit1 位为1并且当前历元bit1位不为1;
//----(!(LLI&2)&&(obs[i].LLI[f]&2) ----前一历元bit1 位为0且当前历元bit1位为1;
//----即前后历元的bit1位不相同,表明可能发生了半周跳。
if (((LLI&2)&&!(obs[i].LLI[f]&2))||(!(LLI&2)&&(obs[i].LLI[f]&2)))
{
errmsg(rtk,"slip detected half-cyc (sat=%2d rcv=%d F=%d LLI=%x->%x)\n",
sat,rcv,f+1,LLI,obs[i].LLI[f]);
slip|=1;//将slip的bit0位置为1;
}
//表示为反欺骗(AS)下的观测值(可能会受到噪声增加的影响)
if(obs[i].LLI[f]&0x04)
{
slip|=1;//将slip的bit0位置为1;
}
/* save current LLI */
if (rcv==1) setbitu(&rtk->ssat[sat-1].slip[f],0,2,obs[i].LLI[f]);
else setbitu(&rtk->ssat[sat-1].slip[f],2,2,obs[i].LLI[f]);
/* save slip and half-cycle valid flag */
rtk->ssat[sat-1].slip[f]|=(uint8_t)slip;
rtk->ssat[sat-1].half[f]=(obs[i].LLI[f]&2)?0:1;
}
}
理论上只要板卡足够好,它自身的LLI标志就能把载波数据的周跳、半周跳告知你,就不需要其他探测方法了。LLI的是从信道方面探测周跳的,效果应该比我们从数据方法探测周跳更灵敏。
有的板卡或许LLI探测太灵敏了,把没有问题的数据也当作周跳进行标志,可能会导致观测数据不足,故有时会把LLI周跳探测方法关闭。
北斗/全球卫星导航系统(GNSS)接收机数据自主交换格式文档
链接: http://www.beidou.gov.cn/zt/bdbz/201712/W020171226815455305615.pdf