RTKLib源码

2023-12-21 20:20
文章标签 源码 rtklib

本文主要是介绍RTKLib源码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

源码解读,自己总结,自己看看

1 代码整体框架

1.1 RTK算法结构体

1.1.1 rtklib.h 头文件

该头文件定义了所使用到的常量、结构体、函数声明等,在其他源代码中均有使用

rnx2rtkp.c等有使用

关于PI的定义,弧度转化等

结构体的定义

函数声明

1.1.2 gtime_t  结构体  时间结构

typedef struct {       
    time_t time;        /*(秒)有符号 64 位整数数据类型*/
    double sec;         /* 时间的(秒)小数部分*/
} gtime_t;  

1.1.3 obsd_t  

用来存储某个历元中的某个卫星的观测值

typedef struct {        
    gtime_t time;       /* 接收机所用时间 */
    unsigned char sat,rcv; 
    unsigned char SNR [NFREQ+NEXOBS]; /* 信噪比,信号强度*/
    unsigned char LLI [NFREQ+NEXOBS]; /* loss of lock indicator */
    unsigned char code[NFREQ+NEXOBS]; /* code indicator (CODE_???) 卫星编码*/
    double L[NFREQ+NEXOBS]; /* observation data carrier-phase (cycle)  载波*/
    double P[NFREQ+NEXOBS]; /* observation data pseudorange (m) 伪距*/
    float  D[NFREQ+NEXOBS]; /* observation data doppler frequency (Hz) 多普勒*/
} obsd_t;

CODE 卫星编码,rtklib将GPS/GLONASS/BDS等卫星统一进行的编码

1.1.4 obs_t 结构体

该结构体存储的是所有的观测值数据。与上面的"obsd_t"呼应

typedef struct {       
    int n,nmax;         /* number of obervation data/allocated */
    obsd_t *data;       /* observation data records */
} obs_t;

n代表实际存储的观测值结构体的个数,nmax代表的是最多存储多少个观测值结构体,如果超过最大个数,需要重新开辟内存空间。

1.1.5  nav_t 星历数据结构体

存全部的星历数据,历书数据、精密星历、TEC格网、广播星历电离层参数、DGPS、SSR改正等信息

typedef struct {        /* navigation data type */int n,nmax;         /* number of broadcast ephemeris */int ng,ngmax;       /* number of glonass ephemeris */int ns,nsmax;       /* number of sbas ephemeris */int ne,nemax;       /* number of precise ephemeris */int nc,ncmax;       /* number of precise clock */int na,namax;       /* number of almanac data */int nt,ntmax;       /* number of tec grid data */int nn,nnmax;       /* number of stec grid data */eph_t *eph;         /* GPS/QZS/GAL ephemeris */geph_t *geph;       /* GLONASS ephemeris */seph_t *seph;       /* SBAS ephemeris */peph_t *peph;       /* precise ephemeris */pclk_t *pclk;       /* precise clock */alm_t *alm;         /* almanac data */tec_t *tec;         /* tec grid data */stec_t *stec;       /* stec grid data */erp_t  erp;         /* earth rotation parameters */double utc_gps[4];  /* GPS delta-UTC parameters {A0,A1,T,W} */double utc_glo[4];  /* GLONASS UTC GPS time parameters */double utc_gal[4];  /* Galileo UTC GPS time parameters */double utc_qzs[4];  /* QZS UTC GPS time parameters */double utc_cmp[4];  /* BeiDou UTC parameters */double utc_sbs[4];  /* SBAS UTC parameters */double ion_gps[8];  /* GPS iono model parameters {a0,a1,a2,a3,b0,b1,b2,b3} */double ion_gal[4];  /* Galileo iono model parameters {ai0,ai1,ai2,0} */double ion_qzs[8];  /* QZSS iono model parameters {a0,a1,a2,a3,b0,b1,b2,b3} */double ion_cmp[8];  /* BeiDou iono model parameters {a0,a1,a2,a3,b0,b1,b2,b3} */int leaps;          /* leap seconds (s) */double lam[MAXSAT][NFREQ]; /* carrier wave lengths (m) */double cbias[MAXSAT][3];   /* code bias (0:p1-p2,1:p1-c1,2:p2-c2) (m) */double wlbias[MAXSAT];     /* wide-lane bias (cycle) */double glo_cpbias[4];    /* glonass code-phase bias {1C,1P,2C,2P} (m) */char glo_fcn[MAXPRNGLO+1]; /* glonass frequency channel number + 8 */pcv_t pcvs[MAXSAT]; /* satellite antenna pcv */sbssat_t sbssat;    /* SBAS satellite corrections */sbsion_t sbsion[MAXBAND+1]; /* SBAS ionosphere corrections */dgps_t dgps[MAXSAT]; /* DGPS corrections */ssr_t ssr[MAXSAT];  /* SSR corrections */lexeph_t lexeph[MAXSAT]; /* LEX ephemeris */lexion_t lexion;    /* LEX ionosphere correction */
} nav_t;//所有星历总的结构体

