102-RTKLIB中的相位解纏

這是一篇未解決問題的博文

rtklib手冊中的相位解纏公式:
在這裏插入圖片描述
首先ErE_r就很不明白,不知道爲什麼程序中要那樣求解。
另外對於EsE^s,大小與前面衛星pco改正求得的各方向單位矢量大小相等,方向相反,猜測是pco中是座標單位矢量,這裏是轉換矩陣,但是這裏的EsE^s中xy的求解還是通過衛星的姿態進行求解的,具體沒有細究,因爲跟找到的資料對比還是沒看明白。衛星的姿態相關計算可以參考下面幾篇文章:
[1] 張寶成,歐吉坤,袁運斌,鍾世明.GPS衛星姿態異常及其對精密單點定位估值的影響[J].科學通報,2010,55(Z2):2612-2618.
[2] 範曹明,王勝利,歐吉坤.GPS/BDS衛星姿態異常對PPP相位纏繞的影響及其改正模型[J].測繪學報,2016,45(10):1165-1170+1209.
[3] KOUBA J. A Simplified Yaw-attitude Model for Eclipsing GPS Satellites[J]. GPS Solutions, 2009, 13(1):1-12.

另外,euse_u^serse_r^s用的是同一個值,即ecef下接收機-衛星座標的單位矢量,這個其實都一樣,反正都是衛星到接收機天線方向的單位矢量。
大概就這些搞不透徹的。另外貼一下,

/* phase windup model --------------------------------------------------------*/
static int model_phw(gtime_t time, int sat, const char *type, int opt,
                     const double *rs, const double *rr, double *phw)
{
    double exs[3],eys[3],ek[3],exr[3],eyr[3],eks[3],ekr[3],E[9];
    double dr[3],ds[3],drs[3],r[3],pos[3],cosp,ph;
    int i;
    
    if (opt<=0) return 1; /* no phase windup */
    
    /* satellite yaw attitude model */
	/* E.8.12星固系的參數 */
    if (!sat_yaw(time,sat,type,opt,rs,exs,eys)) return 0;
    
    /* unit vector satellite to receiver */
    for (i=0;i<3;i++) r[i]=rr[i]-rs[i];
    if (!normv3(r,ek)) return 0;
    
    /* unit vectors of receiver antenna */
	/* E.8.11中的參數 */
    ecef2pos(rr,pos);
    xyz2enu(pos,E);
    exr[0]= E[1]; exr[1]= E[4]; exr[2]= E[7]; /* x = north */
    eyr[0]=-E[0]; eyr[1]=-E[3]; eyr[2]=-E[6]; /* y = west  */
    
    /* phase windup effect */
    cross3(ek,eys,eks); /* eks=ek×eys 即E.8.13中 eus×eys */
    cross3(ek,eyr,ekr); /* ekr=ek×eyr 即E.8.14中 ers×eyy */
    for (i=0;i<3;i++) {
        ds[i]=exs[i]-ek[i]*dot(ek,exs,3)-eks[i]; /* E.8.13 */
        dr[i]=exr[i]-ek[i]*dot(ek,exr,3)+ekr[i]; /* E.8.14 */
    }
	/* E.8.15 沒有加N的部分 */
    cosp=dot(ds,dr,3)/norm(ds,3)/norm(dr,3);
    if      (cosp<-1.0) cosp=-1.0;
    else if (cosp> 1.0) cosp= 1.0;
    ph=acos(cosp)/2.0/PI;
    cross3(ds,dr,drs);
    if (dot(ek,drs,3)<0.0) ph=-ph;
    /* 防止周跳處理 */
    *phw=ph+floor(*phw-ph+0.5); /* in cycle */
    return 1;
}
/* satellite attitude model --------------------------------------------------*/
static int sat_yaw(gtime_t time, int sat, const char *type, int opt,
                   const double *rs, double *exs, double *eys)
{
    double rsun[3],ri[6],es[3],esun[3],n[3],p[3],en[3],ep[3],ex[3],E,beta,mu;
    double yaw,cosy,siny,erpv[5]={0};
    int i;
    
    sunmoonpos(gpst2utc(time),erpv,rsun,NULL,NULL);
    
    /* beta and orbit angle */
    matcpy(ri,rs,6,1);
    ri[3]-=OMGE*ri[1]; /* v1=vx-omega*ry */
    ri[4]+=OMGE*ri[0]; /* v2=vy+omega*rx , v3=vz */
    cross3(ri,ri+3,n); /* n=r×v */
    cross3(rsun,n,p); /* p=rsun×n */
    if (!normv3(rs,es)||!normv3(rsun,esun)||!normv3(n,en)||
        !normv3(p,ep)) return 0;
    beta=PI/2.0-acos(dot(esun,en,3));/* acos(-x)=pi-acos(x) */
    E=acos(dot(es,ep,3));
    mu=PI/2.0+(dot(es,esun,3)<=0?-E:E);
    if      (mu<-PI/2.0) mu+=2.0*PI;
    else if (mu>=PI/2.0) mu-=2.0*PI;
    
    /* yaw-angle of satellite */
    if (!yaw_angle(sat,type,opt,beta,mu,&yaw)) return 0;
    
    /* satellite fixed x,y-vector */
    cross3(en,es,ex);
    cosy=cos(yaw);
    siny=sin(yaw);
    for (i=0;i<3;i++) {
        exs[i]=-siny*en[i]+cosy*ex[i];
        eys[i]=-cosy*en[i]-siny*ex[i];
    }
    return 1;
}

對於程序中β\beta的求解,程序中的計算方法爲
β=π/2arccos[(rsat×v)rsun] \beta = \pi/2 - arccos[(r_{sat} \times v ) \cdot r_{sun}]

而相關文檔中給出的公式是
β=arccos[(v×rsat)rsun]π/2 \beta = arccos[(v \times r_{sat}) \cdot r_{sun}] - \pi/2

可以證明其等價:
cos(A)=xcos(πA)=x cos(A) = x \\ cos(\pi-A) = -x \\

那麼
arccos(x)=Aarccos(x)=πA arccos(x) = A \\ arccos(-x) = \pi-A \\

即:
arccos(x)=πarccos(x) arccos(x) = \pi - arccos(-x)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章