视觉SLAM十四讲——ch10实践(后端2)

news2024/11/19 17:52:12

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

  • 0. 实践前小知识介绍
  • 1. 实践操作前的准备工作
  • 2. 实践过程
    • 2.1 g2o原生位姿图
    • 2.2 李代数上的位姿图优化
  • 3. 遇到的问题及解决办法
    • 3.1 在运行pose_graph_g2o_lie时出现错误

0. 实践前小知识介绍

视觉SLAM(Simultaneous Localization and Mapping)后端是一种用于处理视觉SLAM问题的算法。视觉SLAM是指机器在未知环境中同时实现自身的定位和地图构建的技术。

视觉SLAM后端的任务是在视觉SLAM中负责维护一个优化后的地图和机器人的轨迹。常见的视觉SLAM后端算法包括基于图优化的方法,如G2O、ceres等,以及基于滤波器的方法,如卡尔曼滤波器、扩展卡尔曼滤波器等。

视觉SLAM后端算法需要处理传感器数据的噪声和不确定性,并通过优化算法来减小误差和提高精度。同时,视觉SLAM后端算法还需要快速、高效地处理大量的数据,并对计算结果进行实时更新和优化。

视觉SLAM后端算法在自主驾驶、无人机、机器人等领域有广泛的应用。

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

  1. 在终端中进入ch10文件夹下,顺序执行以下命令进行编译。
mkdir build
cd build
cmake ..
//注意,j8还是其他主要看自己的电脑情况
make -j8
  1. 在build文件中进行运行。
    注意: 在make过程中,会出现warning,但是对我们此实践的过程几乎没有影响。

2. 实践过程

2.1 g2o原生位姿图

在build中执行语句:

 ./pose_graph_g2o_SE3 /home/fighter/slam/slambook2/ch10/sphere.g2o

运行结果:
生成文件result.g2o;终端输出:

