GPS從入門到放棄(二十三) --- 相位纏繞

GPS從入門到放棄(二十三) — 相位纏繞

相位纏繞(Phase Wind-Up)是發射端與接收端之間的相對運動導致的載波相位變化。對 GPS 系統來說,因爲 GPS 衛星發送的是右旋圓極化(RHCP: Right Hand Circularly Polarized)的信號,在這種情況下,接收機或者衛星天線的旋轉會導致載波相位發生改變,這個值可能達到一個載波週期,我們把這種現象叫做相位纏繞。

因爲衛星的太陽能電池板必須對着太陽,這樣才能儘可能的吸收太陽能。爲了把太陽能電池板對準太陽,在衛星經過遠日點和近日點附近時,衛星姿態需要發生近 180° 的劇烈翻轉,稱爲正午、子夜機動(noon, midnight turns),這會導致相位纏繞。而衛星的天線必須對地球,以儘量節省發射能量。這也會導致相位纏繞。所以衛星一定會旋轉,相位纏繞無法避免。

所幸相位纏繞隻影響載波相位測量,不影響碼相位測量,在非精密定位中可以忽略其影響。對差分定位來說其影響一般也可以忽略,尤其是短基線的時候。然而對精密單點定位來說,其影響就不能忽略了,因其影響可能會達到分米級。

下面介紹常用的相位纏繞模型。

如下圖所示是衛星、地球與太陽的位置關係:
相位纏繞
在衛星天線上建立衛星天線座標系,以衛星的天線相位中心爲原點;Z軸沿衛星天線方向指向地心;X軸在地球、太陽和衛星組成的平面內,指向太陽;Y軸與Z軸和X軸構成右手系。於是可以求得三軸方向的單位矢量 exs, eys, ezs\boldsymbol{e_{xs},\ e_{ys},\ e_{zs}} 分別爲:

ezs=rsatrsateys=ezs×esunexs=ezs×eys \boldsymbol{e_{zs} = \frac{-r_{sat}}{|r_{sat}|}} \\ \boldsymbol{e_{ys} = e_{zs}\times e_{sun}} \\ \boldsymbol{e_{xs} = e_{zs} \times e_{ys}}

其中 rsat\boldsymbol{r}_{sat}rsun\boldsymbol{r}_{sun} 分別是ECEF座標系中衛星和太陽的位置矢量,而 esun\boldsymbol{e}_{sun} 是衛星至太陽方向的單位矢量:
esun=rsunrsatrsunrsat \boldsymbol{e_{sun} = \frac{r_{sun} - r_{sat}}{|r_{sun}-r_{sat}|}}

計算相位纏繞時,在衛星和接收機處各定義一個有效偶極 Ds\boldsymbol{D_s}Dr\boldsymbol{D_r},且分別對應於星固座標系和接收機所在位置的站心座標系,有
Dsexsek(ekexs)ek×eysDrexrek(ekexr)+ek×eyrϕfsign(ek(Ds×Dr))arccos(DsDrDsDr) \boldsymbol{D_s=e_{xs} - e_k (e_k \cdot e_{xs}) - e_k \times e_{ys}} \\ \boldsymbol{D_r=e_{xr} - e_k (e_k \cdot e_{xr}) + e_k \times e_{yr}} \\ \phi_f=\mathrm{sign}(\boldsymbol{e_k \cdot (D_s \times D_r)})\arccos(\boldsymbol{\frac{D_s \cdot D_r}{|D_s||D_r|}})

其中 ek\boldsymbol{e_k} 爲衛星至接收機方向的單位向量,exr\boldsymbol{e_{xr}}eyr\boldsymbol{e_{yr}} 爲接收機所在位置的站心座標系的座標軸方向的單位矢量,而 ϕf\phi_f 爲相位纏繞值的小數部分。
ek=rrrsatrrrsat \boldsymbol{e_k=\frac{r_r - r_{sat}}{|r_r - r_{sat}|}}

在 RTKLIB 中是通過調用 windupcorr 函數來進行相位纏繞校正的。此函數的計算過程同上述模型幾乎完全一致,這裏附上代碼,過程很直接,就不多解釋了。

void windupcorr(gtime_t time, const double *rs, const double *rr,
                       double *phw)
{
    double ek[3],exs[3],eys[3],ezs[3],ess[3],exr[3],eyr[3],eks[3],ekr[3],E[9];
    double dr[3],ds[3],drs[3],r[3],pos[3],rsun[3],cosp,ph,erpv[5]={0};
    int i;

    trace(4,"windupcorr: time=%s\n",time_str(time,0));

    /* sun position in ecef */
    sunmoonpos(gpst2utc(time),erpv,rsun,NULL,NULL);

    /* unit vector satellite to receiver */
    for (i=0;i<3;i++) r[i]=rr[i]-rs[i];
    if (!normv3(r,ek)) return;

    /* unit vectors of satellite antenna */
    for (i=0;i<3;i++) r[i]=-rs[i];
    if (!normv3(r,ezs)) return;
    for (i=0;i<3;i++) r[i]=rsun[i]-rs[i];
    if (!normv3(r,ess)) return;
    cross3(ezs,ess,r);
    if (!normv3(r,eys)) return;
    cross3(eys,ezs,exs);

    /* unit vectors of receiver antenna */
    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);
    cross3(ek,eyr,ekr);
    for (i=0;i<3;i++) {
        ds[i]=exs[i]-ek[i]*dot(ek,exs,3)-eks[i];
        dr[i]=exr[i]-ek[i]*dot(ek,exr,3)+ekr[i];
    }
    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 */
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章