relpos函数解读

在配合网络的一些解读和一些自己的理解,将RTKLIB2.3.2的relpos函数进行解读
流程:
zdres—ddres—ekf求出浮点解----lambda固定解-----固定解带回ddres

1.源程序

2.大概框架

  1. 计算卫星位置、速度
  2. 计算基站非差残差项
  3. 选择共视卫星
  4. 计算非差残差项和双差
  5. 使用kalman滤波计算浮点解
  6. 重新进行双差计算
  7. 计算固定解

3.各个步骤的关键算法如下:

1.计算卫星位置速度

  对应代码: relpos--satpossextern void satposs(gtime_t teph, const obsd_t *obs, int n, const nav_t *nav,int ephopt, double *rs, double *dts, double *var, int *svh)input:观测值(obs),导航数据(nav)output:nonefunction:利用obs和nav计算卫星位置,速度和时钟并保存在rs,dts,var等参数中
note:
rs [(0:2)+ i * 6] = obs [i]卫星位置{x,y,z}(m)
* rs [(3:5)+ i * 6] = obs [i]卫星速度{vx,vy,vz}(m / s)
* dts [(0:1)+ i * 2] = obs [i]卫星时钟{bias,drift}(s | s / s)
* var [i] = obs [i卫星位置和时钟误差方差(m ^ 2)
* svh [i] = obs [i]卫星健康状态标记*如果没有导航数据,则将0设置为rs [],dts [],var []和svh []
*卫星位置和时钟是信号传输时的值
*卫星位置参考天线相位中心
*卫星时钟不包括代码偏差校正(tgd或bgd)
*始终需要任何伪距和广播星历来获取信号传输时间

2. 计算基站非差残差项

 对应代码: relpos--zdres
/* undifferenced phase/code residuals ----------------------------------------*/
static int zdres(int base, const obsd_t *obs, int n, const double *rs, const double *dts, const int *svh, const nav_t *nav, const double *rr, const prcopt_t *opt, int index, double *y, double *e, double *azel)
输入:obs,n
输出:y(+nu*nf*2):基准站的无差观测向量(存了无差相位和码的残差)e(+nu*3):基准站的视线向量(卫星坐标-基准站坐标)azel(+nu*2):基准站的方位角仰角向量
功能:计算基站的无差残差(预测值和真实值之差)
for(遍历基站卫星)
{
geodist:计算几何距离
satazel:计算高度角和仰角
satexclude:查看卫星是否被排除
r+=-CLIGHT*dts[i*2]:计算卫星钟差
tropmodel:通过模型计算大气层延迟
tropmapf:通过NMF计算对流层映射函数
antmodel:接收机天线相位中心校正
zdres_sat:计算卫星非差相位/码残差(观察值-伪距)
}

3. 选择基准站与移动站共视卫星

   对应代码: relpos--selsat
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)
将基准站卫星,将通过“高度角阈值”的卫星,作为共视卫星;


找到共同观察到的卫星,然后顺便把他们在数组中的索引 index(iu,ir)记录下来

4.kalman 时间/状态更新 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)
主要更新了:
udpos :kalman中状态更新方程、状态协方差方程更新;
udion : 电离层状态、协方差更新;
udtrop : 对流层状态、协方差更新;
udrcvbias:接收器的时间更新
udbias :更新单差模糊度状态、协方差;
存放到了rtk参数中

5. 1计算移动站非差残差项

if (!zdres(0,obs,nu,rs,dts,svh,nav,xp,opt,0,y,e,azel))

此函数与上边计算基站的无差观测为同一个函数,只不过总体说来有两点不同:
站点坐标使用的是 x p xp xp,这个是kalman滤波时间更新中得到的新坐标,
所有的输出,如 y , e , a z e l y,e,azel y,e,azel,起始存储位置为0,而上边的基准站无差观测时为 n u ∗ s i z e nu*size nu∗size

5.2 计算双差

 if ((nv=ddres(rtk,nav,dt,xp,Pp,sat,y,e,azel,iu,ir,ns,v,H,R,vflg))<1)