read total 2500 vertices, 9799 edges.
optimizing ...
iteration= 0     chi2= 1023011093.967641         time= 0.616354  cumTime= 0.616354       edges= 9799     schur= 0        lambda= 805.622433      levenbergIter= 1
iteration= 1     chi2= 385118688.233187  time= 0.363139  cumTime= 0.979494       edges= 9799     schur= 0        lambda= 537.081622      levenbergIter= 1
iteration= 2     chi2= 166223726.693657  time= 0.350041  cumTime= 1.32953        edges= 9799     schur= 0        lambda= 358.054415      levenbergIter= 1
iteration= 3     chi2= 86610874.269316   time= 0.351792  cumTime= 1.68133        edges= 9799     schur= 0        lambda= 238.702943      levenbergIter= 1
iteration= 4     chi2= 40582782.710190   time= 0.388134  cumTime= 2.06946        edges= 9799     schur= 0        lambda= 159.135295      levenbergIter= 1
iteration= 5     chi2= 15055383.753041   time= 0.377086  cumTime= 2.44655        edges= 9799     schur= 0        lambda= 101.425210      levenbergIter= 1
iteration= 6     chi2= 6715193.487655    time= 0.363641  cumTime= 2.81019        edges= 9799     schur= 0        lambda= 37.664667       levenbergIter= 1
iteration= 7     chi2= 2171949.168382    time= 0.383848  cumTime= 3.19404        edges= 9799     schur= 0        lambda= 12.554889       levenbergIter= 1
iteration= 8     chi2= 740566.827049     time= 0.376922  cumTime= 3.57096        edges= 9799     schur= 0        lambda= 4.184963        levenbergIter= 1
iteration= 9     chi2= 313641.802464     time= 0.367001  cumTime= 3.93796        edges= 9799     schur= 0        lambda= 2.583432        levenbergIter= 1
iteration= 10    chi2= 82659.743578      time= 0.356125  cumTime= 4.29408        edges= 9799     schur= 0        lambda= 0.861144        levenbergIter= 1
iteration= 11    chi2= 58220.369189      time= 0.326571  cumTime= 4.62065        edges= 9799     schur= 0        lambda= 0.287048        levenbergIter= 1
iteration= 12    chi2= 52214.188561      time= 0.34423   cumTime= 4.96488        edges= 9799     schur= 0        lambda= 0.095683        levenbergIter= 1
iteration= 13    chi2= 50948.580336      time= 0.344858  cumTime= 5.30974        edges= 9799     schur= 0        lambda= 0.031894        levenbergIter= 1
iteration= 14    chi2= 50587.776729      time= 0.323255  cumTime= 5.633  edges= 9799     schur= 0        lambda= 0.016436        levenbergIter= 1
iteration= 15    chi2= 50233.038802      time= 0.321105  cumTime= 5.9541         edges= 9799     schur= 0        lambda= 0.010957        levenbergIter= 1
iteration= 16    chi2= 49995.082839      time= 0.321401  cumTime= 6.2755         edges= 9799     schur= 0        lambda= 0.007305        levenbergIter= 1
iteration= 17    chi2= 48876.738967      time= 0.702032  cumTime= 6.97753        edges= 9799     schur= 0        lambda= 0.009298        levenbergIter= 2
iteration= 18    chi2= 48806.625522      time= 0.373531  cumTime= 7.35107        edges= 9799     schur= 0        lambda= 0.006199        levenbergIter= 1
iteration= 19    chi2= 47790.891373      time= 0.764476  cumTime= 8.11554        edges= 9799     schur= 0        lambda= 0.008265        levenbergIter= 2
iteration= 20    chi2= 47713.626582      time= 0.344026  cumTime= 8.45957        edges= 9799     schur= 0        lambda= 0.005510        levenbergIter= 1
iteration= 21    chi2= 46869.323689      time= 0.698816  cumTime= 9.15838        edges= 9799     schur= 0        lambda= 0.007347        levenbergIter= 2
iteration= 22    chi2= 46802.585509      time= 0.359225  cumTime= 9.51761        edges= 9799     schur= 0        lambda= 0.004898        levenbergIter= 1
iteration= 23    chi2= 46128.758041      time= 0.631884  cumTime= 10.1495        edges= 9799     schur= 0        lambda= 0.006489        levenbergIter= 2
iteration= 24    chi2= 46069.133541      time= 0.309911  cumTime= 10.4594        edges= 9799     schur= 0        lambda= 0.004326        levenbergIter= 1
iteration= 25    chi2= 45553.862164      time= 0.622007  cumTime= 11.0814        edges= 9799     schur= 0        lambda= 0.005595        levenbergIter= 2
iteration= 26    chi2= 45511.762616      time= 0.311606  cumTime= 11.393         edges= 9799     schur= 0        lambda= 0.003730        levenbergIter= 1
iteration= 27    chi2= 45122.762999      time= 0.61714   cumTime= 12.0102        edges= 9799     schur= 0        lambda= 0.004690        levenbergIter= 2
iteration= 28    chi2= 45095.174397      time= 0.31117   cumTime= 12.3213        edges= 9799     schur= 0        lambda= 0.003127        levenbergIter= 1
iteration= 29    chi2= 44811.248505      time= 0.608863  cumTime= 12.9302        edges= 9799     schur= 0        lambda= 0.003785        levenbergIter= 2
saving optimization results ...

实践中使用的时列文伯格—马夸尔特下降的方式,迭代次数选择的三十次。
打开文件result.g2o:
在终端运行:

g2o_viewer result.g2o

运行图为(使用g2o自带的顶点与边求解的结果):
使用g2o自带的顶点与边求解的结果

2.2 李代数上的位姿图优化

在build中执行语句:

 ./pose_graph_g2o_lie /home/fighter/slam/slambook2/ch10/sphere.g2o

运行结果:
生成文件result_lie.g2o;终端输出:

