视觉SLAM十四讲——ch13实践(设计SLAM系统)

news2024/11/24 16:27:07

视觉SLAM十四讲——ch13的实践操作及避坑

  • 1. 实践操作前的准备工作
  • 2. 实践过程
    • 2.1 运行测试程序
    • 2.2 运行00数据集
    • 2.3 更改代码画出运动轨迹
  • 3. 遇到的问题及解决办法
    • 3.1 cmake ..时出现的问题
    • 3.2 make时出现的问题
    • 3.3 头文件下红色报错

1. 实践操作前的准备工作

  1. 下载Kitti数据集,下载网址:https://www.cvlibs.net/datasets/kitti/eval_odometry.php
    它的odometry数据大约有22GB.下载解压后可以得到若干个视频段,本次我们使用第0段进行实践。
  2. 在终端中进入ch13文件夹下,顺序执行以下命令进行编译。
mkdir build
cd build
cmake ..
//注意,j8还是其他主要看自己的电脑情况
make -j8
  1. 在ch13文件下的bin文件中进行运行。
    注意: 在make过程中,将错误改正后,依然会出现warning,但是对我们此实践的过程几乎没有影响。
  2. 将config目录下default.yaml文件中的文件路径进行更改,将路径更改为自己数据所在的路径下面是我的更改:
# 更改前
dataset_dir: /mnt/1A9286BD92869CBF/Dataset/Kitti/dataset/sequences/05
# 更改后
dataset_dir: /home/fighter/slam/slambook2/ch13/00
  1. 同样的,我们也需要将run_kitti_stereo.cpp文件中的文件引用路径,更改前后如下所示:
//更改前
DEFINE_string(config_file, "./config/default.yaml", "config file path");
//更改后
DEFINE_string(config_file, "/home/fighter/slam/slambook2/ch15/config/default.yaml", "config file path");
//更改原因:绝对路径可以避免一些后期不必要的麻烦,记得重新make。
  1. (可选)在VSCode中打开ch13工作空间,可以在很多文件中看到include头文件下面有红色波浪线报错,但是按照之前配置好的,工作环境直接运行也没问题。调整后的includePath主要包含:
                "${workspaceFolder}/**",
                "/usr/include/eigen3",
                "/usr/include/opencv4",
                "/usr/include/suitesparse"

2. 实践过程

2.1 运行测试程序

运行语句:
在ch13文件中,进入到bin文件夹下,执行以下语句:

./test_triangulation

运行结果:
test运行结果

2.2 运行00数据集

运行语句:

 ./run_kitti_stereo

运行结果:
可视化结果:
https://download.csdn.net/download/qq_44164791/87934968
第一段视频是ch13中原本的代码,经过更改一些错误之后,能够正常运行程序。
终端输出部分示例:

