因子图优化原理(iSAM、iSAM2论文解析)

2023-05-16

因子图优化原理(iSAM、iSAM2)

  • slam问题
  • 通过贝叶斯网络对slam问题建模
  • 从贝叶斯网络到因子图
  • 非线性最小二乘问题求解
  • isam1增量QR分解
  • isam2
  • 结语

slam问题

在介绍因子图之前,先从一个简单的slam问题入手,如下图所示:
在这里插入图片描述
在图中清晰的显示了各个节点和和连接结点边之间的定义,对于图结构不做过多说明,假定读者已经有一定的先验知识。在上图显示的slam问题中,实际上我们要解决的问题就是,从机器人的控制和观测中恢复机器人的路径以及环境地图。

通过贝叶斯网络对slam问题建模

在这里插入图片描述
在贝叶斯网络中,通过有向边连接变量,除了路标状态节点和机器人的状态节点外(两个状态节点为状态变量),还定义了路标观测节点(红色)和运动观测节点(绿色)(两个观测节点为观测变量)。这个贝叶斯实际上描述了一种状态和观测的联合概率模型。假设知道系统的状态变量X(机器人所在位置、路标点所在位置),可以推测出机器人得到的观测量Z(观测量是通过某些传感器得到的,而传感器有已知模型,可以通过数据手册得到),即已知机器人的状态量和传感器的模型,就可以推算出机器人的观测量。所以得到了如下图所示的一个生成模型:
在这里插入图片描述
由于观测量之间相互独立,可以得到下式所述的模型:
在这里插入图片描述

从贝叶斯网络到因子图

基于上文,我们知道贝叶斯网络是一个生成模型,解决的从状态变量得到观测观测变量,而我们的问题是从观测变量来推出状态变量,是一个状态估计问题,这就引出了因子图,因子图是一个inference model。
首先来对问题做一个推导:由于我们要从观测量来推出状态量,这是一个后验概率问题,结合贝叶斯丁玲,问题被描述为最大化一个后验概率问题(MAP),即给定系统系统观测量,求解系统状态量,使得下式的条件概率最大:
在这里插入图片描述
通过上面的定义将MAP问题转换成求解一个最优的状态,使得似然概率和先验概率的乘积最大化。

因子的定义推导:将先验和似然项因式分解作为因子:
在这里插入图片描述
将上述乘积形式的每一项表示成因子,将状态变量表示成节点,观测量表示成边,就转化成了下面的因子图。
在这里插入图片描述
对于上面的因子图,我们用下面的式子来描述:
在这里插入图片描述
其中红色的部分表示观测因子,绿色为里程计因子,紫色为先验因子。那我们要解决的问题是什么呢,就是寻找一个最优的X,使得这些因子图的乘积最大化。
在这里插入图片描述
因子图中每个因子的定义:在因子图中通常每个因子都是通过指数函数的形式来定义的,这是因为我们得到的观测量是有不确定性的,而且现实中这种不确定性通常服从高斯分布:
在这里插入图片描述
其中f(x)表示的是误差函数,当误差越小的时候,其指数函数越大,其定义如下图所示:
在这里插入图片描述
通过上面的说明,到这里我们终于得到了我们定义因子图之后要解决的问题了。我们先理一遍,首先我们介绍了贝叶斯网络,他是一个概率网络,通过贝叶斯网络可以解决已知状态变量来推出观测变量的问题,但是事实是我们通常可以得到观测变量,想要推出状态变量,所以我们推出了因子图,并且结合贝叶斯定理,将问题描述成一个最大后验概率问题。最终得到目标函数:
在这里插入图片描述
现在有了目标函数之后,剩下的最后一个问题就是,如何求解这个最优化问题。对于目标函数的右边取负对数,可将最大化因子的成绩问题转化成一个非线性最小二乘问题:
在这里插入图片描述
通过求解这个非线性最小二乘的问题就能得到问题的最优解。

非线性最小二乘问题求解

