共计 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
后果: