文章目录

  • DCB概念
  • DCB文件下载
  • RTKLIB中的DCB修正
  • RTKLIB测试

DCB概念

由于卫星或接收机硬件延迟,导致不同信号的传播时间并不一致,从而产生了DCB(Differential Code Bias 差分码偏差)。DCB包括卫星端差分码偏差和接收机端差分码偏差,一般来说接收机端的DCB可以跟接收机钟差一起解算,被接收机钟差所吸收;而卫星端的DCB在精密定位中必须得到补偿。

DCB根据频率可以分为两种:

  • 频内偏差:相同频率不同码之间存在的偏差(如P1-C1、P2-C2等)
  • 频间偏差:不同频率之间存在的偏差(如P1-P2)

差分码偏差是影响电离层总电子含量(total electron content, TEC)监测和建模的主要误差源,忽略卫星和接收机DCB会导致TEC计算误差达到数十个纳秒。差分码偏差也直接影响利用伪距进行导航定位与授时的精度,其误差可达数米。因此,在电离层延迟估计、精密定位等应用中需要对DCB进行修正。

DCB文件下载

目前有两个两个机构为IGS(International GNSS Service)提供DCB产品,一是德国宇航中心(DLR),二是位于武汉的中国科学院大地测量与地球物理研究所(IGG)。IGG计算的卫星和站偏差(BSX文件)是每天生成的,延时为2-3天,包括以下信号;

目前, 这些文件被归档在CDDIS:https://cddis.nasa.gov/archive/gnss/products/bias/

RTKLIB中的DCB修正

读取DCB文件

我所使用的是RTKLIB b34版本,从源码可知,目前RTKLIB只支持GPS 和GLONASS部分信号的DCB修正,DCB参数放在 nav->cbias中。

/* read DCB parameters file --------------------------------------------------*/
static int readdcbf(const char *file, nav_t *nav, const sta_t *sta)
{FILE *fp;double cbias;char buff[256],str1[32],str2[32]="";int i,j,sat,type=0;trace(3,"readdcbf: file=%s\n",file);if (!(fp=fopen(file,"r"))) {trace(2,"dcb parameters file open error: %s\n",file);return 0;}while (fgets(buff,sizeof(buff),fp)) {if      (strstr(buff,"DIFFERENTIAL (P1-P2) CODE BIASES")) type=1;else if (strstr(buff,"DIFFERENTIAL (P1-C1) CODE BIASES")) type=2;else if (strstr(buff,"DIFFERENTIAL (P2-C2) CODE BIASES")) type=3;if (!type||sscanf(buff,"%s %s",str1,str2)<1) continue;if ((cbias=str2num(buff,26,9))==0.0) continue;if (sta&&(!strcmp(str1,"G")||!strcmp(str1,"R"))) { /* receiver DCB */for (i=0;i<MAXRCV;i++) {if (!strcmp(sta[i].name,str2)) break;}if (i<MAXRCV) {j=!strcmp(str1,"G")?0:1;nav->rbias[i][j][type-1]=cbias*1E-9*CLIGHT; /* ns -> m */}}else if ((sat=satid2no(str1))) { /* satellite dcb */nav->cbias[sat-1][type-1]=cbias*1E-9*CLIGHT; /* ns -> m */}}fclose(fp);return 1;
}

单点定位中的DCB修正
从源码可知,RTKLIB会将GPS和GLONASS的C1伪距信号通过DCB修正到P1,将C2伪距信号通过DCB修正到P2。由于GPS广播星历的卫星钟差参数以L1P(Y)和L2P(Y)消电离层组合为参考基准,所以不用再及进行P1、P2之间的的DCB修正。

如果没有DCB,可以使用TGD参数修正不同信号的延迟。与IGS提供的DCB产品相比,TGD参数精度不高且更新频次较低(如GPS TGD参数平均每4个月更新一次)。但由于TGD参数能够通过广播星历实时获取,因此可以用来提高实时定位精度。具体如何使用TGD对信号进行修正,可以参考每个卫星系统的ICD,里面写得比较清楚。

/* iono-free or "pseudo iono-free" pseudorange with code bias correction -----*/
static double prange(const obsd_t *obs, const nav_t *nav, const prcopt_t *opt,double *var)
{double P1,P2,gamma,b1,b2;int sat,sys;sat=obs->sat;sys=satsys(sat,NULL);P1=obs->P[0];P2=obs->P[1];*var=0.0;if (P1==0.0||(opt->ionoopt==IONOOPT_IFLC&&P2==0.0)) return 0.0;/* P1-C1,P2-C2 DCB correction */if (sys==SYS_GPS||sys==SYS_GLO) {if (obs->code[0]==CODE_L1C) P1+=nav->cbias[sat-1][1]; /* C1->P1 */if (obs->code[1]==CODE_L2C) P2+=nav->cbias[sat-1][2]; /* C2->P2 */}if (opt->ionoopt==IONOOPT_IFLC) { /* dual-frequency */if (sys==SYS_GPS||sys==SYS_QZS) { /* L1-L2,G1-G2 */gamma=SQR(FREQL1/FREQL2);return (P2-gamma*P1)/(1.0-gamma);}else if (sys==SYS_GLO) { /* G1-G2 */gamma=SQR(FREQ1_GLO/FREQ2_GLO);return (P2-gamma*P1)/(1.0-gamma);}else if (sys==SYS_GAL) { /* E1-E5b */gamma=SQR(FREQL1/FREQE5b);if (getseleph(SYS_GAL)) { /* F/NAV */P2-=gettgd(sat,nav,0)-gettgd(sat,nav,1); /* BGD_E5aE5b */}return (P2-gamma*P1)/(1.0-gamma);}else if (sys==SYS_CMP) { /* B1-B2 */gamma=SQR(((obs->code[0]==CODE_L2I)?FREQ1_CMP:FREQL1)/FREQ2_CMP);if      (obs->code[0]==CODE_L2I) b1=gettgd(sat,nav,0); /* TGD_B1I */else if (obs->code[0]==CODE_L1P) b1=gettgd(sat,nav,2); /* TGD_B1Cp */else b1=gettgd(sat,nav,2)+gettgd(sat,nav,4); /* TGD_B1Cp+ISC_B1Cd */b2=gettgd(sat,nav,1); /* TGD_B2I/B2bI (m) */return ((P2-gamma*P1)-(b2-gamma*b1))/(1.0-gamma);}else if (sys==SYS_IRN) { /* L5-S */gamma=SQR(FREQL5/FREQs);return (P2-gamma*P1)/(1.0-gamma);}}else { /* single-freq (L1/E1/B1) */*var=SQR(ERR_CBIAS);if (sys==SYS_GPS||sys==SYS_QZS) { /* L1 */b1=gettgd(sat,nav,0); /* TGD (m) */return P1-b1;}else if (sys==SYS_GLO) { /* G1 */gamma=SQR(FREQ1_GLO/FREQ2_GLO);b1=gettgd(sat,nav,0); /* -dtaun (m) */return P1-b1/(gamma-1.0);}else if (sys==SYS_GAL) { /* E1 */if (getseleph(SYS_GAL)) b1=gettgd(sat,nav,0); /* BGD_E1E5a */else                    b1=gettgd(sat,nav,1); /* BGD_E1E5b */return P1-b1;}else if (sys==SYS_CMP) { /* B1I/B1Cp/B1Cd */if      (obs->code[0]==CODE_L2I) b1=gettgd(sat,nav,0); /* TGD_B1I */else if (obs->code[0]==CODE_L1P) b1=gettgd(sat,nav,2); /* TGD_B1Cp */else b1=gettgd(sat,nav,2)+gettgd(sat,nav,4); /* TGD_B1Cp+ISC_B1Cd */return P1-b1;}else if (sys==SYS_IRN) { /* L5 */gamma=SQR(FREQs/FREQL5);b1=gettgd(sat,nav,0); /* TGD (m) */return P1-gamma*b1;}}return P1;
}

PPP中的DCB修正
在RTKLIB的PPP中,如果有SSR修正,则使用SSR修正中对伪距进行修正;如果没有SSR,则用DCB文件的修正参数进行修正。