在这里插入图片描述
对于上式的最小二乘问题,可以通过高斯牛顿迭代法来求解,首先给定X一个初始值(通常在slam问题中这个初始值我们使用上一时刻得到的最有状态估计X),在给定这个变量的基础上再去求一个修改量,最后在用这个初始值加上这个修改量得到新的状态X,重复迭代这个过程,直到收敛。其流程如下图所示:
在这里插入图片描述
对于上图中的非线性最小二乘问题,对中间的式子做一阶泰勒展开,就可以将其转化为线性最小二乘问题:
在这里插入图片描述
现在的问题就转化成了如何求解这个线性最小二乘问题,对于一个线性最小二乘问题是由比较成熟的方法来得到线性最小而成问题的最优解,比较常见的方法为Normal equation:
在这里插入图片描述
对于Normal equation问题可以通过Cholesky分解来求解:

在这里插入图片描述
也可以通过QR分解来求解:

在这里插入图片描述
下面通过最开始的简单的slam问题来说明一下因子图的求解过程:
在这里插入图片描述
上图中的雅可比矩阵的每一行对应一个因子,右边的矩阵是一个信息矩阵,在现实中生成的因子图所获得的雅可比矩阵是稀疏矩阵,这是一个很好的性质,非常有利于线性系统的求解:
在这里插入图片描述
但是这个矩阵的稀疏性和变量的order有关,order不一样的话,矩阵的稀疏性体现也不一样,会出现下图所示的情况:
在这里插入图片描述
这种情况下不利于线性系统的求解,所以通常需要一些算法来对信息矩阵进行重排序来维持其好的稀疏性,目前较为成熟的算法为COLAMD。通过上面的描述我们知道了对于一个确定的因子图如何求解。但是常见的问题(比如SLAM问题)生成的因子图是增量的,并且在机器人运行的过程中,因子图只是又很小一部分的改变,如果我们从头对因子图进行分解来求解的话,不利于系统的实时性,那么如何解决这个问题呢?下面介绍论文isam中是怎么做的。.

isam1增量QR分解

对于给定的J进行QR分解如下图所示:
在这里插入图片描述
现在我想对J加入几行,这几行的意义就是,当因子图中加入了新的节点和因子时在信息矩阵中的表现就是多了几行,问题就是怎么不在重新分解的基础上能得到新的R。
在这里插入图片描述
论文中给出了求解方法,公式如下图所示:
在这里插入图片描述
对于在R下面加了一行(非零元素)变成如下图所示:
在这里插入图片描述
其求解办法是通过givens rotation可以将R变成一个新的上三角矩阵:
在这里插入图片描述
但是随着因子的增加,也会带来一个问题,就是如果我新加的因子只影响上一时刻的因子的时候,这个矩阵依然是有很好的稀疏性,但是如果新加入的因子是回环,那么givens rotation讲影响之前的所有节点,使R矩阵变得稠密,如下图所示
在这里插入图片描述
这时候就体现出了isam1的问题,在经过以一定的时间后就需要对元素进行重新排序,将稠密矩阵变得稀疏:
在这里插入图片描述

isam2

在这里简单说明isam2是将因子图转换成贝叶斯网络去求解,具体的文章参考paper吧,我自己还没有研究透彻。但是我建议明白了因子图的求解流程之后,就不要再去看那枯燥的公式了,脑瓜子疼。其实他就是求解问题的一种工具,所以明白了问题之后,调库不香嘛?

结语

写这篇文章是因为,自己早早的就接触到了因子图优化,针对salm问题的因子图优化问题,我就一直想不通,这个后验概率是在哪里体现的呢,现在终于明白了,其实就是上面指数形式的因子推导的过程,雅可比矩阵是什么玩意呢?原来是矩阵的一阶倒数呀。所以大家在学习论文的时候不要害怕公式,因为公式看不懂你是真不懂,哈哈。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

