rtklib代码支持北斗三代电文(CNAV)解算的不完全修改

概述

因为工作原因需要使用rtklib处理北斗三代(B1C/B2a)的数据,不多说废话,直接上代码

代码修改

因为rtklib抽象后的eph_t结构已经支持北斗三代,通过eph_t结构体的code字段判断星历来源,在计算卫星位置的时候,在ephemeris.c文件作如下修改

/* broadcast ephemeris to satellite position and clock bias --------------------
* compute satellite position and clock bias with broadcast ephemeris (gps,
* galileo, qzss)
* args   : gtime_t time     I   time (gpst)
*          eph_t *eph       I   broadcast ephemeris
*          double *rs       O   satellite position (ecef) {x,y,z} (m)
*          double *dts      O   satellite clock bias (s)
*          double *var      O   satellite position and clock variance (m^2)
* return : none
* notes  : see ref [1],[7],[8]
*          satellite clock includes relativity correction without code bias
*          (tgd or bgd)
*-----------------------------------------------------------------------------*/
extern void eph2pos(gtime_t time, const eph_t *eph, double *rs, double *dts,
                    double *var)
{
    double tk,M,E,Ek,sinE,cosE,u,r,i,O,sin2u,cos2u,x,y,sinO,cosO,cosi,mu,omge;
    double xg,yg,zg,sino,coso;
    int n,sys,prn;
    double A,A0,deltNa,Na,N0;
    trace(4,"eph2pos : time=%s sat=%2d\n",time_str(time,3),eph->sat);
    
    tk=timediff(time,eph->toe);
    
    switch ((sys=satsys(eph->sat,&prn))) {
        case SYS_GAL: mu=MU_GAL; omge=OMGE_GAL; break;
        case SYS_CMP: mu=MU_CMP; omge=OMGE_CMP; break;
        default:      mu=MU_GPS; omge=OMGE;     break;
    }

	if(sys==SYS_CMP&&(eph->code == 7||eph->code==9))//data source (0:unknown,1:B1I,2:B1Q,3:B2I,4:B2Q,5:B3I,6:B3Q,7:B1Cd,8:B1Cp,9:B2ad,10:B2ap) */
	{
        A0 = eph->A;
		A = A0 + eph->Adot*tk;
		N0        = sqrt(mu/(A0*A0*A0));
		deltNa    = eph->deln +0.5*eph->ndot*tk;
		Na        = N0 + deltNa;
		M         = eph->M0 + Na*tk;
	} 
	else
	{
		A = eph->A;
		M=eph->M0+(sqrt(mu/(eph->A*eph->A*eph->A))+eph->deln)*tk;
	}
	
    
    for (n=0,E=M,Ek=0.0;fabs(E-Ek)>RTOL_KEPLER&&n<MAX_ITER_KEPLER;n++) {
        Ek=E; E-=(E-eph->e*sin(E)-M)/(1.0-eph->e*cos(E));
    }
    if (n>=MAX_ITER_KEPLER) {
        trace(2,"eph2pos: kepler iteration overflow sat=%2d\n",eph->sat);
        return;
    }
    sinE=sin(E); cosE=cos(E);
    trace(4,"kepler: sat=%2d e=%8.5f n=%2d del=%10.3e\n",eph->sat,eph->e,n,E-Ek);
    u=atan2(sqrt(1.0-eph->e*eph->e)*sinE,cosE-eph->e)+eph->omg;
	r=A*(1.0-eph->e*cosE);
    i=eph->i0+eph->idot*tk;
    sin2u=sin(2.0*u); cos2u=cos(2.0*u);
    u+=eph->cus*sin2u+eph->cuc*cos2u;
    r+=eph->crs*sin2u+eph->crc*cos2u;
    i+=eph->cis*sin2u+eph->cic*cos2u;
    x=r*cos(u); y=r*sin(u); cosi=cos(i);
    
    /* beidou geo satellite */
    if (sys==SYS_CMP&&(prn<=5||prn>=59)) { /* ref [9] table 4-1 */
        O=eph->OMG0+eph->OMGd*tk-omge*eph->toes;
        sinO=sin(O); cosO=cos(O);
        xg=x*cosO-y*cosi*sinO;
        yg=x*sinO+y*cosi*cosO;
        zg=y*sin(i);
        sino=sin(omge*tk); coso=cos(omge*tk);
        rs[0]= xg*coso+yg*sino*COS_5+zg*sino*SIN_5;
        rs[1]=-xg*sino+yg*coso*COS_5+zg*coso*SIN_5;
        rs[2]=-yg*SIN_5+zg*COS_5;
    }
    else {
        O=eph->OMG0+(eph->OMGd-omge)*tk-omge*eph->toes;
        sinO=sin(O); cosO=cos(O);
        rs[0]=x*cosO-y*cosi*sinO;
        rs[1]=x*sinO+y*cosi*cosO;
        rs[2]=y*sin(i);
    }
    tk=timediff(time,eph->toc);
    *dts=eph->f0+eph->f1*tk+eph->f2*tk*tk;
    
    /* relativity correction */
    *dts-=2.0*sqrt(mu*A)*eph->e*sinE/SQR(CLIGHT);
    
    /* position and clock error variance */
    *var=var_uraeph(sys,eph->sva);
}

扩展测试

使用B1I的观测值和北斗三号的星历,rtklib能正确解算出卫星位置。

参考链接

北斗B1C ICD文档
北斗B2a ICD文档

参考资源链接:[GPS L5信号接口规格详解](https://wenku.csdn.net/doc/64672c5b5928463033d7a450?utm_source=wenku_answer2doc_content) 针对L5频段的GPS接收机开发,设计硬件和软件时需要考虑以下几个关键点,以确保定位精度和抗干扰能力的提升:首先,接收机的天线必须能够有效接收位于1176.45 MHz的L5频段信号。天线设计应考虑极化方式和带宽,确保信号的准确捕获。 其次,在硬件层面,接收机的射频前端应该有高灵敏度和选择性,以区分L5频段的信号并滤除噪声和干扰。这通常涉及到低噪声放大器(LNA)和滤波器的设计,以及模拟到数字转换器(ADC)的精确度。 在软件方面,GPS信号处理算法必须能够处理L5信号的伪随机噪声(PRN)扩展,以便正确解码并跟踪信号。这涉及到信号同步和通道跟踪策略的开发,如使用码跟踪环和载波跟踪环来确保信号的准确捕获和跟踪。 L5频段支持使用民用导航消息CNAV,它提供了更精确的时间和位置信息。因此,接收机的导航消息解析模块需要被优化,以便能够高效处理CNAV消息并从中提取导航数据。 此外,为了增强接收机的定位精度和抗干扰能力,还需要实现先进的算法,比如多路径误差修正和信号质量监控。这些算法能够进一步提升定位的准确性,并在复杂的电磁环境下保持稳定的性能。 最后,对软件的测试和验证是必不可少的,需要在实际环境中对GPS接收机进行测试,确保其在各种条件下都能达到预期的性能标准。 总的来说,L5频段GPS接收机的开发是一个复杂的工程,需要跨学科的知识和技术。欲获得更深入的理解和技术细节,强烈推荐参考《GPS L5信号接口规格详解》。这份文档详细描述了L5频段的特性及其技术规格,为开发人员提供了一个全面的指导,帮助他们构建出性能卓越的GPS接收机。 参考资源链接:[GPS L5信号接口规格详解](https://wenku.csdn.net/doc/64672c5b5928463033d7a450?utm_source=wenku_answer2doc_content)
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜晓码农

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值