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:/Users/Neil/Desktop/b/CENT.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++->代码生成->基本运行时检查"改为"默认值"即可。

时间: 2024-10-14 00:02:10

RTKLIB编译及RTCM数据读取样例的相关文章

计算机中地址和内存大小的计算和编译出来的数据段

由地址计算内存大小(消除模糊认知) 在计算机中一个地址代表一个字节的内存的位置,即这个byte的门牌号,所以如果给出地址空间的起始地址是可以计算出内存大小的,比如STM32中Flash可编程的地址是从0x0800 0000开始到0x0801FFFF结束的所以内存大小的计算过程如下: 地址差 = 结束地址 - 开始地址  =  0x0001FFFF:他们可以表示的Byte的个数是N = 0x0001 FFFF + 1即0x00020000将N变换为十进制是131072. 内存大小 = N/1024

网络加载数据及单例工具类的代码抽取

今天给大家分享一一下网络加载数据:先看代码吧-------------------------- - (void)diseaseNumWithFinishedBlock:(FinishedBlocks)finishedBlock{ NSString *urlStr = @"http://数据接口"; NSDictionary *prama = @{响应参数}; [[NetWorkTool sharedNetWorkTool] POST:urlStr parameters:prama p

2016/4/2 json:js和jquery中轻量级数据交换格式 例: 窗口弹出 popwindow

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于ECMAScript的一个子集. JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C.C++.C#.Java.JavaScript.Perl.Python等).这些特性使JSON成为理想的数据交换语言. 易于人阅读和编写,同时也易于机器解析和生成(一般用于提升网络传输速率). JSON 语法是 JavaScript 对象表示语法的子集. 数据在键值对中 数据由逗号分隔

用matlab将nc数据读出来,写成二进制文件,然后用grads画图

clear,clc nt=735;ny=73;    %2.5*2.5格点的nx=144;    %2.5*2.5格点的f=netcdf('air.mon.mean.nc','nowrite');tt=f{'air'}(:);close(f)fid=fopen('a5.grd','w');  for it=1:nt     for j=1:ny        for i=1:nx         count= fwrite(fid,tt(it,j,i),'float');%根据例子这里用原始的数

动态网页爬取样例(WebCollector+selenium+phantomjs)

目标:动态网页爬取 说明:这里的动态网页指几种可能:1)须要用户交互,如常见的登录操作:2)网页通过JS / AJAX动态生成.如一个html里有<div id="test"></div>,通过JS生成<div id="test"><span>aaa</span></div>. 这里用了WebCollector 2进行爬虫,这东东也方便,只是要支持动态关键还是要靠另外一个API -- selen

jQuery框架中$.ajax()的常用参数有哪些?写一个post请求并带有发送数据和返回数据的样例

sync是否异步 url请求地址 contentType发送信息至服务器时内容编码类型 data发送到服务器的数据 dataType预期服务器返回的数据类型 type请求类型 success请求成功回调函数 error请求失败回调函数 $.ajax({ url: "/jquery/test1.txt", type: 'post', data: { id: 1 }, success: function(data) { alert(data); } }

python 爬虫proxy,BeautifulSoup+requests+mysql 爬取样例

实现思路: 由于反扒机制,所以需要做代理切换,去爬取,内容通过BeautifulSoup去解析,最后入mysql库 1.在西刺免费代理网获取代理ip,并自我检测是否可用 2.根据获取的可用代理ip去发送requests模块的请求,带上代理 3.内容入库 注:日志模块在上一篇随笔 下面附上代码 1.可用代理获取 # -*- coding: utf-8 -*- import random import time import requests from bs4 import BeautifulSou

ADNI数据和样例

ADNI临床数据集: 由各个学科的临床信息组成,包括招募.人口统计特征.体格检查和认知评估数据 所收集的临床数据: 基因数据: ILLUMINA SNP基因分型检测 ADNI的一个关键目标就是为研究人员提供机会,将遗传学.影像学和临床数据结合起来,帮助研究该病的机制 SNPs -- 单核苷酸多态性(single nucleotide polymorphisms) GWAS -- 全基因组关联研究(Genome-Wide Association Studies) WGS -- 全基因组测序 APO

数据可视化Echarts-实例

数据可视化 Echarts 百度 数据可视化 hightCharts 1 数据可视化 D3 老外 -----------------------------当遇到个啥玩意儿,Echarts .hightCharts.D3都解决不了,恭喜你,只能原生 canvas 了,哈哈 原文地址:https://www.cnblogs.com/tianxiaxuange/p/10234519.html