orbslam2图优化基础

2023-05-16

图优化

1.优化问题概述

本周的目标是orb-slam2中的PoseOptimization函数,这个函数算是orb-slam2中Traking进程频繁调用且是入门级的优化问题。看代码的时候多次看到g2o库,这个库是以图优化为核心的优化库。
图优化并不是和高斯牛顿法一样的优化迭代法,其核心是使用图的形式来描述优化问题。
优化问题在上周对高斯-牛顿公式推导时已经接触,由目标函数、优化变量和约束组成,而在slam中很少具有有约束的优化问题(还没接触到),比如机器人的运动是无约束的(想怎么旋转平移都可以。优化问题可以表示为函数形式:
m i n x F ( x ) min_xF(x) minxF(x)
x就是优化变量, F ( x ) F(x) F(x)是目标函数。优化问题可以理解为求出x的一个确切值使得 F ( x ) F(x) F(x)求得最小值。从导数的角度看,F对x求导为0时可能会出现最小值。但在前一周的学习中可以得到一个结论:x的精确值无法求得,只能进行迭代,逐步逼近,当差值在可接受的范围内的时候,课近似得到x的值。

2.图优化

图是由顶点(Vertex)和边(Edge)组成的结构,表示为:G={V,E}其中V为顶点集,E为边集。
怎样去理解一个图
在这里插入图片描述
我们将上图看成机器人移动的俯视图,它首先向右移动再向下运动。换句话讲:顶点通过边的变化变成了另一个顶点,变量通过函数方程获得了结果。

对于PoseOptimization函数来说,其传入的最主要的三个参数为:相机位姿状态、观察到的点的二维坐标、对应点的三维点坐标。其函数的目标是根据二维点和三位点的坐标来计算机器人运动的位姿,也就是对位姿状态进行优化,点坐标不进行优化。

我们用图来表示这个问题,由二维点、三维点和估计方程构成了前一次和后一次位姿中间的边,位姿在三者的作用下校正了自己的位姿状态。所以在图上看也就是一个闭环,边多少取决于匹配的点有多少。
在这里插入图片描述

其实图优化能更好的去理解我们要解决的问题,知道了顶点和边是什么,也就知道了要解决的问题是什么。

二维点的观测方程可以表示为:
z = C ( R x + t ) z = C ( R \mathbf{x} + t ) z=C(Rx+t)
C为相机内参,R,t为旋转和平移。
但是z不可能精确的等于后一项,于是存在误差项e
z = C ( R x + t ) + e z = C ( R \mathbf{x} + t )+e z=C(Rx+t)+e
于是乎误差函数 e e e就出现了,求x令其最小。
e k = z k − C ( R x k + t ) {e_k} = {z_k} - C\left( {R{x_k}+t} \right) ek=zkC(Rxk+t)

3.图优化具体实现

将目标函数改写成:
min ⁡ x ∑ k = 1 n e k ( x k , z k ) T Ω k e k ( x k , z k ) \min\limits_{x} \sum\limits_{k = 1}^n {{e_k}{{\left( {{x_k},{z_k}} \right)}^T}{\Omega _k}{e_k}\left( {{x_k},{z_k}} \right)} xmink=1nek(xk,zk)TΩkek(xk,zk)
e k {e_k} ek表示为由x和z构成的函数,Ω 是信息矩阵,个人理解为:在传入的信息中可能可靠性不同,比如图片边缘的点往往不可靠,或者是orb-slam2特征提取时判定的“远点”,其信息可靠度远比不上清晰的“近点”。

优化函数算是一个由矢量去求标量的过程,传入的坐标、位姿无一例外都是矩阵(矢量),而要求得的是要误差最小,最接近0。所以在表达式中出现平方项。

接下来的问题就很直接了,泰勒展开–求导–求出迭代公式:
F k ( x ~ k + Δ x ) = e k ( x ~ k + Δ x ) T Ω k e k ( x ~ k + Δ x ) ≈ ( e k + J k Δ x ) T Ω k ( e k + J Δ x ) = e k T Ω k e k + 2 e k T Ω k J k Δ x + Δ x T J k T Ω k J k Δ x = C k + 2 b k Δ x + Δ x T H k Δ x \begin{array}{lll}{F_k}\left( {{{\widetilde x}_k} + \Delta x} \right) &=& {e_k}{\left( {{{\widetilde x}_k} + \Delta x} \right)^T}{\Omega _k}{e_k}\left( {{{\widetilde x}_k} + \Delta x} \right)\\ & \approx & {\left( {{e_k} + {J_k}\Delta x} \right)^T}{\Omega _k}\left( {{e_k} + J\Delta x} \right)\\ &=& e_k^T{\Omega _k}{e_k} + 2e_k^T{\Omega _k}{J_k}\Delta x + \Delta {x^T}J_k^T{\Omega _k}{J_k}\Delta x\\ &=& {C_k} + 2{b_k}\Delta x + \Delta {x^T}{H_k}\Delta x \end{array} Fk(x k+Δx)===ek(x k+Δx)TΩkek(x k+Δx)(ek+JkΔx)TΩk(ek+JΔx)ekTΩkek+2ekTΩkJkΔx+ΔxTJkTΩkJkΔxCk+2bkΔx+ΔxTHkΔx
将公式进行整理,我们要求的是 Δ x \Delta x Δx,那就求出 Δ F k \Delta F_k ΔFk:
Δ F k = 2 b k Δ x + Δ x T H k Δ x . \Delta F_k = 2b_k \Delta x + \Delta x^T H_k \Delta x. ΔFk=2bkΔx+ΔxTHkΔx.
求导,令导数为0:
d F k d Δ x = 2 b + 2 H k Δ x = 0 ⇒ H k Δ x = − b k \frac{{d{F_k}}}{{d\Delta x}} = 2b + 2{H_k}\Delta x = 0 \Rightarrow {H_k}\Delta x = - b_k dΔxdFk=2b+2HkΔx=0HkΔx=bk
即: H k Δ x = − b k H_k \Delta x = -b_k HkΔx=bk
接下来的事就交由高斯牛顿或是LM非线性迭代法来求解问题了。

总结一下:
图优化最重要的是找边和顶点,找到了这些也就知道怎样去求解问题,求解的具体细节交给LM迭代完成。

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

orbslam2图优化基础 的相关文章

  • Metasploit Framework Handbook

    文章目录 前言MsFrameworkMetasploit诞生发展体系结构功能阶段工具管理基本命令情报搜集网络服务渗透测试 Refference 前言 众所周知Metasploit工具是一款强大的渗透测试利器 xff0c 在渗透测试中堪称一条
  • 简单无锁队列的实现和使用

    无锁队列越来越流行 xff0c 在特定的场合使用不同的无锁队列 xff0c 可以起到节省锁开销 xff0c 提高程序效率 Linux内核中有无锁队列的实现 xff0c 可谓简洁而不简单 核心判断部分利用了整数溢出机制 xff0c 这个有很多
  • 关于网狐棋牌6603源码的整理、编译和搭建

    最近换工作 xff0c 趁着有一段清闲时间 xff0c 整理了一下网狐棋牌的源码 xff0c 这份源码下载很久了 xff0c 一直呆在硬盘 这次正好好好看看 网狐的代码质量很高 xff0c 流露出来的代码也比较完整 xff0c 基本上都能编
  • Pycharm:注释、删除所有注释

    1 单行注释 2 39 39 39 多行注释 39 39 39 3 删除所有注释 CTRL 43 R进入替换模式 xff0c 勾选右上角正则表达式 xff0c 然后在搜索框输入 xff0c Replace All即可
  • Outlook 2016 pst/ost邮件数据文件迁移实现

    当使用outlook 2016新建Email账户的时候 xff0c 其数据文件 xff08 ost文件 xff09 总是被保存在C盘默认目录 C Users 用户名 AppData Local Microsoft Outlook 下 xff
  • 跟我一起学习VIM - vim插件合集

    前两天同事让我在小组内部分享一下VIM xff0c 于是我花了一点时间写了个简短的教程 虽然准备有限 xff0c 但分享过程中大家大多带着一种惊叹的表情 xff0c 原来编辑器可以这样强大 xff0c 这算是对我多年来使用VIM的最大鼓舞吧
  • linux最简单搭建邮件服务器

    一 概述 xff1a 在配置邮件服务器之前 xff0c 先解释几个概念 通常使用Email都很容易 xff0c 但是Internet的邮件系统是通过几个复杂的部分连接而成的 xff0c 对于最终用户而言 xff0c 我们熟悉的Outlook
  • ROS导航小车经验总结

    经验教训 QS1 rviz地图与gazebo不同步 详细描述 工作空间 xff1a 仿真项目 文件位置 course03 启动urdf gazebo launch union launch xff08 模型启动文件 和 gazebo环境 x
  • 使用libcurl发送post请求

    C语言代码如下 xff1a include lt stdio h gt include lt string h gt include lt curl curl h gt int main int argc char argv CURL cu
  • 访问带有用户名、密码的URL

    很简单 xff0c 举例如下 xff1a HttpURLConnection urlConnection 61 HttpURLConnection url span class hljs preprocessor openConnectio
  • ROS下驱动双雷达

    ROS下驱动SLAMETC的A2和A3雷达步骤如下 xff1a 1 连上激光雷达并进入至 dev文件夹中查看ttyUSB xff1f 的编号 2 使用sudo chmod 777 ttyUSB 来更改USB端口权限 3 调整A2和A3激光雷
  • Usart 串口发送数据包 两种方式(遍历结构体,指针数组)

    Usart 串口发送数据包 两种方式 xff08 结构体 xff0c 指针数组 xff09 1 结构体指针 1 1 结构体和联合体 叙述 xff1a 这种直观性比较 xff0c 利用联合体和结构体的形式组成数据包 xff0c 通过结构体指针
  • netfilter 讲解 ,讲的很好

    Netfilter为多种网络协议 xff08 IPv4 IPv6 ARP等 xff09 各提供了一套钩子函数 在IPv4中定义了5个钩子函数 xff0c 这些钩子函数在数据包流经协议栈的5个关键点被调用 这就像有5个钓鱼台 xff0c 在每
  • python字典添加元素和删除元素

    1 添加字典元素 方法一 xff1a 直接添加 xff0c 给定键值对 pycharm aa 61 39 人才 39 60 39 英语 39 39 english 39 39 adress 39 39 here 39 print aa 39
  • Verilog中奇偶校验位的计算方法

    偶校验 xff1a 数据和校验位中1的总数为偶数 xff0c 则认为数据无误 xff0c 否则标识数据有误 xff1b 奇校验 xff1a 数据和校验位中1的总数为奇数 xff0c 则认为数据无误 xff0c 否则标识数据有误 xff1b
  • Ubuntu下进行Socket编程

    龙云尧个人博客 xff0c 转载请注明出处 CSDN地址 xff1a http blog csdn net Michael753951 article details 72553287 个人blog地址 xff1a http yaoyl c
  • add_library,target_link_libraries,set_target_properties,target_link_libraries使用联系

    折腾了半下午 xff0c 终于知道这个货是怎么个关系了 在此写下记录 xff0c 希望遇到同样问题的同学 xff0c 不要再次浪费时间了 首先我是在Linux环境下 先列出我的CmakeLists txt 注意 xff0c 在CmakeLi
  • strpbrk

    头文件 xff1a include lt include h gt strpbrk 函数检索两个字符串中首个相同字符的位置 xff0c 其原型为 xff1a char strpbrk char s1 char s2 参数说明 s1 s2要检
  • Ubuntu中在命令行如何打开图形界面的文件夹、文件、网页等

    方法一 xff08 nautilus open terminal 打开文件夹 xff09 xff1a 安装nautilus open terminal span class token function sudo span span cla
  • 3.4迭代器介绍

    文章目录 使用迭代器迭代器运算符将迭代器从一个元素移动到另外一个元素迭代器类型begin和end运算符结合解引用和成员访问操作某些对vector对象的操作会使迭代器失效 迭代器运算迭代器的算术运算使用迭代器运算 我们已经知道可以使用下标运算

随机推荐

  • CAN报文格式简析

    Date xff1a 2022 5 11 Author xff1a MJQ Meta xff1a CAN CAN基础篇 CAN报文格式简析 1 Motornala和Intel格式 建议直接看图 xff0c 小白也能秒懂 xff01 注 xf
  • 【C++】头文件声明变量总结

    类外变量 span class token comment 1 直接声明定义 span span class token comment 如果被多个 cpp 包含 xff0c 则链接报错 multiple definition span s
  • C语言 如何用http post方式 上传json数据

    What C语言 如何用post方式 上传json数据 Piont C语言Socket实现HTTP协议 xff0c json格式数据组包 1 xff0c C语言Socket实现HTTP POST 43 json格式数据 按照HTTP协议发送
  • UDP组播调试(使用TCP&UDP调试工具)

    如何使用调试工具进行UDP组播调试 一 下载UDP amp TCP调试工具 二 双击打开调试工具并建立端口 2 1 创建组播客户端1 类型 xff1a UDP xff08 组播模式 xff09 xff1b 目标IP xff1a 225 0
  • python字典遍历的几种方法

    xff08 1 xff09 遍历key值 gt gt gt a 39 a 39 39 1 39 39 b 39 39 2 39 39 c 39 39 3 39 gt gt gt for key in a print key 43 39 39
  • 基于寄存器与基于固件库的stm32差异

    一 简介 STM32标准外设库之前的版本也称固件函数库或简称固件库 xff0c 是一个固件函数包 xff0c 它由程序 数据结构和宏组成 xff0c 包括了微控制器所有外设的性能特征 寄存器是中央处理器内的组成部分 寄存器是有限存贮容量的高
  • Ublox F9P通过NTRIP实现实时RTK定位

    现在开一个新坑 xff0c 后面慢慢填 2022 07 23更新 xff1a 测试视频 NTRIP ROS测试 一 前言 首先 xff0c 什么RTK呀 NTRIP呀 xff0c RTKLIB呀 xff0c 我都还是新手不是很懂 xff0c
  • 接口测试工具--Postman安装

    想用汉化版的Postman xff0c 需要有两样东西 xff1a 一是英文版安装包 xff1b 一是汉化包 xff1b 需注意的是中 英文版本号必须一致 xff0c 才可以 但是官网的汉化包 xff0c 现在还没更新到最新版本 xff0c
  • 05c语言——宏定义、带参宏、带参宏函数

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 文章目录 一 宏定义1 使用规则2 注意 二 带参宏1 定义2 注意 三 带参函数1 带参函数的宏与带参宏的区别2 带参宏函数和普通函数区
  • Makefile 和 CMake 入门

    Makefile Reference Makefile 20分钟入门 xff0c 简简单单 xff0c 展示如何使用Makefile管理和编译C 43 43 代码 简介 Makefile 是一个用于构建 xff08 Build xff09
  • cmake使用独立工具链交叉编译可在android中运行的so包

    cmake使用独立工具链交叉编译可在android中运行的so包 在在命令行下用CMake交叉编译可在android中运行的so包一文中说了一下使用NDK自带的工具链来编译so包 xff0c 当时讲到还有另一种方法来编译so包 xff0c
  • RTK原理

    一 实时载波相位差分 我们知道 xff0c 在利用GPS进行定位时 xff0c 会受到各种各样因素的影响 xff0c 为了消除这些误差源 xff0c 必须使用两台以上的GPS接收机同步工作 GPS静态测量的方法是各个接收机独立观测 xff0
  • keil C51脚本编译

    rem 使用bat编译C51项目 64 echo off amp setlocal enabledelayedexpansion set BIN PATH 61 C Keil v5 C51 set path 61 BIN PATH BIN
  • ESP01s连接Arduino uno发送AT指令返回ERROR

    使用ArduinoIDE连接串口之后出现如下情况 xff1a Esp串口返回ERROR 直接放解决方法 xff1a 将串口监视器右下角 换行符 更改为 NL和CR 再次发送AT指令 xff0c 返回OK 解决原理 xff1a Arduino
  • 如何解决python socket server重启后端口被占用的问题

    本文介绍下 xff0c 在solaris 系统下 xff0c python socket server重启后 xff0c 提示端口被占用 xff0c telnet端口失败 这里给出一个解决方法 xff0c 有需要的朋友参考下 在solari
  • 零基础python字符串处理学习心得

    python 类的定义及使用 xff1a 1 数据如下 xff1a stu1 txt 孙同学 2020 5 21 20 39 男 39 77 56 77 76 92 58 91 84 69 91 stu2 txt 赵同学 2020 11 3
  • PaddlePaddle图像分类神经网络构建正则化笔记

    本文主要根据第二次作业进行分析 作业要求 xff1a 补全网络代码 xff0c 并运行手写数字识别项目 以出现最后的图片和预测结果为准 首先导入必要的包 numpy gt python第三方库 xff0c 用于进行科学计算 PIL gt P
  • 使用GitHub.io仓库实现个人网站建站

    使用GitHub io仓库实现个人网站建站 文章目录 使用GitHub io仓库实现个人网站建站 前言一 注册GitHub二 建立储存库1 新建库2 输入名称3 上传文件4 进行测试5 想进入非index网页 总结 前言 总体流程为注册 建
  • 老旧电脑救星,Windows 8.1 原始系统安装

    老旧电脑win8 1系统安装 先上电脑配置开始安装WIN8 1下载镜像制作U盘启动盘进入主板BIOS设置U盘为第一启动项进入安装环节 总结 先上电脑配置 前段时间从店里拉回来一个十年前的电脑 xff0c 装的win7系统 xff0c 从开机
  • orbslam2图优化基础

    图优化 1 优化问题概述 本周的目标是orb slam2中的PoseOptimization函数 xff0c 这个函数算是orb slam2中Traking进程频繁调用且是入门级的优化问题 看代码的时候多次看到g2o库 xff0c 这个库是