rtklib-单点定位(pntpos.c)代码关键问题解析-satposs部分


前言

       “塔奇克敲代码”博主的博客(RTKLIB源码解析——单点定位),将单点定位部分整理成函数小卡片,为我理解RTKlib提供了很大的帮助。他在单点定位部分列出了一些疑惑,对我进一步深入思考提供了很大的帮助,在此我记录下我对部分疑惑的理解,也是为了补充当时撰写单点定位解析时候的一些不足,大家可以参考。

satposs

1.对于处理过程中的第3步,数据接收时间减去伪距信号传播时间,这里的数据接收时间应该是有接收机得到的,本身应该是包含接收机钟差的,所以最终得到的信号发射时间应该也是不准确的。难道说接收机钟差较小,在此时可以忽略不计?

对于这个问题我们可以这么思考,伪距本身就是包含了所有误差源的一种测量值,除以光速之后,相当于所有误差项都转换成用时间衡量的结果,使用接收机的接收时刻减去伪距除以光速得到的时间,最终的结果应该就是理论上卫星上信号发射的真时刻,没有任何误差。而后面的计算卫星钟差,再减去,是因为我们计算卫星位置参考时刻是信号从天线发出去的那一刻的时间,所以还需要经过3,4步得到信号从天线相位发射出去的时刻。

2.调用 satpos函数,计算信号发射时刻卫星的 P(ecef,m)、V(ecef,m/s)、C((s|s/s))。如果由 6中计算出的钟偏为 0,就再次调用 ephclk函数,将其计算出的卫星钟偏作为最终的结果。

使用精密星历计算出来的卫星钟差往往不为0,如果没有精密星历的时候,但是星历选项又选择了精密星历的模式,调用peph2pos时,会将钟差和钟偏都设置为0。为了程序的容错性考虑,此时会将钟漂默认为0,然后调用ephclk函数计算卫星的钟差,方差设置为广播星历标准900,以此让钟差和钟漂以及方差都有相应数值。

seleph

1.为什么 tmax和tmin都要加 1?

此处我的理解是为了防止程序的判断错误,编程时常常需要思考>=这种情况的判断,所以设置+1可以有效的防止程序出现判断的错误情况,同时也是为了给tmax与tmin赋不一样的初值。

2.IODE正常情况下应该都是 >=0的,为什么还要考虑 <0的情况?

回到ephclk这个函数,调用seleph这个函数时候给予IODE的初值为-1,目的在于不按照数据邻期进行查找,因为普通用户是没有办法直接的到这个数值的,从通用性的角度出发,将其赋值为0可以通过 if (t<=tmin) {j=i; tmin=t;} return nav->eph+j;快速选取卫星信号发射时刻最邻近的最准确的一系列定轨、钟差等参数。

3.考虑到星历中卫星的健康状况,这里在选择星历时是否也应该验证 eph.svh==0呢?
在之后用卫星进行接收机定位的过程中,判断过了卫星的健康程度,如果卫星有问题是不参加单点定位计算的,这里的主要目的是为了选取最邻近的星历,而且该程序在后面还会时常调用,如果加上卫星健康的判断,可能会导致有些情况下星历选择错误,因为有些情况不一定需要判断卫星健康与否,但是需要广播星历的相关参数,比如就是想计算卫星钟差等情形。

eph2clk

看不懂上述处理过程,跟以往资料上都不一样。咋回事?
此处首次使用信号发射时刻时间减去toe的时间算出两者的差值,然后根据广播星历所给的多项式系数对此时刻的钟差进行拟合,然后拿前面的差值减去这次的拟合钟差,我觉得目的是为了计算信号从天线发出时刻的卫星钟差,也可以理解成迭代提高精度,但是北斗与GPS的说明手册都阐明了了此处t的精度可以不考虑,直接拿第一步得出的钟差结果,作为最终结果也不影响。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值