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

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.mfbz.cn/a/259295.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

node.js mongoose middleware

目录 官方文档 简介 定义模型 注册中间件 创建doc实例,并进行增删改查 方法名和注册的中间件名相匹配 执行结果 分析 错误处理中间件 手动抛出错误 注意点 官方文档 Mongoose v8.0.3: Middleware 简介 在mongoose中,中间件是一种允许在执…

Linux静态ip

Linux静态ip Ⅰ、修改静态ip Ⅰ、修改静态ip 修改静态ip必须是root用户 su root //切换root用户 ip a //查看修改前的动态ipvi /etc/sysconfig/network-scripts/ifcfg-ens33 //打开网卡配置文件,修改一处,新增四处 BOOTPROTO&quo…

NumPy教程(一)—— ndarray:多维数组对象

前言 该numpy学习笔记参考了菜鸟教程网、b站up主 孙兴华zz 的《孙兴华中文讲python数据分析三部曲》以及《北理-python数据分析与展示》,课本推荐使用《利用python进行数据分析》 Numpy简介: NumPy(Numerical Python) 是 Python 语言的一个扩展程序库&a…

RHCE8 资料整理(十一)

RHCE8 资料整理 第 32 章 控制语句32.1 判断语句 when32.1.1 when 判断中>、<、!和的使用32.1.2 when 判断中 in的用法32.1.3 when 判断中 is的用法 32.2 判断语句 block-rescue32.3 循环语句 第 32 章 控制语句 一个play中可以包含多个task&#xff0c;如果不想所有的t…

