前段时间看到rtklibexplorer发表的博客raspberry-pi-based-ppk-and-rtk-solutions-with-rtklib,该博客描述了如何在树莓派上用RTKLIB进行实时RTK,感兴趣的同学可以去看看(不过最近用国内网似乎上不了该作者的个人网站)。
对于带linux操作系统的开发板来说,整个流程其实基本是一致的。如果我们想在自己的开发板上利用RTKLIB跑实时RTK,第一步也是要编译RTKLIB,生成可执行文件。由于在linux系统下,一般使用makefile来进行编译,因此这篇文章主要是学习RTKLIB的makefile,以及尝试在linux环境下编译RTKLIB。
RTKLIB Demo5是作者rtklibexplorer在原版RTKlib 2.4.3的一个拓展版本,该作者也在2022年谷歌智能手机分米级定位比赛中取得了第三名的成绩。这个版本的更新相比原版更加活跃,修复了原版上的一些bug,而且针对低成本接收机(如Ublox)进行了很多算法上的提升。
github地址:https://github.com/rtklibexplorer/RTKLIB/
由于“rtkrcv”是RTKLIB做实时RTK的执行程序,因此以它为例子,学习RTKLIB的makefile。“rtkrcv”的makefile位于“RTKLIB-demo5\app\consapp\rtkrcv\gcc"文件夹中。
RTKLIB中的makefile都比较简单清晰,“rtkrcv” 的makefile文件包括了几个部分:
(1)变量定义
变量一般就是字符串,当makefile被执行时,其中的变量会扩展到相应的引用位置。比如在后面我要引用第一行定义的“BINDIR”变量,需要写成“$(BINDIR)”.
下面的变量定义包括:
# 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文件的操作系统指令:
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,测试实际效果。实际测试,一般需要自己修改配置文件,比如输入、输出串口以及数据类型设置等。
编译之前,我先在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