【视觉SLAM入门】5.2. 2D-3D PNP 3D-3D ICP BA非线性优化方法 数学方法SVD DLT

"养气之学,戒之躁急"

  • 1. 3D-2D PNP
    • 1.1 代数法
      • 1.1.1 DLT(直接线性变换法)
      • 1.1.2. P3P
    • 1.2 优化法
      • BA (Bundle Adjustment)法
  • 2. 3D-3D ICP
    • 2.1 代数法
      • 2.1.1 SVD方法
    • 2.2 优化(BA)法
      • 2.2.2 非线性优化方法

前置事项:

1. 3D-2D PNP

该问题描述为:当我们知道n 个 3D 空间点以及它们的投影位置时,如何估计相机所在的位姿

1.1 代数法

1.1.1 DLT(直接线性变换法)

解决的问题:已知空间点 P = ( X , Y , Z , 1 ) T P = (X, Y, Z, 1)^T P=(X,Y,Z,1)T 和它投影点 x 1 = ( u 1 , v 1 , 1 ) T x_1 = (u_1, v_1, 1)^T x1=(u1,v1,1)T。求解相机位姿 R , t \boldsymbol {R, t} R,t
为求解,定义增广矩阵
[ R ∣ t ] = ( t 1 t 2 t 3 t 4 t 5 t 6 t 7 t 8 t 9 t 10 t 11 t 12 ) \boldsymbol {[R| t]} = \begin{pmatrix} t_1&t_2&t_3&t_4 \\\;\\ t_5&t_6&t_7&t_8 \\\;\\ t_9&t_{10}&t_{11}&t_{12} \end{pmatrix} [Rt]= t1t5t9t2t6t10t3t7t11t4t8t12
我们的目的就是求解这个增广矩阵,利用坐标关系得到:
s ( u 1 v 1 1 ) = ( t 1 t 2 t 3 t 4 t 5 t 6 t 7 t 8 t 9 t 10 t 11 t 12 ) ( X Y Z 1 ) s\begin{pmatrix} u_1&v_1&1 \end{pmatrix} = \begin{pmatrix} t_1&t_2&t_3&t_4 \\\;\\ t_5&t_6&t_7&t_8 \\\;\\ t_9&t_{10}&t_{11}&t_{12} \end{pmatrix}\begin{pmatrix} X&Y&Z&1 \end{pmatrix} s(u1v11)= t1t5t9t2t6t10t3t7t11t4t8t12 (XYZ1)

  • 最后一行可以求出 s \boldsymbol s s , 则方程中有12个未知数,需要至少六对点, 可以线性变换 ;
  • 匹配点大于6对时,可以用SVD等方法对超定方程做最小二乘;
  • 缺点:忽略了旋转矩阵自身约束 ----> 找一个旋转矩阵近似(QR分解),把结果重新投影到 S E ( 3 ) SE(3) SE(3) 流形。

1.1.2. P3P

三对(世界坐标系下)3D-2D(成像平面)匹配点 + 一对验证点。原理图如下:
图源SLAM14讲

