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数据读取样例

4166澳门金沙网娱乐,在完成了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-提姆(Tim)e
Check Failure #2 – Stack around the variable ‘opt_’ was
corrupted.”非常。Release形式下不弹出该特别。网络上有关该特别主体上认为时出于内存越界造成的,笔者暂未找出opt_变量越界的由来,后续会做深刻钻研。该特其它最便捷的缓解方案时将”project->配置属性->c/c++->代码生成->基本运作时检查”改为”默认值”即可。