rtklib学习笔记1:在Visual Studio 2019中调试rtklib 2.4.3程序

发布于:2022-12-22 ⋅ 阅读:(864) ⋅ 点赞:(0)

一、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. 准备工作

  1. 安装 Visual Studio 2019
  2. 下载 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文件夹中的所有文件:

  1. 导入rtklib_src文件夹中所有.c文件至src筛选器中,包括rnx2rtkp.c,注意不包含头文件rtklib.h文件;
  2. 导入rtklib_src\rcv中的所有文件至src\rcv筛选器中;
  3. 导入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. 存在的警告

虽然可以成功编译,但是还存在几种警告:

  1. warning C4101: “rs”: 未引用的局部变量;
  2. warning C4244: “return”: 从“double”转换到“int”,可能丢失数据;
  3. warning C4244: “=”: 从“double”转换到“float”,可能丢失数据;
  4. warning C4146: 一元负运算符应用于无符号类型,结果仍为无符号类型;

本人将在下一篇笔记中解决上述警告。

        非常基础的rtklib编译流程,各位学术大牛可以忽略。

本文含有隐藏内容,请 开通VIP 后查看