1.1.6 sol_t:结果结构体

定位/解算结果的参数

typedef struct {        gtime_t time;       //GPST时间double rr[6];       /* 位置、速度结果 (m|m/s) *//* {x,y,z,vx,vy,vz} or {e,n,u,ve,vn,vu} */float  qr[6];       /* 位置估计协方差阵 (m^2) *//* {c_xx,c_yy,c_zz,c_xy,c_yz,c_zx} or *//* {c_ee,c_nn,c_uu,c_en,c_nu,c_ue} */float  qv[6];       /* 速度估计协方差阵 (m^2/s^2) */double dtr[6];      /* receiver clock bias to time systems (s) */uint8_t type;       /* type (0:xyz-ecef,1:enu-baseline) */uint8_t stat;       /* solution status (SOLQ_???) */uint8_t ns;         //有效卫星数float age;          //差分龄期float ratio;        //模糊度固定Ratio值float thres;        //模糊度固定的Ratio阈值
} sol_t;

SOLQ 参数,定位模式的选择,解的类型状态

1.1.7 eph_t

存储了卫星星历中的卫星参数,主要是开普勒参数

typedef struct {        /* GPS/QZS/GAL broadcast ephemeris type */int sat;            /* satellite number */int iode,iodc;      /* IODE,IODC */int sva;            /* SV accuracy (URA index) */int svh;            /* SV health (0:ok) */int week;           /* GPS/QZS: gps week, GAL: galileo week */int code;           /* GPS/QZS: code on L2, GAL/CMP: data sources */int flag;           /* GPS/QZS: L2 P data flag, CMP: nav type */gtime_t toe,toc,ttr; /* Toe,Toc,T_trans *//* SV orbit parameters */double A,e,i0,OMG0,omg,M0,deln,OMGd,idot;double crc,crs,cuc,cus,cic,cis;double toes;        /* Toe (s) in week */double fit;         /* fit interval (h) */double f0,f1,f2;    /* SV clock parameters (af0,af1,af2) */double tgd[4];      /* group delay parameters *//* GPS/QZS:tgd[0]=TGD *//* GAL    :tgd[0]=BGD E5a/E1,tgd[1]=BGD E5b/E1 *//* CMP    :tgd[0]=BGD1,tgd[1]=BGD2 */double Adot,ndot;   /* Adot,ndot for CNAV */
} eph_t;

1.1.8 prcopt_t 配置存储

算法处理选项结构体