I0620 16:27:00.055335 13144 visual_odometry.cpp:65] VO cost time: 0.0070335 seconds.
I0620 16:27:00.055406 13144 visual_odometry.cpp:44] VO is running
I0620 16:27:00.076495 13144 frontend.cpp:269] Find 128 in the last image.
I0620 16:27:00.077795 13144 frontend.cpp:215] Outlier/Inlier in pose estimating: 18/87
I0620 16:27:00.077836 13144 frontend.cpp:220] Current Pose =
00.888545 -0.427115 -0.167511 0-35.5003
00.393009 00.896979 -0.202415 0-462.659
00.236708 00.114022 00.964867 0-247.216
000000000 000000000 000000000 000000001
I0620 16:27:00.081686 13144 visual_odometry.cpp:65] VO cost time: 0.005869 seconds.
I0620 16:27:00.081735 13144 visual_odometry.cpp:44] VO is running
I0620 16:27:00.113430 13144 frontend.cpp:269] Find 112 in the last image.
I0620 16:27:00.115217 13144 frontend.cpp:215] Outlier/Inlier in pose estimating: 13/67
I0620 16:27:00.115278 13144 frontend.cpp:220] Current Pose =
00.890851 -0.421528 -0.169406 0-38.2629
000.38627 00.899102 0-0.20594 0-461.247
00.239123 00.118026 000.96379 0-250.589
000000000 000000000 000000000 000000001
I0620 16:27:00.115438 13144 map.cpp:79] remove keyframe 932
I0620 16:27:00.115639 13144 map.cpp:110] Removed 113 active landmarks
I0620 16:27:00.115675 13144 frontend.cpp:81] Set frame 4535 as keyframe 939
I0620 16:27:00.123732 13144 frontend.cpp:308] Detect 100 new features
I0620 16:27:00.124994 13144 frontend.cpp:350] Find 201 in the right image.
I0620 16:27:00.125965 13144 frontend.cpp:139] new landmarks: 123
I0620 16:27:00.144817 13144 visual_odometry.cpp:65] VO cost time: 0.0355153 seconds.
I0620 16:27:00.144896 13144 visual_odometry.cpp:44] VO is running
I0620 16:27:00.153093 13151 backend.cpp:163] Outlier/Inlier in optimization: 0/2147
I0620 16:27:00.186288 13144 frontend.cpp:269] Find 172 in the last image.
I0620 16:27:00.188879 13144 frontend.cpp:215] Outlier/Inlier in pose estimating: 22/137
I0620 16:27:00.188935 13144 frontend.cpp:220] Current Pose =
00.888264 -0.427094 -0.169049 0-35.2398
00.390936 00.896157 -0.209933 0-460.647
00.241156 00.120388 000.96299 0-253.153
000000000 000000000 000000000 000000001
I0620 16:27:00.192497 13144 visual_odometry.cpp:65] VO cost time: 0.0075273 seconds.
I0620 16:27:00.192548 13144 visual_odometry.cpp:44] VO is running
I0620 16:27:00.204964 13144 frontend.cpp:269] Find 132 in the last image.
I0620 16:27:00.206867 13144 frontend.cpp:215] Outlier/Inlier in pose estimating: 15/102
I0620 16:27:00.206925 13144 frontend.cpp:220] Current Pose =
00.889966 0-0.42294 -0.170536 0-37.2853
00.387267 00.898407 -0.207097 0-461.014
0000.2408 00.118266 00.963342 0-253.325
000000000 000000000 000000000 000000001
I0620 16:27:00.221396 13144 visual_odometry.cpp:65] VO cost time: 0.017146 seconds.
I0620 16:27:00.221469 13144 visual_odometry.cpp:44] VO is running
I0620 16:27:00.251788 13144 frontend.cpp:269] Find 119 in the last image.
I0620 16:27:00.253571 13144 frontend.cpp:215] Outlier/Inlier in pose estimating: 16/80
I0620 16:27:00.253782 13144 frontend.cpp:220] Current Pose =
000.89121 -0.419695 -0.172049 0-38.7982
00.384802 00.900376 -0.203104 0-461.756
00.240151 00.114803 00.963923 0-252.879
000000000 000000000 000000000 000000001
I0620 16:27:00.268241 13144 visual_odometry.cpp:65] VO cost time: 0.017168 seconds.
I0620 16:27:00.268343 13144 visual_odometry.cpp:44] VO is running
I0620 16:27:00.318046 13144 frontend.cpp:269] Find 111 in the last image.
I0620 16:27:00.322237 13144 frontend.cpp:215] Outlier/Inlier in pose estimating: 4/72
I0620 16:27:00.322328 13144 frontend.cpp:220] Current Pose =
00.891961 -0.417701 -0.173005 0-39.7112
00.383965 000.90189 -0.197902 0-462.921
00.238695 00.110093 00.964834 0-251.737
000000000 000000000 000000000 000000001
I0620 16:27:00.322566 13144 map.cpp:79] remove keyframe 933
I0620 16:27:00.322924 13144 map.cpp:110] Removed 114 active landmarks
I0620 16:27:00.322980 13144 frontend.cpp:81] Set frame 4539 as keyframe 940
I0620 16:27:00.330118 13144 frontend.cpp:308] Detect 103 new features
I0620 16:27:00.333930 13144 frontend.cpp:350] Find 193 in the right image.
I0620 16:27:00.335049 13144 frontend.cpp:139] new landmarks: 110
I0620 16:27:00.350602 13144 visual_odometry.cpp:65] VO cost time: 0.0332755 seconds.
I0620 16:27:00.350790 13144 visual_odometry.cpp:44] VO is running
I0620 16:27:00.362143 13151 backend.cpp:163] Outlier/Inlier in optimization: 0/2135
I0620 16:27:00.378190 13144 frontend.cpp:269] Find 169 in the last image.
I0620 16:27:00.380698 13144 frontend.cpp:215] Outlier/Inlier in pose estimating: 17/144
I0620 16:27:00.380779 13144 frontend.cpp:220] Current Pose =
00.887592 -0.427112 -0.172499 0-34.5528
00.394054 00.897983 -0.195827 0-464.253
00.238541 00.105841 00.965347 0-251.064
000000000 000000000 000000000 000000001
I0620 16:27:00.383298 13144 visual_odometry.cpp:65] VO cost time: 0.0060374 seconds.
I0620 16:27:00.383389 13144 visual_odometry.cpp:44] VO is running
W0620 16:27:00.425977 13144 dataset.cpp:61] cannot find images at index 4541
I0620 16:27:00.451663 13151 backend.cpp:163] Outlier/Inlier in optimization: 0/2135
I0620 16:27:00.463881 13152 viewer.cpp:78] Stop viewer
I0620 16:27:00.468593 13144 visual_odometry.cpp:53] VO exit

