orb_slam中LM算法的分析

刘康

2017年 1月

在orb_slam的PoseOptimization()函数中的LM算法,可以分解成几个部分,首先是线性方程的建立和求解,然后是位姿矩阵的迭代更新;对于求解线性方程,就是求解方程 ,然后应用∆x迭代更新当前的位姿  ,其中 , 分别表示第k次,k+1次的位姿;⨁符号表示的是加法意义的运算,当前的系统下表示矩阵的乘法。

在LM的算法中 , , J是雅克比矩阵,e表示的是对应的误差项,增加了一个 正定因子;

该算法中的需要求解的方面如下:

1,J矩阵的求解方法;

2,信息矩阵 的求取方法;

3,正定因子 的初始化,更新方式;

4,向量b的求解方法;

5,线性方程H*∆x= b 的求解;

6,利用线性方程求解的值∆x更新位姿;

7,得到新的位姿之后在次进入步骤1到6的循环;

8,当位姿达到收敛,或者精度达到要求时,停止迭代。

计算步骤的大体的框图如下:

1,求解J矩阵:

在optimization()优化函数中,给出的误差项是对应的匹配点的重投影误差,也就是二维的像素的差值,要求的是当前的帧的位姿,位姿的变化矩阵可以由六个李代数参数表示,也就是一个六维的向量表示,所以J矩阵是一个 的矩阵,具体的公式如下:

J=

2,信息矩阵 的求取

在求解LM算法中信息矩阵反应的是提取特征点时所在的图像金字塔的层数的因子这一特性,金字塔一共八层,每一层的特征乘子为1.2,所以对应层的特征因子为 ,其中n为对应的层数,信息矩阵的求解公式如下:

3,正定因子的初始化

LM算法中正定因子的作用主要是保证H矩阵的正定性,线性方程有解。本次算法中正定因子初始化的过程如下:

首先由1,2步可以得到矩阵 ,求解正定因子 的公式如下:

其中 表示给定的一个参数值,这里给出  ; 表示的是矩阵A的所有的对角元素, 表示对角元素中的最大值。

4,向量b的求取

可以知道在LM算法中  , J是雅克比矩阵,e表示的是对应的误差项,也就是对应的像素值的差。

5,线性方程H*∆x= b 的求解

这里求解的应用的是eigen库中的ldlt方法求解方程:

∆x =H.ldlt().solve(b)

6,利用线性方程求解的值∆x更新位姿

我们更新的方法为:  ,其中 , 分别表示第k次,k+1次的位姿;⨁符号表示的是加法意义的运算,当前的系统下表示矩阵的乘法。

现在详细的讲解一下具体的求解,首先我们的位姿 , 是一个 的矩阵,所以李代数∆x向量需要转化为一个 的矩阵,转化的方法如下:

设转化后的矩阵为  ,所以有  其中exp()就是一种把李代数转化为矩阵的函数,下面就是直接的矩阵的乘法问题:

更新位姿时,要左乘以增量矩阵。

7,得到新的位姿之后的判断

7.1 判断条件然后决定是否把这次得到的位姿作为本次更新的位姿

在开始的时候首先计算得到位姿更新之前的所有误差项的二范数的和,这里用变量chi2表示,计算公式如下:

更新位姿以后现在的误差项 发生了变化,为 ;所以所有误差项的二范数的和为:

判断一个公式:

a, 当rh1的值大于0时,把当前的跟新的位姿作为本次更新的位姿,并且更新正定因子 的值:

更新后的值在下一次迭代的时候使用。

b,当rh1的值小于等于0时,增加 的值重新进行计算一次位姿,直到rh1的值大于0,或者计算10次以后仍然不满足时,停止迭代;

增加 值的策略如下:

首先有初始的 的值为 ,同时定义一个更新因子nu_=2;

当rh1<=0时, ,同时增加为nu_=2* nu_;

下一次迭代之后继续有rh1<=0时,用新的 和nu_继续更新参数的值。

7.2判断条件然后决定是否进行下一次更新

判断不进行进行更新的条件主要有两项,第一项是设置的最多迭代次数,当迭代到达最大次数时自动结束,在本次算法中设置的是10次;另一项判断迭代结束的条件是当优化后的位姿达到了一定的精度之后,判断的条件如下:

if((iniChi-chi2)*1e3<iniChi)

_nBad++;

else

_nBad=0;

if(_nBad>=3)

break;     //若连续3次优化的误差都达到了精度要求,则结束优化

其中iniChi表示迭代之前的总的误差项的二范数的和,chi2表示当前的误差项的二范数的和;上面的程序表示当连续优化三次误差的变化都不大的时候,停止优化。

8,核函数