typedef struct {        /* processing options type  处理类型 */int mode;           /* positioning mode (PMODE_???)  单点定位/基线啥的 处理类型 */int soltype;        /* solution type (0:forward 前向,1:backward 后向,2:combined 都有) */int nf;             /* number of frequencies (1:L1,2:L1+L2,3:L1+L2+L5) 处理频率*/int navsys;         /* navigation system */double elmin;       /* elevation mask angle (rad) 高度截至角 */snrmask_t snrmask;  /* SNR mask 信噪比*/int sateph;         /* satellite ephemeris/clock (EPHOPT_???) 星历的配置*/int modear;         /* AR mode (0:off,1:continuous,2:instantaneous,3:fix and hold,4:ppp-ar) 模糊度固定模式*/int glomodear;      /* GLONASS AR mode (0:off,1:on,2:auto cal,3:ext cal) */int bdsmodear;      /* BeiDou AR mode (0:off,1:on) */int maxout;         /* obs outage count to reset bias */int minlock;        /* min lock count to fix ambiguity */int minfix;         /* min fix count to hold ambiguity */int ionoopt;        /* ionosphere option (IONOOPT_???) */int tropopt;        /* troposphere option (TROPOPT_???) */int dynamics;       /* dynamics model (0:none,1:velociy,2:accel) */int tidecorr;       /* earth tide correction (0:off,1:solid,2:solid+otl+pole) */int niter;          /* number of filter iteration */int codesmooth;     /* code smoothing window size (0:none) */int intpref;        /* interpolate reference obs (for post mission) */int sbascorr;       /* SBAS correction options */int sbassatsel;     /* SBAS satellite selection (0:all) */int rovpos;         /* rover position for fixed mode */int refpos;         /* base position for relative mode *//* (0:pos in prcopt,  1:average of single pos, *//*  2:read from file, 3:rinex header, 4:rtcm pos) */double eratio[NFREQ]; /* code/phase error ratio */double err[5];      /* measurement error factor *//* [0]:reserved *//* [1-3]:error factor a/b/c of phase (m) *//* [4]:doppler frequency (hz) */double std[3];      /* initial-state std [0]bias,[1]iono [2]trop */double prn[5];      /* process-noise std [0]bias,[1]iono [2]trop [3]acch [4]accv */double sclkstab;    /* satellite clock stability (sec/sec) */double thresar[4];  /* AR validation threshold */double elmaskar;    /* elevation mask of AR for rising satellite (deg) */double elmaskhold;  /* elevation mask to hold ambiguity (deg) */double thresslip;   /* slip threshold of geometry-free phase (m) */double maxtdiff;    /* max difference of time (sec) */double maxinno;     /* reject threshold of innovation (m) */double maxgdop;     /* reject threshold of gdop */double baseline[2]; /* baseline length constraint {const,sigma} (m) */double ru[3];       /* rover position for fixed mode {x,y,z} (ecef) (m) */double rb[3];       /* base position for relative mode {x,y,z} (ecef) (m) */char anttype[2][MAXANT]; /* antenna types {rover,base} */double antdel[2][3]; /* antenna delta {{rov_e,rov_n,rov_u},{ref_e,ref_n,ref_u}} */pcv_t pcvr[2];      /* receiver antenna parameters {rov,base} */unsigned char exsats[MAXSAT]; /* excluded satellites (1:excluded,2:included) */char rnxopt[2][256]; /* rinex options {rover,base} */int  posopt[6];     /* positioning options */int  syncsol;       /* solution sync mode (0:off,1:on) */double odisp[2][6*11]; /* ocean tide loading parameters {rov,base} */exterr_t exterr;    /* extended receiver error model */
} prcopt_t;

1.1.9 输出文件结构体

设置输出结果的格式

typedef struct {        /* solution options type 输出文件类型,例如有哪些要输出、用哪个椭球体*/int posf;           /* solution format (SOLF_???) */int times;          /* time system (TIMES_???) */int timef;          /* time format (0:sssss.s,1:yyyy/mm/dd hh:mm:ss.s) */int timeu;          /* time digits under decimal point */int degf;           /* latitude/longitude format (0:ddd.ddd,1:ddd mm ss) */int outhead;        /* output header (0:no,1:yes) */int outopt;         /* output processing options (0:no,1:yes) */int datum;          /* datum (0:WGS84,1:Tokyo) */int height;         /* height (0:ellipsoidal,1:geodetic) */int geoid;          /* geoid model (0:EGM96,1:JGD2000) */int solstatic;      /* solution of static mode (0:all,1:single) */int sstat;          /* solution statistics level (0:off,1:states,2:residuals) */int trace;          /* debug trace level (0:off,1-5:debug) */double nmeaintv[2]; /* nmea output interval (s) (<0:no,0:all) *//* nmeaintv[0]:gprmc,gpgga,nmeaintv[1]:gpgsv */char sep[64];       /* field separator */char prog[64];      /* program name */
} solopt_t;

1.1.10 ssat_t 卫星状态控制结构体(过程信息)