根据相似三角形的相似关系
Δ O a b − Δ O A B , Δ O b c − Δ O B C , Δ O a c − Δ O A C ⇓ 有如下关系 O A 2 + O B 2 − 2 O A ⋅ O B ⋅ c o s < a , b > = A B 2 O B 2 + O C 2 − 2 O B ⋅ O C ⋅ c o s < b , c > = B C 2 O A 2 + O C 2 − 2 O A ⋅ O C ⋅ c o s < a , c > = A C 2 \Delta Oab - \Delta OAB, \quad \Delta Obc - \Delta OBC, \quad \Delta Oac - \Delta OAC \\\;\\\Downarrow 有如下关系 \\\;\\OA^2 + OB^2 -2OA\cdot OB \cdot cos<a,b> = AB^2\\ OB^2 + OC^2 -2OB\cdot OC \cdot cos<b,c> = BC^2 \\ OA^2 + OC^2 -2OA\cdot OC \cdot cos<a,c> = AC^2 ΔOabΔOAB,ΔObcΔOBC,ΔOacΔOAC有如下关系OA2+OB22OAOBcos<a,b>=AB2OB2+OC22OBOCcos<b,c>=BC2OA2+OC22OAOCcos<a,c>=AC2
x = O A / O C , y = O B / O C , v = A B 2 / O C 2 , u v = B C 2 / O C 2 , w v = A C 2 / O C 2 x=OA/OC\quad, y = OB/OC,\quad v=AB^2/OC^2,\quad uv=BC^2/OC^2,\quad wv=AC^2/OC^2 x=OA/OC,y=OB/OC,v=AB2/OC2,uv=BC2/OC2,wv=AC2/OC2

  • 推理可得:
    ( 1 − u ) y 2 − u x 2 − c o s < b , c > y + 2 u x y ⋅ c o s < a , b > + 1 = 0 ( 1 − w ) x 2 − w y 2 − c o s < a , c > x + 2 w x y ⋅ c o s < a , b > + 1 = 0 (1-u)y^2-ux^2-cos<b,c>y+2uxy\cdot cos<a,b>+1=0 \\(1-w)x^2-wy^2-cos<a,c>x+2wxy\cdot cos<a,b>+1=0 (1u)y2ux2cos<b,c>y+2uxycos<a,b>+1=0(1w)x2wy2cos<a,c>x+2wxycos<a,b>+1=0

  • 求解完成,其中只有 x , y x,y x,y未知,二元二次方程组,可以用吴氏消化法求解。最终最多得到4个解,用验证点对进行验证,得到正确的点即可。


  • 只利用3对点的信息,无法利用更多
  • 如果点收到噪声影响,算法失效
  • 改进的有 E P n P , U P n P EPnP, UPnP EPnP,UPnP

1.2 优化法

BA (Bundle Adjustment)法

  • 利用最小化重投影误差来做,简单来说就是已经有相机位姿,然后用该位姿预测得到预测值,再用 预测减观测(投影) 为误差构建最小二乘问题,重新优化相机位姿和空间点位置。重投影示意图如下:
    在这里插入图片描述

一种通用做法:用来对PnP或ICP的结果进行优化。

  • 假设通过PnP已经获得相机的位姿(不精确的) R , t \boldsymbol {R, t} R,t ,它的李代数为 ξ \boldsymbol \xi ξ
  • n个三维空间点 P i = [ X i , Y i , Z i ] T \boldsymbol P_i = [X_i, Y_i, Z_i]^T Pi=[Xi,Yi,Zi]T ,它的投影坐标为 u i = [ u i , v i ] T \boldsymbol u_i = [u_i, v_i]^T ui=[ui,vi]T ;

用矩阵形式写出像素位置与空间点公式(理论上成立的等式(没有误差时)):
s i [ u i v i 1 ] = K e x p ( ξ ˆ ) [ X i Y i Z i 1 ] ( 1 ) ⇓ 即 s i u i = K ⋅ e x p ( ξ ˆ ) ⋅ P i ( 2 ) ⇓ 构建最小二乘问题 ξ ∗ = a r g min ⁡ ξ 1 2 ∑ i = 1 n ∥ u i − 1 s i K exp ⁡ ( ξ ˆ ) P i ∥ 2 2 ( 3 ) s_i\begin{bmatrix}u_i\\v_i\\1\end{bmatrix} = Kexp(\xi\^{})\begin{bmatrix}X_i\\Y_i\\Z_i\\1\end{bmatrix} \qquad\qquad\qquad\qquad (1)\\\; \Downarrow即\qquad \qquad\qquad\qquad\qquad\\\; \\s_i\boldsymbol u_i = K\cdot exp(\xi\^{})\cdot P_i \qquad \qquad\qquad\qquad\qquad(2)\\\; \\\Downarrow 构建最小二乘问题\qquad \qquad\\\; \\\xi^* = arg\min\limits_\xi \frac{1}{2}\sum\limits_{i=1}^n\begin{Vmatrix}u_i- \frac{1}{s_i} K\exp(\xi\^{})P_i\end{Vmatrix}^2_2\qquad(3) si uivi1 =Kexp(ξˆ) XiYiZi1 (1)siui=Kexp(ξˆ)Pi(2)构建最小二乘问题ξ=argξmin21i=1n uisi1Kexp(ξˆ)Pi 22(3)
在上式中:

  • (3)中的 u i \boldsymbol u_i ui :投影位置(观测值---------------------------已知) (2D)
  • (2)和(1)中的 u i \boldsymbol u_i ui:重投影位置(预测值-根据(1)式计算得到) (2D)
  • P i \boldsymbol {P_i} Pi : 空间点位置(已知) (3D)

