【视觉SLAM入门】7.4.后端优化 --- 基于位姿图和基于因子图

2023-09-12 18:05:20

引入:

  • 上节BA将位姿和路标都作为优化的节点,H矩阵也告诉我们路标远大于位姿,时长会导致资源等问题。

办法:

  1. 滑动窗口法:保持H固定大小,丢弃历史
  2. 位姿图:不管路标,只管位姿,从BA变成Pose Graph,容易看出资源会少很多很多,如下:
    在这里插入图片描述

1. 位姿图

1.1 具体做法

其实仍然是用构建非线性最小二乘问题然后优化解的,只是优化变量变成了位姿 ξ \xi ξ

  • 假设,位姿 ξ i \xi_i ξi 经过运动 Δ ξ i j \Delta \xi_{ij} Δξij 变到了 ξ j \xi_j ξj ,根据李群李代数知识,有如下等式:

Δ ξ i j = ξ i − 1 ∘ ξ j = l n ( e x p ( − ξ i ) ^    e x p ( ξ j ^ ) ) ˇ \Delta \xi_{ij} = \xi_i^{-1} \circ \xi_j = ln(exp(-\xi_i)\hat{} \; exp(\xi_j \hat{})) \v{} Δξij=ξi1ξj=ln(exp(ξi)^exp(ξj^))ˇ

用李群表示则如下:

Δ T i j = T i − 1 T j \Delta T_{ij} = T_i^{-1} T_j ΔTij=Ti1Tj

T i j T_{ij} Tij 右移:
在这里插入图片描述
求它关于优化变量 ξ i \xi_i ξi ξ j \xi_j ξj 的导数,按照李群李代数的方法,中间过程略,最终构建的总体目标函数如下:

min ⁡ ξ 1 2 ∑ i , j ∈ ε e i j T Σ i j − 1 e i j \min\limits_{\xi} \frac{1}{2} \sum\limits_{i,j \in \varepsilon} e_{ij}^T \Sigma^{-1}_{ij}e_{ij} ξmin21i,jεeijTΣij1eij

这里的 ε \varepsilon ε 就是所有边的集合,二范数含义就是平方项。关于这个问题的求解,我们可以用G-N,L-M等之前用的很多。略。

1.2 小结

自从PTAM提出来以后,后端优化没必要实时性了;人们将前后端分开作两个线程–跟踪和建图。
前段需要实时响应视频速度,如每秒30HZ,而后端优化只要完成后将结果返回给前端即可,所以实时性没必要了。

2. 因子图

2.1 具体做法

在介绍因子图的做法前,要先了解贝叶斯网络。

2.1.1 贝叶斯网络

直接用一个动态的贝叶斯网络来表达我们的SLAM的运动和观测方程:

在这里插入图片描述

  • x x x 表示位姿节点
  • u u u 输入量节点
  • l l l 路标节点
  • z z z 观测数据节点
  • 箭头表示依赖关系,比如 x 2 x_2 x2 在运动方程中就依赖于 u 2 u_2 u2 x 1 x_1 x1, 图中也是这么标注的。
  • 一次观测或者一次运动实际上是给出的条件概率关系:

P ( x 3 ∣ x 2 , u 3 ) P ( z 1 ∣ x 1 , l 1 ) P(x_3|x_2, u_3) \qquad\quad P(z_1|x_1,l_1) P(x3x2,u3)P(z1x1,l1)

图绘制完,我们后端优化的目标就是—不断调整贝叶斯网络中随机变量的取值,使得整个网络的后验概率最大化:

{ x , l } ∗ = a r g m a x ( x 0 ) ∏ P ( x k ∣ x k − 1 , u k ) ∏ P ( z k ∣ x i , l j ) \{x,l\}^* = arg max(x_0) \prod P(x_k|x_{k-1}, u_k) \prod P(z_k|x_i, l_j) {x,l}=argmax(x0)P(xkxk1,uk)P(zkxi,lj)


我们发现要做这个公式,里边的乘积会很多,所以将因子化为节点,会更直观,就得到了—因子图

2.1.2 因子图

根据上边的公式,可以重新结合公式和概率公式绘制网络,得到因子图:

在这里插入图片描述

  • 圆圈: 变量节点
  • 方块: 因子节点

此时要解决因子乘积最大化的问题,通常,取所有因子的条件概率为高斯分布的形式,则运动数据和观测数据符合:

P ( x k ∣ x k − 1 ) = N ( f ( x k − 1 , u k ) , R k ) P ( z k j ∣ x k , l j ) = N ( h ( x k , l j ) , Q k j ) P(x_k|x_{k-1}) = N(f(x_{k-1}, u_k), R_k)\qquad P(z_{kj}|x_k, l_j) = N(h(x_k, l_j), Q_{kj}) P(xkxk1)=N(f(xk1,uk),Rk)P(zkjxk,lj)=N(h(xk,lj),Qkj)

同样的,它的解法—因子图优化,和之前的类似,也是用GN,LM等。

2.1.3 更具体的因子图

在实际中,我们可能不止有相机,还有其他先验信息—比如,GPS等,它们测到的点是确定的,也就是这些点的先验信息知道了,就可以在图中添加它们的先验信息了,还有编码器,IMU等。如下:

在这里插入图片描述

2.1.4 增量的求解方法

无论怎么求,最后都会落到这一步:

