RTKlib PPP代码解析

2023-05-16

文章目录

    • pppos
    • udstate_ppp
    • udbias_ppp
    • corr_meas
    • ppp_res

欢迎关注个人公众号:导航员学习札记

我所基于的代码版本是RTKlib 2.4.3的一个拓展版本RTKexplore Demo5,这个版本主要针对低成本的GNSS进行了一些改进完善。

pppos

extern void pppos(rtk_t *rtk, const obsd_t *obs, int n, const nav_t *nav)
  • 所在文件:ppp.c
  • 功能说明:PPP处理
  • 参数说明
 args: 		 IO    rtk_t *rtk			rtk solution structure
			 I     const obsd_t *obs	当前历元观测值
			 I     int n 				当前移动站观测值数目
			 I     const nav_t *nav     星历 
  • 调用关系
Created with Raphaël 2.3.0 pppos udstate_ppp satposs testeclipse(配置可选) tidedisp(配置可选) filter ppp_res ppp_ar update_stat End
  • 处理过程
  1. 调用udstate_ppp函数进行卡尔曼滤波的一步预测;
  2. 调用satposs函数计算卫星位置;
  3. 如果在配置中选择排除block IIA卫星,调用testeclipse函数,将这些卫星的位置、速度置0;
  4. 如果在配置中选择潮汐修正,调用tidedisp函数进行潮汐修正;
  5. 调用ppp_res函数计算预测值与量测值之间的残差;
  6. 待用filter函数进行卡尔曼滤波的量测更新;
  7. 调用ppp_res函数计算量测更新后的残差;
  8. 调用ppp_ar进行整周模糊度结算,并调用ppp_res进行残差计算;
  9. 调用update_stat更新输入、输出参数rtk solution的状态
  • 注意事项
  1. 需要注意的是,步骤8中ppp_ar是个空函数,返回值为0,因此实际后面的ppp_res函数也不会被调用。如此来看,实际PPP的解为通过卡尔曼滤波得到的浮点解。
  2. satposs和相对定位中的函数一致,不再进行解析,可参考RTKLIB源码解析——单点定位

udstate_ppp

static void udstate_ppp(rtk_t *rtk, const obsd_t *obs, int n, const nav_t *nav)
  • 所在文件:ppp.c
  • 功能说明:进行卡尔曼滤波的一步预测,更新rtk->x状态量值
  • 参数说明
 args: 		 IO    rtk_t *rtk			rtk solution structure
			 I     const obsd_t *obs	当前历元观测值
			 I     int n 				当前移动站观测值数目
			 I     const nav_t *nav     星历 
  • 调用关系
Created with Raphaël 2.3.0 udstate_ppp udpos_ppp udclk_ppp udtrop_ppp(配置可选) udiono_ppp(配置可选) udbias_ppp End
  • 处理过程
  1. 调用udpos_ppp函数位置、速度、加速度状态量 rtk->x以及相应协方差阵 rtk->P的更新;
  2. 调用udclk_ppp函数,更新钟差状态量(以gpst为基准);
  3. 如果在配置中选择的对流层模型为ZTD estimation或者ZTD+grad estimation,调用udtrop_ppp进行对流层参数状态量的更新;
  4. 如果在配置中选择电离层模型为estimation,调用udiono_ppp函数,更新电离层误差参数状态量;
  5. 如果选择的频率数>=3,则进行L5 dcb状态量的更新;
  6. 调用udbias_ppp函数进行相位bias状态量的更新。
  • 注意事项
  1. 参考RTklib manual 来看,PPP算法中使用的量测量为“无电离层组合的伪距、载波相位”,所以配置中可以将电离层模型选择为“Iono free LC”。通过参考RTKexplorer博客Exploring kinematic single-receiver solutions with RTKLIB and the u-blox F9P. 中的配置,对流层模型应该至少配置为ZTD estimation。我在之后的博客中会测试一下不同的PPP配置对精度有多大的影响。
  2. 参考 RTKLIB Manual 可知状态量包括位置、速度、接收机钟差、对流层参数、卫星相位偏差;
  3. udpos_ppp、udtrop_ppp、udiono_ppp函数与之前相对定位中udpos、udtrop、udion函数流程基本一致,就不再详细解释,具体可参考RTKlib相对定位源码解析: udstate函数。由于udbias_ppp和相对定位中不同,因此在下文中进行解析。

