上海交大最新开源了一套GNSS/INS/Camera组合的框架,看上去功能齐全,结合了GNSS领域的知名框架RTKLIB,VIO领域知名框架OKVIS以及SVO,github地址是gici-open,里面有代码、一个用户手册以及开源的数据集,先争取实现安装以及示例数据的运行吧
代码git clone下来后,因为其实我用的系统和开发者的应该是一致的(ubuntu20.04),所以在这里没有遇到什么问题,唯一需要注意的就是之前没有安装glog
库以及我电脑里有两个ceres
版本,所以需要把这两个配一下
glog
其实无非就是又安装了一个库,但是直接git clone 然后安装glog
我发现会报错,后来搜了一下发现是需要先安装一个gflags
,所以先到gflags这里把gflags
编译安装好,再去glog这里,把glog
也编译安装好就可以了,因为gici-open要的是0.6以上,所以其实直接git clone就可以了,已经是最新的版本了
ceres
版本这个只要在CMakeLists.txt文件里加一句话就可以
set(Ceres_DIR /xxx/ceres-solver-2.1.0/usr/local/lib/cmake/Ceres)
xxx
那里就是你ceres 2.1以上版本的路径,当然如果没有装过ceres,直接装一个2.1以上的就好了
在CMakeLists.txt文件里指定好编译模式比较好,因为如果之后需要自己调试或者修改的话,难免要重新cmake和make,这里也是加了一句
set(CMAKE_BUILD_TYPE "Release")
好了,之后只要和标准编译流程就可以了,在gici-open文件夹下
mkdir build && cd build
cmake ..
make -j8
普通的库到这里就可以跑数据集了!但我发现这个库在通信机制以及数据处理上用了不少技巧(很高级,值得学习),所以还是对数据集格式以及一些处理再了解一些再跑吧
gici-open库很贴心的把ros文件夹都建好了(ros_wrapper),所以如果没什么问题的话直接进去catkin_make
就完了。但是!因为之前在用VINS-Fusion的时候出现了cv_bridge和opencv版本冲突的问题,当时一怒之下把ros noetic自带的cv_bridge给删除了,所以这里直接catkin_make就会找不到,回想了一下,当时删除直接就是apt remove
,所以我们反其道而行之,这次直接
sudo apt-get install ros-noetic-cv-bridge
果然,cv_bridge很完美地回到了原来的地方
之后再去
catkin_make
就编译完成了
本以为编译成功应该就没问题了,但是现实还是给了我沉痛的一击,在我命令行输入尝试运行示例数据集的时候,出现了很神奇的报错
ERROR: flag 'logtostderr' was defined more than once ......
这个是glog
库的问题,但是回忆了一下自己以前确实是没有单独安装过glog
的,那为什么会出现重复定义的问题呢?
于是我卸载了电脑里所有的glog
库以及gflag
库,先
locate glog | grep /usr
locate gflags | grep /usr
把找到的相关的东西都删除掉
sudo rm -rf /usr/local/include/glog/
sudo rm -rf /usr/local/lib/libglog*
sudo rm -rf /usr/local/include/gflags/
sudo rm -rf /usr/local/lib/libgflags*
然后通过网上的资料发现通过apt-get也可以安装,所以就想着试一下也删除一下
sudo apt-get remove libgoogle-glog-dev
sudo apt-get remove libgflags(tab补全)
结果发现还真有!但忘了思考究竟是什么时候安的了,结果给后边埋了个坑
于是把所有都删除完之后,我又重新安装了glog
和gflag
库,然后再去编译gici-open
结果编译报错了,这次的报错是
undefined reference to `google::InitVLOG3__(int**, int*, char const*, int)'
...
这个问题卡了好久,后来我仔细翻了下cmake时候报的信息,发现Ceres库也是有依赖glog的!所以可能是在删除之前的库的时候导致这个地方链接出错了。所以我采用的解决办法就是卸载现在的Ceres2.1.0,再安装一遍
用源码重新安装之后我又先编译了一下IC-GVINS
,编译通过,说明Ceres安装的是没啥问题了
再试下gici-open,也编译通过
运行指令
./gici_main ../option/xxx.yaml
当然第一次运行也报错了,不过这个就是别的问题,不是编译的问题了,所以就放在后边说了
gici-open库的配置文件确实和我之前接触到的配置文件都不太一样,所以得认真学习一下,幸好有手册,配置结构的大体文件是有stream
、estimate
和logging
三个node,manual里也给了一些解释
看起来就是stream
来定义一些数据流,estimate
来定义一些解算模式啊、输入格式之类的,logging
就是日志吧。再结合一个实例pseudo_real_time_estimation_SPP_RRR.yaml
每个节点来仔细看一下
tag
pseudo_real_time_estimation_SPP_RRR.yaml
文件里stream:
streamers:
- streamer:
tag: str_gnss_rov_file # gnss流动站观测文件
...
- streamer:
tag: str_gnss_eph # 星历
...
- streamer:
tag: str_imu # imu数据
...
- streamer:
tag: str_camera # 图像数据
...
- streamer:
tag: str_dcb_file # dcb文件
...
- streamer:
tag: str_solution_file # 最后的结果文件
...
output_tags
这个是数据的类型,每一个都是和后边的format
对应的
type
这个是数据类型,manual里面给的示例是serial
,搜了一下是串口的意思,但在pseudo_real_time_estimation_SPP_RRR.yaml
文件里就都是file
了,这个应该就是普通的文件了(保存好的那种),manual下边也给了,还有tcp-client
、ntrip-client
等等,根据使用需要应该是要的
指得注意的是,在file类型里,有一个属性是enable_time_tag
,这个和数据集里就对应上了,数据集里也有很多.tag文件,解释manual里说的很详细了,就是记录时间戳的
path
文件的路径,也没什么好说的
在streamers
后面紧跟着一个formators
node,看了一下发现里面定义的东西和之前streamers
里output_tag
是能对应上的,常见的选项包括下面几种
里面比较重要的感觉有io(指定是输入还是输出),还有tag(这个就是streamer
s里面要对应的)
这个单看manual其实没太看懂,感觉是运行了一遍数据后存成tag文件,然后在replay的时候就可以设置像播放速度、以及播放延迟一些的参数?之后再看看这个具体是指啥
这个里面设置的就是一些最终运行时相关的模式了,感觉这个里面的内容就和其他一些常见SLAM库的配置文件内容差不多了,manual里给出了常用的选项有
这个就要结合manual来仔细看了,之后有时间的话详细地记录一期吧
作为测绘人,发现一个SLAM库能和RTKLIB
直接连接起来还是很兴奋的,于是兴致勃勃去尝试和rtkplot
建立连接,这个其实在gici-dataset这里有说明
就按这个流程一步一步来就行,因为我第一次运行的时候笔记本和ubuntu主机不在同一个网络下,所以选择了内网穿透的办法,通过映射ubuntu主机tcp,然后再用ubuntu连接,连接本身是没什么问题的
右上角有这个标志基本就是连接成功了,显示未连接主要是因为还没数据,如果担心的话可以再用RTKLIB
的带的strsvr
再单独试一下
连接没什么问题的话,准备工作就做好了
这里需要注意的是一定要把配置文件改好!一开始我没改好,就会出现很多error,主要是Open streamer xxx failed
当然最后也会以很经典的已放弃(核心已转储)结尾
于是我一个一个看,发现每一个Open streamer xxx failed
都对应着自己的一个配置文件没改对的地方…于是只要把需要改的路径和start_time(这个要和你用的数据集对应,数据集对应的时间github里也有写)
都改好了,就可以正常运行了
虽然还没有看代码,但就通过编译运行时候的接触发现,这个库确实做的还是非常好的,尤其是数据处理的部分,感觉可学性很高。由于这个库刚开源,还没什么资料,编译运行过程中遇到的问题基本都是自己嗯想出来的解决方案,可能不具有普适型,我遇到很多问题都是觉得不对暴力的删除重新装,如果您看到了博客按我的方法进行尝试是请务必注意文件安全。