本次算法中为了使得不受错误的匹配得到的大的误差的干扰,应用了核函数来调整误差很大的误差项的权重值,使得能够很大程度上降低错误匹配的影响。

视觉orb_slam中LM算法的分析相关推荐

  1. matlab lm计算方式,lm算法(lm算法原理介绍)

    请问 MATLAB中 LM算法(Levenberg-Marquard-algorithm)的函数是什么?. http://www.mathworks.com/matlabcentral/fileexc ...

  2. lm opencv 算法_相机模型与标定(七)--LM算法在相机标定中的使用

    LM算法在相机标定的应用共有三处. (1)单目标定或双目标定中,在内参固定的情况下,计算最佳外参.OpenCV中对应的函数为findExtrinsicCameraParams2. (2)单目标定中,在 ...

  3. 刚性仿射变换算法_一种视觉定位中的点集仿射变换算法的制作方法

    本发明涉及相机标定 技术领域: ,具体涉及一种视觉定位中的点集仿射变换算法. 背景技术: :随着工业自动化技术的推进,越来越多的产线工件组装.检测.测量等工作正在由机器人或自动化设备逐步替代,而这些技 ...

  4. 直立车模控制中三种滤波算法简单分析(清华卓晴)

    摘自:https://mp.weixin.qq.com/s/WbCh0NFAnsf9y2blQenf7g 让我想起余义的一篇文章也是说到平衡车有三种滤波,我想和卓晴说的是一样的吧. https://b ...

  5. 视觉SLAM中,本质矩阵、基础矩阵、单应性矩阵自由度和秩分析

    视觉SLAM中,本质矩阵.基础矩阵.单应性矩阵自由度和秩分析 1.各个矩阵的自由度 由于基础矩阵和本质矩阵都是由对极约束来的 1.1 本质矩阵E的自由度为5,秩为2 1.1.1 自由度: 首先,旋转和 ...

  6. MATLAB中果蝇味道浓度判定函数,果蝇优化算法的分析.PDF

    果蝇优化算法的分析 2017 年 第 26 卷 第 2 期 计 算 机 系 统 应 用 果蝇优化算法的分析① 韩 虎 (兰州交通大学 电子与信息工程学院, 兰州 730070) 摘 要: 本文针对果蝇 ...

  7. 相机校正、张氏标定法、极大似然估计/极大似然参数估计、牛顿法、高斯牛顿法、LM算法、sin/cos/tan/cot

    日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) CNN:RCNN.SPPNet.Fast RCNN.Faste ...

  8. 北大华为鹏城联合首次提出视觉 Transformer 后量化算法!

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 AI 科技评论报道 编辑 | 陈大鑫 AI 科技评论今天为大家介绍一 ...

  9. 如何在自动驾驶的视觉感知中检测极端情况?

    作者丨黄浴 来源丨 计算机视觉深度学习和自动驾驶 一篇来自德国大学的论文:"Corner Cases for Visual Perception in Automated Driving: ...

最新文章

  1. 脑电分析系列[MNE-Python-4]| MNE中数据结构Evoked及其对象创建
  2. 设置启用树莓派的HDMI显示
  3. python django部署docker_centos利用docker部署django项目
  4. Android官方开发文档Training系列课程中文版:打印内容之图像打印
  5. C++ 多态的实现及原理
  6. Kendo UI常用示例汇总(十)
  7. cocos2d-x之使用plist文件初试
  8. linux异常级别,linux性能异常定位之进程级别
  9. JavaScript-传值(引用类型,基本类型)
  10. Excel查询两列值的差异 -- VLOOPUP
  11. python django文档_python Django中文文档下载
  12. bluetoothctl No default controller available
  13. Golang-web网站入门-服务器入门
  14. Codelf 命名神器
  15. js时间戳转换年月日
  16. 桌面IE图标不见了的4种解决方法
  17. 精细化ASO帮助开发者在App Store中突围
  18. 谷歌更名为“Google中国”
  19. PCIe交换机的作用和参数解读:PEX89144为例,PCIe交换机能做些什么
  20. Damien Rice - 9 crimes

热门文章

  1. 互联网家装元年,土巴兔能否成为阿里、国美们做家装的风向标?
  2. 车载总线监控分析及仿真工具-VBA
  3. 浅谈对java编程思想的理解
  4. 汽车侧垂向耦合动力学模型介绍(汽车动力学建模进阶知识)
  5. c 语言一个数的n次方,C 语言实例 – 计算一个数的 n 次方 - C 语言基础教程
  6. 罗技宏脚本cf,csgo 绝地求生等等
  7. idea自定义导包个数不带*
  8. uniapp消息推送超详细(从开通uniPush到测试成功)
  9. 排列组合 - Java代码实现
  10. php去除html标签和空格换行符,PHP去除字符串空格与换行html标记