2.3 更改代码画出运动轨迹

运行语句:

 ./run_kitti_stereo

运行结果:
可视化结果:
https://download.csdn.net/download/qq_44164791/87934968
第二段视频是经过更改可视化的代码,将相机的运动轨迹绘画出来,但是根据视频可以看出来,轨迹效果并不好
第三段视频是在第二段视频的运行代码上,将后端优化的部分给注释掉后,通过轨迹可以看出来效果比较好,可能因为优化时矫正过度的原因。
由于没有更改输出信息,因此终端输出和2.2相同。

3. 遇到的问题及解决办法

3.1 cmake …时出现的问题

  1. 出现的问题:
CMake Error at CMakeLists.txt:18 (find_package):
  Could not find a configuration file for package "OpenCV" that is compatible
  with requested version "3.1".
  The following configuration files were considered but not accepted:
    /usr/local/lib/cmake/opencv4/OpenCVConfig.cmake, version: 4.5.0
    /usr/lib/x86_64-linux-gnu/cmake/opencv4/OpenCVConfig.cmake, version: 4.2.0
    /lib/x86_64-linux-gnu/cmake/opencv4/OpenCVConfig.cmake, version: 4.2.0
-- Configuring incomplete, errors occurred!
See also "/home/fighter/slam/slambook2/ch15/build/CMakeFiles/CMakeOutput.log".

原因:
这还是我们之前遇到过好多次的opencv版本的问题,和之前一样更改即可。
处理办法:
直接和之前的解决办法一样,更改CMakeLists.txt文件中的opencv版本即可。

//更改前:
find_package(OpenCV 3.1 REQUIRED)
//更改后:
find_package(OpenCV REQUIRED)

3.2 make时出现的问题

  1. 出现的问题:

make 时出现的问题
原因:
这个编译错误是因为您在使用 OpenCV 库时,使用了在较早版本中定义的已弃用的常量 CV_FILLED。在 OpenCV 版本 4.x 中,该常量已被重命名为 cv::FILLED。
解决办法:

// 在frontend.cpp文件中添加头文件
#include <opencv2/imgproc/imgproc_c.h>
//在viewer.cpp文件中添加头文件
#include <opencv2/imgproc/types_c.h>

有关opencv错误可参考:
https://blog.csdn.net/qq_44164791/article/details/131210608?spm=1001.2014.3001.5501

3.3 头文件下红色报错

例:
出现的问题
解决办法,直接点击第一个选项,添加工作空间的工具包的路径。
最终在文件c_cpp_properties.json中内容h如下所示:

{
    "configurations": [
        {
            "name": "Linux",
            "includePath": [
                "${workspaceFolder}/**",
                "/usr/include/eigen3",
                "/usr/include/opencv4",
                "/usr/include/suitesparse"
            ],
            "defines": [],
            "compilerPath": "/usr/bin/gcc",
            "cStandard": "c17",
            "cppStandard": "gnu++14",
            "intelliSenseMode": "linux-gcc-x64"
        }
    ],
    "version": 4
}

