gici-open编译与运行

gici-open编译与运行

  • gici-open
  • 安装与编译
    • 非ROS版本
      • 安装`glog`
      • 指定`ceres`版本
      • 个人习惯
    • ROS版本
    • Bad News:运行出错
  • 配置文件
    • Stream Node
      • formators
      • replay
    • Estimate Node
    • Logging Node
  • 非ROS依赖的运行
    • RTKLIB连接
    • gici运行
  • 总结

gici-open

上海交大最新开源了一套GNSS/INS/Camera组合的框架,看上去功能齐全,结合了GNSS领域的知名框架RTKLIB,VIO领域知名框架OKVIS以及SVO,github地址是gici-open,里面有代码、一个用户手册以及开源的数据集,先争取实现安装以及示例数据的运行吧

安装与编译

非ROS版本

代码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

普通的库到这里就可以跑数据集了!但我发现这个库在通信机制以及数据处理上用了不少技巧(很高级,值得学习),所以还是对数据集格式以及一些处理再了解一些再跑吧

ROS版本

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

就编译完成了

Bad News:运行出错

本以为编译成功应该就没问题了,但是现实还是给了我沉痛的一击,在我命令行输入尝试运行示例数据集的时候,出现了很神奇的报错

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补全)

结果发现还真有!但忘了思考究竟是什么时候安的了,结果给后边埋了个坑
于是把所有都删除完之后,我又重新安装了gloggflag库,然后再去编译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库的配置文件确实和我之前接触到的配置文件都不太一样,所以得认真学习一下,幸好有手册,配置结构的大体文件是有streamestimatelogging三个node,manual里也给了一些解释
gici-open编译与运行_第1张图片
看起来就是stream来定义一些数据流,estimate来定义一些解算模式啊、输入格式之类的,logging就是日志吧。再结合一个实例pseudo_real_time_estimation_SPP_RRR.yaml每个节点来仔细看一下

Stream Node

gici-open编译与运行_第2张图片
gici-open编译与运行_第3张图片

  • 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-clientntrip-client等等,根据使用需要应该是要的
    指得注意的是,在file类型里,有一个属性是enable_time_tag,这个和数据集里就对应上了,数据集里也有很多.tag文件,解释manual里说的很详细了,就是记录时间戳的
    gici-open编译与运行_第4张图片

  • path
    文件的路径,也没什么好说的

formators

streamers后面紧跟着一个formators node,看了一下发现里面定义的东西和之前streamersoutput_tag是能对应上的,常见的选项包括下面几种
gici-open编译与运行_第5张图片里面比较重要的感觉有io(指定是输入还是输出),还有tag(这个就是streamers里面要对应的)

replay

这个单看manual其实没太看懂,感觉是运行了一遍数据后存成tag文件,然后在replay的时候就可以设置像播放速度、以及播放延迟一些的参数?之后再看看这个具体是指啥
gici-open编译与运行_第6张图片

Estimate Node

这个里面设置的就是一些最终运行时相关的模式了,感觉这个里面的内容就和其他一些常见SLAM库的配置文件内容差不多了,manual里给出了常用的选项有
gici-open编译与运行_第7张图片
这个就要结合manual来仔细看了,之后有时间的话详细地记录一期吧

Logging Node

这个感觉就是结合glog库进行的日志文件输出设置
gici-open编译与运行_第8张图片

非ROS依赖的运行

RTKLIB连接

作为测绘人,发现一个SLAM库能和RTKLIB直接连接起来还是很兴奋的,于是兴致勃勃去尝试和rtkplot建立连接,这个其实在gici-dataset这里有说明
gici-open编译与运行_第9张图片
就按这个流程一步一步来就行,因为我第一次运行的时候笔记本和ubuntu主机不在同一个网络下,所以选择了内网穿透的办法,通过映射ubuntu主机tcp,然后再用ubuntu连接,连接本身是没什么问题的
gici-open编译与运行_第10张图片
右上角有这个标志基本就是连接成功了,显示未连接主要是因为还没数据,如果担心的话可以再用RTKLIB的带的strsvr再单独试一下
在这里插入图片描述
gici-open编译与运行_第11张图片
连接没什么问题的话,准备工作就做好了

gici运行

这里需要注意的是一定要把配置文件改好!一开始我没改好,就会出现很多error,主要是Open streamer xxx failed
gici-open编译与运行_第12张图片
当然最后也会以很经典的
已放弃(核心已转储)结尾
gici-open编译与运行_第13张图片
于是我一个一个看,发现每一个Open streamer xxx failed都对应着自己的一个配置文件没改对的地方…于是只要把需要改的
路径
start_time(这个要和你用的数据集对应,数据集对应的时间github里也有写)都改好了,就可以正常运行了
gici-open编译与运行_第14张图片

总结

虽然还没有看代码,但就通过编译运行时候的接触发现,这个库确实做的还是非常好的,尤其是数据处理的部分,感觉可学性很高。由于这个库刚开源,还没什么资料,编译运行过程中遇到的问题基本都是自己嗯想出来的解决方案,可能不具有普适型,我遇到很多问题都是觉得不对暴力的删除重新装,如果您看到了博客按我的方法进行尝试是请务必注意文件安全

你可能感兴趣的:(gici-open,c++,计算机视觉)