read total 2500 vertices, 9799 edges.
optimizing ...
iteration= 0     chi2= 674837160.579968  time= 0.419014  cumTime= 0.419014       edges= 9799     schur= 0        lambda= 6658.554263     levenbergIter= 1
iteration= 1     chi2= 234706314.970484  time= 0.307203  cumTime= 0.726217       edges= 9799     schur= 0        lambda= 2219.518088     levenbergIter= 1
iteration= 2     chi2= 142146174.348537  time= 0.306181  cumTime= 1.0324         edges= 9799     schur= 0        lambda= 739.839363      levenbergIter= 1
iteration= 3     chi2= 83834595.145595   time= 0.309102  cumTime= 1.3415         edges= 9799     schur= 0        lambda= 246.613121      levenbergIter= 1
iteration= 4     chi2= 41878079.903257   time= 0.314584  cumTime= 1.65608        edges= 9799     schur= 0        lambda= 82.204374       levenbergIter= 1
iteration= 5     chi2= 16598628.119947   time= 0.306542  cumTime= 1.96263        edges= 9799     schur= 0        lambda= 27.401458       levenbergIter= 1
iteration= 6     chi2= 6137666.739406    time= 0.306009  cumTime= 2.26864        edges= 9799     schur= 0        lambda= 9.133819        levenbergIter= 1
iteration= 7     chi2= 2182986.250589    time= 0.313833  cumTime= 2.58247        edges= 9799     schur= 0        lambda= 3.044606        levenbergIter= 1
iteration= 8     chi2= 732676.668220     time= 0.304348  cumTime= 2.88682        edges= 9799     schur= 0        lambda= 1.014869        levenbergIter= 1
iteration= 9     chi2= 284457.115176     time= 0.305686  cumTime= 3.1925         edges= 9799     schur= 0        lambda= 0.338290        levenbergIter= 1
iteration= 10    chi2= 170796.109734     time= 0.317388  cumTime= 3.50989        edges= 9799     schur= 0        lambda= 0.181974        levenbergIter= 1
iteration= 11    chi2= 145466.315841     time= 0.305792  cumTime= 3.81568        edges= 9799     schur= 0        lambda= 0.060658        levenbergIter= 1
iteration= 12    chi2= 142373.179501     time= 0.347022  cumTime= 4.16271        edges= 9799     schur= 0        lambda= 0.020219        levenbergIter= 1
iteration= 13    chi2= 137485.756901     time= 0.304775  cumTime= 4.46748        edges= 9799     schur= 0        lambda= 0.006740        levenbergIter= 1
iteration= 14    chi2= 131202.175665     time= 0.311505  cumTime= 4.77899        edges= 9799     schur= 0        lambda= 0.002247        levenbergIter= 1
iteration= 15    chi2= 128006.202529     time= 0.30704   cumTime= 5.08603        edges= 9799     schur= 0        lambda= 0.000749        levenbergIter= 1
iteration= 16    chi2= 127587.860945     time= 0.313496  cumTime= 5.39952        edges= 9799     schur= 0        lambda= 0.000250        levenbergIter= 1
iteration= 17    chi2= 127578.599359     time= 0.322269  cumTime= 5.72179        edges= 9799     schur= 0        lambda= 0.000083        levenbergIter= 1
iteration= 18    chi2= 127578.573853     time= 0.326536  cumTime= 6.04833        edges= 9799     schur= 0        lambda= 0.000028        levenbergIter= 1
iteration= 19    chi2= 127578.573840     time= 0.328882  cumTime= 6.37721        edges= 9799     schur= 0        lambda= 0.000018        levenbergIter= 1
iteration= 20    chi2= 127578.573840     time= 0.315369  cumTime= 6.69258        edges= 9799     schur= 0        lambda= 0.000012        levenbergIter= 1
iteration= 21    chi2= 127578.573840     time= 0.308945  cumTime= 7.00152        edges= 9799     schur= 0        lambda= 0.000008        levenbergIter= 1
iteration= 22    chi2= 127578.573840     time= 3.00403   cumTime= 10.0056        edges= 9799     schur= 0        lambda= 296083660142.312988    levenbergIter= 10
saving optimization results ...

可以发现,迭代23次后,总体误差保持不变,事实上可以让优化算法停止。
打开文件result_lie.g2o:
在终端运行:

g2o_viewer result_lie.g2o

运行图为(使用李代数自定义节点与优化后的结果):
运行图

单击窗口中的Optimize按钮,g2o将使用它自带的SE3顶点进行优化,可以在窗口下方的文本框看到以下内容:

loaded result_lie.g2o with 2500 vertices and 9799 measurements
graph is fixed by node 2499
# Using CHOLMOD poseDim -1 landMarkDim -1 blockordering 1
Preparing (no marginalization of Landmarks)
iteration= 0	 chi2= 44360.504602	 time= 1.01586	 cumTime= 1.01586	 edges= 9799	 schur= 0
iteration= 1	 chi2= 44360.466873	 time= 0.247692	 cumTime= 1.26355	 edges= 9799	 schur= 0
iteration= 2	 chi2= 44360.466872	 time= 0.253022	 cumTime= 1.51658	 edges= 9799	 schur= 0
iteration= 3	 chi2= 44360.466872	 time= 0.247728	 cumTime= 1.7643	 edges= 9799	 schur= 0
iteration= 4	 chi2= 44360.466872	 time= 0.272316	 cumTime= 2.03662	 edges= 9799	 schur= 0
iteration= 5	 chi2= 44360.466872	 time= 0.249167	 cumTime= 2.28579	 edges= 9799	 schur= 0
iteration= 6	 chi2= 44360.466872	 time= 0.248997	 cumTime= 2.53478	 edges= 9799	 schur= 0
iteration= 7	 chi2= 44360.466872	 time= 0.28726	 cumTime= 2.82204	 edges= 9799	 schur= 0
iteration= 8	 chi2= 44360.466872	 time= 0.243892	 cumTime= 3.06594	 edges= 9799	 schur= 0
iteration= 9	 chi2= 44360.466872	 time= 0.245539	 cumTime= 3.31148	 edges= 9799	 schur= 0

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

