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代码解析 的相关文章

  • RTKLIB ppp rtk_post

    1 实时ppp xff1a IGS MGEX数据处理中心的播发的实时轨道钟差产品 xff0c 结合广播星历 xff0c 实现实时定位 2 事后的 xff08 近似实时 xff09 xff1a 下载精密星历 钟差产品 xff0c 结合其他的精
  • deepsort代码解析

    DeepSort代码解析 项目地址 xff1a deepsort span class token keyword if span name span class token operator 61 61 span span class t
  • 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代码解析(文中有福利!!!)

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

    AR功能主要流程是 xff1a 先检测平面 xff0c 然后计算AR物体 xff08 box xff09 的各个顶点3d位置 xff0c 然后写程序把每个顶点投影到相平面 xff0c 用cv的多边形填充功能来绘制到照片上面 先求一个相机朝向
  • 学习rtklib

    数据下载 日期转换和一些常用数据下载 http www gnsscalendar com index html year 61 2019 多系统精密星历和精密钟差下载 2021年10月25日更新 xff1a 单GPS精密星历文件要在这里下载
  • PX4代码解析(2)

    前言 在大致了解PX4代码架构后 xff0c 我们需要了解PX4的通信机制 在PX4代码架构中 xff0c 每通信总线主要分为两个部分 xff0c 一是内部通信总线uORB 即PX4内部进程通信采用的协议 xff0c 例如PX4内部姿态控制
  • px4代码解析(3)

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

    一 前言 上一节介绍了PX4姿态估计调用函数的流程 xff0c 这一节分享一下我对PX4姿态解算的解读 首先 xff0c 要理解PX4姿态解算的程序 xff0c 要先从传感器的特性入手 xff0c 这里主要介绍的传感器有加速度计 xff0c
  • 【计算机网络】(五)拨号上网与宽带上网PPP,PPPoE,ADSL,FTTH(GPON)

    可见链接 https www zhihu com question 48988005 它们都是个人用户接入Ethernet的协议 小学的时候家里就是拨号上网的 xff0c 每次有人打电话到家里网就会断掉 xff0c 游戏就掉线 xff0c
  • ppp的chap认证完全配置

    网络环境 xff1a CHAP认证命令 xff1a cisco config interface s0 0 cisco config if encapsulation ppp cisco config if ppp authenticati
  • RTKlib PPP代码解析

    文章目录 ppposudstate pppudbias pppcorr measppp res 欢迎关注个人公众号 xff1a 导航员学习札记 我所基于的代码版本是RTKlib 2 4 3的一个拓展版本RTKexplore Demo5 xf
  • RTKLIB 中的天线相位缠绕误差修正

    之前一直没有细看精密定位 xff08 PPP xff09 中的相位缠绕 xff0c 不过我觉得还是应该至少从应用层面理解PPP中每项修正 因此抱着不求甚解的心情 xff08 没有仔细去研究右旋极化信号 偶极等概念 xff09 xff0c 只
  • 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 ppp rtk_post

    1 实时ppp xff1a IGS MGEX数据处理中心的播发的实时轨道钟差产品 xff0c 结合广播星历 xff0c 实现实时定位 2 事后的 xff08 近似实时 xff09 xff1a 下载精密星历 钟差产品 xff0c 结合其他的精
  • GNSS原理及技术(二)——卫星定位原理

    本篇以GPS为例介绍卫星定位原理 GPS技术原理 卫星信号 一 GPS的信号结构 每个GPS卫星播发一组信号 每组信号包括两个不同频率的载波信号 L1和L2 两个不同的测距码信号 C A码调制在L1载波上 P码或Y码同时调制在L1及L2载波
  • 方程组线性化方法和牛顿迭代法基础

    方程组线性化方法和牛顿迭代法基础 非线性方程组线性化和牛顿迭代法 参考书籍 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