udbias_ppp

static void udbias_ppp(rtk_t *rtk, const obsd_t *obs, int n, const nav_t *nav)
  • 所在文件:ppp.c
  • 功能说明:进行相位偏差状态量和协方差阵的一步预测
  • 参数说明
 args: 		 IO    rtk_t *rtk			rtk solution structure
			 I     const obsd_t *obs	当前历元观测值
			 I     int n 				当前移动站观测值数目
			 I     const nav_t *nav     星历 
  • 处理过程
  1. 首先是对所有共视星进行周跳检测:调用了detslp_ll函数,根据LLI来判断基站和移动站周跳;然后调用detslp_gf利用几何无关组合进行周跳检测;最后调用了detslp_gf_mw函数进行周跳检测。对RTKlib的周跳检测函数,我专门写了一篇博客解析RTKlib源码解析:ppp和rtkpost中的周跳检测函数
  2. 对所有卫星进行循环,判断是否需要重置单差相位偏移状态量。如果所配置的AR的模式为instantaneous(实际由于当前PPP中使用的是浮点解,通常将PPP的AR配置为OFF),或者卫星载波相位的中断次数大于配置中所设置的最大次数,则将单差相位偏移状态量重置为0;
  3. 对每一组观测数据,调用 corr_meas函数对伪距、载波相位进行修正,并计算无电离层组合的伪距、载波相位量测量Pc和Lc;
  4. 将每颗卫星的载波相位偏差bias初始化为0,如果电离层模型为电离层无关模型,则直接计算bias[i]=Lc-Pc;否则的话,通过伪距计算电离层延迟ion=(obs[i].P[0]-obs[i].P[l])/(1.0-SQR(lam[l]/lam[0]));由于L1和L2伪距相减后,只剩下L1和L2的电离层误差之差,以及伪距噪声项,因此由此计算出来的电离层误差实际包含了伪距噪声,误差相对较大。利用修正电离层误差后的伪距和载波相位之差计算bias: bias[i]=L[f]-P[f]+2.0ionSQR(lam[f]/lam[0]);
  5. 计算每颗卫星的bias与载波相位偏差状态量rtk->x之间的偏差offset之和;
  6. 在原有的载波相位偏差状态量上加上offset的平均值,以此来作为载波相位偏差一步预测值:rtk->x[j]+=offset/k;
    7.对每颗卫星循环,更新一步预测协方差阵,对有周跳的卫星、或者没有初始化载波相位偏差状态量的卫星,用之前计算的bias值重新初始化载波相位偏差状态量。

corr_meas

static void corr_meas(const obsd_t *obs, const nav_t *nav, const double *azel,
                      const prcopt_t *opt, const double *dantr,
                      const double *dants, double phw, double *L, double *P,
                      double *Lc, double *Pc)
  • 所在文件:ppp.c
  • 功能说明:计算经过接收机天线修正、相位缠绕校正、SSR修正或者dcb 修正后的伪距、载波相位量测量,并计算无电离层组合的伪距、载波相位值Lc,Pc
  • 参数说明
 args: 		 I     const obsd_t *obs	当前历元观测值
			 I     const nav_t *nav 	星历
			 I     const double *azel 	方位角和俯仰角 (rad)
			 I	   const prcopt_t *opt  处理选项
			 I     const double *dantr  接收机天线校正值
			 I     const double *dants  卫星天线校正值
			 I     double   phw        相位缠绕校正值
			 O     double *L           修正后的载波相位
			 O     double *P           修正后的伪距值
			 O	   double *Lc          无电离层组合的载波相位值
			 O     double *Pc          无电离层组合的伪距值 
  • 处理过程
  1. 调用 testsnr函数检查观测值的信噪比是否大于mask;
  2. 对伪距天线修正、相位缠绕校正,对载波相位进行天线修正;
  3. 如果星历类型是broadcast + SSR_APC或者broadcast + SSR_COM,对伪距值进行ssr 修正;如果是其他星历类型,进行 DCB 校正;
  4. 计算无电离层组合的伪距、载波相位值Lc,Pc