3.1 在运行pose_graph_g2o_lie时出现错误

  1. 出现的错误如下所示:
Sophus ensure failed in function 'void Sophus::SO3Base<Derived>::normalize() [with Derived = Sophus::SO3<double>]', file '/usr/local/include/sophus/so3.hpp', line 273.
Quaternion (   0.706662 4.32706e-17    0.707551 -4.3325e-17) should not be close to zero!
Aborted

原因:

顶点类VertexSE3LieAlgebra的读入函数virtual bool read(istream& is)缺少返回值,会报以上错误。

解决办法:

在函数 virtual bool read(istream& is) 中加入 return true;

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

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

相关文章

基于Java菜匣子优选系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a; ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精…

粒子群算法(Particle Swarm Optimization(PSO)附简单案例及详细matlab源码)

作者&#xff1a;非妃是公主 专栏&#xff1a;《智能优化算法》 博客地址&#xff1a;https://blog.csdn.net/myf_666 个性签&#xff1a;顺境不惰&#xff0c;逆境不馁&#xff0c;以心制境&#xff0c;万事可成。——曾国藩 文章目录 专栏推荐序一、概论二、粒子群算法原理…

【复杂网络建模】——使用PyTorch和DGL库实现图神经网络进行链路预测

&#x1f935;‍♂️ 个人主页&#xff1a;Lingxw_w的个人主页 ✍&#x1f3fb;作者简介&#xff1a;计算机科学与技术研究生在读 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4a…

当老板问:软件质量怎么样,能上线发布吗?阁下该如何应对

说在前面 每当你和团队完成了一款软件产品的开发&#xff0c;是否很容易被问到这样一个问题&#xff1a;质量怎么样&#xff1f;或者是能上线发布吗&#xff1f;如果你是团队的负责人&#xff0c;你会如何回答这样的问题呢&#xff1f;对软件质量的评判标准&#xff0c;不见得…

【Airtest】UI自动化测试的数据分离实践

目录 前言 1. 示例介绍 2. 读取Excel单元格里的数据 1&#xff09;安装 xlrd 第三方库 2&#xff09;读取表格数据存储到列表中 3&#xff09;封装成读取控件信息的函数 3. 处理控件信息并实现控件操作 小结 前言 在UI自动化测试中&#xff0c;测试数据的管理和组织是…

Spring-Retry(重试机制)

Spring-Retry&#xff08;重试机制&#xff09; 在实际工作中&#xff0c;重处理是一个非常常见的场景&#xff0c;比如: 发送消息失败。 调用远程服务失败。 争抢锁失败。 这些错误可能是因为网络波动造成的&#xff0c;等待过后重处理就能成功。通常来说&#xff0c;会用try…

Redis入门 - 5种基本数据类型

原文首更地址&#xff0c;阅读效果更佳&#xff01; Redis入门 - 5种基本数据类型 | CoderMast编程桅杆https://www.codermast.com/database/redis/five-base-datatype.html 说明 在我们平常的业务中基本只会使用到Redis的基本数据类型&#xff08;String、List、Hash、Set、…

重新学树结构

树 图一 图二 相关术语 前驱&#xff1a;某结点上一层结点&#xff0c;图中H结点的前驱结点是F后继&#xff1a;某结点紧跟的后面的结点&#xff0c;图中F结点的后继是G、H、I三个结点根结点&#xff1a;非空树没有前驱结点的结点&#xff0c;图中的R结点结点的度&#x…

019+limou+C语言预处理

0.前言 您好&#xff0c;这里是limou3434的一篇博客&#xff0c;感兴趣您可以看看我的其他博文系列。本次我主要给您带来了C语言有关预处理的知识。 1.宏的深度理解与使用 1.1.数值宏常量 #define PI 3.1415926注意define和#之间是可以留有空格的 1.2.字符宏常量 #includ…

设置论文中的图、表的题注

