最近阅读RTKlib开源代码,非常感谢“塔奇克敲代码”博主的博客(RTKLIB源码解析——单点定位),他将单点定位部分整理成函数小卡片,为我理解RTKlib提供了很大的帮助。我参照他的格式,记录整理对相对定位部分的个人理解。由于刚开始接触卫星定位,所以可能有理解不到位的地方,还请诸位指正。

我所基于的代码版本是RTKlib 2.4.3的一个拓展版本RTKexplore Demo5,这个版本主要针对低成本的GNSS定位。该版本整体算法并未做较大更改,只是针对低成本接收机进行了完善。

文章目录

  • udstate
  • udpos
  • udion
  • udtrop
  • udbias

udstate

static void udstate(rtk_t *rtk, const obsd_t *obs, const int *sat,const int *iu, const int *ir, int ns, const nav_t *nav)
  • 所在文件:Rtkpos.c
  • 功能说明:对相对定位中的卡尔曼滤波状态量进行时间更新
  • 参数说明
 args:  IO  rtk_t *rtk:      rtk solution structureI   obsd_t *obs:     sat observationsI   int *sat:        移动站、基站共视星列表I   int *iu          移动站共视星所在obs数组中的索引I   int *ir          基站共视星所在obs数组中的索引I   int ns:          共视星个数I   nav_t *nav:      卫星导航电文
  • 调用关系
Created with Raphaël 2.2.0udstateudposudionudtropudbiasEnd
  • 处理过程
  1. 首先对位置、速度、加速度状态量做时间更新;
  2. 其次对对流层参数做时间更新;
  3. 对单差相位偏移状态量进行时间更新。
  • 注意事项
  1. 实际第三步是对GLONASS的接收机误差进行处理,但是由于我并不关注GLONASS系统,所以和GLONASS相关的处理会略过。

udpos

static void udpos(rtk_t *rtk, double tt)
  • 所在文件:Rtkpos.c
  • 功能说明:对相对定位的位置、速度、加速度状态量进行时间更新
  • 参数说明
 args:  IO  rtk_t *rtk:      rtk solution structureI   double tt:       当前历元与前一历元的时间差
  • 处理过程
  1. 如果现在的定位模式是PMODE_FIXED的状态,即移动站固定的定位模式,则调用initx函数,利用移动站的位置对前三个状态(即位置)进行初始化,将并其在协方差阵P的方差设置为一个较小的方差值(1E-8)。
  2. 对第一个历元时刻的位置、速度、加速度状态量进行初始化,其中位置状态量初始化为单点定位所得到的位置值,方差设置为VAR_POS(60)。如果在配置中选择了将dynamics打开,则将速度状态量初始化为单点定位的速度值,方差设置为VAR_VEL(10),将加速度状态量初始化1E-6,方差设置为VAR_ACC(10)。
  3. 如果配置中没有打开Rec dynamics,每次状态更新都将位置状态量赋值为单点定位的位置,方差设置为VAR_POS(60)。
  4. 检查位置状态量的协方差,如果位置状态量的平均方差大于VAR_POS(60),则将位置状态量、速度状态量重置为单点定位值,加速度状态量重置为1E-6。根据3我们可以知道,这一步主要是检查dynamics打开时的情况。
  5. 对位置、速度、加速度状态量按照卡尔曼滤波方程进行一步预测,即时间更新。实际上速度、位置、加速度之间的状态方程非常简单,即:
  6. 该过程噪声建模为随机游走噪声。由于在配置中所设的“Receiver Accel horiz/vertical”是东北天坐标系下的,因此还需要将该过程噪声的方差阵由东北天坐标系转到地球固定坐标系。由此,便完成了位置、速度、加速度状态量的时间更新。
  • 注意事项
  1. 如果没有选择打开Rec dynamics,实际上速度、加速度状态量并没有初始化,相当于仅使用了位置状态量。

udion

static void udion(rtk_t *rtk, double tt, double bl, const int *sat, int ns)
  • 所在文件:rtkpos.c
  • 功能说明:对电离层状态量进行时间更新
  • 参数说明
 args:  IO  rtk_t *rtk:      rtk solution structureI   double tt:       当前历元与前一历元的时间差I   double bl:       基线长度I   int *sat:        移动站、基站共视星列表I   int ns:          共视星个数
  • 处理过程
  1. 在基线比较长的情况下(>10km),由于电离层的误差,通过双差不能完全消除,因此需要考虑电离层的影响。在长基线的情况,可以在配置中选择电离层修正方式为IONOOPT_EST。这种配置下,会将垂直方向的单差电离层延迟添加到卡尔曼滤波状态量中。
  2. 如果L1,L2载波相位的中断次数大于GAP_RESION(120),则将该卫星的单差电离层延迟状态量(后简称为电离层状态量)0。
  3. 对所有共视星进行循环,如果该卫星的电离层状态量为0,则将其初始化为1E-6,方差为SQR(rtk->opt.std[1]*bl/1E4),即根据在配置中所设置的参数和基线长度来决定;如果电离层状态量不为0,则在它的协方差阵上添加过程噪声,过程噪声大小由高度角,基线长度,过程噪声参数决定。
  • 注意事项
  1. 在整个电离层状态量的时间更新中,实际上仅对电离层状态量为0的那些卫星进行了初始化,其余卫星的电离层状态量并没有变化,仅仅是在协方差阵中加入了过程噪声。

