【学习SLAM】Bundle Adjustment 光束法平差详解

2023-10-27

首先引述来自维基百科的定义:假设我们有一个3D空间中的点,他被位于不同位置的多个摄像机看到,那么所谓的光束法平差(Bundle Adjustment),就是能够从这些多视角信息中提取出3D点的坐标以及各个摄像机的相对位置和光学信息的过程。
可能这么说有点不够具体,我们用比较通俗的数学公式来描述这个过程:
问题提出:假设我们有一个3D空间中的一个点 Xj,他可以被多个位于不同角度的摄像机看到,设第i个摄像机看到的第j个点坐标为xij,由3D点像二维相机平面转换的矩阵为Pi. 我们现在考虑这样的问题,给出一系列的的坐标xij,找到相机转换矩阵Pi使得PiXj=xij.

光束法:加入我们的图像含有噪声,那么PiXj=xij可能不能够准确的满足,所以我们采用极大似然估计(Maximum Likelihood )的办法,假设测量噪声是高斯白噪声,我们希望估计投射矩阵P̂ i和对应的3D空间中的点X̂ j,这两个参量可以准确的满足P̂ iX̂ j=x̂ ij.这里的x̂ ij

是我们在图像中观测到的点。我们希望最小化所有的通过预测得到的3D空间中的点投影在在平面中的像点,与真实的平面中的像点之间的误差,也就是:

这里的cij代表指示参量,如果计算的像素在平面里面,cij=1 反之,cij=0。d(x,y)表示点x,y之间的几何距离。这种把所有的映射误差最小化的过程被称为光束法平差——就类似于调整位于相机中心和一系列的3D点之间的一串光束一样。

(这里我们要简单回顾下相机矩阵的概念,相机都要进行校正,其中以小孔模型为例,把以小孔中心为原点的三维坐标系中的点转化到同样以小孔中心为原点的二维平面的矩阵,我们称之为内部矩阵(intrinsic matrix),这个矩阵只与fx,fy,cx,cy
等相机的内部参数有关,把相机坐标系转换到世界坐标系的矩阵称之为外部矩阵,一般涉及相机的旋转和平移(rotation and translation matrix))。\color{red}{(注意我们一般在变量上加一个折号来表示观测量,如\hat{x},加波浪号表示预测量,如\tilde{x}),个人认为上面公式中出现的有关折号的参量表示应该改为波浪号}。
 

 

光束法平差模型:
在解析摄影测量中,将外方位元素(局外点)和模型点坐标(局内点)的计算放在一个整体内进行,此时称其为光束法。光束法平差是以共线方程式作为数学模型,像点的像平面坐标观测值是未知数的非线性函数,经过线性化后按照最小二乘法原理进行计算。该计算也是在提供一个近似解的基础上,逐次迭代来达到趋近于最佳值的。

  1. 共线方程式的表达:
    设S为摄影中心,在世界坐标系下的坐标为这里写图片描述;M为空间一点,在世界坐标系下的坐标为(X,Y,Z),m是M在影像上的构象,其像平面和像空间辅助坐标分别为(x,y,-f),这里写图片描述,此时可知S、m、M三点共线。可得
    这里写图片描述
    再根据像平面坐标和像空间辅助坐标的关系有
    这里写图片描述
    由上面两式可解得共线方程式为
    这里写图片描述
    其中x0、y0、f是影像内方位元素;表示像平面中心坐标和摄像机主距。

  2. 共线方程式的线性化:
    该方程式一次项展开式为
    这里写图片描述
    式中这里写图片描述为共线方程函数近似值,这里写图片描述为外方位元素改正数,这里写图片描述为待定点的坐标改正数。
    在保证共线条件下有:
    这里写图片描述
    此时,根据上面的共线方程式以及旋转矩阵可得到
    这里写图片描述

  3. 误差方程式的建立:
    据此可得到误差方程式为
    这里写图片描述
    其中有:
    这里写图片描述
    将误差方程式改写成矩阵形式可为
    这里写图片描述
    也可简写成:
    这里写图片描述
    在该式中有:
    这里写图片描述

  4. 法方程式的建立:
    根据平差原理可知其法方程式为
    这里写图片描述
    只需列出误差方程式,权赋1;
    对于控制点,列出误差方程式,还要列出虚拟误差方程式,权赋P。
    虚拟误差方程式为
    这里写图片描述
    列出各类点的误差方程式后,按照最小二乘法原理建立法方程式,即按这里写图片描述为最小建立的法方程式为
    这里写图片描述
    也可简写成:
    这里写图片描述
    在根据上式进行展开消元可得改化法方程式为:
    这里写图片描述
    或者
    这里写图片描述
    根据上面的公式可以求解出外方位元素的改正值;下面的公式可以求解出点的坐标改正值。

  5. 结果判定:
    将改正数和规定的限差相比较,若小于限差则迭代完成,否则用未知数的新值又作为近似值继续迭代,直至满足条件。
    由此可知,开始时提供的初始值越接近最佳值,解的收敛速度就愈快;所以通常的处理方法是先进行空间后方交会,求出像片的外方位元素,将其作为光束法平差时未知数的初始值。

 