参考b站&#xff1a;毕业论文图表如何自动编号/word图表自动编号/图表编号自动更新 其中&#xff0c;更新图表序号 视频使用ctrl 设置论文中的图、表的题注 step1:设置章节1.1: 章节设置字体样式&#xff0c;选择标题11.2&#xff1a;章节添加序号1.3 修改序号 和字之间的缩进&…

Linux->线程基本概念

目录 前言&#xff1a; 1. 线程的基本概念 2 线程的优点 3 线程的缺点 4 数据块大小为4KB大小的真正原因 前言&#xff1a; 本篇文章讲解了线程与进程之间的区别和联系&#xff0c;线程的优缺点&#xff0c;还有内存的数据管理与磁盘之间的关系&#xff0c;虚拟内存到内存…

阿里云服务器提供哪些操作系统和软件支持?是否与常用软件兼容?

阿里云服务器提供哪些操作系统和软件支持&#xff1f;是否与常用软件兼容&#xff1f;    阿里云服务器支持的操作系统   为了满足不同用户需求&#xff0c;阿里云服务器&#xff08;ECS&#xff09;提供了丰富的操作系统选择。以下是阿里云服务器支持的主要操作系统&#…

Linux 配置MySQL环境(三)

Linux配置MySQL环境 一、下载1. 官网下载MySQL2. 百度网盘快速下载MySQL 二、安装1、通过 Xftp 将 MySQL 安装包拷贝到 Linux2、解压缩3、安装 common、libs、client、server4、初步连接 三、卸载四、常用设置1. 修改 root 用户密码 五、使用新密码登录六、开启远程访问七、开放…

PHP设计模式21-工厂模式的讲解及应用

文章目录 前言基础知识简单工厂模式工厂方法模式抽象工厂模式 详解工厂模式普通的实现更加优雅的实现 总结 前言 本文已收录于PHP全栈系列专栏&#xff1a;PHP快速入门与实战 学会好设计模式&#xff0c;能够对我们的技术水平得到非常大的提升。同时也会让我们的代码写的非常…

OpenCV 笔记_5

文章目录 笔记_5特征点匹配DMatch 存放匹配结果DescriptorMatcher::match 特征点描述子&#xff08;一对一&#xff09;匹配DescriptorMatcher::knnMatch 特征点描述子&#xff08;一对多&#xff09;匹配DescriptorMatcher::radiusMatch 特征点描述子&#xff08;一对多&#…

Frontiers in Microbiology:DAP-seq技术在猪苓C2H2转录因子PuCRZ1调控菌丝生长及渗透胁迫耐受性机制研究中的应用

猪苓&#xff08;Polyporus umbellatus&#xff09;是一种可食用的蘑菇&#xff0c;也是我国常用的菌类药材之一&#xff0c;至今已有2000多年的药用历史&#xff0c;在《神农本草经》、《本草纲目》、《本草求真》等典籍中均有记载。猪苓具有利尿、抗菌作用&#xff0c;近年来…

SpringBatch从入门到实战(二):HelloWorld

一&#xff1a;HelloWorld 1.1 配置Job、Step、Tasklet Configuration public class HelloWorldJobConfig {Autowiredprivate JobBuilderFactory jobBuilderFactory;Autowiredprivate StepBuilderFactory stepBuilderFactory;Beanpublic Job helloWorldJob() {return jobBuild…

代码随想录算法训练营第五十九天|503.下一个更大元素II 42. 接雨水

目录 LeeCode 503.下一个更大元素II LeeCode 42. 接雨水 暴力解法 优化双指针法 单调栈法 LeeCode 503.下一个更大元素II 503. 下一个更大元素 II - 力扣&#xff08;LeetCode&#xff09; 【思路】 相较于前两道题目&#xff0c;这道题目将数组改为循环数组&#x…

python获取度娘热搜数据并保存成Excel

python获取百度热搜数据 一、获取目标、准备工作二、开始编码三、总结 一、获取目标、准备工作 1、获取目标&#xff1a; 本次获取教程目标&#xff1a;某度热搜 2、准备工作 环境python3.xrequestspandas requests跟pandas为本次教程所需的库&#xff0c;requests用于模拟h…

在读博士怎么申请公派访学?

作为在读博士生&#xff0c;申请公派访学是一项重要而有益的经历。下面知识人网将为您介绍一些关于如何申请公派访学的步骤和注意事项。 首先&#xff0c;您需要找到一个合适的公派访学机会。可以通过与导师、教授或其他相关人士进行交流来获取相关信息。还可以参考学术会议、研…