SLAM8-后端的其他方法,BA与图优化,Pose Graph优化的理论与公式详解、因子图优化

2023-05-16

1、BA方法
Bundle Adjustment翻译过来是“光束调整”,意思是每个特征反射的光束,通过调整它们的空间位置和相机姿态,使它们都汇聚到相机光心,这个过程叫BA。
假定世界坐标系下的点p,通过K,T之后转换为了像素坐标,把这个过程用方程描述为z=h(x,y)其中x是位姿T,y是路标点p,误差函数写为:
在这里插入图片描述
通过同时把T,P作为优化量来进行调整,对误差函数进行求解,就是所谓的BA
2、BA的求解
由于误差函数不是线性的,所以我们想到用增量△x的方法,逐步迭代。当给误差函数一个增量△x时,函数变为:
在这里插入图片描述
对相机姿态的偏导数记为F,对路标点的偏导数记为E,把所有的位姿作为一个变量xc,所有的空间点作为一个变量xp,进一步化简为:
在这里插入图片描述
由于变量xc,xp很多,而且后面还要求误差函数对于△x的导数为零来求解△x,进而引发H△x=g求解△x的问题,这里的H矩阵就会非常大。
例如,高斯牛顿法里面:
在这里插入图片描述
3、化简H
我们知道H具有了一定的特殊结构,而这个结构是因为JT*J的雅可比矩阵引起的。雅可比矩阵如下图,每一行例如第四行J14,就是第一个相机位置拍摄的图片中的第四个特征点,根据外参畸变内参计算到像素坐标的时候产生的误差对于相机的位姿和特征点产生的导数。
在这里插入图片描述
进一步导致H矩阵如下
在这里插入图片描述
把H矩阵进行分块划分,那么方程H△x=g可以进一步改写为:
在这里插入图片描述
在这里插入图片描述
把方程逐步化简
在这里插入图片描述
在这里插入图片描述
这样会得到两个方程,先解开第一个方程,获得△xc,再把△xc带入第二个方程求出来△xp,这个过程叫做Schur消元或者边缘化
4、核函数
有时候误差函数会出现错误,因为有可能某个相机没有观察到这个点,但是却加了上去,所以我们要利用核函数改写一下误差函数。常用的核函数例如Huber函数,把误差限制在一个范围内才进行二次增长,超过阈值就变成一次增长,以防一个误匹配使劲优化,把整体都给带歪了。
在这里插入图片描述
5、Pose Graph优化
BA和图优化,是把位姿和空间点放在一块,进行优化。特征点非常多,机器人轨迹越走越长,特征点增长的也很快。因此位姿图优化的意义在于:在优化几次以后把特征点固定住不再优化,只当做位姿估计的约束,之后主要优化位姿。
在这里插入图片描述
三角形的位姿T1,T2。。。是通过和世界坐标系的比较而得到的,蓝色的边是两个位姿之间相对运动的估计。
如何获得T1,T2:世界坐标系的路标点有了,然后根据图像坐标系下的点,估计世界坐标系与图像坐标系下的变换关系,解得位姿,这里的位置是有误差的。
如何估计它们的相对运动,也就是蓝色的线
数学方式算出来的是:T1的逆乘以T2。
匹配方法是:通过T1和T2所在的图像进行匹配,比如单独算一个2D-2D之间的位姿变换或者光流法等,这样根据图像算出的位姿相对变换很有可能是和T1与T2用数学方式计算得到的位姿是有差异的
如何减小两种方法的差异
相对运动公式如下,左边是根据匹配获得的,右边是根据数学公式获得的,两者是近似相等,这里公式稍微有问题
在这里插入图片描述
这个△的意思就是蓝色的边,两个位姿i和j之间的变换ij。之后左右两边同时乘以△Tij的逆,再求对数。如果Ti和Tj没有误差,那左右都应该是0,但是由于右边Ti,Tj有误差,所以要想办法调整Ti,Tj,使得右边的(eij)尽可能接近零在这里插入图片描述
想求误差对于位姿Ti的偏导数和位姿Tj的偏导数来调整Ti,Tj,但是求导很麻烦,我们仍然想使用高斯牛顿法,求出增量,然后进行迭代。
从李代数的角度出发,给俩左扰动,一个是i的小扰动δξi,一个是j的δξj。不过Ti在误差函数里是逆矩阵,求了逆以后,i的小扰动δξi就去了右边:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
把两个exp合并起来,然后泰勒展开,保留一阶项:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
求出关于Ti,Tj的雅可比矩阵之后,由于雅可比矩阵比较复杂,通常取近似,
在这里插入图片描述
得到J,然后计算H,第三,根据H△x=g得到扰动量△x,并对原先俩位姿进行更新,实现优化。
把所有的顶点和边都考虑进来,总的目标函数就是:
在这里插入图片描述
6、因子图
因子图怎么看:
在这里插入图片描述
这图的意思是,路标l和位姿x1,在状态方程h的作用下一起决定了一个观测数据z。