udtrop

static void udtrop(rtk_t *rtk, double tt, double bl)
  • 所在文件:rtkpos.c
  • 功能说明:对对流层状态量进行时间更新
  • 参数说明
 args:  IO  rtk_t *rtk:      rtk solution structureI   double tt:       当前历元与前一历元的时间差I   double bl:       基线长度
  • 处理过程
  1. 在基线比较长(>10km)、或者是基线和移动站之间高度差较大的情况下,由于通过双差不能完全消除对流层误差,因此需要考虑对流层延迟的影响。在长基线的情况,可以在配置中选择对流层修正方式为Estiamte ZTD或者Estimate ZTD+Grad。如果选择是Estiamte ZTD,则会将基站、移动站天顶方向的对流层延迟(Zb,ZrZ_b,Z_rZb​,Zr​)加入卡尔曼滤波状态量,即新增2个状态量;如果选择Estimate ZTD+Grad,那么除了基线、移动天顶方向对流层延迟外,还会将东向、北向的对流层梯度系数(GE,r,GN,r,GE,b,GN,bG_{E,r},G_{N,r},G_{E,b},G_{N,b}GE,r​,GN,r​,GE,b​,GN,b​)加入卡尔曼滤波状态量,即新增6个状态量,具体参见RTKlib manual的167页。
  2. 该函数首先检查Zb,ZrZ_b,Z_rZb​,Zr​状态量是否为0,如果为0,则初始化为INIT_ZWD(0.15m),如果是在Estimate ZTD+Grad配置下,还会初始化GE,r,GN,r,GE,b,GN,bG_{E,r},G_{N,r},G_{E,b},G_{N,b}GE,r​,GN,r​,GE,b​,GN,b​状态量为1E-6;如果Zb,ZrZ_b,Z_rZb​,Zr​状态量不为0,则在将其协方差阵加上过程噪声。
  • 注意事项
  1. 在整个对流层状态量的时间更新中,实际上仅对对流层状态量为0的那些卫星进行了初始化,其余卫星的对流层状态量并没有变化,仅仅是在协方差阵中加入了过程噪声。

udbias

static void udbias(rtk_t *rtk, double tt, const obsd_t *obs, const int *sat,const int *iu, const int *ir, int ns, const nav_t *nav)
  • 所在文件:rtkpos.c
  • 功能说明:对单差整周模糊度状态量进行时间更新
  • 参数说明
 args:  IO  rtk_t *rtk:      rtk solution structureI   double tt:       当前历元与前一历元的时间差I   obsd_t *obs:     sat observationsI   int *sat:        移动站、基站共视星列表I   int *iu          移动站共视星所在obs数组中的索引I   int *ir          基站共视星所在obs数组中的索引I   int ns:          共视星个数I   nav_t *nav:      卫星导航电文
  • 处理过程
  1. 首先是对所有共视星进行周跳检测:调用了detslp_ll函数,根据LLI来判断基站和移动站周跳;然后调用detslp_gf_L1L2、detslp_gf_L1L5函数,利用几何无关组合进行周跳检测;最后调用detslp_dop函数,利用多普勒进行周跳检测(但该函数由于时间跳变的原因,暂未使用)。对RTKlib的周跳检测函数,我专门写了一篇博客解析,RTKlib源码解析:ppp和rtkpost中的周跳检测函数
  2. 对所有卫星进行循环,判断是否需要重置单差相位偏移状态量。如果所配置的AR的模式为instantaneous,或者卫星载波相位的中断次数大于配置中所设置的最大次数,则将单差相位偏移状态量重置为0。
  3. 对共视星进行循环,对单差相位偏移状态量的协方差阵加入过程噪声,如果发现有周跳或者异常值,则单差相位偏移状态量重置为0。
  4. 对共视星进行循环,利用“单差伪距”和“单差载波相位”计算一个“单差相位偏移”估计值,来对单差相位偏移状态量进行更新。由于如果忽略伪距误差,那么伪距减去载波相位,则应该是载波相位(m)的相位偏移(m),所以这里计算的是一个大致的相位偏移bias[i]。如果配置为无电离层组合,计算则按照无电离层组合的方式来计算。最后,仅计算所有有效星(单差相位偏移状态不为0)的offset = sum of (bias - phase-bias)。其实就是计算每颗有效星bias[i]与单单差相位偏移状态量的偏差,然后把所有有效星的这个偏差值加起来,之后会除以有效星的个数,最终就是求一个偏差平均值rtk->com_bias。
  5. 利用4求得的bias[i] - rtk->com_bias,来对没有进行初始化的卫星,进行单差相位偏移状态量的初始化。
  • 注意事项
  1. 在整个单差相位偏移状态量的时间更新中,实际上仅对单差相位偏移状态量为0的那些卫星进行了初始化,其余卫星的单差相位偏移状态量并没有变化,仅仅是在协方差阵中加入了过程噪声。