按照测量平差理解,非线性方程,首先要线性化,即是全微分,然后才能进行误差传播。

按照计算机视觉,导数矩阵可以提供优化的方向,即是梯度方向,指导迭代,如机器学习的梯度下降法

SLAM 中2*6的雅克比见下图:

摄影测量中的误差方程矩阵如下:

注意这里的H等于   Z一拔,摄影测量是先平移后旋转,而计算机视觉是先旋转,后平移。

可以看出,两个矩阵几乎一样,不同有两处:1、角元素改正数的顺序不同 2、符号上的差异,见用圆圈圈起来的地方。

注:知道了导数矩阵,那么如何迭代获得最优值?

对于摄影测量,利用高斯牛顿,即是利用正规方程(就是法方程,笔者在Slam 与测量平差中介绍过)得到改正数,若改正数小于一个阈值,则退出,否则更新姿态元素进行下一次。

对于SLAM 则是,利用列-马(就是岭回归)或者梯度下降法。
 

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

【学习SLAM】Bundle Adjustment 光束法平差详解 的相关文章

  • 92-TCP三次握手及TCP四次挥手

    TCP三次握手及TCP四次挥手 1 tcp三次握手 1 tcp的特点 2 tcp三次握手发生在什么阶段 3 tcp协议报头 4 tcp三次握手的流程 2 tcp四次挥手 1 tcp四次挥手发生在什么阶段 2 tcp四次挥手的流程 3 能不能
  • 深入学习java源码之Integer.parseInt()与Integer.valueOf()

    深入学习java源码之Integer parseInt 与Integer valueOf 一般我们创建一个类的时候是通过new关键字 比如 Object obj new Object 但是对于 Integer 类 我们却可以这样 Integ
  • 基于Packet Tracer的校园网络设计与规划

    本文仅仅为本人课程要求而设计的方案 本文仅仅使用RIP动态路由协议 HSRP协议 浮动路由 静态路由 等价路由 DHCP地址分配 NAT技术 VLAN划分 如有问题请大佬们在本博客下留言 课程设计报告文件 资源链接 Packet Trace
  • CSRF简介

    一 CSRF是什么 CSRF Cross site request forgery 中文名称 跨站请求伪造 也被称为 one click attack session riding 缩写为 CSRF XSRF 二 CSRF可以做什么 你这可
  • 9. STM32——HC_SR04超声波测距

    STM32 HC SR04超声波测距 HC SR04 实物图 基本参数 工作原理 时序图 超声波测距步骤 1 使能GPIO时钟 定时器时钟 2 配置GPIO引脚 3 配置TIM定时器时钟 4 配置NVIC优先级 5 开启TIM4定时器 6
  • SQL数据库案例

    数据表 Navicat SQLite Data Transfer Source Server school Source Server Version 30808 Source Host 0 Target Server Type SQLit
  • 嵌入式单片机基础篇(二十七)之Stm32F103单片机给蓝牙模块发送AT指令程序

    Stm32F103单片机给蓝牙模块发送AT指令程序 include stm32f10x h include string h include stdio h unsigned char UARTbuff 32 unsigned char A
  • 基于CT117E的按键控制流水灯

    这是在流水灯的基础上加上关于按键的程序 使前两个按键一个可以控制流水灯的移动方向 一个可以控制流水灯的移动速度 1 先在流水灯的基础上添加关于按键的头文件 2 添加关于按键的宏定义 3 在在主函数中添加检测按键程序和按键处理程序 4 在初始
  • Android平台的兼容相关概念详细整理

    设置应用的支持版本 通过我们会在文件夹下 指定下面属性 来表示我们应用所支持的Android版本
  • Summary of OpenGL ES 3.0 Programming Guide

    零 OpenGLES简介 OpenGLES 是用于嵌入式系统的一个3D图形编程接口规范 支持IOS Android Linux Windows WebGL 一 渲染管线 1 VertexBufferArrayObject 2 VertexS
  • Python 高级变量类型,函数进阶 day05

    高级变量类型 目标 列表 元组 字典 字符串 公共方法 变量高级 知识点回顾 Python 中数据类型可以分为 数字型 和 非数字型 数字型 整型 int 浮点型 float 布尔型 bool 真 True 非 0 数 非零即真 假 Fal
  • 命名空间system中不存在data_我理解中的Unity DOTS

    我是第一次接触到 ECS 并不是使用老手 以下仅仅是我通过浏览相关文章和实现相关 Demo 而写出的一篇分享初见文 如有错误 请您指出 谢谢 因为本身就是忠实的 Overwatch 玩家 所以天然的对其应用的 ECS 架构有所兴趣 再加上最
  • 流文件保存到本地的两种方法

    1 FileStream fs new FileStream path FileMode Create fs Write ImageBuff 0 ImageBuff Length fs Close 注释 ImageBuff 图片流 byte
  • HEX(Xilinx MCS)文件格式详解

    文章目录 自己定义个文件格式 HEX文件格式详解 HEX 文件是指以hex为后缀 采用Intel HEX编码规则的文件 可以直接使用文本编辑工具打开 通常用来对微控制器或ROM进行编程 本质上都是对存储器编程 其中包含了每个地址对应的数据
  • QT connect()连接函数的一点说明

    QObject connect中的signal和slot函数一定要有参数类型 但是 不可以有参数名 指定信号和方法时 必须使用SIGNAL 和SLOT 宏 例如 关联信号和槽函数 connect configureWindow SIGNAL
  • MySQL索引失效场景实例演示

    文章目录 一 环境信息 二 表 数据准备 三 复合索引的失效情况 最左前缀法则 or查询 四 单列索引的失效情况 like模糊查询使用前通配符 索引列上使用函数 字符串索引没加引号 使用 lt gt gt lt is null 或 is n