ppp_res

static int ppp_res(int post, const obsd_t *obs, int n, const double *rs,
                   const double *dts, const double *var_rs, const int *svh,
                   const double *dr, int *exc, const nav_t *nav,
                   const double *x, rtk_t *rtk, double *v, double *H, double *R,
                   double *azel)
  • 所在文件:ppp.c
  • 功能说明:计算载波相位和伪距残差
  • 参数说明
 args: 		 I     int post             是否是修正后残差计算标志
 			 I     const obsd_t *obs	当前历元观测值
 			 I     int n                当前移动站观测值数目
             I     const double *dts    卫星钟差
             I     const double *var_rs 星位置和钟差的协方差
             I     const int *svh       卫星健康标志
             I     const double *dr     地球潮汐位移
             IO    int *exc             卫星排除标志
			 I     const nav_t *nav 	星历
			 IO    const double *x      状态量
			 IO    rtk_t *rtk			rtk solution structure
			 IO    double *v            载波相位和伪距残差
			 IO    double *H            卡尔曼滤波中的观测矩阵
			 IO    double *R            测量误差的协方差矩阵
			 I     const double *azel 	方位角和俯仰角 (rad) 
  • 处理过程
  1. 把卫星的有效标志位均置0,rtk->ssat[i].vsat[j]=0;
  2. 在一步预测值x[i]基础上加上潮汐修正,作为移动站位置:rr[i]=x[i]+dr[i];
  3. 对每颗星进行循环,根据移动站位置,计算卫星仰角,如果小于设定阈值,排除该卫星,并且检查该卫星系统、单点定位卫星有效标志、是否在设置中排除,重置排除标志:exc[i]=1;
  4. 调用model_trop函数计算对流层误差dtrp,调用model_iono函数计算电离层误差dion;
  5. 调用satantpcv函数计算卫星天线校正参数dants;调用antmodel函数计算根据接收机天线的相位中心参数计算天线偏移量dantr,该函数在此博客曾进行解析;
  6. 调用model_phw函数计算相位缠绕校正值rtk->ssat[sat-1].phw;
  7. 调用corr_meas函数对伪距和载波相位进行修正,得到量测量;
  8. 计算量测矩阵H和残差v,相位残差存放在 rtk->ssat[sat-1].resc中,伪距残差在rtk->ssat[sat-1].resp中;
  9. 综合考虑伪距(载波相位)噪声、对流层噪声、电离层噪声、卫星位置钟差噪声后,作为量测噪声;如果是GLONASS卫星,在伪距量测噪声上,还要加上IFB噪声(频间差噪声);
  10. 如果是 pre-fit,即!post的情况,如果某颗残差值大于阈值,将这颗星排除;
  11. 如果post为1,某颗残差值大于阈值,将这颗星记录下来;整个循环结束;
  12. 如果post为1,找到11步中残差值最大的那颗星,将其排除。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RTKlib PPP代码解析 的相关文章

  • TensorRT量化工具pytorch_quantization代码解析(二)

    后续继续补充 xff01 继续看张量量化函数 xff0c 代码位于 xff1a tools pytorch quantization pytorch quantization tensor quant py ScaledQuantDescr
  • TensorRT量化工具pytorch_quantization代码解析(四)

    继续看pytorch quantiation calib 中Calibrator类 xff0c 代码位于 xff1a tools pytorch quantization pytorch quantization calib 其作用 xff
  • PX4代码解析:振动分析

    本篇文章首发于公众号 xff1a 无人机系统技术 更多无人机技术相关文章请关注此公众号 一 前言 前面的文章主要都是一些理论知识为主 xff0c 很多读者朋友看了之后可能会有点枯燥 xff0c 里面很多公式看起来也比较晦涩 xff0c 今天
  • 位置控制器PX4代码解析(文中有福利!!!)

    号外号外 xff01 xff01 xff01 本公众号将联合电子工业出版社于9月11号送出15本价值98元的全权老师著作 多旋翼飞行器设计与控制 xff0c 关注本公众号的朋友均可参加 xff0c 敬请期待 还没关注的朋友赶紧关注吧 xff
  • EGO Planner代码解析bspline_optimizer部分(3)

    1 int BsplineOptimizer earlyExit void func data const double x const double g const double fx const double xnorm const d
  • PX4代码解析(1)

    前言 做pixhawk飞控有一段时间了 xff0c 但在学习过程中遇到许多困难 xff0c 目前网上找不到比较完整的PX4学习笔记 xff0c 我打算结合自己理解 xff0c 写写自己对PX4源码的理解 xff0c 不一定对 xff0c 只
  • px4代码解析(3)

    前言 在使用PX4飞控时 xff0c 我们难免要对其进行二次开发 xff0c 例如修改控制算法 xff0c 添加新的传感器 xff0c 这时需要在代码中定义属于自己的消息 本节主要分享一下如何在PX4代码中添加自己的消息 一 消息添加与配置
  • PX4代码解析(4)

    一 引言 PX4程序是基于实时操作系统 xff08 Real time operating system RTOS xff09 的上层应用程序 xff0c PX4飞控程序的很多重要模块都是在Nuttx操作系统的调度下运行的 因此 xff0c
  • PX4代码解析(5)

    一 前言 我所讨论的PX4代码是基于v1 11版本 xff0c 该版本与之前的版本有不少不同 xff0c 其中一个比较大的区别在于新版本大部分用到了C 43 43 中模板 xff0c 使得代码没有以前那么容易理解 xff0c 因此我在后面介
  • RTKLIB简介

    RTKLIB是全球导航卫星系统GNSS global navigation satellite system 的标准 amp 精密定位开源程序包 xff0c RTKLIB由日本东京海洋大学 xff08 Tokyo University of
  • RTKlib源码解析:ppp和rtkpost中的周跳检测函数

    文章目录 前言detslp mwdetslp gfdetslp lldetslp dop 欢迎关注个人公众号 xff1a 导航员学习札记 前言 本文解析了RTKlib ppp c中两个周跳检测函数detslp mw和detslp gf xf
  • stm32驱动NRF24L01_原理+代码解析

    目录 概念 废话篇 xff08 24L01简介 xff09 引脚分配 工作模式 通信地址理解 xff08 个人疑难点 xff09 原理分析 寄存器赏析 寄存器操作指令 配置寄存器 xff08 CONFIG xff0c 位置 xff1a 0X
  • RTKLIB之RTKRCV

    1 options file option file can be saved from rtknavi exe modify the options file to fit for ubuntu system remember to ch
  • RTKLIB源码及介绍

    目录 1 官网翻译 2 文件下载 1 官网翻译 RTKLIB xff1a 用于 GNSS 定位的开源程序包 下载 版本 日期 适用于 Windows 的二进制 AP 包 带有源程序的完整包 0 2 0 2006 12 16 rtklib 0
  • RTKLIB软件介绍

    转载自南京信息工程大学遥感与测绘工程学院的赵乐文老师的网课 xff08 来源 xff1a B站 xff09 开源GNSS数据处理软件介绍 RTKLIB下载 xff1a http www rtklib comCSDN里的资源 xff1a 快速
  • RTKLIB ppp rtk_post

    1 实时ppp xff1a IGS MGEX数据处理中心的播发的实时轨道钟差产品 xff0c 结合广播星历 xff0c 实现实时定位 2 事后的 xff08 近似实时 xff09 xff1a 下载精密星历 钟差产品 xff0c 结合其他的精
  • 【HUAWEI】PPP&PPPoE配合Radius认证配置案例

    背景 对于在一个大的园区网 要保证接入的安全性和合法性 有许多种手段 对于到端的接入用户 可以使用802 1X 对于移动办公人员 可以使用SSL 可以配合使用IPS 防火墙 上网行为管理等手段 不过 对于网关分布的网络呢 或者说 公司合并
  • 方程组线性化方法和牛顿迭代法基础

    方程组线性化方法和牛顿迭代法基础 非线性方程组线性化和牛顿迭代法 参考书籍 GPS原理与接收机设计 谢钢 非线性方程 就是因变量与自变量之间的关系不是线性的关系 这类方程很多 例如平方关系 对数关系 指数关系 三角函数等等 求解此类方程往往
  • 一文看懂PPP协议——PPP协议简介

    今天给大家介绍一下PPP协议的相关内容 文章浅显易懂 特别适合0基础同学 本文主将主要从PPP概述 PPP链路建立过程和PPP认证三个角度对PPP协议进行讲解 一 PPP概述 PPP point to point协议 即点对点协议 是数据链
  • PPP 或以太网如何从错误中恢复?

    查看数据链路级标准 例如 PPP通用帧格式 http www tcpipguide com free t PPPGeneralFrameFormat htm or Ethernet http en wikipedia org wiki Et