重投影误差:用3D和估计位姿投影得到的位置和观测得到的位置作差得到的。实际中利用很多点调整相机位姿使得这个值变小,但不会精确为0.

  • 求解这个最小二乘问题,由之前的李代数左乘模型,非线性优化的知识(推理过程略,详见视觉SLAM14讲7.7.3),记变换到相机坐标系下的空间点坐标 P ′ \boldsymbol {P'} P 这里直接给结果:
    在这里插入图片描述
    这个雅克比矩阵描述了重投影误差关于相机位姿李代数的一阶变化关系 ( s e ( 3 ) 这里是平移在前,旋转在后,则如上市,否则前后三列互换 se(3)这里是平移在前,旋转在后,则如上市,否则前后三列互换 se(3)这里是平移在前,旋转在后,则如上市,否则前后三列互换)。

此外,还有 e e e 关于空间点 P P P 的导数:

在这里插入图片描述


以上两个导数矩阵分别是观测相机方程关于相机位姿和特征点的导数矩阵。在优化中能提供迭代方向。

2. 3D-3D ICP

问题:有一组匹配好的3D点:
P = { p 1 , . . . , p n } , P ′ = { p 1 ′ , . . . , p n ′ } P=\left\{p_1, ..., p_n \right\}, \qquad P' = \left\{p'_1, ..., p'_n\right\} P={p1,...,pn},P={p1,...,pn}
欲求一个欧式变换 R , t R,t R,t,使:
∀ i , p i = R p i ′ + t {\forall i}, \qquad p_i = Rp'_i + t i,pi=Rpi+t

用ICP(Iterative Closest Point)求解,没有出现相机模型,和相机无关,故激光SLAM中也有ICP。

2.1 代数法

2.1.1 SVD方法

定义误差:
e i = p i − ( R p i ′ + t ) e_i = p_i - (Rp'_i + t) ei=pi(Rpi+t)
构建最小二乘问题:使得误差平方和最小
min ⁡ R , t J = 1 2 ∑ i = 1 n ∣ ∣ p i − ( R p i ′ + t ) ∣ ∣ 2 2 \min\limits_{R,t} J = \frac{1}{2}\sum\limits_{i=1}^n||p_i-(Rp'_i+t)||_2^2 R,tminJ=21i=1n∣∣pi(Rpi+t)22
求解问题:

  1. 定义两组点质心
    p = 1 n ∑ i = 1 n ( p i ) , p ′ = 1 n ∑ i = 1 n ( p i ′ ) p=\frac{1}{n}\sum\limits_{i=1}^n(p_i),\qquad p'=\frac{1}{n}\sum\limits_{i=1}^n(p'_i) p=n1i=1n(pi),p=n1i=1n(pi)
  2. 带入上边误差最小二乘函数整理,优化后结果:
    min ⁡ R , t J = 1 2 ∑ i = 1 n ∣ ∣ p i − p − R ( p i ′ − p ′ ) ∣ ∣ 2 + ∣ ∣ p − R p ′ − t ∣ ∣ 2 \min\limits_{R,t}J = \frac{1}{2}\sum\limits_{i=1}^n||p_i-p-R(p'_i-p')||^2+||p-Rp'-t||^2 R,tminJ=21i=1n∣∣pipR(pip)2+∣∣pRpt2
    观察,左边只和R有关,右边只和质心有关,有R时,令右边等于0,t可得。接下来着重求R
  3. 展开上式中关于 R R R 平方项,定义一个 W W W,最终用SVD分解可得R,得到后求解t即可。
    R = U V T R=UV^T R=UVT

2.2 优化(BA)法

2.2.2 非线性优化方法

和前边介绍的一样,构建G2O,然后导数用李代数扰动模型即可。
min ⁡ ξ = 1 2 ∑ i = 1 n ∣ ∣ ( p i − e x p ( ξ \qquad\qquad\qquad\qquad\qquad\qquad\min\limits_\xi = \frac{1}{2}\sum\limits_{i=1}^n||(p_i-exp(\xi ξmin=21i=1n∣∣(piexp(ξ^ ) p i ′ ) ∣ ∣ 2 2 )\;p'_i)||^2_2 )pi)22

注意:在唯一解的情况下,只要我们能找到极小值解,那么该值就是全局最优解。意味着可以任意选取初始值

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/103911.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开悟Optimization guide for intermediate tracks

目录 认识模型 参考方案&#xff08;按模块拆解&#xff09; 认识模型 模型控制1名英雄进行镜像1 v 1对战 Actor集群资源为64核CPU 问题特点&#xff1a;单一公平对抗场景&#xff08;同英雄镜像对赛&#xff09;&#xff0c;单位时间样本产能低&#xff0c;累计训练资源相…

libevent源码学习3---事件event

libevent源码学习3—事件event libevent 的基本操作单元是事件。每个事件代表一组条件的集合, 这些条件包括: 文件描述符已经就绪, 可以读取或者写入文件描述符变为就绪状态,可以读取或者写入(仅对于边沿触发 IO)超时事件发生某信号用户触发事件 所有事件具有相似的生命周期。…

CentOS ens160 显示disconnected

使用nmcli device查看网卡状态&#xff0c;显示如图&#xff1a; 检查宿主机系统VMware DHCP Sevice和VMware NAT Sevice服务是否正常运行。 右键点击我的电脑管理按钮&#xff0c;打开计算机管理点击服务

elementui的el-tabs标签页样式修改

一、官网样式&#xff1a; 二、修改样式 1.去掉下划线 效果&#xff1a; 代码: /* 去掉tabs标签栏下的下划线 */ ::v-deep .el-tabs__nav-wrap::after {position: static !important;/* background-color: #fff; */ } 2.改变下划线颜色 效果&#xff1a; 代码&#xff1a;…

JVM——垃圾回收(垃圾回收算法+分代垃圾回收+垃圾回收器)

1.如何判断对象可以回收 1.1引用计数法 只要一个对象被其他对象所引用&#xff0c;就要让该对象的技术加1&#xff0c;某个对象不再引用其&#xff0c;则让它计数减1。当计数变为0时就可以作为垃圾被回收。 有一个弊端叫做循环引用&#xff0c;两个的引用计数都是1&#xff…

STM32 printf函数

printf函数输出流程 用户调用printf()函数到C标准库调用printf函数相关部分&#xff0c;printf函数由编译器提供的stdio.h解析。包含在usart.h文件中。fputc()最终实现输出。用户需要根据最终输出的硬件重新定义该函数&#xff0c;此过程为&#xff1a;printf重定向。 printf的…

测试框架pytest教程(8)失败重试-pytest-rerunfailures

pytest-rerunfailures是一个pytest插件&#xff0c;用于重新运行失败的测试用例。当测试用例在第一次运行时失败&#xff0c;该插件会自动重新运行指定次数的失败用例&#xff0c;以提高稳定性和减少偶发性错误的影响。 要使用pytest-rerunfailures插件&#xff0c;需要按照以…

MySQL双主架构、主从架构

为什么要对数据库做优化&#xff1f; MySQL官方说法&#xff1a; 单表2000万数据就达到瓶颈了。所以为了保证查询效率&#xff0c;要让每张表的大小得到控制。 MySQL主主架构 主数据库都负责增删改查。 比如有1000W的数据&#xff0c;有两个主数据库&#xff0c;就将数据分流给…

学习网络编程No.4【socket编程实战】

引言 北京时间&#xff1a;2023/8/19/23:01&#xff0c;耍了好几天&#xff0c;主要归咎于《我欲封天》这本小说&#xff0c;听了几个晚上之后逐渐入门&#xff0c;在闲暇时间又看了一下&#xff0c;小高潮直接来临&#xff0c;最终在三个昼夜下追完了&#xff0c;哈哈哈&…

在 Pytorch 中使用 TensorBoard

机器学习的训练过程中会产生各类数据&#xff0c;包括 “标量scalar”、“图像image”、“统计图diagram”、“视频video”、“音频audio”、“文本text”、“嵌入Embedding” 等等。为了更好地追踪和分析这些数据&#xff0c;许多可视化工具应运而生&#xff0c;比如之前介绍的…

使用 ChatGPT 创建 PowerPoint 演示文稿

让 ChatGPT 成为您的助手来帮助您编写电子邮件很简单,因为众所周知,它非常能够生成文本。很明显,ChatGPT 无法帮助您做饭。但您可能想知道它是否可以生成文本以外的其他内容。在上一篇文章中,您了解到 ChatGPT 只能通过中间语言为您生成图形。在这篇文章中,您将了解使用中…

Ubuntu 配置国内源

配置国内源 因为众所周知的原因&#xff0c;国外的很多网站在国内是访问不了或者访问极慢的&#xff0c;这其中就包括了Ubuntu的官方源。 所以&#xff0c;想要流畅的使用apt安装应用&#xff0c;就需要配置国内源的镜像。 市面上Ubuntu的国内镜像源非常多&#xff0c;比较有…

PyTorch训练简单的生成对抗网络GAN

文章目录 原理代码结果参考 原理 同时训练两个网络&#xff1a;辨别器Discriminator 和 生成器Generator Generator是 造假者&#xff0c;用来生成假数据。 Discriminator 是警察&#xff0c;尽可能的分辨出来哪些是造假的&#xff0c;哪些是真实的数据。 目的&#xff1a;使…

小区新冠疫情管理系统的设计与实现/基于springboot的小区疫情管理系统

摘要 采用更加便于维护和使用的Java语言&#xff0c;其可拓展性高且更富于表现力&#xff0c;基于mysql数据库、Springboot框架开发的小区新冠疫情管理系统&#xff0c;方便用户查看物资信息、疫苗信息。通过Eclipse来进行网页编程&#xff0c;其方便易用、移植适用性广、更加安…

日志搞不定?手把手教你如何使用Log4j2

系列文章目录 从零开始&#xff0c;手把手教你搭建Spring Boot后台工程并说明 Spring框架与SpringBoot的关联与区别 SpringBean生成流程详解 —— 由浅入深(附超精细流程图) Spring监听器用法与原理详解 Spring事务畅谈 —— 由浅入深彻底弄懂 Transactional注解 面试热点详解…

装备制造企业如何执行精益管理?

导 读 ( 文/ 2358 ) 精益管理是一种以提高效率、降低成本和优化流程为目标的管理方法。装备制造行业具备人工参与度高&#xff0c;产成品价值高&#xff0c;质量要求高的特点。 在装备制造企业中实施精益管理可以帮助企业提高竞争力、提升生产效率并提供高质量的产品。本文将…

边缘计算节点BEC典型实践:如何快速上手PC-Farm服务器?

百度智能云边缘计算节点BEC&#xff08;Baidu Edge Computing&#xff09;基于运营商边缘节点和网络构建&#xff0c;一站式提供靠近终端用户的弹性计算资源。边缘计算节点在海外覆盖五大洲&#xff0c;在国内覆盖全国七大区、三大运营商。BEC通过就近计算和处理&#xff0c;大…

【算法日志】贪心算法刷题:单调递增数列,贪心算法总结(day32)

代码随想录刷题60Day 目录 前言 单调递增数列 贪心算法总结 前言 今天是贪心算法刷题的最后一天&#xff0c;今天本来是打算刷两道题&#xff0c;其中的一道hard题做了好久都没有做出来(主要思路错了)。然后再总结一下。 单调递增数列 int monotoneIncreasingDigits(int n…

Wlan——STA上线流程与802.11MAC帧讲解以及报文转发路径

目录 802.11MAC帧基本概念 802.11帧结构 802.11MAC帧的分类 管理帧 控制帧 数据帧 STA接入无线网络流程 信号扫描—管理帧 链路认证—管理帧 用户关联—管理帧 用户上线 不同802.11帧的转发路径 802.11MAC帧基本概念 802.11协议在802家族中的角色位置 其中802.3标…

Linux内核学习(八)—— 内存管理(基于Linux 2.6内核)

目录 一、页&#xff08;page&#xff09; 二、区&#xff08;zone&#xff09; 三、页操作 四、kmalloc() 五、vmalloc() 六、slab 分配器 七、在栈上的静态分配 一、页&#xff08;page&#xff09; 内核把物理页作为内存管理的基本单位。尽管处理器的最小可寻 …