102-RTKLIB中的相位解缠

本文深入探讨了RTKLIB库中用于GPS卫星信号处理的相位解缠算法,详细分析了ErE_rEr​和EsE^sEs的计算原理,对比了不同文献中的βetaβ角求解公式,并解释了euse_u^seus​和erse_r^sers​的使用场景。此外,还提供了关键函数model_phw和sat_yaw的源代码解读,为理解卫星姿态对精密单点定位(PPP)的影响提供了理论依据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这是一篇未解决问题的博文

rtklib手册中的相位解缠公式:
在这里插入图片描述
首先 E r E_r Er就很不明白,不知道为什么程序中要那样求解。
另外对于 E s E^s Es,大小与前面卫星pco改正求得的各方向单位矢量大小相等,方向相反,猜测是pco中是坐标单位矢量,这里是转换矩阵,但是这里的 E s E^s Es中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.

另外, e u s e_u^s eus e r s e_r^s ers用的是同一个值,即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 β的求解,程序中的计算方法为
β = π / 2 − a r c c o s [ ( r s a t × v ) ⋅ r s u n ] \beta = \pi/2 - arccos[(r_{sat} \times v ) \cdot r_{sun}] β=π/2arccos[(rsat×v)rsun]

而相关文档中给出的公式是
β = a r c c o s [ ( v × r s a t ) ⋅ r s u n ] − π / 2 \beta = arccos[(v \times r_{sat}) \cdot r_{sun}] - \pi/2 β=arccos[(v×rsat)rsun]π/2

可以证明其等价:
c o s ( A ) = x c o s ( π − A ) = − x cos(A) = x \\ cos(\pi-A) = -x \\ cos(A)=xcos(πA)=x

那么
a r c c o s ( x ) = A a r c c o s ( − x ) = π − A arccos(x) = A \\ arccos(-x) = \pi-A \\ arccos(x)=Aarccos(x)=πA

即:
a r c c o s ( x ) = π − a r c c o s ( − x ) arccos(x) = \pi - arccos(-x) arccos(x)=πarccos(x)