本文章仅仅是代码实践过程中,没有进行代码详读,代码祥读在后面的文章会有。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/667260.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用dat.gui更改three.js中的物体变量

一、dat.gui介绍 gui是一种JavaScript库&#xff0c;用于创建可视化控件和调试工具。它是dat.gui的简称。dat.gui是一个用于在Web应用程序中创建可定制GUI的JavaScript库。它可以轻松创建滑块、复选框、颜色选择器等控件&#xff0c;用户可以直接在GUI上进行交互和调整。dat.g…

一起来看看 K-verse LAND 销售活动中的合作伙伴给大家的祝福吧~

K-verse 是 The Sandbox 中的韩国内容主题空间&#xff0c;自去年 12 月首次推出以来&#xff0c;已吸引多家合作伙伴加入。此外&#xff0c;现有的合作伙伴公司和品牌正在积极准备以新的形式展示元宇宙内容。 这里有着许多可能性&#xff0c;K-verse LAND 销售活动是不是让你们…

Tomcat及项目部署

一、Tomcat是什么&#xff1f; Tomcat 是基于 Java 实现的⼀个开源免费, 也是被⼴泛使⽤的 HTTP 服务器。 二、下载安装 官⽅⽹站&#xff1a;https://tomcat.apache.org/ 选择其中的 zip 压缩包, 下载后解压缩即可. 解压缩的⽬录最好不要带 "中⽂" 或者 特殊符号…

vue-cli 如何修改默认环境变量名称

比如想要修改开发环境 NODE_ENV 的默认值 &#xff1f; 1. 新建文件 .env.development 2. 在 packjson.json 的 script 中添加一行代码 --mode [文件 env 后面的环境名称] "dev": "vue-cli-service serve --mode development", 3. 然后 npm run dev 环境变…

JavaScript ES12新特性有哪些?

文章目录 导文Promise.any()WeakRef 和 FinalizationRegistry数字分隔符String.prototype.replaceAll()Logical Assignment Operators数字类型的新增方法私有字段和方法 导文 JavaScript ES12&#xff08;也称为ECMAScript 2022&#xff09;是JavaScript的最新版本&#xff0c;…

如何解决报错:nginx error!

目录 Nginx报错问题 nginx error! The page you are looking for is not found. Website Administrator 解决方法 Nginx报错问题 当访问搭建好的Nginx服务网站时 有以下报错 nginx error! The page you are looking for is not found. Website Administrator Someth…

猪齿鱼开源发布2.0版本:DevOps能力全面升级,研发效能显著提升,欢迎即刻体验!

近日&#xff0c;甄知科技猪齿鱼Choerodon数智化开发管理平台正式发布了开源2.0版本&#xff01; 开源发布会上&#xff0c;甄知产研团队、业内伙伴和社区开发者们齐聚一堂&#xff0c;共同见证猪齿鱼开源2.0的重磅发布&#xff01;发布会由上海甄知科技创始合伙人兼CTO张礼军先…

前端添加代理通过nginx进行转发解决跨域

记录在项目中遇到跨域并进行解决的方案 解决方案 记录在项目中遇到跨域并进行解决的方案前端代理部分nginx转发配置origin限制,修复CORS跨域漏洞 前端代理部分 代理后页面请求地址截图&#xff1a; 这里地址栏的地址是&#xff1a;http://127.0.0.1:13908 调用登录接口请求地…

OrCAD Capture 元件位号Part Reference有下划线

原因&#xff1a; 提示用户曾经修改过原理图封装。 现象&#xff1a; USB20_12 解决办法&#xff1a; 对着元器件右键>User Assigned Reference > Uset&#xff0c;即可消除下划线。 修改后&#xff1a;

通过域名的方式访问服务器里的资源

大家好&#xff0c;我是雄雄。欢迎关注微信公众号&#xff1a;雄雄的小课堂 前言 在平时的项目过程中&#xff0c;我们可能经常会遇到这样的场景。 上传资源&#xff0c;比如图片或者视频到服务器中&#xff0c;上传上去后&#xff0c;我们给数据库中存的是文件所在路径&…