位姿x1根据运动方程f和噪声u2一起构成了下一步的位姿x2,这个过程逐步递推。红框表示一次观测,蓝框表示一次运动。
蓝框可以看成是先验,红框是似然,在似然和先验的共同作用下,才能得到后验
在这里插入图片描述
因子图优化是否就是普通图优化换了种说法?不是。

区别在于:因子图是增量的处理后端优化。啥意思呢,机器人是运动的,不同的边和节点会被不断加入图中。每加入一个点,普通图优化是对整个图进行优化,所以比较麻烦和耗时。因子图的话相当于是保留中间结果,每加入一个点,对不需要重新计算的就直接用之前的中间结果,对需要重新计算的再去计算。以这种方式加速计算,避免冗余计算。

相机和路标点信息存储在problem-16-22106-pre.txt文件中,可以使用common.h中定义的BALProblem类读入文件内容,然后使用ceres或者g2o来解决BA问题.
rotation.h定义旋转变换所需要的函数,这里的旋转使用的是旋转向量
SnavelyReprojectionError.h定义:根据文件中的相机信息和路标点信息预测路标的归一化平面点的坐标,与实际拍摄到的图片的路标点坐标之差,作为误差。
代码1:使用ceres
https://blog.csdn.net/Summer_star_summer/article/details/107466298
代码2:使用g2o
https://blog.csdn.net/Summer_star_summer/article/details/107467107

代码3:pose graph优化:使用g2o自带的默认SE3顶点和边
https://blog.csdn.net/Summer_star_summer/article/details/107472214

代码4:pose graph优化:使用g2o自定义的顶点和边
https://blog.csdn.net/Summer_star_summer/article/details/107472615

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

SLAM8-后端的其他方法,BA与图优化,Pose Graph优化的理论与公式详解、因子图优化 的相关文章