/* antenna corrected measurements --------------------------------------------*/
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)
{double freq[NFREQ]={0},C1,C2;int i,ix=0,frq2, sys=satsys(obs->sat,NULL);for (i=0;i<NFREQ;i++) {L[i]=P[i]=0.0;/* skip if low SNR or missing observations */freq[i]=sat2freq(obs->sat,obs->code[i],nav);if (freq[i]==0.0||obs->L[i]==0.0||obs->P[i]==0.0) continue;if (testsnr(0,0,azel[1],obs->SNR[i]*SNR_UNIT,&opt->snrmask)) continue;/* antenna phase center and phase windup correction */L[i]=obs->L[i]*CLIGHT/freq[i]-dants[i]-dantr[i]-phw*CLIGHT/freq[i];P[i]=obs->P[i]       -dants[i]-dantr[i];if (opt->sateph==EPHOPT_SSRAPC||opt->sateph==EPHOPT_SSRCOM) {/* select SSR code correction based on code */if (sys==SYS_GPS)ix=(i==0?CODE_L1W-1:CODE_L2W-1);else if (sys==SYS_GLO)ix=(i==0?CODE_L1P-1:CODE_L2P-1);else if (sys==SYS_GAL)ix=(i==0?CODE_L1X-1:CODE_L7X-1);/* apply SSR correction */P[i]+=(nav->ssr[obs->sat-1].cbias[obs->code[i]-1]-nav->ssr[obs->sat-1].cbias[ix]);}else {   /* use P1-C1,P2-C2 code corrections from DCB file *//* P1-C1,P2-C2 dcb correction (C1->P1,C2->P2) */if (sys==SYS_GPS||sys==SYS_GLO) {if (obs->code[i]==CODE_L1C) P[i]+=nav->cbias[obs->sat-1][1];  /* C1->P1 */if (obs->code[i]==CODE_L2C||obs->code[i]==CODE_L2X||obs->code[i]==CODE_L2L||obs->code[i]==CODE_L2S) P[i]+=nav->cbias[obs->sat-1][2]; /* C2->P2 */}}}/* choose freqs for iono-free LC */*Lc=*Pc=0.0;frq2=L[1]==0?2:1;  /* if L[1]==0, try L[2] */if (freq[0]==0.0||freq[frq2]==0.0) return;C1= SQR(freq[0])/(SQR(freq[0])-SQR(freq[frq2]));C2=-SQR(freq[frq2])/(SQR(freq[0])-SQR(freq[frq2]));if (L[0]!=0.0&&L[frq2]!=0.0) *Lc=C1*L[0]+C2*L[frq2];if (P[0]!=0.0&&P[frq2]!=0.0) *Pc=C1*P[0]+C2*P[frq2];
}

RTKLIB测试

测试采用已知精密位置的CORS站数据。数据来源、RTKLIB配置和之前的PPP测试博客“RTKlib 后处理静态PPP性能分析测试”中基本一致。

测试中只用两个小时的GPS的数据,比较使用DCB文件和不使用DCB文件情况下,前向PPP精度。从下图中的定位结果来看,有DCB修正PPP收敛得比较平稳、比较快。

将前向PPP最后一个定位值与CORS站精确位置进行比较,ecef误差分别为:

  • 有DCB修正:-0.0230m, 0.1382m 0.0639m
  • 无DCB修正: -0.0212m 0.0980m 0.0744m

虽然看起有DCB修正的PPP显得还稍微差一丢丢,不过有无DCB最后PPP收敛的位置只差0.0018m, -0.0402m, 0.0105m,我觉得都在PPP的精度范围内,所以收敛后的定位精度其实是比较一致的

参考文献
[1] 吴竞, et al. “BDS-2 导航电文的 TGD 参数精度及其对用户导航定位精度的影响.” 天文学进展 37.03 (2019): 337-346.
[2] 王宁波, et al. “GPS 民用广播星历中 ISC 参数精度分析及其对导航定位的影响.” (2016).