<think>好的,用户想了RTKLIB中SPP算法和PPP算法的具体流程。首先,我需要回忆一下RTKLIB的相关知识,特别是SPP和PPP的实现步骤。根据用户提供的引用内容,引用[3]提到SPP是单点定位,使用伪距观测值,而PPP是精密单点定位,结合伪距和载波相位观测值,并且需要精密星历和钟差改正。引用[2]指出PPP的钟差sol.dtr数值较大,这可能与处理方式有关。引用[1]提到PPP中使用扩展卡尔曼滤波,这可能是在PPP流程中的状态估计部分。 首先,我需要整理SPP的流程。根据引用[3],SPP通常在ECEF坐标系下进行计算,使用伪距观测值和广播星历。流程可能包括数据预处理、卫星位置计算、误差修正、最小二乘法定位、结果输出等步骤。需要检查每个步骤的具体内容,比如数据预处理可能包括周跳检测、数据有效性检查;误差修正可能包括电离层、对流层、卫星钟差等修正。 然后是PPP的流程。PPP需要更精确的改正,如引用[2]提到的精密星历和钟差,还可能涉及相位模糊度处理。根据引用[1],PPP可能使用扩展卡尔曼滤波进行状态估计,处理伪距和载波相位数据。流程可能包括数据预处理、精密产品获取、误差修正、状态估计(卡尔曼滤波)、模糊度处理、结果输出。需要注意相位观测值的使用以及如何与伪距结合,还有如何处理接收机钟差和其他误差源。 接下来,需要比较两者的差异,比如观测值类型、星历精度、误差修正方法、定位模型等。这可能涉及到SPP使用广播星历而PPP使用精密星历,SPP忽略某些高阶误差而PPP需要更全面的修正。同时,PPP可能需要更长时间收敛,因为需要算模糊度参数。 用户提供的引用中有提到ECEF坐标系的应用,所以在流程中需要指出内部计算使用ECEF坐标系,但输出可能转换为其他坐标系。此外,引用[2]提到PPP的钟差较大,这可能是因为PPP将接收机钟差作为状态参数估计,而SPP可能通过差分或其他方法处理钟差。 还需要确认流程中的每一步是否合理,例如数据预处理的具体步骤,误差修正的具体模型,卡尔曼滤波的状态参数设置等。可能还需要考虑周跳检测与修复在PPP中的重要性,因为载波相位数据对周跳敏感。 最后,生成相关问题时要围绕SPP和PPP的流程差异、误差处理、数学模型、收敛时间等方面提问,帮助用户深入理两者的实现细节和应用场景。</think>### RTKLIB中SPP与PPP算法流程析 #### 一、SPP(标准单点定位)算法流程 1. **数据预处理** 读取接收机原始观测文件(O文件)和导航电文(N文件),筛选有效卫星,剔除高度角过低或信噪比不足的卫星[^3]。 2. **卫星位置计算** 利用广播星历计算各卫星在信号发射时刻的ECEF坐标系位置,公式为: $$ X_{sat} = f(t_{oe}, a_0, a_1, a_2, \sqrt{A}, \dots) $$ 其中$t_{oe}$为星历参考时间,$a_0,a_1,a_2$为卫星钟差参数。 3. **误差修正** - **电离层延迟**:使用Klobuchar模型修正 - **对流层延迟**:Saastamoinen模型或RTKLIB内置模型 - **卫星钟差**:通过广播星历参数计算 - **相对论效应**:基于轨道参数补偿 4. **最小二乘法定位** 构建伪距观测方程: $$ \rho = \|X_{sat} - X_{rec}\| + c \cdot (dT_{rec} - dT_{sat}) + \epsilon $$ 通过迭代最小二乘法求接收机位置$X_{rec}$和钟差$dT_{rec}$[^3]。 5. **结果输出** 将ECEF坐标转换为大地坐标系(经度、纬度、高程)输出。 --- #### 二、PPP(精密单点定位)算法流程 1. **数据预处理** 增加载波相位观测值处理,执行周跳检测(如TurboEdit算法)和相位平滑伪距操作。 2. **精密产品加载** 读取精密星历(SP3文件)和钟差文件(CLK文件),替代广播星历[^2]。 3. **高阶误差修正** - **电离层延迟**:使用双频无电离层组合或全球电离层格网模型 - **相位缠绕**:基于卫星姿态模型修正 - **潮汐效应**:固体潮、极潮、海潮负荷修正 - **天线相位中心偏差**:通过igs文件校正 4. **扩展卡尔曼滤波(EKF)** 状态向量包含: $$ X = [x,y,z,dT_{rec},T_{zpd},AMB_1,...,AMB_n]^T $$ 观测模型同时使用伪距和载波相位: $$ \begin{cases} P_{IF} = \rho + c \cdot dT_{rec} + T_{zpd} + \epsilon_P \\ \Phi_{IF} = \rho + c \cdot dT_{rec} + T_{zpd} + \lambda \cdot AMB + \epsilon_\Phi \end{cases} $$ 通过EKF实现参数递推估计[^1]。 5. **模糊度固定(可选)** 采用小数周偏差(FCB)或整数钟方法尝试固定模糊度为整数。 6. **结果输出** 输出包含精密坐标、钟差、对流层延迟等参数的决方案。 --- #### 三、关键差异对比 | 特征 | SPP | PPP | |---------------|------------------------------|------------------------------| | 观测值 | 仅伪距 | 伪距+载波相位 | | 星历精度 | 米级(广播星历) | 厘米级(精密星历) | | 钟差修正 | 卫星钟差通过广播参数修正 | 使用精密钟差产品 | | 定位模型 | 几何定位 | 物理定位(考虑动力学约束) | | 收敛时间 | 瞬时 | 通常需要30分钟以上收敛 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值