|
项目维护人: 鲁郁 |
ENGLISH |
|
|
|
|
|
|
|
|
与设备驱动通信,控制硬件,同时将GP2021的原始数据拷贝到navthread, 并从navthread得到控制指令帧 | |
实现跟踪环路的4个状态:acquisition,confirm, pullin, tracking. 当信号被锁定后,读取测量值来计算精确的信号发送时间, | |
提供所有GPS相关的功能函数,包括地理坐标和ECEF坐标相互转换, 从almanac数据和ephemeris数据计算卫星的位置坐标等, P.V.T.解算 | |
实现原始数据,跟踪环状态,以及处理结果的显示. 这个类同时还负责系统和全局变量的初始化., |
     ...
     ca_t = ch[idx].theta[l] - ch[idx].theta[l-1];
    
     if( fabs(ca_t) > PI )
      ca_theta = ca_t > 0? ca_t - 2*PI : ca_t + 2*PI;
     else
      ca_theta = ca_t;
     ch[idx].total_theta += ca_theta;
     ...
在这个PI补偿以后, ch[idx].total_theta
存储着4次相关结果的总相位变化,
可以用来控制载波环路里的FLL.
     ...
    
     int ms_diff, tic_ms_mod20, compensate_ms;
    
     ms_diff = (frm_4ms_6ch.ch_cntl[idx].epoch) & 0xff;
     ms_diff -= ch[idx].epoch_ref; // minus epoch_check value
     if(ms_diff < 0) ms_diff += 20;// get the value of [0 -- 19]
     tic_ms_mod20 = ch[idx].TIC_mscount %20;
     if( fabs( ms_diff - tic_ms_mod20) < 10)
      compensate_ms = ms_diff - tic_ms_mod20;
     else // ms_diff and tic_ms_mod20 should be very close,
      {
      if( ms_diff > tic_ms_mod20)
        compensate_ms = -(tic_ms_mod20 - ms_diff + 20);
      else
       compensate_ms = (ms_diff - tic_ms_mod20 + 20);
      }
    
    
     ch[idx].tr_time = ch[idx].tr_time_HOW+(ch[idx].TIC_mscount+compensate_ms)*0.001+
     (frm_4ms_6ch.ch_cntl[idx].code_phase)/2.046e6 +
     (frm_4ms_6ch.ch_cntl[idx].cd_dco_phase)/2.046e6L/1024.;
    
     ...
这里ch[idx].epoch_ref
是该通道的EPOCH_CHECK值,
而ms_diff
是ch[idx].epoch - ch[idx].epoch_ref
.
compensate_ms
应该被加到ch[idx].TIC_mscount
, 以解决1毫秒模糊.
compensate_ms
的值很小, 比如-2,1,0.
在绝大数时间里, 这种方法可以计算出正确的发送时间;但偶尔(虽然很少发生),
它会不正确. 如果有人找到了更好更稳定的方法可以解决这个问题, 欢迎和我联系.