写在前面

其实前几年还在校的时候出过一个还不太成熟的教程,回头看的时候发现有诸多不够成熟的地方,如今的工作自由时间相对较多,因此萌生了重新梳理,提升博客质量的想法。因此,就有了这个新的系列。对于大多数GNSS的从业者,大部分人的生涯起点都是Rtklib,而我也不例外。希望该系列博客能够给GNSS的入门者提供相应的参考,那这个系列的博客也就有了它存在的意义。写的不够专业和严谨的地方,还请各位专家多多指教。

该教程面向对象为GNSS初学者,建议掌握一定的GNSS原理和C语言基础作为知识背景,使用的IDE为Visual Studio2022。

Rtklib概述

Rtklib是东京海洋大学的高须知二教授(Tomoji Takasu)开发的一款开源软件,主要功能覆盖GNSS标准单点定位(SPP)/伪距差分定位(DGPS)/精密单点定位(PPP)/实时动态定位(RTK),而服从宽松的BDS2-Clause协议,使用户能够自由地使用,修改源代码,也可以将修改后的代码选择继续开源或者闭源,仅须遵守如下两项要求:

1)如果分发的软件包含源代码,则必须在源代码中保留原始的BSD许可证声明;

2)如果分发的软件仅包含二进制程序,则必须在文档或版权说明中保留原始的BSD许可证声明。

Rtklib在代码上优雅、规范、性能相对较好,具有很强的教学价值和实践价值,是大多数GNSS入门者推荐学习的代码。

Rtklib下载

Rtklib的开源库包括Rtklib的源代码库和Rtklib的可执行程序,两者的下载地址分别如下:

源代码库地址:https://github.com/tomojitakasu/RTKLIB/tree/master

GUI:https://github.com/tomojitakasu/RTKLIB_bin/tree/master

此外,也有一些Rtklib的衍生版本,比如:

面向低成本方案的Rtklib demo5:https://github.com/rtklibexplorer/RTKLIB/tree/demo5

该作者也同样提供了一个python版本的rtklib:https://github.com/rtklibexplorer/rtklib-py

感兴趣的同学可以从github上进行源码的下载,然后开始这段学习之旅。

Rtklib安装调试

本章节会简单介绍如何基于一份Rtklib的源代码建立相应的工程,使其在Visual Studio IDE上运行起来。

首先打开Visual Studio,点击创建新项目,然后进入下一步,

然后选择空项目,并进入下一步,

配置项目名称和路径位置,我建立的项目名称为rtklib,配置的路径为D:\project\C\rtklib,之后点击创建。

这样我们就完成了一个空项目的创建,现在要做的是将源代码导入并进行编译。

  • 复制源文件:首先准备一份下载好并解压的源代码,我这里使用的是rtklib2.4.3的b34版本。将src目录复制到上述工程目录下:

另外将rnx2rtkp文件夹下的rnx2rtkp.c文件一并拷贝到src目录下。

  • 添加源文件进项目:在项目右键点击添加-现有项,选择src中的所有文件,将所有源文件添加进去。源文件包含rcv文件夹下的所有源代码文件和src目录下的其他源代码文件,我添加的方式是先添加所有rcv目录下的文件,在项目中新建rcv文件夹将该部分文件全部导入到该文件夹下,再将其他文件全部导入。

  • 配置路径:配置路径的目的是配置的搜索源代码中所引用的包含文件的目录。 对应于 INCLUDE 环境变量。

  • 宏配置:宏配置。宏配置的目的是为了解决一些编译问题,我用的是win64的平台,其中WIN32,_CRT_SECURE_NO_WARNINGS,_WINSOCK_DEPRECATED_NO_WARNINGS,ENAGLO是必配置的,否则会产生编译问题,后续三个宏是打开GAL、QZSS、BDS系统的功能开关,建议开启。WIN_DLL宏是windows下的控制宏,会触发部分windows下特有的系统函数使用,尤其是在windows平台下需要打包dll库的时候必须配置,建议开启。

在使用WIN_DLL宏后,会触发extern关键字和EXPORT关键字在不同地方的重定义问题,我的解决方案是注释掉原有定义,增加WIN_DLL的宏选择配置如下。

  • sbs未初始化问题,修正方案为将对应内容增加初始化为NULL。

  • 附加依赖项添加,在属性-链接器-附加依赖项中增加winnmm.lib和ws2_32.lib库

  • rtklib原生代码会触发C4244报错: 一元负运算符应用于无符号类型,结果仍为无符号类型,在不改变源代码功能的情况下,修正方案为将SDL检查关闭。

  • 修复showmsg、settspan、settime在rnx2rtkp中的重定义问题。同样由于WIN_DLL宏的配置,该情况下三个函数的定义在不同地方存在不一致的问题,由于该函数已经在其他地方进行了定义,此处注释即可。

现在编译即可通过,如下所示。

Ref

  1. https://www.jianshu.com/p/469510e640f1?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

  1. https://wap.sciencenet.cn/blog-3386358-1138020.html?mobile=1