因子图优化原理(iSAM、iSAM2论文解析) 的相关文章

  • STM32学习——串口

    STM32学习 串口 USART通用同步异步收发器 xff08 Universal Synchronous Asynchronous Receiver Transmitter xff09 是一串行通信设备 xff0c 可以灵活地与外部设备进
  • core dumped 错误

    Aborted xff08 core dumpde xff09 一般是关于内存异常 xff1a 详细解释 gdb使用 1 往受到系统保护的内存地址写数据 有些内存是内核占用的或者是其他程序正在使用 xff0c 为了保证系统正常工作 xff0
  • 使用OpenCV进行特征(颜色、形状)提取

    图像处理 图像处理所做的只是从图像中提取有用的信息 xff0c 从而减少数据量 xff0c 但保留描述图像特征的像素 下面从图像中提取颜色 形状和纹理特征的方法开始 1 颜色 每次处理图像项目时 xff0c 图像的色彩空间都会成为最先探索的
  • proxifier中文汉化版

    在日常工作中使用到一些网络不稳定的服务时 xff0c 经常会遇到一个很头疼的问题 xff0c 那就是非常慢 xff0c 很是令人抓狂 xff0c 所以小编将介绍一款非常好用的代理客户端proxifier 软件下载点击这里 xff0c 支持s
  • K8S-微服务调用及运行过程

    为什么分析微服务过程调用 在实际的项目中 xff0c 微服务之间涉及到业务代码的部分 xff0c 调用逻辑非常复杂 对于工程师而言 xff0c 熟悉组件之间的调用关系 方便之后的业务模块开发 以及集群部署与自动化编排过程中有非常大的帮助 x
  • freertos常用任务函数----freertos初学笔记

    vtasksuspend 任务挂起函数 xff0c 用户可以调用Vyasksuspend xff08 xff09 函数将任何状态的任务挂起 xff0c 被挂起的任务得不到cpu的使用权也不会参加调度 xff0c 他相对于调度器而言是不可见的
  • 作为一名实施,需要自己反编译、网络抓包、猜测数据库,干的全不像实施的活……

    一位朋友提到这样的一个问题 xff1a 做为一名现场实施人员 xff0c 面对某x系统 xff0c 一片空白 好不容易整明白点了 xff0c 又发现x系统与某xx系统有关系 xff0c 再深入一点 xff0c 还与某xxx系统相连 xff0
  • Kalibr安装 ubuntu18.04+ros melodic

    原来的版本需要opencv2 xff0c 所以出现很多错误 总结安装kalibr安装核心重点就是 xff1a 下载这个版本的kalibr包 xff0c https github com ori drs kalibr 遇到问题就看看是哪个模块
  • 学了4年C++后,我转向了Python

    C 43 43 已经学不动了 xff0c 现在换 Python 还来得及吗 xff1f 一位四年工作经验的 C 43 43 程序员亲述转型历程 xff0c 这不仅仅是语言上的转变 xff0c 而是代码思维甚至工作环境的转变 通常 xff0c
  • 关于远程控制软件向日葵Linux端、win10版本交互“连接已断开”问题的解决

    问题环境 xff1a 被控制端 xff1a Ubuntu18 04版本操作系统 xff08 默认gdm3桌面显示管理器 xff09 控制端 xff1a win10版本操作系统 向日葵版本 xff1a 出现的问题 xff1a 当我的win10
  • Layui 弹出全屏自适应

    span class token keyword var span index span class token operator 61 span layer span class token punctuation span span c
  • CSS - 修改滚动条样式

    span class token comment 整个滚动条 span span class token selector webkit scrollbar span span class token punctuation span sp
  • VUE 初学(1)

    span class token doctype lt DOCTYPE html gt span span class token tag span class token tag span class token punctuation
  • VUE 初学(2)生命周期

    span class token doctype lt DOCTYPE html gt span span class token tag span class token tag span class token punctuation
  • VUE 初学(3) 模板语法

    span class token operator lt span span class token operator span DOCTYPE html span class token operator gt span span cla
  • VUE 初学(4) 数据、方法、计算属性、侦听器

    span class token doctype lt DOCTYPE html gt span span class token tag span class token tag span class token punctuation
  • VUE 初学(5) 样式绑定语法

    span class token doctype lt DOCTYPE html gt span span class token tag span class token tag span class token punctuation
  • 部门赶工,团队成员都积累了上百个小时以上的调休时间,如何调休?

    有朋友问 xff1a 部门赶工 xff0c 团队成员都积累了上百个小时以上的调休时间 然后闲下来了 xff0c 调休潮来了 批准太多 xff0c 怕影响不好 不批准嘛 xff0c 这些时间难消 采用每月每人只准调一次 xff0c 每次同时调
  • homebrew基本操作

    安装软件 xff1a brew span class token function install span xxx 卸载软件 xff1a brew uninstall xxx 搜索软件 xff1a brew search xxx 更新软件
  • centos8安装搭建php环境

    原文章地址 centos8安装搭建php环境 window centos双系统安装完成之后 xff0c 接下来在centos上搭建php的环境 网上也有很多安装的教程 xff0c 其实都一个样 xff0c 以下我直接使用yum安装 默认都是

随机推荐