RTKlib相对定位源码解析: udstate函数相关推荐

  1. RTKlib相对定位源码解析:zdres函数

    最近阅读RTKlib开源代码,非常感谢"塔奇克敲代码"博主的博客(RTKLIB源码解析--单点定位),他将单点定位部分整理成函数小卡片,为我理解RTKlib提供了很大的帮助.我参照 ...

  2. RTKlib相对定位源码解析: ddres函数

    最近阅读RTKlib开源代码,非常感谢"塔奇克敲代码"博主的博客(RTKLIB源码解析--单点定位),他将单点定位部分整理成函数小卡片,为我理解RTKlib提供了很大的帮助.我参照 ...

  3. Vue源码解析之函数入口

    从入口开始看起 写博客就是记录自己撸码的过程和问题,好了~废话就不多说了,直接源码撸起,通过上一篇博客咱们大致知道了Vue源码目录设计,下面我们要一步步找到vue的入口 通过查看package.jso ...

  4. 谷歌BERT预训练源码解析(三):训练过程

    目录 前言 源码解析 主函数 自定义模型 遮蔽词预测 下一句预测 规范化数据集 前言 本部分介绍BERT训练过程,BERT模型训练过程是在自己的TPU上进行的,这部分我没做过研究所以不做深入探讨.BE ...

  5. CenterNet 后处理过程及源码解析

    目录 1.写在前面 2.后处理源码解析 2.1 CenterNet推理过程 2.2 后处理源码解析 2.2.1 NMS 2.2.2 Top K 2.2.3 提取reg和wh 2.2.4 是否对每一类分 ...

  6. RTKLIB源码解析(一)、单点定位(pntpos.c)

      目录 pntpos satposs estpos raim_fde estvel ephclk satpos satsys seleph eph2clk ephpos eph2pos rescod ...

  7. QT源码解析(一) QT创建窗口程序、消息循环和WinMain函数

    版权声明 请尊重原创作品.转载请保持文章完整性,并以超链接形式注明原始作者"tingsking18"和主站点地址,方便其他朋友提问和指正. QT源码解析(一) QT创建窗口程序.消 ...

  8. usestate中的回调函数_React Hooks 源码解析(3):useState

    React 源码版本: v16.11.0 源码注释笔记: airingursb/react​github.com 在写本文之前,事先阅读了网上了一些文章,关于 Hooks 的源码解析要么过于浅显.要么 ...

  9. 黄聪:WordPress动作钩子函数add_action()、do_action()源码解析

    WordPress常用两种钩子,过滤钩子和动作钩子.过滤钩子相关函数及源码分析在上篇文章中完成,本篇主要分析动作钩子源码. 然而,在了解了动作钩子的源码后你会发现,动作钩子核心代码竟然跟过滤钩子差不多 ...

最新文章

  1. 【VB】学生信息管理系统6——错误调试
  2. 什么是 Delta 文件
  3. java程序结构_Java 程序结构说明(学习 Java 编程语言 004)
  4. 分享让人折服的优秀代码基因
  5. 老BOJ 13 K-based Numbers
  6. windowsxp的自动更新关闭后怎么能不提示?
  7. python基础--字符串的内置函数
  8. 单行溢出 和多行溢出
  9. Huffman树学习
  10. 东芝移动硬盘驱动_传输数据不用等,高速移动硬盘数据线畅享快传体验
  11. pthread_cond_signal函数《代码》--生产者与消费者
  12. 对话框应用程序的DoModal()源代码
  13. appium自动化测试环境部署_Android
  14. win10装系统--笔记
  15. 【181023】有意思的屏幕画笔,基于VC++实现
  16. 东软c语言课后习题,C语言笔试题及参考答案-东软集团
  17. MXF视频文件损坏的修复方法
  18. 【计算机网络】第三部分 数据链路层(18) 虚电路网络:帧中继和ATM
  19. 简单的python爬虫爬豆瓣图书TOP250
  20. 7*24小时全球实时财经新闻直播摘要python抓取

热门文章

  1. MPEG编码方法简述
  2. MOS管推挽电路设计及特性解析
  3. springcloud分布式配置中心(二)-阿波罗apollo
  4. 低温工作笔记本计算机,电脑低温自动关机
  5. 【JAVA学习路径 表述(超级详细的Java知识宇宙)】
  6. 从Dijkstra谈帅才的洞察力(王选)
  7. python中int函数_int()函数以及Python中的示例
  8. php中如何获得当前周数,PHP中根据输入的周数获取到该周的日期范围
  9. iOS之深入解析App Thinning的应用瘦身优化
  10. U盘插上后在“安全删除硬件”中不显示的解决方案