SLAM算法与工程实践——RTKLIB编译

news2024/9/24 19:14:13

SLAM算法与工程实践系列文章

下面是SLAM算法与工程实践系列文章的总链接,本人发表这个系列的文章链接均收录于此

SLAM算法与工程实践系列文章链接


下面是专栏地址:

SLAM算法与工程实践系列专栏


文章目录

  • SLAM算法与工程实践系列文章
    • SLAM算法与工程实践系列文章链接
    • SLAM算法与工程实践系列专栏
  • 前言
  • SLAM算法与工程实践——RTKLIB编译
    • Ubuntu下rtklib库编译&安装
      • 编译CUI APs
        • 命令说明
        • RTKRCV说明文档
        • RNX2RTKP文档说明
        • STR2STR说明文档
        • 出现的错误
      • 编译成可调用库文件
      • 出现的错误
        • 错误1
        • 错误2
    • 示例代码编译&运行
    • 译图形界面qtapp


前言

这个系列的文章是分享SLAM相关技术算法的学习和工程实践


SLAM算法与工程实践——RTKLIB编译

Ubuntu下rtklib库编译&安装

Windows下的编译方法网上教程很多,这里主要讲Ubuntu下的编译方法

官网地址:https://www.rtklib.com/

编译CUI APs

RTKLIB使用手册上的安装说明/P88

在这里插入图片描述

如果是2.4.2版本

在这里插入图片描述

其实就是打开你要编译的软件的文件夹,比如我编译的是str2strc这个软件,路径就是RTKLIB/app/str2str/gcc

vi makefile

然后依次运行

make
make install

它要是告诉你没权限的话,那就提升权限:

sudo su

我这里是2.4.3版本的,与2.4.2差别比较大

在这里插入图片描述

具体命令如下

cd RTKLIB/app/consapp/rtkrcv/gcc

编辑并更改makefile来调整文件以适应自己的环境

vi makefile

默认安装路径为系统路径

BINDIR = /usr/local/bin

将其修改为自己的路径,比如自己的工作空间的路径

BINDIR = /home/jin/my_ws/rtklib_study/RTKLIB-rtklib_2.4.3/bin

BINDIR = /home/jin/my_ws/rtklib_study/RTKLIB-master/bin

在这里插入图片描述

然后执行make来编译AP,以及make install来安装二进制文件到对应的bin目录下。

make
make install

在这里插入图片描述

make后会生成很多的 .o 文件

在这里插入图片描述

然后安装

在这里插入图片描述

在这里插入图片描述

或者直接修改最高级的makefile后,一起批量编译

在这里插入图片描述

BINDIR = /home/jin/my_ws/rtklib_study/RTKLIB-rtklib_2.4.3/bin

然后编译安装

make
make install

在这里插入图片描述

如果出现 iers.a 文件的报错,见后面的错误处理

如果需要清除已经编译和安装好的二进制文件,使用命令

make clean
命令说明

关于命令的使用方法手册中有详细的说明

在这里插入图片描述

RTKRCV说明文档

在这里插入图片描述

在这里插入图片描述

RNX2RTKP文档说明

rnx2rtkp是一个用于GNSS(全球导航卫星系统)数据处理的软件工具。它主要用于将原始的GNSS观测数据(通常以RINEX格式存储)转换成精密的定位解决方案。这个工具的全称是"RINEX to RTKLIB Post-Processing",它基于RTKLIB,是一个开源的实时运动定位库。

具体而言,rnx2rtkp的功能包括:

  1. 数据预处理: 从RINEX格式的原始GNSS观测数据中提取必要的信息。
  2. 定位解算: 利用RTKLIB的算法,进行精密的实时运动定位解算。
  3. 输出结果: 生成定位结果,包括位置、速度等信息,以便进一步分析或应用。

阅读 RINEX OBS/NAV/GNAV/HNAV/CLK, SP3, SBAS 消息日志文件和计算接收器(漫游者)位置和输出位置解决方案。