typedef struct {        /* satellite status type */uint8_t sys;         //卫星导航系统uint8_t vs;          //有效卫星单一标志double azel[2];      //方位角,高度角double resp[NFREQ];  //伪距残差double resc[NFREQ];  //载波相位残差uint8_t vsat[NFREQ]; //有效卫星标志uint16_t snr[NFREQ]; //信噪比uint8_t fix [NFREQ]; //模糊度的状态,浮点解、固定解uint8_t slip[NFREQ]; /* cycle-slip flag */          uint8_t half[NFREQ]; /* half-cycle valid flag */int lock [NFREQ];   /* lock counter of phase */uint32_t outc [NFREQ]; //载波中断计数uint32_t slipc[NFREQ]; /* cycle-slip counter */uint32_t rejc [NFREQ]; /* reject counter */double gf[NFREQ-1]; /* geometry-free phase (m) */double mw[NFREQ-1]; /* MW-LC (m) */double phw;         /* phase windup (cycle) */gtime_t pt[2][NFREQ]; /* previous carrier-phase time */double ph[2][NFREQ]; /* previous carrier-phase observable (cycle) */
} ssat_t;

1.1.11 rtk_t:rtk控制结构体

typedef struct {        /* RTK control/result type */sol_t  sol;			//结果结构体                         double rb[6];        //基准站位置、速度int nx,na;         	 //na为除模糊度外参数数、nx为加上模糊度参数数double tt;           //当前历元和先前历元时间差double *x, *P;       //浮点解和协方差double *xa,*Pa;      //固定解和协方差int nfix;            //number of continuous fixes of ambiguityambc_t ambc[MAXSAT]; //模糊度控制结构体数组ssat_t ssat[MAXSAT]; //卫星状态控制结构体数组int neb;             //错误信息的缓冲区长度char errbuf[MAXERRMSG];//错误信息缓冲区prcopt_t opt;        //处理选项
} rtk_t;

1.2 satno() 卫星编码函数

按照HPS、GLONASS、GAL等卫星依次往后编号

extern int  satno   (int sys, int prn);