SSMP整合案例(3) 创建数据层并在测试类中运行数据库增删查改操作

上文 SSMP整合案例(2) Spring Boot整合Lombok简化实体类开发我们已经开发完了实体类 我们就可以做数据层了 目前来讲 数据层技术 使用了最大的自然是 MyBatis 但其实MyBatis-Plus在国内很多中小企业还是使用的挺多的 这次 我们主要是通过MyBatis-Plus和Druid来做这件事情 这两…

5款界面简洁无广告的轻量级小软件

今天的主题是简洁&#xff0c;轻便&#xff0c;都是轻量级的小软件&#xff0c;界面都是非常简洁&#xff0c;而且无广告的。 文件同步——Syncthing Syncthing是一款用于同步和分享文件的工具。它可以让你在不同的设备上同步你的文件夹&#xff0c;并提供多种功能和选项来设…

鱼眼相机成像模型以及基于OpenCV标定鱼眼镜头(C++)

opencv系列 文章目录 opencv系列一、鱼眼镜头模型二、投影函数等距投影模型等立体角投影模型正交投影模型体视投影模型 三、OpenCV中的鱼眼相机模型四、标定&#xff08;C&#xff09;实现使用的函数采集标定图像标定代码标定结果 一、鱼眼镜头模型 鱼眼镜头一般是由十几个不同…

新能源充电桩4G无线物联网解决方案|4G路由器ZR2000

日常生活中新能源汽车已随处可见&#xff0c;新能源也逐渐普遍&#xff0c;绿色出行、低碳生活的环保概念也随着科普深入人心&#xff0c;新能源汽车必备的充电桩行业随之崛起&#xff0c;为保证用户体验及运营管理&#xff0c;充电桩需要通过网络实现数据传输、远程监控、位置…

19-递归的理解、场景

一、递归 &#x1f32d;&#x1f32d;&#x1f32d;在函数内部&#xff0c;可以调用其他函数。如果一个函数在内部调用自身本身&#xff0c;这个函数就是递归函数 核心思想是把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解 一般来说&#xff0c;递归…

Azure-FunctionApp入门实战

介绍 FuntionApp 是微软云推出的一款serverless产品服务&#xff0c;作为coder可以无需关心程序部署所需的infra信息&#xff0c;只需要focus自己的业务代码实现即可 使用场景 是不是所有的业务都可以使用serverless产品呢&#xff1f;理论上是可以的&#xff0c;但是从实际…

初识mysql数据库之mysql数据库安装(centos)

目录 一、卸载不需要的环境 二、安装mysql yum源 三、安装mysql 四、登录mysql 1. 直接登录 2. 设置免密码登录 五、配置my.cnf 六、mysql登录时的一些选项介绍 一、卸载不需要的环境 要注意&#xff0c;在安装mysql数据库时&#xff0c;最好将用户切换为root&#xf…

Maven配置仓库、阿里云镜像、环境变量(史上最全最详细)

Maven配置仓库、阿里云镜像、环境变量&#xff08;史上最全最详细&#xff09; 一、前言 为了解决在maven的pom.xml文件中填入了某个依赖以后&#xff0c;maven却一直在转圈&#xff0c;非常慢的情况&#xff0c;我们需要进行配置阿里云镜像&#xff0c;这样会提升开发速度。…

Yolov5/Yolov7优化:引入Soft-NMS,提升密集遮挡场景检测精度

1.Soft-NMS介绍 论文地址:https://arxiv.org/pdf/1704.04503.pdf NMS需要优化的参数: IoU 的阈值是一个可优化的参数,一般范围为0~0.5,可以使用交叉验证来选择最优的参数。 R-CNN会从一张图片中找出n个可能是物体的矩形框,然后为每个矩形框为做类别分类概率: 就…

解密车载SOA架构原理,构建汽车通信的核心技术

车载SOA架构原理 车载SOA架构&#xff08;Service-Oriented Architecture&#xff0c;面向服务的架构&#xff09;是一种设计思想&#xff0c;旨在构建可扩展、灵活和可维护的车载系统。以下是车载SOA架构的一些原理和特点&#xff1a; 服务导向&#xff1a;车载SOA架构将车载…