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

在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 字(可选)

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python 学习 2022.08.28 周日

文章目录 一、 概述1.1) 之前写的文章:1.2) 基础点1.3) 配置1.4) Python2 和 Python3 的区别1.5) 相关问题跟踪解决1.6) 其他 一、 概述 1.1) 之前写的文章: 【Python大系】Python快速教程《Python 数据库 GUI CGI编…

怎么取消只读模式?硬盘进入只读模式怎么办?

案例:电脑磁盘数据不能修改怎么办? 【今天工作的时候,我想把最近的更新的资料同步到电脑上的工作磁盘,但是发现我无法进行此操作,也不能对磁盘里的数据进行改动。有没有小伙伴知道这是怎么一回事?】 在使…

无线充+台灯专用PD诱骗芯片LDR6328S

近几年,日常生活中到处可以看到消费者使用支持Type-c接口的电子产品,如手机,笔记本,筋膜枪,蓝牙音箱等等。例如,像筋膜枪,蓝牙音箱,无人机,小风扇。 无线充台灯方案&…

容器安装Datax+Datax-web2.1(一)

目录 简介1、安装Datax-web2.1.11)安装docker-compose2)创建Datax-web和MySQL容器 2、安装Datax-web2.1.21)安装MySQL2)初始化数据3)安装datax和datax-web4)浏览器登录 DataxDatax-web2.1实现MySQL数据库数…

如何通过SOLIDWORKS driveworksxpress初步实现参数化设计

当提到参数化设计,我们首先需要了解究竟什么是参数化设计,它是指从一个系统的角度,计划所有的设计过程,在整个系统中建立组件、次组件和子零件之间的关系,在最上层的部分建立设计意图,并将其往较下层的部分…

RK3588光电载荷处理板研制进展

本来就是一个很小众的市场,但是偶尔也会有同行询问,这儿就简单汇报一下后期的进展 板子已经开发完成,并有幸得到了两个订单,虽然量不是很大,但是也很开心由于一段时间的努力和付出,将该设备应用在了国防事业…

微信小程序等待wx.requestPayment的回调函数执行完后再执行后续代码

async/await & Promise的再认识 背景 在开发微信小程序过程中,遇到如下需求: 需要等待wx.requestPayment的回调函数执行完后再执行后续代码 这是因为在调用wx.requestPayment之后,会弹出一个支付弹窗,如果此时点击右上角的…

Electron自定义窗口

Electron标题栏隐藏和自定义 Electron应用自定义标题栏样式 标题栏样式允许隐藏浏览器窗口的大部分色彩,同时保持系统原生窗口控件完整无损,并可以在 BrowserWindow 的构造器中使用 titleBarStyle 选项来配置。 应用 hidden 标题栏样式的结果是隐藏标…

AI智能机器人的语音消息使用方式

如何在没有资金扩大营销的情况下增加收入,这是不是有点像先有蛋还是先有鸡的问题?如果没有足够的收入来源,小型企业很难对新客源扩展营销和传播。有关系统问题欢迎和博主一起交流。 机器人的语音消息是不是给百姓造成了生活上的影响&#xf…

Springcloud1---->openFeign

目录 简介快速入门导入依赖开启Feign配置Feign客户端接口Feign使用小结feign feign配置负载均衡feign配置Hystix支持 简介 Feign可以把Rest的请求进行隐藏,伪装成类似SpringMVC的Controller一样。你不用再自己拼接url,拼接参数等等操作,一切…

Golang笔记:使用http包实现基础WebServer功能

文章目录 目的监听请求并响应请求解析进行响应静态文件服务总结 目的 WebServer是一种非常常用的功能,Golang的高并发特性在处理此类工作中也有较大的优势,同时借助标准库中的 net/http 包可以非常快速的编写WebServer应用。这篇文章将简单记录下相关内…

第02章 变量与运算符

一 关键字(keyword) 定义:被Java语言赋予了特殊含义,用做专门用途的字符串(或单词) HelloWorld案例中,出现的关键字有 class、public 、 static 、 void 等,这些单词已经被Java定义…

第1章 Nginx简介

基于 Nginx版本 1.14.2 ,Tomcat版本 9.0.0 演示 第1章 Nginx简介 1.1 Nginx发展介绍 Nginx (engine x) 是一个高性能的Web服务器和反向代理服务器,也可以作为邮件代理服务器。 Nginx 特点是占有内存少,并发处理能力…

基于粒子群算法的微网经济优化调度——附Matalb代码

目录 摘要: 代码主要内容: 研究背景: 微电网模型: 粒子群算法: 运行结果: Matlab代码分享: 摘要: 提出了一种经济与环保相协调的微电网优化调度模型,针对光伏电池…

深度解析接口自动化框架封装项目:封装层级,关联调用,极限改进

目录 前言: 一、接口封装与封装层级 二、接口关联和数据准备 三、接口封装极限改进 四、代码示例 五、总结 前言: 接口自动化是软件测试领域中的一个重要环节,它可以自动化执行接口测试用例,快速发现和定位接口问题&#xf…

MyBatis中的别名机制

在我们使用MyBatis中的select语句时&#xff0c;需要指定resultType的值&#xff0c;即查询对象的类型&#xff0c;该值是对象的完整类名&#xff0c;看起来非常的繁琐&#xff0c;因此MyBatis中有了别名机制。 使用步骤 在mybatis-config.xml文件中添加< typeAliases >…

C语言进阶——字符函数和字符串函数(上)

重点&#xff1a; 重点介绍处理字符和字符串的库函数的使用和注意事项 1、求字符串长度 strlen 2、长度不受限制的字符串函数 strcpy strcat strcmp 1、函数介绍 1.1 strlen 函数原型&#xff1a;size_t strlen (const char *str); 1、字符串以‘\0’作为结束标志&#xff0…

如何把ipa文件(iOS安装包)安装到iPhone手机上? 附方法汇总

苹果APP安装包ipa如何安装在手机上&#xff1f;很多人不知道怎么把ipa文件安装到手机上&#xff0c;这里就整理了苹果APP安装到iOS设备上的方式&#xff0c;仅供参考 苹果APP安装包ipa如何安装在手机上&#xff1f;使用过苹果手机的人应该深有感触&#xff0c;那就是苹果APP安…

登录appuploader

登录appuploader 常规使用登录方法 双击appuploader.exe 启动appuploader 点击底部的未登录&#xff0c;弹出登录框 在登录框内输入apple开发者账号 如果没有apple开发者账号&#xff0c;只是普通的apple账号&#xff0c;请勾选上未支付688 然后软件会提示输入验证码&#…

【Spring/MySQL数据库系列】数据库事务的特点与隔离级别

⭐️前面的话⭐️ 本文已经收录到《Spring框架全家桶系列》专栏&#xff0c;本文将介绍有关数据库事务的特点以及隔离级别。 &#x1f4d2;博客主页&#xff1a;未见花闻的博客主页 &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4…