随机推荐

  • stm32 FreeRTOS中如何创建任务

    include 34 config h 34 include 34 global h 34 include 34 stdio h 34 include 34 PC h 34 include 34 FreeRTOS h 34 include
  • 串口HAL库函数

    HAL StatusTypeDef HAL UART Transmit UART HandleTypeDef huart uint8 t pData uint16 t Size uint32 t Timeout 串口发送 xff1b 发送指
  • KEIL 那些编辑技巧与方法

    来源 xff1a 公众号 鱼鹰谈单片机 作者 xff1a 鱼鹰Osprey ID xff1a emOsprey 本篇笔记介绍一些鱼鹰常用的 KEIL 编辑方法与技巧 xff0c 用于加快编辑速度 当然了 xff0c 很多人现在更多的是使用
  • PotPlayer优化与最高画质设置(最强本地播放器)

    一 前言 软件 xff1a PotPlayer 描述 xff1a 被誉为本地视频最好用的播放器 xff01 PotPlayer下载地址参考 xff1a https potplayer org 推荐Potplayer论坛 xff1a http
  • Arduino结构体变量使用

    Arduino结构体变量使用 x1f4dd 示例程序 span class token comment 本文使用arduino nano span span class token comment 声明 B span span class
  • 51单片机自定义串口通讯协议控制流水灯+Proteus仿真

    51单片机自定义串口通讯协议控制流水灯 Proteus仿真 Proteus仿真演示 注意不要使用Proteus 8 Professional 8 13版本串口通信会出错 需要利用虚拟串口工具提前创建2个虚拟串口 Proteus里面AT89C
  • Arduino struct结构体定义和使用方法详解

    Arduino struct结构体定义和使用方法 1 直接使用struct定义 示例 span class token keyword struct span span class token class name People span
  • 锂电池基于DW01组成的过充电、过放、短路保护电路

    锂电池基于DW01组成的过充电 过放 短路保护电路 原理图 该电路主要由锂电池保护专用集成电路 xff24 xff37 xff10 xff11 xff0c 充 放电控制MOSFET xff08 内含两只 xff2e 沟道 xff2d xff
  • STM32F103基于标准库开发串口中断接收数据环形队列例程

    STM32F103基于标准库开发串口中断接收数据环形队列例程 本示例源码来源于野火 STM32库开发实战指南 xff0c 是一个值得学习借鉴的资源 x1f4d1 一个完整的串口数据包通讯协议一般包含 xff1a 帧头 地址信息 数据类型 数
  • 基于STM32CubeIDE HAL库利用基本定时器实现串口接收不定长数据

    基于STM32CubeIDE HAL库利用基本定时器实现串口接收不定长数据 申明 xff1a 本文章仅发表在CSDN网站 xff0c 任何其他网见此内容均为盗链和爬取 xff0c 请多多尊重和支持原创 x1f341 对于文中所提供的相关资源
  • idea重构手法

    idea重构手法 四键齐发 xff1a ctrl 43 alt 43 shift 43 T 修改方法名 xff1a shift 43 F6修改方法参数 xff1a Ctrl 43 F6提取常量 xff1a Ctrl 43 Alt 43 C提
  • Linux下实现http的Get方法

    Linux如何实现http的GET数据方法 下载curl库源码 https curl se download html Linux编译 make拷贝库文件 xff0c 目录 curl 7 83 0 lib libs 下 libcurl so
  • 一篇关于GPS定位写得最详实清晰的文章之一

    一篇关于GPS定位写得最详实清晰的文章之一 介绍篇 过去 xff0c 如果你的女友是个路痴 xff0c 大概会有这样的对话 你在哪儿呢 xff1f 啊 xff1f 我在马路上啊 有什么特征 xff1f 头顶有个月亮 你旁边有什么啊 xff1
  • 基于HAL库STM32串口驱动不定长数据接收

    STM32串口驱动不定长数据接收带环形缓冲区 最新框架代码使用方法源码串口接口文件环形缓冲区接口文件 移植图示 使用涉及4个文件 xff0c UART Port c UART Port h CircularQueue h CircularQ
  • OptiTrack---Motive简单使用导出groundtruth

    文章目录 Motive介绍1 详细介绍 Motive使用1 详细使用2 简单使用导出groundtruth 1 首先安装Motive 2 启动Motive 3 建立body xff0c 进行录制 4 对结果进行保存 Motive介绍 1 详
  • 使用U盘安装Ubuntu20.04

    背景 今天自己鼓捣小电脑 xff0c 卖家发过来的时候已经按要求预装了Ubuntu20 04 xff0c 我想改一下卖家起的用户名 也许是计算机名 xff0c 分不太清 xff0c 结果搞的电脑输入密码却进不了桌面 xff0c 最终决定重装
  • 【ROS基础】rviz打开后如何显示实时2D地图

    1 背景 launch 了一个建图程序 xff0c 并打开了 rviz xff0c rviz 中也 add 了 map xff0c 但是 rviz 中并未出现期望的2D地图 xff0c 让人很是手足无措 2 问题解决 百度了才发现自己使用的
  • RTKlib源码解析:ppp和rtkpost中的周跳检测函数

    文章目录 前言detslp mwdetslp gfdetslp lldetslp dop 欢迎关注个人公众号 xff1a 导航员学习札记 前言 本文解析了RTKlib ppp c中两个周跳检测函数detslp mw和detslp gf xf
  • RTKlib相对定位源码解析:resamb_LAMBDA (整周模糊度求解)

    本文对resamb LAMBDA函数 xff0c 以及其中的ddmat restamb函数进行了解析 由于其中的lambda函数在参考论文中都给出了详细推导和计算步骤 xff0c 因此没有解析 lambda函数参考论文 xff1a 1 P
  • RTKlib PPP代码解析

    文章目录 ppposudstate pppudbias pppcorr measppp res 欢迎关注个人公众号 xff1a 导航员学习札记 我所基于的代码版本是RTKlib 2 4 3的一个拓展版本RTKexplore Demo5 xf