上边函数最重要的三个输出 v , H , R v,H,R v,H,R都是卡尔曼滤波量测更新所必须的。
ekf的量测向量是双差载波和双差伪距,这里为什么观测变成双差残差了呢?

残差/v=【参考星(移动站非差残差 - 基准站非差残差)- 非参考星(移动站非差残差 - 基准站非差残差)】-【双差模糊度】
H = -参考星站星单位矢量 + 非参考星站星单位矢量;移动站下
H 参考星对应的列为1 ,非参考星对应的列为-1
保存伪距、载波残差;对新息阈值检测,卫星相关情况、相关值保存到
ssat_t中 resc、resp、rejc、vsat

5.3 kalman滤波状态量更新

if ((info=filter(xp,Pp,H,v,R,rtk->nx,nv)))

在这里,其实浮点解已经出来了:
状 态 更 新 公 式 : Q = H ′ ∗ P ∗ H + R K = P ∗ H ∗ Q − x p = x + K ∗ v P p = ( I − K ∗ H ′ ) ∗ P 状态更新公式:\\ Q=H'*P*H+R\\ K=P*H*Q^-\\ xp=x+K*v\\ Pp=(I-K*H')*P 状态更新公式:Q=H′∗P∗H+RK=P∗H∗Q−xp=x+K∗vPp=(I−K∗H′)∗P
kalman滤波状态更新主要内容有3个,即a 状态转移矩阵的确定 b 初值确定 c 状态向量确定

rtklib中状态向量选择移动站的位置速度 以及单差整周模糊度(x,v,N1,N2,N3…Nm)
初值选择:坐标速度为第一步中计算的概略坐标,整周模糊度初值则使用伪距载波相位组合确定uppos upbias

状态转移矩阵的选择:对于位置速度可分为静态模型和动态模型 高动态模型,具体模型与单点定位kalman滤波模型一致uppos
对于整周模糊度,未发生周跳则整周模糊度不变,发生周跳时,则重置滤波器,重新使用伪距载波组合计算概略整周模糊度为初值进行滤波

计算量测值与预测值差v和观测矩阵H(ddres),并进行卡尔曼滤波的量测更更新filter,此步得到浮点解

周跳的判断:rtklib使用电离层残差法进行周跳的探测
对应代码udbias-detslp_gf_L1L2/L1L5

5. 重新进行双差计算

重新计算双差ddres

6. 计算固定解

使用LAMBDA算法计算固定解
对应代码: resamb_LAMBDA

下边才是重头戏,单差整周模糊度的固定,只有固定了模糊度,才能得到固定解,也就是真正意义上的高精度解。

rtklib中的整周固定解通过lambda算法求解,整周固定解的求解过程其数学本质是一个混合整数最小二乘问题,即待求解的变量中有一部分是浮点数,一部分是整数(单差模糊度)。如果不考虑计算效率,那么我们通过估计误差设置一个搜索区间,带入所有模糊度的组合,取残差最小的那一组就是我们要求解的整周模糊度。但是,这个计算量无疑是一个天文数字!想象一下,我们有14*3=42个单差模糊度要求解,每个浮点周围我们取10个待算整数,那么组合数量就是 1 0 42 10^{42} 1042,即便是后处理应用,这个量级也挺吓人的。
所以,lambda算法本质上是解决计算速度的问题,relpos的核心算法或者之一,
这里我们需要知道,通过这个函数之后固定解rtk->xa得到了

参考文献

链接:
https://blog.csdn.net/jack909633117/article/details/87997123
https://blog.csdn.net/iceboy314159/article/details/105422468
https://blog.csdn.net/wuwuku123/article/details/107410950
https://blog.csdn.net/weixin_42918498/article/details/106747386
https://www.cnblogs.com/taqikema/p/8819798.html

