下面是SLAM算法与工程实践系列文章的总链接,本人发表这个系列的文章链接均收录于此
下面是专栏地址:
这个系列的文章是分享SLAM相关技术算法的学习和工程实践
Windows下的编译方法网上教程很多,这里主要讲Ubuntu下的编译方法
官网地址:https://www.rtklib.com/
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
关于命令的使用方法手册中有详细的说明
rnx2rtkp是一个用于GNSS(全球导航卫星系统)数据处理的软件工具。它主要用于将原始的GNSS观测数据(通常以RINEX格式存储)转换成精密的定位解决方案。这个工具的全称是"RINEX to RTKLIB Post-Processing",它基于RTKLIB,是一个开源的实时运动定位库。
具体而言,rnx2rtkp的功能包括:
阅读 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 文件夹中输出了两个文件
输入数据来自流和分割并将它们输出到多个流中,输入流可以是串行的,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的文件, 记录了代码执行的关键路径.
编译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的函数接口有些不一样
编译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
原版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,并打开
在原项目的根目录下、src文件夹下、app/consapp下各添加一个CMakeLists.txt,
# src文件夹结构如下
src
├── build
├── CMakeLists.txt
├── convgpx.c
├── convkml.c
├── convrnx.c
├── datum.c
├── download.c
├── ephemeris.c
├── geoid.c
├── gis.c
├── ionex.c
├── lambda.c
├── options.c
├── pntpos.c
├── postpos.c
├── ppp_ar.c
├── ppp.c
├── preceph.c
├── rcv
├── rcvraw.c
├── rinex.c
├── rtcm2.c
├── rtcm3.c
├── rtcm3e.c
├── rtcm.c
├── rtkcmn.c
├── rtklib.h
├── rtkpos.c
├── rtksvr.c
├── sbas.c
├── solution.c
├── stream.c
├── streamsvr.c
├── tides.c
└── tle.c
# app/consapp文件夹结构如下
app/consapp
├── clean_consapp.bat
├── CMakeLists.txt
├── convbin
├── install_consapp.bat
├── makefile
├── pos2kml
├── rnx2rtkp
├── rtklib_consapp.groupproj
├── rtklib_consapp.groupproj.local
├── rtkrcv
└── str2str
重构后的代码我放在了:https://github.com/yangtseJin/RTKLIB_2.4.3_cmake