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的过程及可能遇到的问题,笔者也采⽤了其部分编译策略,初次编译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)附加依赖项的问题
在《》博客中,作者为了规避"不到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"
2int main()
3 {
4char ifile[1024] = "";
5char ofile[9][1024] = { "", "", "", "", "", "", "", "" };
6char *pofile[9] = { "" };
7char tracefile[1024] = "";
8int format = STRFMT_RTCM3;
9
10double 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    ver = 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    = 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);
35for (int i = 0; i < 9; i++) {
36        pofile[i] = malloc(sizeof(char) * 1024);
37        memcpy(pofile[i], &ofile[i], 1024);
38    }
39if (convrnx(format, &opt, ifile, pofile)) printf("\n数据转换成功!\n");
40    traceclose();
41    getchar();
42return0;
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++->代码⽣成->基本运⾏时检查"改为"默认值"即可。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。