graph slam tutorial :从推导到应用2

2023-05-16

       在上一部分中通过一个例子大致了解了graph based slam的优化过程。在本篇博客中将提升一个层次,对图优化的求解过程进行推导。由于博文关注的在图构建好以后,如何调整机器人位姿使误差最下。因此,本文主要涉及的是图优化的后端(back-end)。

       我们已经知道图优化问题转变成了一个最小二乘问题。根据上篇博客最后一个例子,求机器人SLAM过程中最优轨迹可以表示成求解机器人位姿使得下面误差平方函数最小。

其中,表示图顶点的参数向量,如机器人位姿。表示测量值,表示该误差所占权重的矩阵。是一个向量误差函数表示之间的关系与测量之间有多吻合。后面为了简化,将误差函数写成下面的形式:


下图为图优化的一个简单例子


        对于上述最小二乘问题还可以从最大似然的角度解释。这里也作简单介绍,主要是为了更进一步的理解误差的权重矩阵。对于传感器的测量,我们可以假设它受高斯白噪声的影响。所以每一个测量值的分布可以看作是以真值为中心的高斯分布。如果测量是多变量的,那就是多元高斯分布。

     

多元高斯分布的协方差矩阵的某一维越大,高斯曲线越矮胖,表示在这个方向上越不确定。并且高斯分布中,均值部位概率最大。所以,对于某个测量,我们应该使它出现在概率最大的地方,这就是最大似然概率。可以得到似然概率的log形式的计算公式:

    

上式和前面的误差平方和函数很像,只不过这里显式的指明了误差函数的形式。所以我们发现,误差的权重矩阵(正式名称为信息矩阵)等于协防差矩阵的逆。由于图优化里每一条边代表一个测量值,如表示相邻位姿关系的编码器测量值或者图像(激光)匹配得到的位姿变换矩阵。所以图优化里每一条边的信息矩阵就是这些测量协防差矩阵的逆。如果协防差越小,表示这次测量越准越值得相信,信息权重就越大。

       我们看到图优化问题变成了求解最小二乘问题,然而机器人位姿之间的变化函数不是线性的,所以是个非线性最小二乘问题,得通过迭代法进行求解。如果迭代开始时有一个好的初始假设值,那我们就能用Guass-Newton法或者 Levenberg-Marquardt法了。

       假设我们已经有了好的初始假设值,需要在这个值附近迭代寻求最优解。求解的方法是把误差函数在该初始值附近进行一节泰勒展开


其中是误差函数附近的雅克比矩阵。并且为了书写方便,使用代替了

      将上面的(5)式代入误差平方和中的某一项可以得到


注意,这里是列向量,是列向量,也是列向量,是一个数值。

       将(10)式代入,可以重写误差平方和函数如下:


其中。为了求解上式,使得其最小,还是求其一阶导数并使其等于0,可以得


其中H系统的信息矩阵(注意与边的信息矩阵区分),系统的解就是在初始值上叠加这个增量

Guass-Newton迭代法就是不断重复这个过程直到收敛。LM法引入了一个松弛因子来控制迭代速度:


      然而,一个值得注意的问题是,上面的步进迭代是用的两个向量直接相加,这是在欧式空间中的做法。而机器人SLAM问题中涉及到平移和旋转,平移是在欧氏空间中,可是旋转就是在非欧空间了。在航迹推演的公式中我们也能看到相邻时刻间位姿的递增由于航向角的存在已经不是简单的相加了。所以得重新定义一个非线性算子来代表增量。

       

将这个非线性算子用在移动机器人相邻时刻的航迹推演,能够得到:


这里可能有点抽象,别急,在后面2d slam的图优化例子中将具体介绍。

       上面的求解过程看起来简单,计算b,H,然后计算增量迭代直到收敛。然而,实际计算的时候,b,H,雅克比矩阵到底是啥得弄清楚。接下来,具体解析它们的结构。

        误差函数只和有关,因此它的雅克比矩阵和无关的列都为0,有如下结构:


清楚了雅克比矩阵的结构,再来看b和H。我们已经知道是列向量,可以推算出结构如下,注意下图中下面的色块代表矩阵和列向量,并且蓝色块代表0,红色块非0。可以看到只有和有关的区域非零。







从上图中可以看出系统是稀疏的,并且正如上面图中的累加一样,程序中也可以对特定的ij计算相应的Hij,bij,然后再把所有的Hij,bij累加起来就行了。

