RTKLIB编译及RTCM数据读取样例

Posted 远方的驼队

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RTKLIB编译及RTCM数据读取样例相关的知识,希望对你有一定的参考价值。

1、RTKLIB简介

RTKLIB是全球导航卫星系统GNSS(global navigation satellite system)的标准&精密定位开源程序包,RTKLIB由日本东京海洋大学(Tokyo University of Marine Science and Technology)的高须知二(Tomoji Takasu)开发。RTKLIB由一个便携式程序库和多个AP(应用程序)工具库组成。RTKLIB的主要功能有:

(1)支持多个GNSS系统的标准和精密定位算法,包括GPS,GLONASS,Beidou,Galileo,QZSS和SBAS

(2)支持多种GNSS实时和后处理定位模式:单点定位、DGPS/DGNSS,动态RTK、静态RTK、移动基站、PPP

(3)支持多种GNSS标准格式和协议:RINEX2.10、RINEX2.11、RINEX2.12、RINEX3.00、RINEX3.01、RINEX3.02、RTCM2.3、RTCM3.1、RTCM3.2、BINEX、NTRIP、NMEA0183、SP3、ANTEX1.4、IONEX1.0、NGS PCV、EMS 2.0

(4)支持多种GNSS接收机专有数据协议格式:NovAtel:OEM4/V/6,OEM3, OEMStar、Superstar II、 Hemisphere、Crescent、u‐blox:LEA-4T/5T/6T、SkyTraq、JAVAD 、GW10-II/III和NVS

(5)支持外部通信:Serial、TCP/IP、NTRIP、本地日志文件(记录和播发)和FTP/HTTP

(6)提供许多函数库和API(application program interfaces):卫星和导航系统函数、矩阵和向量函数,时间和字符串函数、坐标的转换,输入和输出函数、调试跟踪函数、平台依赖函数、定位模型、大气模型、天线模型、地球潮汐模型、大地水准面模型、基准转换、RINEX函数、星历和时钟函数、精密星历和时钟、接收机原始数据函数、RTCM函数,解算函数、谷歌地球KML转换、SBAS函数、选项(option)函数、流数据输入和输出函数、整周模糊度解算、标准定位、精密定位、后处理定位(解算)、流服务器函数、RTK服务器函数、下载函数。

2、基于VS的RTKLIB编译

基于VS的RTKLIB的编译范例在网络上已经有较多的版本,比较成熟且切实有效的当属博主【D10.天地弦(湖南桃江)】在博客园中发表的博客《VS2013使用rtklib中需要注意的一些问题(编译)》,里面详细阐述了利用VS2013编译RTKLIB的过程及可能遇到的问题,笔者也采用了其部分编译策略,初次编译RTKLIB的朋友可以去参考。

当我们深入研究RTKLIB代码后,会发现仅仅采用上述网友提供的问题解决方法仍不能完全解决RTKLIB编译过程中的问题,需要我们进一步的研究,以下是笔者在实际应用过程中发现的一些问题,分享出来供大家参考。

(1)预编译器定义的问题。

RTKLIB中为了适应不同的应用需求,定义了诸多的宏,常见的包括ENAGLO,ENACMP ,_CRT_SECURE_NO_WARNINGS,_WINSOCK_DEPRECATED_NO_WARNINGS等。这些预编译器定义存在的根本目的是为了控制代码编译的走向,以确保功能的实现,为此我们需要详细了解各个宏定义的存在的目的。例如,_CRT_SECURE_NO_WARNINGS存在的目的是确保strcmp等VS认为不安全的函数的有效执行。_WINSOCK_DEPRECATED_NO_WARNINGS存在的目的是确保通信sock函数的有效执行。ENAGLO,ENACMP,WIN_DLL,TRACE存在的目的是确保与GLONASS、与北斗、与windows动态库编译、与TRACE信息输出相关的函数的有效执行。通过合理的预编译器定义,我们可以得到不同功能的RTKLIB动态库。

