关于计算机视觉:轻量视觉里程计框架LVT部署记录

6次阅读

共计 2257 个字符,预计需要花费 6 分钟才能阅读完成。

尝试在一个嵌入式环境上开发基于视觉的定位算法,也就是 视觉里程计。嵌入式的软硬件环境计算能力无限,架构不同,所以部署很多支流算法有点艰难,如 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

后果:

正文完
 0