第一个 RINEX OBS 文件应包含接收器(漫游者)观测值。 对于相对模式,第二个 RINEX OBS 文件应包含参考(基站)接收器观测值。 至少一个 RINEX NAV/GNAV/HNAV 文件应包含在输入文件中。

若要使用SP3精确的星历,请指定文件中的路径。 SP3文件的扩展应为 .sp3.eph。 所有输入文件路径都可以包括通配符 (*)。 为避免命令行部署通配符,请使用ʺ …ʺ用于通配符的路径。

命令行选项如下([]:默认值)。 使用 -k 选项,处理选项是从配置文件。 在这种情况下,命令行选项先于配置文件中的选项。 为了配置文件,请参阅 B.4。

在这里插入图片描述

在这里插入图片描述

windows下的一个例子为

.\rtklib.exe -x 5 -p 0 -m 15 -n -o D:\\source\\RTKLIBrtklib_2.4.3\\rtklib\\out.pos D:\\source\\RTKLIBrtklib_2.4.3\\test\\data\\rinex\\07590920.05o D:\\source\\RTKLIBrtklib_2.4.3\\test\\data\\rinex\\07590920.05n

我在项目的根目录下新建一个 output 文件夹,用于存储输出的文件

我这里的例子为

./rnx2rtkp -x 5 -p 0 -m 15 -n -o /home/jin/my_ws/rtklib_study/RTKLIB-rtklib_2.4.3/output/out.pos /home/jin/my_ws/rtklib_study/RTKLIB-rtklib_2.4.3/test/data/rinex/07590920.05o /home/jin/my_ws/rtklib_study/RTKLIB-rtklib_2.4.3/test/data/rinex/07590920.05n

程序运行结果如下

在这里插入图片描述

运行结束后,在指定的 output 文件夹中输出了两个文件

在这里插入图片描述

STR2STR说明文档

输入数据来自流和分割并将它们输出到多个流中,输入流可以是串行的,TCP客户端,TCP服务器,NTRIP客户端或文件。 输出流可以是串行,TCP客户端,TCP服务器,NTRIP
服务器或文件。 STR2STR是一种居民类型应用程序。 要停止它,如果前景运行或发送信号SIGINT以进行背景过程。 如果运行前景或发送信号sigint以进行背景过程。

如果输入流和输出流都遵循#format,则输入消息的格式转换为输出。 要指定输出消息,请使用-MSG选项。命令选项如下。

在这里插入图片描述

在这里插入图片描述

出现的错误

在编译 rnx2rtkp 时出现下面的错误

没有 ../../../../lib/iers/gcc/iers.a 文件

error: ../../../../lib/iers/gcc/iers.a: No such file or directory

在这里插入图片描述

解决办法:

进入到 RTKLIB-rtklib_2.4.3/lib/iers/gcc 文件夹中编译得到 iers.a 文件

sudo apt-get install gfortran

cd ../../../lib/iers/gcc/
# 编译得到iers.a
make 

# 如果需要安装的话再 make install
# make install

# 如果是安装到系统路径
# sudo make install

编译完成后得到 iers.a 文件

在这里插入图片描述

再接着编译就没问题了

编译成可调用库文件

下载rtklib源码,编译成静态库并安装(如果编译成动态库,会有解决不了的错误,见错误2)

git clone https://github.com/tomojitakasu/RTKLIB.git
cd RTKLIB/src

在RTKLIB/src目录下添加CMakeLists.txt文件

cmake_minimum_required(VERSION 3.1)
project(rtklib)

add_definitions(-DTRACE)#enable trace in rtklib

set(RTKLIB_SRC convkml.c convrnx.c datum.c download.c ephemeris.c geoid.c ionex.c lambda.c options.c pntpos.c postpos.c ppp_ar.c ppp.c preceph.c qzslex.c rcvraw.c rinex.c rtcm2.c rtcm3.c rtcm3e.c rtcm.c rtkcmn.c rtkpos.c rtksvr.c sbas.c solution.c stream.c streamsvr.c tle.c)
add_library(rtklib STATIC ${RTKLIB_SRC})