电子学会C/C++编程等级考试2022年06月(六级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:小白鼠再排队2 N只小白鼠(1 < N < 100),每只鼠头上戴着一顶有颜色的帽子。现在称出每只白鼠的重量,要求按照白鼠重量从小到大的顺序输出它们头上帽子的颜色。帽子的颜色用 “red”,“blue”等字符串来表示。不同的小白…

董宇辉“回归”成为东方甄选高级合伙人,尘埃落地后是谁赢了?

董宇辉“回归”成为东方甄选高级合伙人&#xff0c;尘埃落地后是谁赢了&#xff1f; 董宇辉的“小作文事件”“CEO摔手机事件”迎来大结局了&#xff01; 就在12月18日&#xff0c;董宇辉被任命为新东方教育科技集团董事长文化助理&#xff0c;兼任新东方文旅集团副总裁。有朋…

Excel如何将行的值转换为列值?

问题:Excel如何将行的值转换为列值?(如图左表变成右表) 1.用 SUMIFS(求和区域, 条件区域1, 条件1, [条件区域2, 条件2], ...)函数 比如:=SUMIFS($C$2:$C$8,$A$2:$A$8,H3,$B$2:$B$8,"快车") 2.直接用简单的透视表 (1)随机点击目标目标表格任何位置,点击插入…

Gin之GORM事务(转账操作)

禁用默认事务的操作 为了确保数据一致性,GORM 会在事务里执行写入操作(创建、更新、删除)。如果没有这方面的要求,您可以在初始化时禁用它,这将获得大约 30%+ 性能提升。 // 全局禁用 db, err := gorm.Open(sqlite.Open("gorm.db"), &gorm.Config{SkipDef…

Just Laws -- 中华人民共和国法律文库,简单便捷的打开方式

链接&#xff1a;JustLaws | Home 一个简洁便捷的中华人民共和国法律文库&#xff0c;而且收录比较完善&#xff0c;都是平常网民可能用到比较多的法律知识&#xff0c;目前包括宪法及宪法相关法、民商法、行政法、经济法、社会法、刑法和程序法等等 页面以文档的风格展示每一…

Java设计模式:工厂模式(简单工厂模式、工厂方法模式、抽象工厂模式)

❤ 作者主页&#xff1a;欢迎来到我的技术博客&#x1f60e; ❀ 个人介绍&#xff1a;大家好&#xff0c;本人热衷于Java后端开发&#xff0c;欢迎来交流学习哦&#xff01;(&#xffe3;▽&#xffe3;)~* &#x1f34a; 如果文章对您有帮助&#xff0c;记得关注、点赞、收藏、…

正向代理和反向代理的区别与联系

一、代理 代理就相当于中间商,本来A和B是可以直接连接的,但是此时添加了一个C在中间,A跟B不直接连接,而是通过C作为中介进行连接。最常见的例子就是二手东,其实很多我们租房子时签约的人不是房子的真正房东,而是房东委托的中介,房东不想管事或者房子太多,只靠自己无法进行管理,…

LVS负载均衡器(DR模式)+nginx七层代理+tomcat多实例+php+mysql 实现负载均衡以及动静分离、数据库的调用!!!

目录 前言 一、nfs共享存储&#xff0c;为两个节点服务器提供静态网页共享 二、nginx作为lvs的后端节点服务器&#xff0c;完成lo:0网卡配置&#xff0c;以及内核参数设置&#xff0c;还有设置路由表 步骤一&#xff1a;先完成nfs共享存储挂载 步骤二&#xff1a;完成lo:0网…

七:爬虫-数据解析之正则表达式

七&#xff1a;正则表达式概述 正则表达式&#xff0c;又称规则表达式,&#xff08;Regular Expression&#xff0c;在代码中常简写为regex、regexp或RE&#xff09;&#xff0c;是一种文本模式&#xff0c;包括普通字符&#xff08;例如&#xff0c;a 到 z 之间的字母&#xf…

Java解决不同路径问题2

Java解决不同路径问题2 01题目 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish”&#xff09;。 现在考虑网格中…

移动云捐赠三款开源项目,加速新一代基础软件生态繁荣

随着云计算、大数据、人工智能等新领域新信息技术的发展&#xff0c;我国基础软件的自主可控极大程度地影响着产业链上下游的多样性和技术创新的发展空间。移动云作为中国移动涉云业务的主入口&#xff0c;一直坚持共享开源价值&#xff0c;积极推动中国开源软件生态的繁荣发展…

AWS 知识一:如何在AWS上启动云AD服务器(详细到极致)

前言&#xff1a; 首先这里指的云AD服务器&#xff0c;只是为了让读友更好理解。云AD服务器在AWS中称为目录。AWS一共提供了4种目录类别&#xff0c;下面我将全程使用AWS托管微软AD这种目录类别进行示例。他完全提供了和Microsoft AD的功能&#xff0c;包括NTLM&#xff0c;Ker…

机器学习基础实验(使用 Pandas 进行数据探索)

介绍 本次实验通过分析电信运营商的客户离网率数据集来熟悉 Pandas 数据探索的常用方法&#xff0c;并构建一个预测客户离网率的简单模型。 知识点 排列索引交叉表透视表数据探索 课程介绍 机器学习开放基础课程是蓝桥云课经由 Open Machine Learning Course 授权并制作的…

Oracle定时任务的创建与禁用/删除

在开始操作之前&#xff0c;先从三W开始&#xff0c;即我常说的what 是什么&#xff1b;why 为什么使用&#xff1b;how 如何使用。 一、Oracle定时器是什么 Oracle定时器是一种用于在特定时间执行任务或存储过程的工具&#xff0c;可以根据需求设置不同的时间段和频率来执行…

el-form与el-upload结合上传带附件的表单数据(后端篇)

1.写在之前 本文采用Spring Boot MinIO MySQLMybatis Plus技术栈&#xff0c;参考ruoyi-vue-pro项目。 前端实现请看本篇文章el-form与el-upload结合上传带附件的表单数据&#xff08;前端篇&#xff09;-CSDN博客。 2.需求描述 在OA办公系统中&#xff0c;流程表单申请人…

无约束优化问题求解笔记(1)

目录 1. 迭代求解的基本流程与停止准则1.1 迭代求解的基本流程1.2 停止准则1.3 收敛阶 2. 线搜索方法2.1 精确线搜索2.2 非精确搜索**Goldstein 准则****Wolfe 准则** 2.3 线搜索算法的收敛性 1. 迭代求解的基本流程与停止准则 1.1 迭代求解的基本流程 优化问题的解通常无法直…
最新文章