Optimizer类
ORB_SLAM2优化类一共有五个优化
这里先说一下利用g2o的BundleAdjustment优化
- 初始化优化器(稀疏,线性,LM算法)
- 设置关键帧位姿为顶点
- 设置地图点位置为顶点
- 对于每一个地图点,将它与能观测到该点的关键帧之间的重投影误差设置为边
- 设置完成,进行优化
- 更新优化后的关键帧位姿和地图点位置
一、GlobalBundleAdjustemnt(全局优化):对所有的地图点和关键帧进行优化
全局BA优化在本程序中有两个地方使用:
- 单目初始化:CreateInitialMapMonocular函数
- 闭环优化:RunGlobalBundleAdjustment函数
二、LocalBundleAdjustment(局部优化):对某一关键帧的局部地图点集合和局部关键帧进行优化
局部优化在LocalMapping线程处理完队列中最后一个关键帧时使用
- 初始化优化器
- 将参数关键帧及其共视关键帧位姿设置为顶点
- 将能观测到局部地图点的关键帧(不包含步骤2中的关键帧)作为补充关键帧,将其位姿也设置为顶点
- 将局部地图点设置为顶点
- 对于每一个局部地图点,将它与能观测到该点的关键帧之间的重投影误差设置为边
- 进行第一回优化,去除优化后误差较大的顶点,不再优化它们
- 进行第二回优化,去除优化后误差较大的顶点
- 更新优化后的关键帧位姿和地图点位置
Pos3是新加入的关键帧,其初始估计位姿已经得到。此时,Pos2是和Pos3相连的关键帧,X2是Pos3看到的三维点,X1是Pos2看到的三维点,这些都属于局部信息,共同参与Bundle Adjustment。同时,Pos1也可以看到X1,但它和Pos3没有直接的联系,属于Pos3关联的局部信息,参与Bundle Adjustment,但取值保持不变。Pos0和X0不参与Bundle Adjustment。
因此,参与优化的是下图中红色椭圆圈出的部分,其中红色代表取值会被优化,灰色代表取值保持不变。(u,v)是X在Pos下的二维投影点,即X在Pos下的测量(measurement)。优化的目标是让投影误差最小。
三、PoseOptimization(位姿图优化):地图点固定,只对当前帧的位姿进行优化
用于LocalTracking中运动模型跟踪,参考帧跟踪,地图跟踪TrackLocalMap,重定位
- 初始化优化器
- 设置输入的关键帧位姿为顶点
- 设置关键帧对应的地图点与该关键帧的重投影误差(地图点固定,是一元边)为边
- 进行4次优化,每次十次迭代,剔除外点和误差过大的边
- 更新优化后的关键帧位姿
四、OptimizeEssentialGraph(优化本质图):所有的关键帧都是顶点,但边只是进行了一部分边的优化
用于闭环检测Sim3调整后优化
- 初始化优化器
- 将所有关键帧的位姿设置为顶点
- 某一帧,因为有闭环而新产生了一些跟他相连的关键帧,在该帧与这些关键帧之间建立边
- 某一帧,找出他的父关键帧,建立二者之间的边
- 某一帧,如果他有与他匹配的闭环帧,在二者之间建立边
- 某一帧,找出与它连接权重大于一定值的关键帧,建立该帧与这些帧之间的边
- 进行优化
- 根据优化结果更新各帧位姿,矫正地图点的位置
五、OptimizeSim3(优化Sim3):当前关键帧与闭环关键帧之间进行Sim3优化
在用RANSAC求解过Sim3,以及通过Sim3匹配更多的地图点后,对当前关键帧,闭环关键帧,以及匹配的地图点进行优化,获得更准确的Sim3位姿,再去下一步的闭环调整
- 初始化优化器
- 将两帧之间的sim3设置为顶点
- 将两针之间匹配上的地图点分部在各自相机坐标系下的位置设置为顶点
- 分别设置两帧对应的地图点的重投影误差为边
- 进行优化
- 剔除重投影误差过大的边
- 再进行一次优化,剔除外点
- 更新优化后的sim3
Pos6和Pos2为一个可能的闭环。通过之间的投影误差来优化
Optimizer类相关推荐
- PyTorch 源码分析:Optimizer类
PyTorch对Optimizer类的实现大部分都在Python上,只有计算用到了C++的部分,所以还是可以继续分析的. 总览 Optimizer类是所有具体优化器类的一个基类.下面一幅图表示一下. ...
- ORB-SLAM2的源码阅读(十二):Optimizer类
ORB_SLAM2主要都是进行图优化,把关键帧的位姿和路标点的坐标设为图的顶点,如果在对应关键帧中有观测到该路标点则产生一条边,这就是共视图的定义.然后Essential graph则还要对权重也就是 ...
- TensorFlow学习笔记(十三)TensorFLow 常用Optimizer 总结
这里主要是各种优化器,以及使用.因为大多数机器学习任务就是最小化损失,在损失定义的情况下,后面的工作就交给优化器啦. 因为深度学习常见的是对于梯度的优化,也就是说,优化器最后其实就是各种对于梯度下降算 ...
- TensorFlow(四)优化器函数Optimizer
因为大多数机器学习任务就是最小化损失,在损失定义的情况下,后面的工作就交给了优化器.因为深度学习常见的是对于梯度的优化,也就是说,优化器最后其实就是各种对于梯度下降算法的优化. 常用的optimize ...
- C++实现神经网络之一 | Net类的设计和神经网络的初始化
北京 上海巡回站 | NVIDIA DLI深度学习培训 2018年1月26/1月12日 NVIDIA 深度学习学院 带你快速进入火热的DL领域 阅读全文 ...
- pytorch load state dict_pytorch源码阅读(二)optimizer原理
pytorch包含多种优化算法用于网络参数的更新,比如常用的SGD.Adam.LBFGS以及RMSProp等.使用中可以发现各种优化算法的使用方式几乎相同,是因为父类optimizer[1]定义了各个 ...
- 理解optimizer.zero_grad(), loss.backward(), optimizer.step()的作用及原理
在用pytorch训练模型时,通常会在遍历epochs的过程中依次用到optimizer.zero_grad(),loss.backward()和optimizer.step()三个函数,如下所示: ...
- optimizer.zero_grad(), loss.backward(), optimizer.step()的理解及使用
optimizer.zero_grad,loss.backward,optimizer.step 用法介绍 optimizer.zero_grad(): loss.backward(): optimi ...
- 梯度值与参数更新optimizer.zero_grad(),loss.backward、和optimizer.step()、lr_scheduler.step原理解析
在用pytorch训练模型时,通常会在遍历epochs的过程中依次用到optimizer.zero_grad(),loss.backward.和optimizer.step().lr_schedule ...
最新文章
- etcd 笔记(05)— etcd 代码结构、各模块功能、整体架构、各模块之间的交互、请求和应答流程
- MongoDB update修改器: 针对Fields的$修改器 $inc $set $unset
- javascript知识点
- 嵌入式s5vp210裸机 KXTF9-2050(G-sensor)
- 1_HDFS理论及安装部署
- 第八天2017/04/17(3、C++的几个语法)
- OpenGL之控制渲染图形的移动
- 《信息检索》第8讲 毕业论文学习指导(资源及预习材料)
- SAP Fiori 1.0 Migrate to Fiori 2.0
- 算法设计与分析基础知识总结——dayOne
- vue中分割线的实现
- 热议:CSS为什么这么难学?一定是你的方法不对
- 苹果手机自带表格软件_手机自带的软件无法卸载?教你一招”!
- Openstack Trove概要
- 将汉字转换为拼音:pypinyin.pinyin()
- 高中数学数列技巧解题秒杀视频:数列小题秒杀技巧
- 协议和协议栈的区别?
- HTML基础学习记录
- 蓝桥杯细节与功能Understanding——小结共欣赏,疑义相与析
- 邮箱格式检测易语言代码
热门文章
- linux挂载zfs文件系统,ZFS使用:挂载文件系统、更改挂载点、
- 风高放火非官方的身法
- 基于AHB Slave设计及验证平台搭建
- HTML+CSS+JavaScript+Ajax+ECharts实现疫情实时监控大屏-1快速上手
- 学习笔记(02):第一章: 路由与模板-Web原理与框架介绍
- 测试用例怎么写?这里提供一个测试用例小模板
- 刘涛淘宝直播当众怼人,引来一片叫好:懂得拒绝的人,活得有多爽?
- matlab randperm()函数用法
- 《WCF技术内幕》翻译15:第1部分_第3章_消息交换模式、拓扑与编排:消息拓扑、消息编排和本章小结...
- http返回码401