install(TARGETS rtklib
        LIBRARY DESTINATION lib
        ARCHIVE DESTINATION lib)

install(FILES rtklib.h DESTINATION include)

实际上我使用的cmake代码为

cmake_minimum_required(VERSION 3.1)
project(rtklib)

add_definitions(-DTRACE)#enable trace in rtklib

#set(RTKLIB_SRC convkml.c convrnx.c datum.c download.c ephemeris.c geoid.c ionex.c lambda.c options.c pntpos.c postpos.c ppp_ar.c ppp.c preceph.c qzslex.c rcvraw.c rinex.c rtcm2.c rtcm3.c rtcm3e.c rtcm.c rtkcmn.c rtkpos.c rtksvr.c sbas.c solution.c stream.c streamsvr.c tle.c)

include_directories(${PROJECT_SOURCE_DIR})

# 搜索指定目录下源文件
# file(GLOB_RECURSE RTKLIB_SRC ${PROJECT_SOURCE_DIR}/*.c)
file(GLOB RTKLIB_SRC ${PROJECT_SOURCE_DIR}/*.c)
file(GLOB RTKLIB_SRC_RCV ${PROJECT_SOURCE_DIR}/rcv/*.c)

# 设置库的输出位置,如果需要将库编译后安装到系统路径,则注释这一句,将最后的两个install命令解开注释
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)

add_library(rtklib STATIC ${RTKLIB_SRC} ${RTKLIB_SRC_RCV})
target_link_libraries(rtklib pthread)


# install(TARGETS rtklib
        LIBRARY DESTINATION lib
        ARCHIVE DESTINATION lib)

# install(FILES rtklib.h DESTINATION include)

这里install的目标类型对应的有三种,ARCHIVE 特指静态库,LIBRARY 特指动态库,RUNTIME特指可执行目标二进制。

如果不指定安装路径,即设置 CMAKE_INSTALL_PREFIX 变量的值,则默认安装路径为 /usr/local

一般编译好的动静态库放到 /usr/local/lib/ 中,头文件放到 /usr/local/include/

常我们会把可执行文件、静态库、动态库会分别放在不同的路径,如下:

文件类型路径备注
可执行文件usr/bin 、usr/local/bin-
静态库(*.a)usr/lib、usr/local/lib-
动态库(*.so)usr/lib、usr/local/lib-
头文件(*.h)usr/include、usr/local/include-

然后编译安装

mkdir build
cd build
cmake ..
make
sudo make install

此时rtklib已经作为静态库被安装在系统目录下, 基于rtklib二次开发也不用带源码了,直接引用静态库即可.

注意-DTRACE的做用是打开trace开关,遇到问题调试起来会快不少.

添加如下几行代码, 就可以使能trace功能

traceopen("rtklib.trace");
tracelevel(5);
//
code//
//
traceclose();

你的目录下会多一个rtklib.trace的文件, 记录了代码执行的关键路径.

出现的错误

错误1

编译rtklib源码src为库文件时显示没有 qzslex.c 这个文件

在这里插入图片描述

我这里使用的是 2.4.3 版本

在这里插入图片描述

而 2.4.2 版本是有这个文件的,https://github.com/tomojitakasu/RTKLIB/tree/master/src

在这里插入图片描述

将库换成2.4.2版本来编译,因为这个演示仓库中的示例代码是基于2.4.2写的,2.4.2和2.4.3的函数接口有些不一样

错误2

编译learning_rtklib时出现很多的未定义

在这里插入图片描述

搜索 input_gw10f 发现这个函数在 rcv 文件夹下,之前没有添加进去

修改 CMakeLists.txt 文件,添加 src/crv/ 文件夹下的文件后,报错少了很多,记得还要添加头文件的路径,虽然只有以一个 rtklib.h

在这里插入图片描述

在这里插入图片描述

/usr/bin/ld: /home/jin/my_ws/rtklib_study/learning_rtklib-master/lib/librtklib.so: undefined reference to `pthread_create'
/usr/bin/ld: /home/jin/my_ws/rtklib_study/learning_rtklib-master/lib/librtklib.so: undefined reference to `settime'
/usr/bin/ld: /home/jin/my_ws/rtklib_study/learning_rtklib-master/lib/librtklib.so: undefined reference to `settspan'
/usr/bin/ld: /home/jin/my_ws/rtklib_study/learning_rtklib-master/lib/librtklib.so: undefined reference to `showmsg'
/usr/bin/ld: /home/jin/my_ws/rtklib_study/learning_rtklib-master/lib/librtklib.so: undefined reference to `pthread_join'

搜索 pthread_create,发现这个函数定义在系统的头文件中,pthread.h 的路径为 /usr/include/pthread.h

在这里插入图片描述

注意,这里是编译好的库 librtklib.so 中未定义 pthread_create 、pthread_join、settime、settspan、showmsg

RTKLIB-master/src/CMakeLists.txt 中先寻找 Threads 库,然后链接到 rtklib 库中

find_package(Threads REQUIRED)
target_link_libraries(rtklib Threads::Threads)

# 或者直接链接 pthread
target_link_libraries(rtklib pthread)

这时 pthread_create 和 pthread_join 的错误消失了

在这里插入图片描述

剩下的三个函数定义在 rtklib.h 文件中

在这里插入图片描述

实现在 rtkcmn.c 中,但是没有实现任何功能

在这里插入图片描述

ConvBin Depends on GUI extern functions #621 也遇到一样的问题

我这里本来编译成的是动态库(SHARED),最后编译将源文件成**静态库(STATIC)**就没问题了

在这里插入图片描述

在这里插入图片描述

示例代码编译&运行

从 https://github.com/libing64/learning_rtklib 处下载示例代码,然后编译执行

cd rtklib_example
mkdir build
cd build
cmake ..
make
./rinex_example
./satpos_example
./spp_example
./rtk_example
./ppp_satpos_example
./ppp_example

编译成功

在这里插入图片描述

这里以执行 ppp_example为例

在这里插入图片描述

执行完成后,在可执行文件处生成一个文件 ppp.trace

在这里插入图片描述

译图形界面qtapp

原版RTKLIB不支持Linux下编译图形界面,要使用修改过的demo5版本才可以

demo5版本:https://github.com/rtklibexplorer/RTKLIB

先查询自己的QT版本

qmake -v

在这里插入图片描述

安装依赖

sudo apt-get update
sudo apt install build-essential
sudo apt-get install libpng-dev
sudo apt-get install qt5-default libqt5serialport5-dev

第一行可能不是必需的,它只是更新以下命令的包列表。

第二行安装最常用的构建工具,

第三行安装“png”库,

在这里插入图片描述

最后一行安装 Qt 工具。

在这里插入图片描述

demo5的文档也说了功能不全

GUIs (Qt based - available but not fully supported)

在这里插入图片描述

命令如下

cd app/qtapp
qmake
make
./install_qtapp

先 qmake

在这里插入图片描述

然后make

在这里插入图片描述
在这里插入图片描述

编译完后,会在每个文件夹中生成可执行文件

在这里插入图片描述

然后安装

在这里插入图片描述

将可执行文件复制到了如下所示的位置,可以修改makefile中的输出路径,设置自己的输出位置

在这里插入图片描述

启动程序

./rtkplot_qt 

在这里插入图片描述

File->open solution-1,找到前面生成的out.pos,并打开

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1324477.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux 内核的 lru_list 的结构

在linux的slab分配的入口slab_alloc有一个传入参数lru,它的作用是使每个slab对象在unused,但可能后面继续使用的时候,不需要free,可以先放在lru_list上。lru_list的结构为: struct list_lru {struct list_lru_node *n…

网工内推 | 上市公司中级网工,思科、华为认证优先,有带薪年假

01 新晨科技 招聘岗位:中级网络工程师 职责描述: 1. 负责公司网络系统的规划、设计、实施、维护和优化; 2. 负责网络设备的选型、采购、安装、配置和调试; 3. 负责网络安全策略的制定和实施,保障公司网络安全&#xf…

fastjson1.2.24 反序列化漏洞(CVE-2017-18349)分析

FastJson在< 1.2.24 版本中存在反序列化漏洞&#xff0c;主要原因FastJson支持的两个特性&#xff1a; fastjson反序列化时&#xff0c;JSON字符串中的type字段&#xff0c;用来表明指定反序列化的目标恶意对象类。fastjson反序列化时&#xff0c;字符串时会自动调用恶意对…

国标28181平台只能连接视频监控吗?

在一些视频监控项目中&#xff0c;国标28181平台成为了必不可少的工具。这个平台的主要作用在于将分布在不同区域的视频监控录像机、摄像头等设备进行联网管理&#xff0c;同时还能将视频监控连接到上一级的国标监控平台。 可以说&#xff0c;国标监控平台是一个非常重要的承上…

原子学习笔记3——使用tslib库

一、tslib介绍 tslib 是专门为触摸屏设备所开发的 Linux 应用层函数库&#xff0c;并且是开源。 tslib 为触摸屏驱动和应用层之间的适配层&#xff0c;它把应用程序中读取触摸屏 struct input_event 类型数据&#xff08;这是输入设备上报给应用层的原始数据&#xff09;并进行…

动力电池系统介绍(十四)——热管理系统

动力电池系统介绍&#xff08;十四&#xff09; 一、梗概二、座舱热管理&#xff08;汽车空调&#xff09;2.1 空调制冷2.2 空调制热2.2.1 传统燃油汽车空调制热2.2.2 新能源汽车空调制热 三、动力系统热管理3.1 燃油车发动机热管理3.1.1 冷却系统3.1.2 润滑系统3.1.3 进排气系…

网络编程day5

作业 1> 使用select完成TCP客户端程序 //client #include<myhead.h> #define CLINET_IP "192.168.125.79" #define CLINET_PORT 9999 #define SERVE_IP "192.168.125.79" #define SERVE_PORT 8888 int main(int argc, const char *argv[]) {/…

音视频直播核心技术介绍

直播流程 采集&#xff1a; 是视频直播开始的第一个环节&#xff0c;用户可以通过不同的终端采集视频&#xff0c;比如 iOS、Android、Mac、Windows 等。 前处理&#xff1a;主要就是美颜美型技术&#xff0c;以及还有加水印、模糊、去噪、滤镜等图像处理技术等等。 编码&#…

文件消失但是有占用内存的恢复方法

文件消失但占用内存是一个常见的问题&#xff0c;通常是由于文件系统错误或病毒攻击引起的。在这种情况下&#xff0c;文件虽然从目录结构中消失&#xff0c;但它们仍然占用存储空间。本文将分析这一问题的原因&#xff0c;并探讨解决该问题的几种方法。 文件消失但占用内存的原…

Text2SQL学习整理(四)将预训练语言模型引入WikiSQL任务

导语 上篇博客&#xff1a;Text2SQL学习整理&#xff08;三&#xff09;&#xff1a;SQLNet与TypeSQL模型简要介绍了WikiSQL数据集提出后两个早期的baseline&#xff0c;那时候像BERT之类的预训练语言模型还未在各种NLP任务中广泛应用&#xff0c;因而作者基本都是使用Bi-LSTM…

头部首发优志愿头部u_sign生成与TLS指纹处理! + 数据可视化技术讲解【Python爬虫】

目录 针对大学名称 大学排名, 综合指数,学校情况等数据进行爬取 找对应得数据包 请求发现数据有加密 发现加密参数 搜索加密参数&#xff0c;好进行分析 分析过程 数据可视化 针对大学名称 大学排名, 综合指数,学校情况等数据进行爬取 首先进行鼠标右键&#xff0c;进行…

制作PPT找了一个校徽是方形的,如何裁剪为圆形的。

问题描述&#xff1a;制作PPT找了一个校徽是方形的&#xff0c;如何裁剪为圆形的。 问题解决&#xff1a;使用一个在线圆形裁剪软件即可。 网址为&#xff1a; https://crop-circle.imageonline.co/cn/#google_vignette

计算机组成原理综合2

21、和外存储器相比&#xff0c;内存储器的特点是________。C A. 容量大、速度快、成本低 B. 容量大、速度慢、成本高 C. 容量小、速度快、成本高 D. 容量小、速度快、成本低 22、某计算机字长16位&#xff0c;存储器容量64KB&#xff0c;若按字编址&#xf…

网络基础(十二):ACL与NAT

目录 一、ACL 1、ACL的概述 2、ACL的分类 3、ACL的应用 4、ACL的组成和基本原理 ​编辑 5、ACL的配置 5.1配置基本ACL 5.2配置高级ACL 二、NAT 1、NAT的概述 2、NAT的分类 3、NAT的工作原理 4、静态NAT的配置 5、动态NAT的配置 6、NAPT&#xff08;端口映射&am…

01AVue入门(持续学习中)

1.使用AVue开发简单的前端页面直接简单到起飞,他是Element PlusVueVite开发的,不需要向元素的前端代码一样一个组件要传很多参数,他可以使用Json文本来控制我们要传入的数据结构来决定显示什么 //我使用的比较新,我们也可以使用cdn直接使用script标签直接引入 2.开发中遇到的坑…

期货平仓日历(期货平仓日期汇总)

什么是期货平仓日历&#xff1f; 期货是一种高风险高收益的投资品种。而期货交易不同于股票等其他投资品种的交易&#xff0c;期货交易需要在一定时间内才能买卖。而期货平仓日历就是指期货交易中规定的所有合约的平仓日期汇总。 常见期货平仓日期和时间&#xff1f; 不同的…

KylinV10 安装 MySQL 教程(可防踩雷)

KylinV10 安装 MySQL 教程&#xff08;可防踩雷&#xff09; 1、直接用 apt 快捷安装 MySQL $ sudo apt-get update #更新软件源 $ sudo apt-get install mysql-server #安装mysql然后你会发现&#xff0c;KylinV10 安装畅通无阻&#xff0c;并没有设置密码的场景&#xff0c…

Vue: node-sass 无法为当前环境找到绑定, Windows64-bit, 重新安装node-sass失败

参照两位大神的文章总结: 参考1: 解决Node Sass could not find a binding for your current environment: Windows 64-bit with Node.js 14.x-CSDN博客 参考2: 前端开发环境搭建踩坑笔记——npm install node-sass安装失败的解决方案-CSDN博客 总结: 管理员运行 先卸载n…

测试自动化平台 | 测试开发工程师的进阶之路

一、测试工程师的现状 很多测试小伙伴在工作中有时会比较迷茫&#xff0c;不知该怎样突破瓶颈&#xff0c;更好的发展。 那么测试人员究竟该如何打破瓶颈继续向上提升呢&#xff1f;如果你苦于不知所措&#xff0c;又满怀斗志向上的话&#xff0c;不妨一起聊聊。测试职业发展…

Compose 组合项 - 滑动列表 LazyColumn、LazyRow

一、概念 可滚动&#xff0c;类似RecyclerView&#xff08; Column、Row 用 Modifier 设置滚动是相当于ScrollView&#xff09;。 从 Navigation 返回后丢失状态&#xff08;跳到头部&#xff09; &#xff1a;将 LazyListState 提升到 Screen 级别&#xff0c;不用放到 ViewMo…