extern int satno(int sys, int prn)
{if (prn<=0) return 0;switch (sys) {case SYS_GPS:if (prn<MINPRNGPS||MAXPRNGPS<prn) return 0;return prn-MINPRNGPS+1; //如果是GPS的X卫星,重新编号就是...case SYS_GLO:if (prn<MINPRNGLO||MAXPRNGLO<prn) return 0;return NSATGPS+prn-MINPRNGLO+1; //如果是GLOSS的X卫星,在GPS卫星基础上编号,续case SYS_GAL:if (prn<MINPRNGAL||MAXPRNGAL<prn) return 0;return NSATGPS+NSATGLO+prn-MINPRNGAL+1;case SYS_QZS:if (prn<MINPRNQZS||MAXPRNQZS<prn) return 0;return NSATGPS+NSATGLO+NSATGAL+prn-MINPRNQZS+1;case SYS_CMP:if (prn<MINPRNCMP||MAXPRNCMP<prn) return 0;return NSATGPS+NSATGLO+NSATGAL+NSATQZS+prn-MINPRNCMP+1;case SYS_LEO:if (prn<MINPRNLEO||MAXPRNLEO<prn) return 0;return NSATGPS+NSATGLO+NSATGAL+NSATQZS+NSATCMP+prn-MINPRNLEO+1;case SYS_SBS:if (prn<MINPRNSBS||MAXPRNSBS<prn) return 0;return NSATGPS+NSATGLO+NSATGAL+NSATQZS+NSATCMP+NSATLEO+prn-MINPRNSBS+1;}return 0;
}
参数16进制向二进制转换有规律#define SYS_NONE    0x00                /* navigation system: none */
#define SYS_GPS     0x01                /* navigation system: GPS 1*/
#define SYS_SBS     0x02                /* navigation system: SBAS 10*/
#define SYS_GLO     0x04                /* navigation system: GLONASS 100*/
#define SYS_GAL     0x08                /* navigation system: Galileo 1000*/
#define SYS_QZS     0x10                /* navigation system: QZSS 16^1=16 10000*/
#define SYS_CMP     0x20                /* navigation system: BeiDou */
#define SYS_IRN     0x40                /* navigation system: IRNSS */
#define SYS_LEO     0x80                /* navigation system: LEO */
#define SYS_ALL     0xFF                /* navigation system: all */

1.3 rtkpos() 接口调用逻辑

该函数处理的是单个历元的所有卫星观测值数据,实现单历元定位,我们需要多次调用处理全部数据。我们在VS中查看调用层级

Main( )函数中调用postpos( )函数,postpos( )调用execses_b( )进行基准站的处理,基准站下遍历每个流动站(execses_r),数据处理使得对应的基准站和流动站结合起来,将处理好结合的流动站/基准站数据进行调用execses( )函数进行定位,procpos( )遍历基准站/流动站每个历元,每个历元数据使用rtkpos( )进行处理实现单历元定位

这篇关于RTKLib源码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/521381

相关文章

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

Java ArrayList扩容机制 (源码解读)

结论:初始长度为10,若所需长度小于1.5倍原长度,则按照1.5倍扩容。若不够用则按照所需长度扩容。 一. 明确类内部重要变量含义         1:数组默认长度         2:这是一个共享的空数组实例,用于明确创建长度为0时的ArrayList ,比如通过 new ArrayList<>(0),ArrayList 内部的数组 elementData 会指向这个 EMPTY_EL

如何在Visual Studio中调试.NET源码

今天偶然在看别人代码时,发现在他的代码里使用了Any判断List<T>是否为空。 我一般的做法是先判断是否为null,再判断Count。 看了一下Count的源码如下: 1 [__DynamicallyInvokable]2 public int Count3 {4 [__DynamicallyInvokable]5 get

工厂ERP管理系统实现源码(JAVA)

工厂进销存管理系统是一个集采购管理、仓库管理、生产管理和销售管理于一体的综合解决方案。该系统旨在帮助企业优化流程、提高效率、降低成本,并实时掌握各环节的运营状况。 在采购管理方面,系统能够处理采购订单、供应商管理和采购入库等流程,确保采购过程的透明和高效。仓库管理方面,实现库存的精准管理,包括入库、出库、盘点等操作,确保库存数据的准确性和实时性。 生产管理模块则涵盖了生产计划制定、物料需求计划、

Spring 源码解读:自定义实现Bean定义的注册与解析

引言 在Spring框架中,Bean的注册与解析是整个依赖注入流程的核心步骤。通过Bean定义,Spring容器知道如何创建、配置和管理每个Bean实例。本篇文章将通过实现一个简化版的Bean定义注册与解析机制,帮助你理解Spring框架背后的设计逻辑。我们还将对比Spring中的BeanDefinition和BeanDefinitionRegistry,以全面掌握Bean注册和解析的核心原理。

音视频入门基础:WAV专题(10)——FFmpeg源码中计算WAV音频文件每个packet的pts、dts的实现

一、引言 从文章《音视频入门基础:WAV专题(6)——通过FFprobe显示WAV音频文件每个数据包的信息》中我们可以知道,通过FFprobe命令可以打印WAV音频文件每个packet(也称为数据包或多媒体包)的信息,这些信息包含该packet的pts、dts: 打印出来的“pts”实际是AVPacket结构体中的成员变量pts,是以AVStream->time_base为单位的显

kubelet组件的启动流程源码分析

概述 摘要: 本文将总结kubelet的作用以及原理,在有一定基础认识的前提下,通过阅读kubelet源码,对kubelet组件的启动流程进行分析。 正文 kubelet的作用 这里对kubelet的作用做一个简单总结。 节点管理 节点的注册 节点状态更新 容器管理(pod生命周期管理) 监听apiserver的容器事件 容器的创建、删除(CRI) 容器的网络的创建与删除

red5-server源码

red5-server源码:https://github.com/Red5/red5-server

TL-Tomcat中长连接的底层源码原理实现

长连接:浏览器告诉tomcat不要将请求关掉。  如果不是长连接,tomcat响应后会告诉浏览器把这个连接关掉。    tomcat中有一个缓冲区  如果发送大批量数据后 又不处理  那么会堆积缓冲区 后面的请求会越来越慢。

Windows环境利用VS2022编译 libvpx 源码教程

libvpx libvpx 是一个开源的视频编码库,由 WebM 项目开发和维护,专门用于 VP8 和 VP9 视频编码格式的编解码处理。它支持高质量的视频压缩,广泛应用于视频会议、在线教育、视频直播服务等多种场景中。libvpx 的特点包括跨平台兼容性、硬件加速支持以及灵活的接口设计,使其可以轻松集成到各种应用程序中。 libvpx 的安装和配置过程相对简单,用户可以从官方网站下载源代码