随机推荐

  • 路径跟踪算法之PID路径跟踪与PP跟踪

    路径跟踪算法之PID路径跟踪与PP跟踪 1路径跟踪原理2 常见的路径跟踪算法2 1 Pure puresuit pp 纯跟踪2 2 PID 跟踪 1路径跟踪原理 在运用好的路径规划算法 xff0c 规划好一条从起点到目标点最优的路径后 xf
  • 深入详解PID三项的作用与特性(抛开公式,以常识认识PID)

    深入探讨PID三项作用与特性 xff08 纯以常识方式对PID进行数学理论分析 xff09 1 经典PID的理解 xff08 抛弃公式 xff0c 以常识认识PID xff09 源文献 PID指的就是比例 积分 微分三项的结合 xff0c
  • ADRC自抗扰控制,有手就行

    ADRC自抗扰控制 xff0c 有手就行 关于ADRC的优点本人不会赘述 xff0c 毕竟作为一个ADRC算法都推导不出来的应用工程师 xff0c 最希望看到的就是有手就行的操作方法 ARC的缺点就显而易见 xff0c 就是参数多 xff0
  • nuScenes数据集详细介绍

    本文为博主原创文章 xff0c 未经博主允许不得转载 本文为专栏 python三维点云从基础到深度学习 系列文章 xff0c 地址为 https blog csdn net suiyingy article details 12401771
  • fegin调用的时候数据格式转换为linkedhashmap

    在spring cloud项目开发中 xff0c 使用fegin进行远程调用 1 接口服务方返回类型为Map String Object 类型 2 接口调用方返回值类型也是Map String Object 3 通过fegin调用之后返回的
  • 一个字符串截取函数c语言

    刚开始学习c语言 xff0c 标准库中总是有很多函数没有 xff0c string h中的字符串处理函数好像不是很多 xff0c 在做栈的例子用需要用到一个字符串按位置截取的函数 xff0c 就自己写一个 xff0c 超简单 char su
  • RAF_DB数据集分类_3

    混淆矩阵 这里ECANet太长了 xff0c 我这里直接利用resnet代替一下 xff0c 你可以直接替换 xff0c 然后把权重对应好即可 xff0c 这只是一个简单的混淆矩阵生成 xff0c 没有太多美化 span class tok
  • docker镜像的创建

    目录 基于现有镜像创建 首先启动一个镜像 xff0c 在容器里做修改 然后将修改后的容器提交为新的镜像 xff0c 需要使用该容器的ID号创建新镜像 基于本地模板创建 导入镜像 基于Dockerfile创建 联合文件系统 xff08 Uni
  • ROS源码分析--子话题-catkin

    catkin简介 catkin简介 packagexml 格式1格式2 CMakeListtxtmeta package典型ROS应用添加自定义message文件 修改packagexml修改CMakeListtxt find packag
  • vnc安装和开机自启设置

    一 安装VNC 键入以下命令以在 Ubuntu 服务器上安装 TigerVNC xff1a sudo apt install tigervnc standalone server tigervnc common 现在安装了 VNC 服务器
  • 【Linux】线程安全篇Ⅰ

    文章目录 0 概述1 线程不安全举例1 1 前提知识铺垫1 2 场景模拟1 3 代码模拟 2 互斥2 1 什么是互斥2 2 互斥锁的原理 amp amp 特性2 3 互斥锁的计数器如何保证原子性2 4 互斥锁的接口2 4 1 初始化接口2
  • PX4/APM/飞控的学习笔记前言-Cxm

    开始了 开始了 终于有时间可以学习飞控了 此文章是用来当目录 我会持续更新我的学习之旅 希望能对各位有所帮助 如果有错误的地方还请各位前辈指点 此帖持续更新后续内容 其实从21年的一月就开始学习飞控一开始是从PX4开始学习 但是因为对liu
  • kubernetes 中文版

    这个文档非常好用 xff0c 建议收藏 无水印版 https pan baidu com s 1LSI46GBENd90Z06FnuaKmw lukb
  • SimpleBGC三轴云台用户手册

    SimpleBGC三轴云台用户手册 V1 00 硬件平台 xff1a STorM BGC V1 31 软件框架 xff1a SimpleBGC V1 00 本方案是采用俄版STorM BGC硬件平台 xff0c 软件采用SimpleBGC架
  • typedef和define有什么区别

    typedef和define都是替一个对象取一个别名 xff0c 以此增强程序的可读性 xff0c 区别如下 xff1a xff08 1 xff09 原理不同 define是C语言中定义的语法 xff0c 是预处理指令 xff0c 在预处理
  • 接口返回报错 resource notfound,plrase check path

    1 报错原因 post请求的content type application x www form urlencoded 但是请求体中设置的是json数据 34 date 34 34 2022 01 01 34 34 inclTransfe
  • Java中枚举的线程安全性及序列化问题

    一 枚举是如何保证线程安全的 要想看源码 xff0c 首先得有一个类吧 xff0c 那么枚举类型到底是什么类呢 xff1f 是enum吗 xff1f 答案很明显不是 xff0c enum就和class一样 xff0c 只是一个关键字 xff
  • Vscode配置Git

    vscode安装git 首先我们要确保我们下载了vscode和git xff0c 接下来就是给vscode配置git的步骤 xff1a 配置git环境变量 xff08 path值为git安装位置的cmd文件夹 xff09 xff0c 如图
  • SLAM-6视觉里程计里面特征点计算的缺点所做的改进

    缺点的改进方法 xff1a 由于之前的视觉里程计要计算关键点和描述子 xff0c 花费大量的时间 xff0c 有两种办法可以避免 1 只计算关键点 xff0c 通过光流法追踪关键点的运动 xff0c 可以得到同一个关键点在不同时刻图片的位置
  • SLAM8-后端的其他方法,BA与图优化,Pose Graph优化的理论与公式详解、因子图优化

    1 BA方法 Bundle Adjustment翻译过来是 光束调整 xff0c 意思是每个特征反射的光束 xff0c 通过调整它们的空间位置和相机姿态 xff0c 使它们都汇聚到相机光心 xff0c 这个过程叫BA 假定世界坐标系下的点p