一、rtklib简介
rtklib是由日本的Tomoji Takasu开发的开源GNSS定位软件,是卫星导航定位领域的最著名的软件之一。目前rtklib可下载的最新版本为rtklb 2.4.3,支持GPS、GLONASS、Galileo、QZZ、Beidou和SBAS系统,下载地址为:GitHub - tomojitakasu/RTKLIB at rtklib_2.4.3。
二、调试过程
深入了解和学习rtklib的基础是要在编译器中搭建项目工程,阅读和剖析不同函数中的程序结构和专业方法。本人作为卫星定位和定轨方面的初学者,尝试了几种网上的调试方法,最终调试通过,下面分享一下详细的过程。
1. 准备工作
- 安装 Visual Studio 2019
- 下载 rtklib 2.4.3
2. 创建项目
打开VS2019,点击创建新项目。
创先新项目,选择第一个空项目。
创建新项目的时候可以选择一个空文件夹,将解决方案和项目放在统一目录中我勾选上了。点击创建即可。
3. 导入文件
搭建好的空项目是这样的,什么都没有。
下载好的rtklib文件夹解压后结构如下图,需要将下图中显示的src文件夹复制到刚才新建的项目文件夹中。
这里在复制过去之后很多教程都让改了名字,个人感觉应该没影响但是还是改了,把“src”改为“rtklib_src”。
然后还需要把rtklib的主函数复制到rtklib_src文件夹中,主函数的位置在RTKLIB-rtklib_2.4.3\app\consapp\rnx2rtkp,主函数的名字为“rnx2rtkp.c”。复制过去之后很多教程将该文件改为“main.c”,我个人没有改,也不影响最后的编译成功。rnx2rtkp.c的文件位置如下图。
首先在源文件中添加名为“src”的筛选器,再在src筛选器下面添加名为“rcv”的筛选器,结果如图。
接下来分三步导入rtklib_src文件夹中的所有文件:
- 导入rtklib_src文件夹中所有.c文件至src筛选器中,包括rnx2rtkp.c,注意不包含头文件rtklib.h文件;
- 导入rtklib_src\rcv中的所有文件至src\rcv筛选器中;
- 导入rtklib_src文件夹中的rtklib.h文件至头文件中,注意不是源文件。
导入之后的项目结构如下图。
4. 修改部分代码中的内容
把主函数rnx2rtkp.c文件中的#include "rtklib.h"修改为#include "./rtklib.h"
把在src/rcv文件夹中的.c文件中的#include "rtklib.h"修改为#include "../rtklib.h”
注意一定不是只改一个rnx2rtkp.c一个文件!另外在使用VS2019全局替换功能时候要注意替换错误,比如“./rtklib”替换成了“./../rtklib”!(个人操作中遇到的问题)。
这一步是我在大部分教程中没有看到的关键步骤
参考了科学网—LPJ6378137的博客 - 李鹏杰这篇文章
5. 项目属性设置
打开项目属性,在链接器下的输入中的附加依赖项中添加依赖库winmm.lib和ws2_32.lib。
将常规中的目标文件名改为rnx2rtkp。
设置高级中的字符集为使用多字节字符集。
将C/C++中的 SDL检查设置为否,附加包含目录添加.\src。
C/C++中的预编译头设置为不使用预编译头。
在C/C++中的预处理器中添加如下内容:
_LIB _CRT_SECURE_NO_WARNINGS _WINSOCK_DEPRECATED_NO_WARNINGS ENAGLO DLL
添加完成之后如下图。
6. 修改指针变量未初始化的错误
完成以上步骤之后,会报“使用了可能未初始化的本地指针变量“sbs”的错误,解决方式是对指针变量进行初始化,将ephemeris.c文件中的第579行改为“const sbssatp_t *sbs=NULL;”。
7. 编译通过
8. 存在的警告
虽然可以成功编译,但是还存在几种警告:
- warning C4101: “rs”: 未引用的局部变量;
- warning C4244: “return”: 从“double”转换到“int”,可能丢失数据;
- warning C4244: “=”: 从“double”转换到“float”,可能丢失数据;
- warning C4146: 一元负运算符应用于无符号类型,结果仍为无符号类型;
本人将在下一篇笔记中解决上述警告。
非常基础的rtklib编译流程,各位学术大牛可以忽略。