DCB差分码偏差概念及应用(附RTKLIB测试对比结果)相关推荐

  1. GPS从入门到放弃(十五)、DCB差分码偏差

    一.概念 DCB(Differential Code Bias 差分码偏差)是全球卫星导航系统(GNSS)中,通过不同信号得到的观测值之间存在的系统性偏差.DCB是由卫星和接收机硬件延迟的影响造成的. ...

  2. GNSS差分码偏差(DCB)文件下载

    DCB文件下载 DCB文件主要提供机构: CODE(欧洲定轨中心) DLR(德国宇航中心) CAS(中科院测地所) GPS DCB CODE P1-C1 P1-P2 P2-C2 http://ftp. ...

  3. 织梦dedecms资源素材教程下载网站模板源码(带手机移动端)附安装教程

    织梦dedecms资源素材教程下载网站模板(带手机移动端) 1.把文件上传到你的站点的根目录,然后运行 http://你的域名/install/index.php 安装,根据提示填写好相关信息,点&q ...

  4. 二维码简介_二维码基本概念_二维码基本原理

    一.二维码简介_二维码基本概念_二维码基本原理 1.二维码又称二维条码,常见的二维码为QR Code,QR全称Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的Ba ...

  5. 最新云盘网盘PHP源码系统源码+对接云存储/附安装教程

    最新云盘网盘PHP源码系统源码+对接云存储/附安装教程 2022最新云盘网盘PHP系统源码,支持快速对接第三方云存储,支持七牛.又拍.阿里OSS.AWS S3.Onedrive.自建远程服务器,当然, ...

  6. 易想团购 注入 user.php,易想购物(easethink)存在sql注入漏洞,附利用测试POC

    漏洞概要 缺陷编号:WooYun-2013-022023 漏洞标题:易想购物(easethink)存在sql注入漏洞,附利用测试POC 相关厂商:易想购物 漏洞作者:lxsec 提交时间:2013-0 ...

  7. linux绝育玩客云_玩机技巧 篇二:玩客云实用指南(真·无痛绝育),附玩物下载对比...

    玩机技巧 篇二:玩客云实用指南(真·无痛绝育),附玩物下载对比 2019-12-10 15:52:41 408点赞 3771收藏 336评论 创作立场声明:看到站内有些关于玩客云❎绝育的帖子,补充一下 ...

  8. Fabric--链码的概念与使用

    链码的概念与使用 概念: Chaincode: 链上代码, 简称链码, 一般是指用户编写的应用代码 链码被部署在Fabric网络节点上, ​ Peer 节点 ​ – 背书节点 ​ – commit节点 ...

  9. PHP密码生成管理源码,php密码生成类(附源码)

    本节内容: 好用的php 密码生成类. 访代码实现的功能: 1,可设定密码长度. 2,可设定要生成的密码个数,批量生成. 3,可以指定密码的规则,字母,数字,特殊字符等. 1,密码生成类文件 Gene ...

  10. 央行新规收款码事件|还有人不知道收款码的概念?

    首先我们需要澄清几个概念: 「收款码」:指收钱的一方提供的二维码或条码(如微信右上角+号-收付款-二维码收款),付钱的一方扫这个码之后进行支付或转账. 注意上面这两条细则规定是专门针对「收款码」的规定 ...

最新文章

  1. 如何利用 Python 爬取 LOL 高清精美壁纸?
  2. 重磅风控干货:如何用数据分析监测交易欺诈
  3. windows下搭建go开发环境
  4. MyBatis中提示:invalid comparison: java.util.LinkedHashMap and java.lang.String
  5. Navicat120_premium_cs_x64
  6. python数据清洗代码_8段用于数据清洗Python代码(小结)
  7. x264_scan8分析
  8. 说下List接口下的那些类
  9. TypeError: create_target_machine() got an unexpected keyword argument ‘jitdebug‘解决方案
  10. 实验3 OpenGL几何变换
  11. Day6 数据清洗(2)
  12. 原生js 获取屏幕各种宽高的方法
  13. Java第三章(数组)
  14. 干了5年的前端,实在熬不动了...
  15. 点击图片播放音乐实现
  16. 移动端自动化测试appium(6)--搭建模拟器和真机环境
  17. Oracle--“ORA-28007: the password cannot be reused”解决
  18. tomcat HTTP与HTTPS同时开启并且同时可以访问
  19. 使用gcore工具产生core文件而不杀死进程
  20. 不得不说,还是这款开源工作流表单设计器较合心意!

热门文章

  1. 深度学习面试题集锦【1】
  2. Linux下用dd命令测试硬盘的读写速度
  3. 有了HTML5,Flash还能走多远?
  4. Flash Programer 给CC2530下载Hex文件 error解决办法 汇总
  5. 基于matlab直方图均衡,matlab 直方图均衡实验报告.pdf
  6. CUDA10.0网盘下载
  7. 废旧手机变身服务器,打造私人云盘
  8. 【论文撰写和程序员常用软件】
  9. igs无法分配驱动器映射表_CAD图纸字体不全怎么办?只要修改字体映射表就可以轻松解决了...
  10. PSF 点扩展函数 (from WikiPedia)