(2)附加依赖项的问题

在《VS2013使用rtklib中需要注意的一些问题(编译)》博客中,作者为了规避"找不到error LNK2019: 无法解析的外部符号…"的问题,选择了在添加附加库[连接器->输入->附加依赖库]中添加winmm.lib, ws2_32.lib。虽然可以解决问题,但是不够直观,很容易被其他开发人员忽略。笔者认为直接在头文件代码中添加#pragma comment(lib, "winmm.lib")和#pragma comment(lib, "ws2_32.lib")更为直观明了,一劳永逸。

3、RTCM数据读取样例

在完成了RTKLIB动态库编译后,笔者利用动态库构建了简单的RTCM数据读取的Demo。Demo程序读取保存的实时RTCM观测信息并输出观测值文件、导航文件以及TRACE日志信息。Demo代码如下:

 1 #include "rtklib.h"
 2 int main()
 3 {
 4     char ifile[1024] = "C:xxx.rtcm";    
 5     char ofile[9][1024] = { "", "", "", "", "", "", "", "" };
 6     char *pofile[9] = { "" };
 7     char tracefile[1024] = "";
 8     int format = STRFMT_RTCM3;
 9  
10     double ep_rtcm[6] = { 2017, 9, 4, 14, 00, 00 };    
11     gtime_t time_rtcm = epoch2time(ep_rtcm);    
12     
13     rnxopt_t opt = { 0 };    
14     opt.tint = 0.00;
15     opt.tunit = 86400;
16     opt.rnxver = 3.02;
17     opt.navsys = 37;
18     opt.obstype = OBSTYPE_ALL;
19     opt.freqtype = 0x03;
20     opt.scanobs = 1;
21     opt.outiono = 1;
22     opt.outtime = 1;
23     opt.trtcm = time_rtcm;
24  
25     strcpy(ofile[0], ifile);
26     strcat(ofile[0], ".obs");
27  
28     strcpy(ofile[1], ifile);
29     strcat(ofile[1], ".nav");
30  
31     strcpy(tracefile, ifile);
32     strcat(tracefile, ".trace");
33     traceopen(tracefile);
34     tracelevel(5);     
35     for (int i = 0; i < 9; i++) {
36         pofile[i] = malloc(sizeof(char) * 1024);
37         memcpy(pofile[i], &ofile[i], 1024);
38     }    
39     if (convrnx(format, &opt, ifile, pofile)) printf("\\n数据转换成功!\\n");    
40     traceclose();
41     getchar();
42     return 0;
43 }

在调试Demo过程中,笔者发现RTKLIB库仍存在两个问题:

(1)添加TRACE预编译器定义后,软件运行到scan_obstype函数的trace(3,"scan_obstype: nf=%s, opt=%s\\n",nf,opt)语句时会提示内存出错,调试后发现该语句中nf的输出类型出错,应将"%s"更改为"%d",即trace(3,"scan_obstype: nf=%d, opt=%s\\n",nf,opt)。这反映了RTKLIB原始编码系统环境与VS IDE的差异,后续应用库文件时需要多加注意。

(2)convrnx函数在执行完成退出动态库回到主函数main时,Debug模式下会弹出"Run-Time Check Failure #2 - Stack around the variable \'opt_\' was corrupted."异常。Release模式下不弹出该异常。网络上关于该异常主体上认为时由于内存越界造成的,笔者暂未找出opt_变量越界的原因,后续会做深入研究。该异常的最快捷的解决方案时将"project->配置属性->c/c++->代码生成->基本运行时检查"改为"默认值"即可。

以上是关于RTKLIB编译及RTCM数据读取样例的主要内容,如果未能解决你的问题,请参考以下文章

Eclipse框架下rtklib动态库编译

rtklib代码阅读与调试

rtklib代码阅读与调试

VS2015编译rtklib2.4.2

RTKLIB改-sortobs-只要双频及以上的观测值

rtklib 代码阅读与调试