【视觉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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

线性代数的学习和整理7:各种特殊矩阵(草稿-----未完成)

目录 1 单位矩阵 为什么单位矩阵I是 [1,0;0,1]T 而不是[1,1;1,1]T 2 旋转矩阵 3 伸缩矩阵 放大缩小倍数矩阵 4 镜像矩阵 5 剪切矩阵 矩阵 行向量 列向量 方阵 1 单位矩阵 [ 1 0 0 1] 为什么单位矩阵I是 [1,0;0,1]T 而不是[1,1;1,1]T 因为 矩阵 [1,0;0,1] 代表…

websocket + stomp + sockjs学习

文章目录 学习链接后台代码引入依赖application.ymlWebSocketConfigPrivateControllerWebSocketService WebSocketEventListenerCorsFilter 前端代码Room.vue 学习链接 WebSocket入门教程示例代码&#xff0c;代码地址已fork至本地gitee&#xff0c;原github代码地址&#xff…

马哈鱼数据血缘工具背后的项目: gsp_demo_java 项目简单介绍与使用

0.背景 马哈鱼数据血缘工具(https://www.sqlflow.cn/)是SQLflow工具的中文译名,实际就是sqlflow. 对于SQL flow来说,底层调用的是General SQL Parser(GSP https://sqlparser.com) 的库. 这个gsp有开源的java demo项目:https://github.com/sqlparser/gsp_demo_java 1.快速使用…

【C# 基础精讲】LINQ 基础

LINQ&#xff08;Language Integrated Query&#xff09;是一项强大的C#语言特性&#xff0c;它使数据查询和操作变得更加简洁、灵活和可读性强。通过使用LINQ&#xff0c;您可以使用类似SQL的语法来查询各种数据源&#xff0c;如集合、数组、数据库等。本文将介绍LINQ的基础概…

(排序) 剑指 Offer 45. 把数组排成最小的数 ——【Leetcode每日一题】

❓ 剑指 Offer 45. 把数组排成最小的数 难度&#xff1a;中等 输入一个非负整数数组&#xff0c;把数组里所有数字拼接起来排成一个数&#xff0c;打印能拼接出的所有数字中最小的一个。 示例 1: 输入: [10,2] 输出: “102” 示例 2: 输入: [3,30,34,5,9] 输出: “3033459”…

PV3D: A 3D GENERATIVE MODEL FOR PORTRAITVIDEO GENERATION 【2023 ICLR】

ICLR&#xff1a;International Conference on Learning Representations CCF-A 国际表征学习大会&#xff1a;深度学习的顶级会议 生成对抗网络(GANs)的最新进展已经证明了生成令人惊叹的逼真肖像图像的能力。虽然之前的一些工作已经将这种图像gan应用于无条件的2D人像视频生…

[K8s]问题描述:k8s拉起来的容器少了cuda的so文件

问题解决&#xff1a;需要设置Runtimes&#xff1a;nvidia的同时设置Default Runtimenvidia

Java请求Http接口-OkHttp(超详细-附带工具类)

简介&#xff1a;OkHttp是一个默认有效的HTTP客户端&#xff0c;有效地执行HTTP可以加快您的负载并节省带宽&#xff0c;如果您的服务有多个IP地址&#xff0c;如果第一次连接失败&#xff0c;OkHttp将尝试备用地址。这对于IPv4 IPv6和冗余数据中心中托管的服务是必需的。OkHt…

Win11游戏高性能模式怎么开

1、点击桌面任务栏上的“开始”图标&#xff0c;在打开的应用中&#xff0c;点击“设置”&#xff1b; 2、“设置”窗口&#xff0c;左侧找到“游戏”选项&#xff0c;在右侧的选项中&#xff0c;找到并点击打开“游戏模式”&#xff1b; 3、打开的“游戏模式”中&#xff0c;找…

搭载KaihongOS的工业平板、机器人、无人机等产品通过3.2版本兼容性测评,持续繁荣OpenHarmony生态

近日&#xff0c;搭载深圳开鸿数字产业发展有限公司&#xff08;简称“深开鸿”&#xff09;KaihongOS软件发行版的工业平板、机器人、无人机等商用产品均通过OpenAtom OpenHarmony&#xff08;以下简称“OpenHarmony”&#xff09;3.2 Release版本兼容性测评&#xff0c;获颁O…

【Vue】yarn 安装包时权限不足或者文件夹被占用导致安装失败

在一个 Vue3 项目中&#xff0c;用 yarn 安装 Vue 插件或者 Vue-Router 时&#xff0c;出现同样的 error &#xff0c;如下&#xff1a; An unexpected error occurred: “EPERM: operation not permitted, unlink ‘C:\Codefield\项目\yupao-frontend\node_modules\esbuild\w…

c#设计模式-结构型模式 之 代理模式

前言 由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时&#xff0c;访问对象不适合或者不能直接 引用目标对象&#xff0c;代理对象作为访问对象和目标对象之间的中介。在学习代理模式的时候&#xff0c;可以去了解一下Aop切面编程AOP切面编程_aop编程…

python高级基础

文章目录 python高级基础闭包修饰器单例模式跟工厂模式工厂模式单例模式 多线程多进程创建websocket服务端手写客户端 python高级基础 闭包 简单解释一下闭包就是可以在内部访问外部函数的变量&#xff0c;因为如果声明全局变量&#xff0c;那在后面就有可能会修改 在闭包中的…

下载安装并使用小乌龟TortoiseGit

1、下载TortoiseGit安装包 官网&#xff1a;Download – TortoiseGit – Windows Shell Interface to Githttps://tortoisegit.org/download/ 2、小乌龟汉化包 在官网的下面就有官方提供的下载包 3、安装

android 的Thread类

Thread类 位于java.lang包下的Thread类是非常重要的线程类&#xff0c;它实现了Runnable接口&#xff0c;学习Thread类包括这些相关知识&#xff1a;线程的几种状态、上下文切换&#xff0c;Thread类中的方法的具体使用。 线程&#xff1a;比进程更小的执行单元&#xff0c;每…

消息中间件-kafka实战-第六章-kafka加线程池多线程消费

目录 参考架构图延时队列 参考 头条面试&#xff1a;当线上Kafka集群有大量消息积压时&#xff0c;如何利用多线程消费解决消费积压问题 架构图 延时队列

vulnhub靶机DarkHole_2

靶机下载地址&#xff1a;DarkHole: 2 ~ VulnHub 靶机发现 arp-scan -l 扫描端口 nmap --min-rate 10000 -p- 192.168.21.145 扫描服务 nmap -sV -sT -O -p22,80 192.168.21.145 漏洞扫描 nmap --scriptvuln -p22,80 192.168.21.145 这里有git源码泄露 git clone mirrors…

网络编程基础(1)

目录 网络编程解决是跨主机的进程间通讯 1、网络 2、互联网 3、ip地址 &#xff08;1&#xff09;ipv4: &#xff08;2&#xff09;ipV6:1 &#xff08;3&#xff09;IP地址的组成&#xff1a; (4)Linux查看IP地址&#xff1a;ifconfig 4、mac地址 5、ping Ip地址 6…

Vue2-TodoList案例(初级 后面会进行完善)

&#x1f954;&#xff1a;觉得累是因为在走上坡路 本案例是初级案例&#xff0c;在下面几节会进行完善——Vue.js TodoList案例 组件化编码流程&#xff08;通用&#xff09;整体思路1、分析结构2、拆html和css3、初始化列表4、实现添加列表功能5、实现勾选功能6、实现删除功能…

第三讲:ApplicationContext的实现

这里写目录标题 一、前文回顾二、基础代码准备三、基于XML的ClassPathXmlApplicationContext1. 创建spring-config.xml配置文件2. 指定配置文件的路径 四、基于注解的AnnotationConfigApplicationContext1. 新增一个配置类2.指定配置类信息 五、基于注解和ServletWebServer应用…