一、双频修电离层
关于双频消电离层有两种,广播星历和精密星历。
广播星历对应的是SPP,参考频点为B3,双频组合为B1/B2,B1/B3,B2/B3。
精密星历对应的是PPP,参考频点为B1/B3组合,双频组合为B1/B2,B1/B3,B2/B3。
我们这里讲的是广播星历的双频消电离层。
以P13为例,ρ是我们所求。P13是我们的双频伪距,由下图公式求得,P1是频率f1的观测伪距,P2是频率2的观测伪距。
DCB的值在文件中找,记得像DCB13指的是DP3 - DP1。
SVN:用于表示导航卫星的唯一编号。PRN:利用伪随机码标识导航卫星的编号。
如图所示,红色框中是频点,黄色框中是对应的DCB的值。
二、地球自转改正
我们在经过之前几篇文章的计算及修正后,发现精度还是差30米左右,查阅资料发现,忽略了地球自转改正。
我是在算出卫星坐标之后进行的地球自转改正,这里还有一个门限(停止计算时刻),我们还要让他迭代不能超过8次,为了防止一直不接近门限值迭代次数太多。
贴上代码:
/* correction for rotation */
void CorrectForRotation( Sat_t *sat, Klo_t *klo, SPP_t *spp )
{
double tau = 0;
double alpha = 0;
double count = 0;
double PSE = 0, pseudo = 0;
double X = 0, Y = 0, Z = 0;
double xs = 0, ys = 0, zs = 0;
for(int i = 0;i < N;i++)
{
pseudo = spp[i].PR;
while( fabs(PSE - pseudo) > 1e-5 ) //threshold
{
tau = pseudo / C;
alpha = tau * WE;
xs = sat[i].X_obs_k * cos(alpha) + sat[i].Y_obs_k * sin(alpha);
ys =-sat[i].X_obs_k * sin(alpha) + sat[i].Y_obs_k * cos(alpha);
zs = sat[i].Z_obs_k;
/* update satellite ECEF coordinate */
sat[i].X_obs_k = xs;
sat[i].Y_obs_k = ys;
sat[i].Z_obs_k = zs;
PSE = pseudo;
/* update pseudorange */
pseudo = sqrt( pow(klo[i].x-X,2) + pow(klo[i].y-Y,2) + pow(klo[i].z-Z,2) );
count++;
if(count == 8) break;
}
printf("sat %lf %lf %lf\n",sat[i].X_obs_k,sat[i].Y_obs_k,sat[i].Z_obs_k);
}
}
亲爱的伙伴,爱你们,再见。