relpos函数解读相关推荐

  1. 硬阈值(Hard Thresholding)函数解读

    版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明. 题目:硬阈值(Hard Thresholding)函数解读 1.硬阈值(Hard Thresh ...

  2. uip1.0核心模块uip_process函数解读

    转载地址:https://www.amobbs.com/thread-5531817-1-1.html 最近,利用uip搞了小东西,要想利用好uip, 最好彻底搞清楚其关键函数 uip_process ...

  3. 软阈值函数作用图matlab,软阈值(Soft Thresholding)函数解读

    题目:软阈值(Soft Thresholding) 函数解读 1.软阈值(Soft Thresholding)函数的符号 软阈值(Soft Thresholding)目前非常常见,文献[1][2]最早 ...

  4. 软阈值 (Soft Thresholding)函数解读

    版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明. 题目:软阈值(Soft Thresholding) 函数解读 1.软阈值(Soft Thres ...

  5. 软阈值(Soft Thresholding) 函数解读

    题目:软阈值(Soft Thresholding) 函数解读 1.软阈值(Soft Thresholding)函数的符号 软阈值(Soft Thresholding)目前非常常见,文献[1][2]最早 ...

  6. 软阈值(Soft Thresholding)函数解读

    原文:https://www.cnblogs.com/wlzy/p/7966525.html 软阈值(Soft Thresholding)函数解读 函数的符号 软阈值(Soft Thresholdin ...

  7. 语义分割中的mIoU计算函数解读

    代码来自于CVPR2018的一篇文章Context Encoding for Semantic Segmentation. github工程地址为:https://github.com/zhangha ...

  8. 计算机连续乘法连加总数怎么用,excel乘法函数-Excel函数公式:计数、求和、查询及一对多查询实用万能函数解读...

    Excel中,函数公式的威力强大是众所周知的,但是,好多人还是应用不好,今天,我们对常用的万能公式,做一下讲解,希望对大家的工作有所帮助. 一.多条件计数统计--Countifs函数. 目的:计算销往 ...

  9. 【代码解读】超详细,YOLOV5之build_targets函数解读。

    文章目录 build_targets作用 注意 可视化结果 过程 详细代码解读 准备 第一遍筛选 扩增正样本 Reference build_targets作用 build_targets函数用于网络 ...

最新文章

  1. Cloud for Customer手机应用上传图片禁止从本地相册选择图片的核心代码
  2. Mac上Homebrew的使用 (Homebrew 使 OS X 更完整)
  3. energy in transition课文翻译_备战四六 | 四六级翻译常考固定表达,速记!
  4. Struts1.x系列教程(17):使用IncludeAction和ForwardAction类包含和转入Web资源
  5. 计算机的硬盘材料,电脑坏了把硬盘资料转移到新硬盘的方法
  6. Adams 线性多步积分器(一)
  7. 刷 LeetCode 吃力正常吗?
  8. ASUS ZenBook Duo 14 UX481电脑 Hackintosh 黑苹果efi引导文件
  9. 软件工程 个人学习笔记(第二章)
  10. VUE3 vue-devtools 调试工具下载安装
  11. Python网络爬虫与信息提取(中国大学mooc)
  12. 大闹天竺里的机器人_王宝强的电影《大闹天竺》都植入了哪些品牌?
  13. HBase第一天学习
  14. 车载摄像头 原像 镜像
  15. 可以用到项目的优化网站加载速度方案
  16. 考研数学常用基础知识
  17. PageOffice实现文件在线安全预览——禁止编辑、下载、复制等
  18. 万科物业java面试经验,万科物业人力资源面试经验
  19. 2021国家电网校招面试秘籍及真题汇总
  20. django产生错误,Unknown field(s) () specified for StoreEntity. Check fields/fieldsets/exclude attributes

热门文章

  1. vue 导入第三方js实例对象
  2. Win如何更改锁屏密码提示?
  3. 程序员需要懂的常用数据结构
  4. H323plus添加h264等能力集的疑惑
  5. 第十二篇:Unity与UE4的通信机制(二):UE4与UE4通信
  6. Linux如何创建用户、新增用户、创建新用户(adduser、deluser)(useradd、userdel)
  7. 【java基础 6】java的发展史简介
  8. 华大单片机串口BUG
  9. CAD明细表转EXCEL
  10. linux安装包软件命令