H Δ x = g H \Delta x = g HΔx=g

但是,当新的节点和新的边加入,它的所有节点更新量就要重新计算一次更新量。
对资源占用很大。我们继续分析因子图:

  • 按照里程计的方式添加节点,在因子图中只有最后一个与之相连的节点会受影响。(实际上是接近的影响大一点)
  • 那么我们只需要在有新的变量和因子加入时,分析它和因子图的连接和影响关系:
      1. 如果按照回环检测方式添加,回环开始到这一帧这一段的节点都受影响,都要调整
      1. 如果只添加一个任意节点,则影响区域几乎只作用于离他最近的点

如下:
在这里插入图片描述

更多推荐

Java 代理模式之静态代理与动态代理

1,代理模式代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。通俗的来讲代理模式就是我们生活中常见的中介。代理模式的目的:(1)通过引入代理对象的方式来间接访问目标对象,防止直接访问目标对象给系统带来的不必要复杂性;(2)通过代理对象对访问进行控制;代理模式一般会有三个角色:抽象角色:指代理角色和真

C++内存管理

目录一.new和delete二.operatornew与operatordelete函数三.new和delete的实现原理四.在VS2022编译器下new和delete不匹配的问题五.定位new六.malloc/free和new/delete的区别七.C++内存分布八.内存泄漏C++在内存管理上引入了两个操作符,分别是

性能测试 —— Tomcat监控与调优:status页监控

Tomcat服务器是一个免费的开放源代码的Web应用服务器,Tomcat是Apache软件基金会(ApacheSoftwareFoundation)Jakarta项目中的一个核心项目,由Apache、Sun和其他一些公司及个人共同开发而成。Tomcat是一个轻量级应用服务器,在中小型系统和并发访问用户的场合下被普遍使用

STM32 EtherCAT 总线型(1 拖 4)步进电机解决方案

第1章概述技术特点支持标准100M/s带宽全双工EtherCAT总线网络接口及CoE通信协议一进一出(RJ45接口),支持多组动态PDO分组和对象字典的自动映射,支持站号ID的自动设置与保存,支持SDO的电机参数设置与自动保存。自动适配市面上EtherCAT总线主站系统或PLC运动控制器,如TwinCAT,Cod

【Unity实战】从零手戳一个库存背包系统

文章目录前言素材开始一、绘制背包UI二、背包开启关闭三、初始化背包网格四、添加物品五、拖拽交换功能物品六、物品拆分七、物品堆叠八、拖拽还原九、引入字典存储数据十、拾取物品十一、丢弃物品最终效果源码完结前言库存背包系统是大多数游戏的关键部分,几乎在每种类型的游戏都可能会用到,今天我将带你从零实现一个能够进行拖放的库存拆分

Linux学习第13天:嵌入式LinuxLED驱动开发:一字一符总见情

在正式写这篇笔记前,有一个事情必须要说一下。昨天更新的基于API函数的字符设备驱动开发按照正常的教程来说应该在本笔记后一天更新才对。但是由于我一时的疏忽,跳过了本笔记。在昨天学习基于API函数的时候造成了一定程度的困扰。今天重翻教程的时候才发现昨天漏了一节,今天补上。从这件小小的事情上我也明白了一个道理,学习不可一蹴而

React中组件通信01——props

React中组件通信01——props1.父传子——props1.1简单例子——props1.2props可以传递任何数据1.2.1传递数字、对象等1.2.2传递函数1.2.3传递模版jsx2.子传父+子传子——props2.1父传子——传递函数2.2子传父——通过父传子的函数实现2.3优化+子传子(兄弟通信)3.re

Spring工厂模式,模拟ApplicationContext实现

一、什么是SpringSpring是一个轻量级的Java企业开发解决方案。它集合了众多优秀的设计模式如:单例、代理、工厂模式等。在这其中最基础的也就是工厂模式。二、Spring为什么是轻量级在Spring问世之前JavaEE开发主流使用EnterpriseJavaBean(EJB)来进行。但是这个框架是重量级的,扩展性

正则表达式的学习笔记

[!note]其实这个正则表达式整体上不难,自从这个gpt出来之后这种正则表达式已经不需要我们去写了,我们并不需要自己能够去写特别深奥的代码,我们可以将这个正则表达式交给gpt去做,我们只需要能够看懂就行了,所以学习这个正则表达式,自己写不出来那种比较难的正则没有事情,只要你能够看懂别人给你的,你就达标了正则表达式的练

redis学习

Redis​redis是一个开源的使用ansic语言编写、支持网络、可基于内存亦可持久化的日志型、key-value数据库,并提供多种语言的api。从2010年3月15日起,redis的开发工作由vmware主持.和MySQL一样都是数据仓库,用于存放数据的仓库,存储和管理磁盘查询数据时顺序IO随机IOmysqI底层使

Leetcode算法入门与数组丨5. 数组二分查找

文章目录1二分查找算法2二分查找细节3二分查找两种思路3.1直接法3.2排除法1二分查找算法二分查找算法是一种常用的查找算法,也被称为折半查找算法。它适用于有序数组的查找,并通过将待查找区间不断缩小一半的方式来快速定位目标值。算法思想如下:首先,确定待查找数组的起始位置(通常为数组的第一个元素)和结束位置(通常为数组的

热文推荐