如何在linux下编译RTKLIB(实时RTK程序rtkrcv)

文章目录

    • 一、RTKLIB Demo5代码下载
    • 二、RTKLIB的makefile
    • 三、编译rtkrcv

欢迎关注个人公众号:导航员学习札记

前段时间看到rtklibexplorer发表的博客raspberry-pi-based-ppk-and-rtk-solutions-with-rtklib,该博客描述了如何在树莓派上用RTKLIB进行实时RTK,感兴趣的同学可以去看看(不过最近用国内网似乎上不了该作者的个人网站)。

对于带linux操作系统的开发板来说,整个流程其实基本是一致的。如果我们想在自己的开发板上利用RTKLIB跑实时RTK,第一步也是要编译RTKLIB,生成可执行文件。由于在linux系统下,一般使用makefile来进行编译,因此这篇文章主要是学习RTKLIB的makefile,以及尝试在linux环境下编译RTKLIB。

一、RTKLIB Demo5代码下载

RTKLIB Demo5是作者rtklibexplorer在原版RTKlib 2.4.3的一个拓展版本,该作者也在2022年谷歌智能手机分米级定位比赛中取得了第三名的成绩。这个版本的更新相比原版更加活跃,修复了原版上的一些bug,而且针对低成本接收机(如Ublox)进行了很多算法上的提升。

github地址:https://github.com/rtklibexplorer/RTKLIB/

二、RTKLIB的makefile

由于“rtkrcv”是RTKLIB做实时RTK的执行程序,因此以它为例子,学习RTKLIB的makefile。“rtkrcv”的makefile位于“RTKLIB-demo5\app\consapp\rtkrcv\gcc"文件夹中。

RTKLIB中的makefile都比较简单清晰,“rtkrcv” 的makefile文件包括了几个部分:

(1)变量定义

变量一般就是字符串,当makefile被执行时,其中的变量会扩展到相应的引用位置。比如在后面我要引用第一行定义的“BINDIR”变量,需要写成“$(BINDIR)”.

下面的变量定义包括:

  • "BINDIR"定义了安装可执行文件的路径,用在后面的“install”中,其实就是把可执行程序拷到这个文件夹
  • “SRC”定义了源文件路径
  • “CTARGET”定义了一些宏, gcc的-D选项可以定义宏,这里所定义的宏包括了是否打开trace、是否打开各个GNSS系统、使用多少个频段、预留多少个额外频段等
  • “CFLAGS ”则定义了一些gcc编译选项,比如-Wall表示打开所有warning,-I是加入头文件路径等
  • “LDLIBS ”告诉链接器要链接哪些库文件
# makefile for rtkrcv

BINDIR = /usr/local/bin
SRC    = ../../../../src

CTARGET= -DTRACE -DENAGLO -DENAQZS -DENACMP -DENAGAL -DENAIRN -DNFREQ=3 -DNEXOBS=3 -DSVR_REUSEADDR
#CTARGET= -DENAGLO -DENAQZS -DENACMP -DENAGAL -DENAIRN -DNFREQ=3 -DIERS_MODEL -DSVR_REUSEADDR

CFLAGS = -Wall -O3 -ansi -pedantic -Wno-unused-but-set-variable -I$(SRC) -I.. -DTRACE $(CTARGET) -g
LDLIBS  = -lm -lrt -lpthread
#LDLIBS  = ../../../lib/iers/gcc/iers.a -lm -lrt -lpthread

(2)可执行文件和中间目标文件定义

Makefile的第一个目标会被作为默认目标,下面第一行申明了一个“all”伪目标,后面的rtkrcv即为我们要生成的可执行文件(我们的最终目标)。

后面几行是rtkrcv所依赖的.o文件,这个例子里其实就是依赖了所有.o文件。LINUX下编译生成的.o文件就相当于Windows下的.obj文件,用于后续链接(link)生成可执行文件。

all        : rtkrcv
rtkrcv     : rtkrcv.o vt.o rtkcmn.o rtksvr.o rtkpos.o geoid.o solution.o lambda.o
rtkrcv     : sbas.o stream.o rcvraw.o rtcm.o preceph.o options.o pntpos.o ppp.o ppp_ar.o
rtkrcv     : novatel.o ublox.o crescent.o skytraq.o javad.o nvs.o binex.o
rtkrcv     : rt17.o ephemeris.o rinex.o ionex.o rtcm2.o rtcm3.o rtcm3e.o
rtkrcv     : tides.o septentrio.o swiftnav.o

(3)定义生成的.o文件及执行指令

这一部分定义了每个.o文件依赖的源文件和头文件,以及生成该.o文件的操作系统指令:

  • $(CC)为操作系统默认的C/C++编译器,比如在linux环境下可能是gcc,在windows环境可能是MSCV
  • -c表示只编译(compile)源文件但不链接
  • $(CFLAGS)变量则是最前面定义的指令。
rtkrcv.o   : ../rtkrcv.c
	$(CC) -c $(CFLAGS) ../rtkrcv.c
vt.o       : ../vt.c
	$(CC) -c $(CFLAGS) ../vt.c
rtkcmn.o   : $(SRC)/rtkcmn.c
	$(CC) -c $(CFLAGS) $(SRC)/rtkcmn.c
	
.......

rtkrcv.o   : $(SRC)/rtklib.h ../vt.h
rtkcmn.o   : $(SRC)/rtklib.h
.......

(4)安装
当输入“make install”后,会执行下面的指令,即将可行执行文件rtkrcv拷贝到最前面定义的$(BINDIR)路径下。

install:
	cp rtkrcv $(BINDIR)

(5)测试

输入“make test1”,“mak test2”,“make test3”会对应执行下面的指令。

test1:
	./rtkrcv -t 4 -m 52001 -t 4

test2:
	./rtkrcv -p 2105 -m 52001

test3:
	./rtkrcv -o ../rtk_pb.conf

(6)clean

每个makefile一般都有一个“clean”,通常是放在makefile的最后,用来清除。

输入“make clean”指令就会执行下面的命令,即删除所有文件。

clean:
	rm -f rtkrcv rtkrcv.exe rtkrcv.nav *.o *.out *.trace

至此,整个makefile文件我们就看完了。

三、编译rtkrcv

因为我手边没有板子,所以我就只编译一下,看看能否生成可执行文件rtkrcv,并不运行。有开发和运行环境的话,可以编译后直接运行rtkrcv,测试实际效果。实际测试,一般需要自己修改配置文件,比如输入、输出串口以及数据类型设置等。

编译之前,我先在windows电脑上安装了个ubuntu子系统,感兴趣的话可以参考这篇文章Windows10/11 三步安装wsl2 Ubuntu20.04(任意盘)。

在默认方式下,输入make命令,make会自动在当前目录下寻找名字叫“makefile”的文件。所以我们将代码下载下来后,直接到“RTKLIB\app\consapp\rtkrcv\gcc\”文件夹下输入make指令即可。

在ubuntu命令行窗口输入如下命令:

git clone https://github.com/rtklibexplorer/RTKLIB.git
cd RTKLIB/app/consapp/rtkrcv/gcc
make

编译过程中会有很多warning,但是没有报错,所以可以忽略。编译完成后,会发现文件夹下生成了makefile中定义的.o文件和可执行程序rtkrcv,证明我们成功编译。

在这里插入图片描述
参考资料
[1] raspberry-pi-based-ppk-and-rtk-solutions-with-rtklib
[2] NEO M8T with RTKRCV on Raspberry Pi 3

你可能感兴趣的:(RTKLIB,LINUX,ubuntu)