最后把整个求解过程总结如下:



       本篇博文对图优化后端(back-end)进行了推导,但是还有很重要的问题,雅克比矩阵在实际编程中如何计算?前面看到了针对非欧空间的递增设计了非线性算子,那么针对非欧空间的误差函数又该如何设计哩(不能直接两个向量相减求模了)?在下一篇博文中,将结合一个二维平面上的图优化例子进行讲解,同时配有matlab仿真代码


(转载请注明作者和出处:http://blog.csdn.net/heyijia0327 未经允许请勿用于商业用途)

reference:

1. Grisetti. 《A Tutorial on Graph-Based SLAM》

2. Grisetti. 课件 《SLAM Back-end》(可以直接搜到)

3. Rainer & Grisetti  《g2o: A General Framework for Graph Optimization》






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

graph slam tutorial :从推导到应用2 的相关文章

  • 属性错误:“图形”对象没有属性“节点”

    我有以下 python 代码来构建 knn 图 但出现错误 AttributeError Graph 对象没有属性 node 似乎 nx Graph 没有节点属性 但我不知道应该用它替换什么 import networkx as nx de
  • Neo4j/Gremlin/Cypher:如何获取所有节点,直到我在类似地图的设置中达到一定距离(深度)?

    我有一个带有字段的简单图表 每个字段有 4 个邻居 东北 南 西 NodeEntity public class Field GraphId Long id Field north Field east Field south Field
  • sql server图形查询,找到节点的所有路径

    我有一个非常常见的问题 我试图使用图形查询来解决 sql server 2017 我想构建一个查询并查找节点中的任何人如何连接到C 我想构建一个查询并查找节点中的任何人如何连接到C 有 1 或 2 个连接 这是创建该图的完整脚本 DROP
  • QSTK 的事件分析器函数无法正确绘制

    在佐治亚理工学院的 Coursera 计算投资课程中使用 QSTK 时 Examples EventProfiler tutorial py 末尾的 eventprofiler 函数不会输出视频中显示的图表 见下图 为第 4 周的练习生成的
  • 如何将自定义图形适合boost图形库模板?

    我对 C 模板很生疏 而且我正在使用 boost 图形库 一个致命的组合 我在网上搜索过 但找不到任何关于如何采用自定义图形结构并将其足够适合 BGL 增强图形库 的直接说明 以便我可以使用增强图形遍历算法 有熟悉图书馆的人可以帮助我吗 编
  • 在 Python 中为方法生成控制流图的最简单方法是什么?

    我正在编写一个程序来尝试比较两种方法 我想为所有匹配的方法生成控制流图 CFG 并使用拓扑排序来比较两个图 有一个Python包叫做staticfg https pypi org project staticfg 它正是从一段 Python
  • 目标必须是节点索引的密集双精度数组。怎么解决?

    我正在尝试构建一个网络图词邻接 http www personal umich edu mejn netdata 数据 但我收到错误 目标必须是节点索引的密集双数组 以下是我的代码 fileName adjnoun gml inputfil
  • 如何在 R 中创建类似箱线图的分类散点图?

    有谁知道如何创建散点图R创建像这样的情节these http graphpad com support faq graph tip how can i make a barcolumn graph that also shows the i
  • 有什么方法可以改变 TortoiseHg 中图表的绘制方式吗?

    由于习惯了 ClearCase 绘制图表的方式 我乍一看发现 Mercurial 和 TortoiseHg 的方式令人困惑 This http nvie com posts a successful git branching model
  • 将边权重传递给networkx中的graphviz_layout

    每个人都找不到如何将权重列表的属性名称传递给networkx中的graphviz layout 像这样的事情 nx spring layout G weight weight sum 但与nx graphviz layout G 也许有人会
  • 在尝试找到最长路径的同时消除有向无环图中的无关边

    我问了一个question https stackoverflow com q 8685598 35690关于在可变数量的集合中查找没有重复字符的子序列 解决方案是创建每对字母的矩阵 丢弃每组中未出现的字母 然后找到最长路径 http en
  • NetworkX:翻转图

    有没有办法以相反的顺序生成图形 即我想生成垂直翻转的图形 或者如果我可以在绘制之前用一些 matplotlib 子例程翻转它 F e 我希望 357 和 358 位于顶部 1 6 位于底部 只需交换您的位置坐标即可 import netwo
  • 为什么使用 Dijkstra 算法而不是最佳(最便宜)优先搜索?

    从我到目前为止所读到的来看 这最佳优先搜索 https en wikipedia org wiki Best first search在找到到达目标的最短路径方面似乎更快 因为 Dijkstra 算法在遍历图时必须放松所有节点 是什么让 D
  • 什么是好的、免费的 PHP 图表套件?

    我要做的只是基本的折线图 任何人分享的经验将不胜感激 不是真正的 PHP 但我发现 amchart 非常容易实现 而且看起来很棒 http www amcharts com http www amcharts com 还可以查看 Googl
  • 在 python matplotlib 中格式化损坏的 y 轴

    我正在 matplotlib 中处理一个 相当复杂的 条形图 它包含来自多个源的摘要数据 每个源都沿 x 轴标记 y 轴上有一系列结果 许多结果都是异常值 我尝试使用断开的 y 轴来显示这些结果 而不会使用以下组合来扭曲整个图表这个方法 h
  • 使用 d3 在两个节点之间绘制多条边

    我一直在关注 Mike Bostock 的代码这个例子 http bl ocks org 1153292学习如何在 d3 中绘制有向图 并且想知道如何构建代码 以便可以在图中的两个节点之间添加多个边 例如 如果上例中的数据集定义为 var
  • Kamada 和 Kawai 图形布局算法? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有人尝试过 Kamada Kawai 的 88 算法来绘制一般无向图吗 如果是这样 并且您知道其中的任
  • Floyd-Warshall 算法:获取最短路径

    假设一个图由一个表示n x n维数邻接矩阵 我知道如何获得所有对的最短路径矩阵 但我想知道有没有办法追踪所有最短路径 Blow是python代码实现 v len graph for k in range 0 v for i in range
  • 图中的后边

    I m having a hard time understanding Tarjan s algorithm for articulation points I m currently following this tutorial he
  • d3力定向布局-链接距离优先

    在 d3 中使用力导向布局 如何使链接距离成为优先事项 同时仍然保持良好的图形布局 如果我指定动态链接距离 但保留默认费用 则我的图形距离会因费用函数而发生一些变形 并且不再是准确的距离 但是 如果我删除电荷 图表将如下所示 任何建议表示赞

随机推荐

  • 【Matter】解密Matter协议(一)--- 什么是Matter协议?

    1 什么是Matter协议 xff1f 目前的智能家居行业使用解决方案众多 xff0c 相互之间隔离严重 xff0c 有WiFi 蓝牙 ZigBee 蜂窝或者有线等等不同通讯协议的设备 不仅不同协议之间的设备不能互通 xff0c 而且连相同
  • 【蓝牙系列】蓝牙5.4到底更新了什么?(1)--- PAwR

    蓝牙系列 蓝牙5 4到底更新了什么 xff08 1 xff09 PAwR 一 背景 蓝牙技术联盟最近发布了蓝牙5 4的核心规范 xff0c 蓝牙5 4规范的主要改进之一就是实现了单个接入点与数千个终端节点进行双向无连接通信 xff0c 这一
  • UP Squared Board,工业级创新开发板,为您的物联网应用注入升级能量

    研扬科技自推出UP Board xff08 世界首创 Intel 平台信用卡大小开发板 xff09 以来 xff0c 便成功于业界打开名号 xff0c 后续 xff0c 研扬持续开发 UP 系列产品 xff0c 至今 xff0c 除了 UP
  • 【蓝牙系列】蓝牙5.4到底更新了什么(2)

    蓝牙系列 蓝牙5 4到底更新了什么 xff08 2 xff09 一 背景 上一篇文章讲了蓝牙5 4的PAwR特征 xff0c 非常适合应用在电子货架标签 xff08 ESL xff09 领域 xff0c 但是实际应用场景中看 xff0c 只
  • 【转载】【Nordic博文分享系列】详解Zephyr设备树(DeviceTree)与驱动模型

    详解Zephyr设备树 xff08 DeviceTree xff09 与驱动模型 转载自nordic半导体微信公众号 1 前言 Nordic最新的开发包NCS xff08 nRF Connect SDK xff09 相对于原来的nRF5 S
  • 感受一下SPL06气压计+APM三阶互补的高度融合

    不得不说 xff0c spl06气压计很强 xff0c 原始数据也比较干净 xff0c 短时间可以保持在30cm内浮动 xff0c 滤波后在10cm内浮动 就是这么夸张 使用APM的三阶互补滤波融合出 高度 xff0c 速度 xff0c 效
  • 6种串口协议的实现

    串口协议开发 以下解析范式都是采用数据队列的形似来存储 xff0c 并且根据设备运行速度差异 xff0c 还需增加数据包队列来存储解析完毕的数据包 1 范式一 固定长度 无校验 0x6B 20字节 0xB6 上面数据中有一个帧头0x6B x
  • html页面实时刷新显示服务器数据

    在上一篇中我说到浏览器和服务器交互数据 xff0c 是实现了服务器发数据给浏览器 xff0c 并在页面上显示 xff0c 但是是通过按钮点击刷新的 xff0c 而且数据是和html页面一起发过来的 xff0c 在这里我是数据放到页面数组里
  • 平衡小车之家客服真差

    我同事送了我一台直流电机平衡车 xff0c 然后同事又买了一台步进电机平衡车 都是在平衡小车之家买的 xff0c 好好看看下面的图片 最近在研究同事的步进平衡小车 xff0c 然后跑去问一下客服步进电机的参数 xff0c 一看我说 xff0
  • C++编译流程

    C 43 43 编译流程 C C 43 43 是编译型高级语言 xff0c 程序要执行 xff0c 必须要有编译器和链接器 编译过程分为四步 xff1a 预处理 编译 汇编 链接 1 预处理 读取源代码并对其中的以 开头的指令和特殊符号进行
  • 卡尔曼滤波 -- 从推导到应用(一)

    前言 卡尔曼滤波器是在估计线性系统状态的过程中 xff0c 以 最小均方误差为目的而推导出的几个递推数学等式 也可以从贝叶斯推断的角度来推导 本文将分为两部分 xff1a 第一部分 xff0c 结合例子 xff0c 从最小均方误差的角度 x
  • 卡尔曼滤波 -- 从推导到应用(二)

    该文是自我总结性文章 xff0c 有纰漏 xff0c 请指出 xff0c 谢谢 白巧克力 这部分主要是通过对第一部分中提到的匀加速小车模型进行位移预测 先来看看状态方程能建立准确的时候 xff0c 状态方程见第一部分分割线以后内容 xff0
  • LQR 的直观推导及简单应用

    本文主要介绍LQR的直观推导 xff0c 说明LQR目标函数J选择的直观含义以及简单介绍矩阵Q R的选取 xff0c 最后总结LQR控制器的设计步奏 xff0c 并将其应用在一个简单的倒立摆例子上 假设有一个线性系统能用状态向量的形式表示成
  • STM32学习路线-长图

    最近好好整理了一下学习STM32的路程 xff0c 做成了一个长图 xff1a STM32学习路线 xff0c 供初学者们参考一下
  • ROS 教程之 vision: 摄像头标定camera calibration

    在上一个ROS教程视觉文章中 xff0c 我们使用usb cam包读入并发布了图像消息 xff0c 但是图像没有被标定 xff0c 因此存在畸变 ROS官方提供了用于单目或者双目标定的camera calibration包 这个包是使用op
  • ROS 基础: 在同一个节点里订阅和发布消息

    在一些应用中 xff0c 可能有的人需要在同一个节点中实现订阅一个消息 xff0c 然后在该消息的回调函数中处理一下这些数据后再发布到另一个topic上 ROS answers中也有人有相同的疑问 xff0c 这里贴出Martin Peri
  • ROS : 修改ROS源代码(overlaying package)

    ROS官方或者其他个人提供了很多package供大家使用 xff0c 但是随着学习的深入 xff0c 很多人可能想去修改这些package的源代码 xff0c ROS提供了一种称之为overlaying的机制 它允许 ROS原有安装的pac
  • graph slam tutorial :从推导到应用3

    为了更好地理解graph based slam的过程 xff0c 本文以二维平面的激光SLAM为例子 xff0c 先简单介绍如何根据传感器信息构建图 xff0c 即图优化的前端 xff08 front end xff09 然后再针对上篇博客
  • graph slam tutorial : 从推导到应用1

    前言 SLAM问题的处理方法主要分为滤波和图优化两类 滤波的方法中常见的是扩展卡尔曼滤波 粒子滤波 信息滤波等 xff0c 熟悉滤波思想的同学应该容易知道这类SLAM问题是递增的 实时的处理数据并矫正机器人位姿 比如基于粒子滤波的SLAM的
  • graph slam tutorial :从推导到应用2

    在上一部分中通过一个例子大致了解了graph based slam的优化过程 在本篇博客中将提升一个层次 xff0c 对图优化的求解过程进行推导 由于博文关注的在图构建好以后 xff0c 如何调整机器人位姿使误差最下 因此 xff0c 本文