尝试在一个嵌入式环境上开发基于视觉的定位算法,也就是视觉里程计。嵌入式的软硬件环境计算能力无限,架构不同,所以部署很多支流算法有点艰难,如ORB-SLAM系列,DSO系列,VINS-Fusion系列。
板子是夕阳x3,大略500块钱,操作系统Ubuntu20。接入摄像头跑了一下官网指标检测sample,实时性勉强,算是个入门级的板子。
我首先尝试的是VINS和DSO两个框架,发现编译VINS的时候间接CPU占满卡死,无论cmake指令加-j并行编译还是创立替换内存,依然卡死,于是尝试部署DSO,DSO通过替换内存艰巨地编译胜利了,然而运行官网数据集时处理速度极慢,大概2-3秒一帧,CPU还是满载,感觉优化空间太大,遂放弃。
原本想要么本人拼装一个轻量的框架,然而工夫紧迫不想造轮子了,就持续调研更轻量的框架,而后发现了LVT。
论文:Lightweight Visual Odometry for Autonomous Mobile Robots
github:https://github.com/SAR-Research-Lab/lvt
我的项目绝对冷门,但也有大量的援用和改良。反对双目和RGBD相机输出。
最次要的是该工作能在树莓派3上运行,单帧解决工夫不到200ms,体量和内存都极小,而且精度尚可,官网数据集验证超过了LIBVISO2,靠近支流VSLAM零碎。我的项目在Ubuntu和Windows上胜利构建,我感觉这可能是非常适合我的需要的框架,上面打算在它的根底上开发。
我想在本人的win11上做开发,借助vcpkg能够极大简化依赖的装置,值得致力一下。
应用vcpkg装置依赖
我想用最新的opencv4和CUDA,所以我先对照本人显卡,装置了CUDA11。此处不赘述。
而后下载vcpkg,略微学习一下应用,参考:https://blog.csdn.net/cjmqas/article/details/79282847
为了避免vcpkg下载依赖时网络引起的乌七八糟问题,把梯子挂上。
而后通过vcpkg一键装置opencv4(contrib,带CUDA),g2o和pangolin。装置g2o时会主动装置eigen3。vcpkg会主动下载这些依赖,编译,实现装置。速度比较慢,要急躁期待。
实现后应用.\vcpkg.exe integrate install
集成到全局,让任何VS工程里能找到这些依赖。
最初,把vcpkg装置的地位全副加到环境变量里去,让cmake可能从这里找包,省得配置来配置去。
用.\vcpkg.exe list
查看已装置的依赖,发现我的环境具体是:
- opencv v4.7
- eigen3
- g2o (2020)
- pangolin v0.8
cmake生成解决方案+VS2019生成
clone下来lvt的代码,建一个build文件夹,进去后cmake..
生成VS的解决方案。
能够看到须要的依赖都找到了,不过我应用的opencv和g2o都是新版本的,所以还要批改一下源码。
关上build里生成的lvt.sln。间接生成的话,必定会有opencv相干的报错,因为我用的是opencv4,所以要去源码里把找不到定义的变量名批改一下,不多。
另外还有g2o新版本里的求解器的用法变了,要应用unique_ptr。参考该同学的博客:https://blog.csdn.net/robinhjwy/article/details/78084210 对照着批改了一下。
右击ALL_BUILD -> 生成,把可执行我的项目全副生成。
如果要可视化展现,确保CMakeLists.txt里把pangolin编译的选项置为“ON”,而后生成。我尝试了开启,然而Pangolin报了一堆gl.h未声明符号的错,我查了半天不明确起因,有的说没有引入opengl32.lib,有的间接用旧版本v0.5,我这里就先敞开pangolin的编译。
生成胜利。
指标视图如下。lvt生成库,三个example生成对应数据集的测试程序。经VS生成后,会发现在三个example目录下/debug中生成了可执行程序。
KITTI数据集测试
下载KITTI odometry数据集,应用sequences/00测试。
报错1:
短少opencv xfeatures2d4d.dll终止运行。
- 解决:关上可执行程序所在的文件夹发现的确没有该动静库,起因不明。我在VS里由debug模式改成release模式从新生成,发现xfeatures2d4d.dll等加载到可执行程序所在目录了,该报错解决。
报错2:
Can't open file: 'calib/00.yml' in read mode
- 解决:察看一下就会发现,因为我在VS里生成我的项目,可执行程序会被输入到/debug或/release文件夹里,而kitti_example.cpp的main函数是从以后门路下读取标定文件,所以把读取门路的代码批改一下就好。
将kitti example设为启动我的项目,依据main函数里的定义,在我的项目属性页填写参数。我写的是绝对路径,同时留神其它文件的读取门路是否正确,可能须要批改一下。
开始运行。因为没有开启可视化,所以终端只打印了解决的帧数。lvt内有获取以后地位的接口,我调用了一下在终端里打印出以后地位。
执行后果:
在我的PC上,均匀一帧解决工夫0.015s,也就是约66FPS,速度还是十分快的。
用evo绘制轨迹,只展现仰视角
evo_traj kitti 00.txt -p --plot_mode=xz
后果: