(1分钟速览)g2o入门指南--笔记版

news2024/9/21 5:33:15

在slam后端中,优化的框架很多,有ceres,g2o,gtsam这些。要想真正掌握slam后端的优化内容,这些框架是必不可少的上手练习的内容。本文则介绍有关g2o的相关内容,作为一个入门指南,目标:大家阅读完以后,大体知道g2o写代码的时候有几步,然后图是怎么画的,一条边连接啥节点,最后自己会求导即可。

编辑切换为居中

添加图片注释,不超过 140 字(可选)

上面这幅图,简单地介绍了一下g2o里面有啥,圆圈是啥,边是啥大家看一下上面的图即可。

编辑切换为居中

添加图片注释,不超过 140 字(可选)

这个地方还存在一个版本上的问题,大家可以自行网上搜索一下相关的版本。

编辑切换为居中

添加图片注释,不超过 140 字(可选)

上面这幅图敲重点,是g2o在程序里的书写的步骤,大家新上手的同学可以按照上面的操作来实操一遍,加深印象。

1.创建一个线性求解器linearsolver

2.然后将上面这个linearsolver作为参数,创建blocksolver

3.然后再见上面的blocksolver作为参数,创建solver

4.然后再创建optimizer,当然这里是solver作为参数

5.然后下面就是顶点vertex和边edge的一个循环,然后设置ID,是否边缘化,边连接哪些顶点的内容

6.设置优化参数,开始执行优化,一般就是optimize(40),里面的数字表示优化多少次。

编辑切换为居中

添加图片注释,不超过 140 字(可选)

针对顶点部分的改写,大家可以参考上面这幅图片。上面的函数里面主要改写oplusImpl和setToOriginImpl这两个,当然其中还有read()和write()函数,这些的话可以写成空的函数体。

编辑切换为居中

添加图片注释,不超过 140 字(可选)

上面这是边的相关说明,一般要重写computeError(),然后下面的函数根据情况也进行相关重写。

//LM

g2o::OptimizationAlgorithmLevenberg* solver = new g2o::OptimizationAlgorithmLevenberg( solver_ptr )

;

//GN

g2o::OptimizationAlgorithmGaussNewton* solver = new g2o::OptimizationAlgorithmGaussNewton(

solver_ptr );

//DogLeg

g2o::OptimizationAlgorithmDogleg* solver = new g2o::OptimizationAlgorithmDogleg( solver_ptr );

上面这三段代码是优化器的选择,分别是LM、GN和DogLeg方法。这里面的话GN计算的效率还可以,经过我的实验,DogLeg是最快的,然后LM是最慢的,然后GN和Dogleg差不多,但是精度的话,Dogleg还是比较准确的。

编辑切换为居中

添加图片注释,不超过 140 字(可选)

上面这些都是一些小参数,大家可以根据日常练习的代码来自主选择里面参数的内容。

编辑切换为居中

添加图片注释,不超过 140 字(可选)

上面是g2o代码优化的一般步骤,大家可以仔细看看,每一步定义出来的变量都基本会作为下一步的参数,然后这样层层递归下去。最后用optimizer.optimize(100)来进行优化,就是进行100次迭代优化,这里的100是自己设置的,大家可以根据优化的场景来进行调参。

编辑切换为居中

添加图片注释,不超过 140 字(可选)

这里也有进行外点剔除的操作,是用huber核函数来进行的,这个里面有个参数,这个参数是根据是用的场景来定的。

编辑切换为居中

添加图片注释,不超过 140 字(可选)

这个图要理解一下,图中的边为一元边,这个的意思就是说,在求一个二次函数的拟合问题的时候,这里的abc三个参数进行拟合求解,那么此时这里的边就是自己指向自己的,就是所谓的一元边。通常一元边在因子图中配合着先验因子出现的。

编辑切换为居中

添加图片注释,不超过 140 字(可选)

上面就是g2o的整体结构。

编辑切换为居中

添加图片注释,不超过 140 字(可选)

上面这幅图可以看一下,有关g2o的结构说明。

g2o的使用分布介绍:

编辑切换为居中

添加图片注释,不超过 140 字(可选)

这个可以记一下,有关g2o是怎么搞的,一般按照上面的步骤,知道求导的表达式以后,一般优化是不成问题的。

编辑切换为居中

添加图片注释,不超过 140 字(可选)

编辑切换为居中

添加图片注释,不超过 140 字(可选)

编辑

添加图片注释,不超过 140 字(可选)

这个当然要include一下头文件。

编辑切换为居中

添加图片注释,不超过 140 字(可选)

编辑切换为居中

添加图片注释,不超过 140 字(可选)

最后就是添加图中的边和顶点,然后启动optimizer.optimize()即可。

编辑切换为居中

添加图片注释,不超过 140 字(可选)

函数里面大致就是这样。

编辑切换为居中

添加图片注释,不超过 140 字(可选)

这是添加相应的顶点和边。

编辑

添加图片注释,不超过 140 字(可选)

最后优化一下,就可以了。

以上做一个总结:

针对g2o的步骤就根据下面这个图来进行即可。

编辑切换为居中

添加图片注释,不超过 140 字(可选)

然后针对顶点和边的关系,以及求导的内容,还是要多加练习才可。本篇博客到此结束。

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

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

相关文章

使用教程 | 基于TSMaster如何实现LIN RBS 剩余总线仿真

本文导读 RBS 全称是:residual bus simulation,也就是所谓的剩余总线仿真。主要是基于车载网络数据库,如 CAN/LIN/FlexRay/以太网数据库,仿真该网络内部各个节点的通讯行为。 本文主要讲解 TSMaster 中 LIN RBS 的操作流程。 “ …

aosp11/12/13 壁纸高斯模糊,毛玻璃SurfaceFlinger层面原理-第二节千里马framework实战

hi,粉丝朋友们! 上一个blog已经详细讲解了系统中自带相关接口实现窗口的高斯模糊相关效果,具体点击这里 https://blog.csdn.net/learnframework/article/details/130767893 1、补充app层面实现方式 更多framework干货知识手把手教学 Log.i…

Restful API

Restful API 一、RESTful API是什么意思二、对比三、小知识四、用 apifox 进行测试1. GET2. POST3. PUT4. DELETE 一、RESTful API是什么意思 REST 与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻…

操作系统实验三 内存分配及回收研究

前言 本次实验跟前两次相比简单许多,主要是体会底层的一些运行机制。其实,要说简单,也不是真的很简单,毕竟还是存在一些更底层的东西需要我们去探讨。接下来就让我们通过实验来感受一下。 1.实验目的 掌握Linux操作系统的内存分…

地表水灌区取水计量设施包含哪些设备?

方案背景 根据《关于强化取水口取水监测计量的意见》、《十四五”节水型社会建设规划》以及《2022年水资源管理工作要点》等政策要求,为强化水资源管理,做好水资源税改革,构建节水型社会,要全面加强取水计量监测设施建设&#xff…

【计算机系统基础3】数据的存储与运算

3.程序调试与实践:数据存储与运算 3.1真值与机器数 真值: 数据在现实世界中的表示 机器数: 数据在计算机内部的二进制编码表示 温度:零下3.5度 习惯写法:-3.5 (数据的真值/数据的实际值) 3.1.1整数的编码 带符号整数&…

15:13进去面试,5分钟就完事了,问的实在是太......

干了两年外包,本来想出来正儿八经找个互联网公司上班,没想到算法死在另一家厂子。 自从加入这家外包公司,每天都在加班,钱倒是给的不少,所以也就忍了。没想到11月一纸通知,所有人不许加班,薪资…

2023年值得关注的低代码平台推荐

低代码平台在数字化转型的浪潮中受到越来越多企业的青睐,因为它们提供了一种更容易、更快的方式来开发网络和移动应用程序。低代码平台只需要最少的编码知识,使公司能够在很短的时间内开发出定制的应用程序,而这只是使用传统的搭建手段所需时…

参数传递之传名,传地址,得结果,传值

编译原理速成,参数传递之传名,传地址,得结果,传值(四)_哔哩哔哩_bilibili 学习自上面的文章。 题目1: (1)传名。 (2)传地址。(注意观察,AB变成了临时变量T1,…

jvm之G1 GC

写在前面 jdk9以及之后的版本已经将默认的垃圾收集器parallel更换为G1.本文就一起来看下。 1:G1介绍 parallel GC的设计目标是高吞吐量,CMS GC的设计目标是低延迟,而G1的设计目标不是这二者中的任何一个,其设计目标是让GC的STW…

我的世界Fabric mod开发-快速漏斗

前往我的主页以阅读完整内容,并获取源码 DearXuan的主页 MOD介绍 使用漏斗链进行分类或传递物品时,常常会发现漏斗速度太慢,难以收集全部掉落物.或者漏斗太多,影响性能.而现有的漏斗加速mod则是引入新的快速漏斗,存在各种兼容问题.开服时发现paper服务器可以修改原…

华为OD机试真题 Java 实现【区间连接器】【2023Q1 200分】

一、题目描述 有一组区间 [a0, b0], [a1, b1], … (a, b 表示起点, 终点),区间有可能重叠、相邻,重叠或相邻则可以合并为更大的区间; 给定一组连接器[x1, x2, x3, …](x 表示连接器的最大可连接长度,即 x>gap&…

支付宝沙箱支付(java电脑版)

目录 下载支付demo配置环境AlipayConfig 下载支付demo 网址&#xff1a;https://open.alipay.com/ 下载并打开项目发现无法运行&#xff1a; 手动转化项目&#xff1a; 等待下载整理一下maven pom 通过tomat部署运行测试。 导入阿里支付的pom依赖 <dependency> &l…

都2023了,你竟然还不知道网络安全该怎么学

前言 网络安全是指网络系统的硬件、软件及其系统中的数据受到保护&#xff0c;不因偶然或恶意原因而遭受破坏、更改、泄露&#xff0c;系统连续可靠正常地运行&#xff0c;网络服务不中断。网络安全因何而重要&#xff1f; 截至2023年4月,我国网民规模为_11.51亿_&#xff0c…

模板初阶(泛型编程)

模板初阶 &#x1f506;泛型编程&#x1f506;函数模板函数模板概念函数模板格式函数模板的原理函数模板的实例化模板参数的匹配原则 &#x1f506;类模板类模板的定义格式类模板的实例化类模板与模板类的区别 &#x1f506;结语 &#x1f506;泛型编程 泛型编程&#xff1a;编…

【总结】Numpy2

Numpy 1. 数组和数的运算 array1 np.arange(1,10) array1 # array([1, 2, 3, 4, 5, 6, 7, 8, 9]) array1 10 # array([11, 12, 13, 14, 15, 16, 17, 18, 19]) array1 - 10 # array([-9, -8, -7, -6, -5, -4, -3, -2, -1]) array1 * 10 # array([10, 20, 30, 40, 50, 60, 70…

Flutter:如何在Android中实现串口通信调试

本文介绍如何通过flutter_libserialport插件在Flutter中实现串口通信调试。 1、引入依赖 在flutter工程的pubspec.yaml文件中引入flutter_libserialport依赖&#xff1a; dependencies:flutter_libserialport: ^0.3.0 2、导入import依赖包 在dart代码中import导入flutter_li…

快手国际化 后端开发面经二面

目录 1.Redis用的什么数据类型2.Hash底层结构3.JVM垃圾判别阶段算法4.MySQL索引模型5.为什么用B树6.联合索引在B树如何构造的7.覆盖索引知道吗 1.Redis用的什么数据类型 1.String(字符类型) 2.Hash(散列类型) 3.List(列表类型) 4.Set(集合类型) 5.SortedSet(有序集合类型&…

设计模式 单例模式(创建型)

一、前言 学习设计模式我们关注的是什么&#xff0c;如何实现么&#xff1f;是也不是。我认为比了解如何实现设计模式更重要的是这些设计模式的应用场景&#xff0c;什么场景下我们该用这种设计模式&#xff1b;以及这些设计模式所包含的思想&#xff0c;最终帮助我们把代码写…

继承 + 多态 + final + 权限修饰符

目录 继承 多态 final 权限修饰符 继承 继承定义&#xff1a; 可以让类跟类之间产生子父的关系继承的好处 可以把多个子类中重复的代码抽取到父类中&#xff0c;子类可以直接使用&#xff0c;减少代码几余&#xff0c;提高代码的复用性子类继承内容 非私有private构造方法…