随机推荐

  • Jenkins安装与配置

    什么是CICD CI CD 是一种通过在应用开发阶段引入自动化来频繁向客户交付应用的方法 CI CD 的核心概念是持续集成 持续交付和持续部署 作为一个面向开发和运营团队的解决方案 CI CD 主要针对在集成新代码时所引发的问题 亦称 集成
  • Ubuntu16.04下基于Docker的Caffe-GPU版本环境搭建总结

    Caffe的GPU环境搭建在docker支持下并不困难 但是过程比较杂 所需依赖如下 本文会说明安装方法 帮助大家少走弯路 GNU Linux x86 64 with kernel version gt 3 10 Docker gt 1 9
  • 这是一个更新版本服务代码python

    import win32serviceutil import win32service import win32event import os import logging import inspect import time from u
  • 【计算机网络】实验报告三:Cisco Packet Tracer 实验

    Cisco Packet Tracer 实验 1 直接连接两台 PC 构建 LAN 2 用交换机构建 LAN 3 交换机接口地址列表 4 生成树协议 Spanning Tree Protocol 5 路由器配置初步 6 静态路由 7 动态路
  • 1045 快速排序

    著名的快速排序算法里有一个经典的划分过程 我们通常采用某种方法取一个元素作为主元 通过交换 把比主元小的元素放到它的左边 比主元大的元素放到它的右边 给定划分后的 N 个互不相同的正整数的排列 请问有多少个元素可能是划分前选取的主元 例如给
  • typora高亮_用Typora实现写作排版一体化

    用Typora实现写作排版一体化 一般的推文制作过程 大概都是在本地word写好文案以后 再导入到第三方的推文编辑器中进行排版 最后再黏贴到微信的图文素材编辑器里生成图文发布 经常看到许多公众号文章充满花里胡哨的元素 大概都是因为使用了推文
  • SpringBoot整合Elasticsearch(最新最全,高效安装到使用)

    文章目录 一 安装Elasticsearch相关插件 1 选择版本 2 安装Elasticsearch 3 安装node 4 安装grunt 5 安装es head插件 6 安装kibana 7 安装ik分词器 二 整合SpringBoot
  • 从零开始学编程——DOS命令

    一 DOS操作系统 DOS 英文 Disk Operating System 是一款由微软早期推出的磁盘操作系统 可以通过一系列dos命令直接对硬盘文件进行增删改查 DOS和windiws的最大不同之处在于它是一个字符式操作系统 所有的操作
  • Oracle 表空间查询与操作方法

    一 查询篇 1 查询oracle表空间的使用情况 select b file id 文件ID b tablespace name 表空间 b file name 物理文件名 b bytes 总字节数 b bytes sum nvl a by
  • 自动化办公更简单了:新版python-office,有哪些更新?

    职场经验谈 大家好 这里是程序员晚枫 小破站 小红薯都叫这个名 去年4月开源了一个Python自动化办公项目 python office GitHub和Gitee都能看到 1行代码实现复杂的自动化办公任务 帮助不懂代码的小白 快速使用Pyt
  • Unity鼠标控制物体的旋转、移动、缩放等

    这个是控制相机 44条消息 unity 相机 旋转缩放查看 物体或地图 unity旋转查看物体 野区捕龙为宠的博客 CSDN博客 下面的是控制物体本身 知识点 Input GetMouseButton 0 获取鼠标输入 参数为一个int值
  • QT moveToThread解析

    目录 简介 源码分析 判断是否可以执行移动动作 执行移动动作 调用moveToThread helper 调用setThreadData helper 简介 每一个QObject子类都会关联到一个具体QThread线程上 QObject有一
  • 同一块磁盘下,非lvm的扩容

    1 想要给跟分区扩容 2 先安装growpart yum install cloud utils growpart 3 growpart dev sda 2 发现lsblk看到扩容了 但是实际df还是没扩容 4 需要执行xfs growfs
  • 数据库系统之NoSQL数据库系统

    NoSQL Database Systems 什么是NoSQL数据库系统 为什么使用NoSQL NoSQL数据库系统的属性 半结构化的 无模式的数据模型 专业分布模型 弱一致性 Relaxing durability Versioning
  • 操作系统_03_内存管理(个人总结)

    声明 1 本文为我的个人复习总结 并非那种从零基础开始普及知识 内容详细全面 言辞官方的文章 2 由于是个人总结 所以用最精简的话语来写文章 3 若有错误不当之处 请指出 为什么要有虚拟地址 使各个进程使用的内存 相互独立 单片机没有操作系
  • 论文笔记之DPG

    原论文地址 阅读DPG的必要性 A2C的难收敛使得policy based向着DDPG发展 而DDPG Deep DPG 因此想要理解DDPG算法 就必须先理解DPG Deterministic Policy Gradient Algori
  • 【QT5 带参connect语法记录】

    QT5 带参connect语法记录 slot版 lamda版 Qt4版 未测试 更多细节参考 slot版 void QListWidget itemClicked2 QListWidgetItem QListWidget itemClick
  • 第三章作业

    例3 1 在一个班级中随机抽取9名学生 得到每名学生的英语考试分数如下 91 69 75 78 81 96 92 88 86 计算9名学生的平均考试分数 解 根据式3 1有 x 91 69 75 78 81 96 92 88 86 9 84
  • 动态生成多个 React createRef

    有这么个需求 从接口获取数据 数据格式为 dataList 接口获取的数据 tableData 表格数据 const dataList tableData1 tableData2 tableData3 需要实现的效果大概长这样 dataLi
  • 【学习SLAM】Bundle Adjustment 光束法平差详解

    首先引述来自维基百科的定义 假设我们有一个3D空间中的点 他被位于不同位置的多个摄像机看到 那么所谓的光束法平差 Bundle Adjustment 就是能够从这些多视角信息中提取出3D点的坐标以及各个摄像机的相对位置和光学信息的过程 可能