拆分基础slam(2)-前端视觉里程计
二
- 前端几何原理
- 对极几何 2D-2D
- PNP 3D-2D
- 直接线性变换(DLT)
- 非线性优化:Bundle Adjustment
- P3P
- ICP(Iterative Closest Point) 3D-3D
- 线性优化方法
- 非线性优化方法
- 总结
前端几何原理
在前一章中,我讲了一个例子:有两帧图像我用什么方法来对相机姿态做一个估计,这种情况一般是单目相机。如果是双目相机或者RGB—D相机,这种可以获取到深度的相机那么处理方式就有区别。
对极几何 2D-2D
在前一章中我主要讲了对极几何的求解归一化坐标的方法,使用了经典的八对点法,其实也可以使用五点法(相机有六个移动自由度,但有一个尺度等价,跟九点转八点原理类似),但是这种方法会增加计算的复杂度,所以我们更倾向于使用八点法。这种方法用的两张图像都是2D的归一化坐标所以叫做2D-2D,具体内容可以参考上一篇文章:
链接: 静态相机前端.
PNP 3D-2D
PnP方法解决的是当我们知道n个3D空间点和他们的投影位置时,求解姿态的问题。当我们2D-2D时,只知道归一化坐标,但是3D-2D时其中一张图上的特征点深度是知道的,这个时候需要的点对就会从八对减少成为三对。
直接线性变换(DLT)
在空间中又个点的坐标为P=(X,Y,Z,1),现在这个点投影到图像中坐标为(u,v,1),这个转换关系中就需要包含我们要求解到R和t,那么可以建立如下所示的关系式:
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\left( %左括号 \begin{array}{ccc} %该矩阵一共3列,每一列都居中放置 u_{1}\\ %第一行元素 v_{1}\\ %第二行元素 1\\ \end{array} \right)=\left( %左括号 \begin{array}{ccc} %该矩阵一共3列,每一列都居中放置 t_{1} \quad t_{2}\quad t_{3}\quad t_{4}\\ %第一行元素 t_{5} \quad t_{6}\quad t_{7}\quad t_{8}\\ %第二行元素 t_{9} \quad t_{10}\quad t_{11}\quad t_{12}\\ \end{array} \right)\left( %左括号 \begin{array}{ccc} %该矩阵一共3列,每一列都居中放置 X\\ %第一行元素 Y\\ %第二行元素 Z\\ 1 \end{array} \right) s⎝⎛u1v11⎠⎞=⎝⎛t1t2t3t4t5t6t7t8t9t10t11t12⎠⎞⎝⎜⎜⎛XYZ1⎠⎟⎟⎞
上式中由于左侧是归一化坐标,所以s可以用X、Y、Z消掉,u和v两个未知量就可以用两个方程表示:
u 1 = t 1 X + t 2 Y + t 3 Z + t 4 t 9 X + t 10 Y + t 11 Z + t 12 v 1 = t 5 X + t 6 Y + t 7 Z + t 8 t 9 X + t 10 Y + t 11 Z + t 12 u_{1}=\frac{t_{1}X+t_{2}Y+t_{3}Z+t_{4}}{t_{9}X+t_{10}Y+t_{11}Z+t_{12}}\qquad v_{1}=\frac{t_{5}X+t_{6}Y+t_{7}Z+t_{8}}{t_{9}X+t_{10}Y+t_{11}Z+t_{12}} u1=t9X+t10Y+t11Z+t12t1X+t2Y+t3Z+t4v1=t9X+t10Y+t11Z+t12t5X+t6Y+t7Z+t8
在上面两个方程中,t是我们需要求的,其中包含的就是R和t的信息,T矩阵一共有12个未知数,所以在DLT方法中我们需要六对匹配点来建立12个方程来求解。
非线性优化:Bundle Adjustment
直接线性优化是将求解姿态问题转化为解线性方程组。这种方法流程是先求得姿态R,t再求空间点位置,DLT就是这个思路。非线性优化将姿态和空间点同时作为优化变量,因为关系不是用线性方程描述的所以叫非线性优化。BA是一种常用的方法,我介绍的重点放在思路,数学含量过高的内容会省略易懂。
BA的思路是最小化重投影误差:
这个图我上一节提到过,P11和P2的差距叫做重投影误差,我们就需要建立关系来最小化,我建立P和P11点的关系如下:
s i [ u i v i 1 ] = K e x p ( ξ ^ ) [ X i Y i Z i 1 ] + e s_{i}\left[ %左括号 \begin{array}{ccc} %该矩阵一共3列,每一列都居中放置 u_{i}\\ %第一行元素 v_{i}\\ %第二行元素 1\\ \end{array} \right]=Kexp(\hat \xi)\left[ %左括号 \begin{array}{ccc} %该矩阵一共3列,每一列都居中放置 X_{i}\\ %第一行元素 Y_{i}\\ %第二行元素 Z_{i}\\ 1 \end{array} \right]+e si⎣⎡uivi1⎦⎤=Kexp(ξ^)⎣⎢⎢⎡XiYiZi1⎦⎥⎥⎤+e
上式对初学者来说难以理解,左侧是空间点的归一化坐标,右侧是空间点乘以李代数(姿态)后加上一个误差,这个李代数冒号后变成了反对称矩阵,再指数变换后得到李群也就是外参姿态变换。我们建立的优化关系就是最小化这个误差。我们对误差建立最小二乘问题,寻找相机最好的位姿来最小化误差:
ξ ∗ = a r g m i n 1 2 ∑ i = 1 n ∣ ∣ u i − 1 s i K e x p ( ξ ^ ) P i ∣ ∣ 2 2 \xi^*=argmin\frac{1}{2}\sum\limits_{i = 1}^n||u_{i}-\frac{1}{s_{i}}Kexp(\hat \xi)P_{i}||_{2}^2 ξ∗=argmin21i=1∑n∣∣ui−si1Kexp(ξ^)Pi∣∣22
i表示第i个点,将一批点都放进来进行这个优化就叫做批调整BA。要求解这个问题需要的是数值分析等学科的数学知识。用高斯牛顿或者LM方法对这个方程求解。我们可以通过线性化得到重投影误差关于相机位姿李代数的一阶关系,还有重投影误差关于空间点P的导数,我们得到了这两个优化关系后就可以在方程中对其优化了。
P3P
这是另一种PNP方法,这种方法只使用三对匹配点,利用的是空间中相似三角形的几何关系。
现在由余弦定理建立关系表达式:
O A 2 + O B 2 − 2 O A ⋅ O B ⋅ c o s < a , b > = A B 2 OA^{2}+OB^{2}-2OA·OB·cos<a,b>=AB^ {2} OA2+OB2−2OA⋅OB⋅cos<a,b>=AB2
O B 2 + O C 2 − 2 O B ⋅ O C ⋅ c o s < b , c > = B C 2 OB^{2}+OC^{2}-2OB·OC·cos<b,c>=BC^ {2} OB2+OC2−2OB⋅OC⋅cos<b,c>=BC2
O A 2 + O C 2 − 2 O A ⋅ O C ⋅ c o s < a , b > = A C 2 OA^{2}+OC^{2}-2OA·OC·cos<a,b>=AC^ {2} OA2+OC2−2OA⋅OC⋅cos<a,b>=AC2
整理上式,并且按照图中的关系对公式进行整理:
x 2 + y 2 − 2 x ⋅ y ⋅ c o s < a , b > − v = 0 ( ∗ ) x^{2}+y^{2}-2x·y·cos<a,b>-v=0 (*) x2+y2−2x⋅y⋅cos<a,b>−v=0(∗)
y 2 + 1 − 2 y c o s < b , c > − u v = 0 y^{2}+1-2ycos<b,c>-uv=0 y2+1−2ycos<b,c>−uv=0
x 2 + 1 − 2 x c o s < a , c > = 0 x^{2}+1-2xcos<a,c>=0 x2+1−2xcos<a,c>=0
我们用第一个式子消掉二三式子中的v:
( 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-u)y^{2}-ux^2-cos<b,c>y+2uxycos<a,b>+1=0 (1−u)y2−ux2−cos<b,c>y+2uxycos<a,b>+1=0
( 1 − w ) y 2 − w y 2 − c o s < a , c > y + 2 w x y c o s < a , b > + 1 = 0 (1-w)y^{2}-wy^2-cos<a,c>y+2wxycos<a,b>+1=0 (1−w)y2−wy2−cos<a,c>y+2wxycos<a,b>+1=0
这个式子是关于x和y的一个二元二次方程,其他的量像w,u和cos都可以用已知的三维坐标和角度信息得出来。所以我们仅用三个点建立了求x和y的两个等式。得到了x和y后我们看(*)式子,我们可以解出v来,通过v,我们就知道了OC是多少,那么OAOB就知道了。我们就由此计算出了所有点信息。此时就是把3D点投影到2D归一化坐标那个计算公式求得Rt。
ICP(Iterative Closest Point) 3D-3D
ICP指的是用匹配好的两组点来估计空间运动。3D-3D的意思就是我们知道了三位空间中一组匹配好的点(如果涉及了图像怎么能叫3D呢),同样,我们的目的是计算相机位姿,那么自然而然就是如下点变换公式:
p i = R p i ′ + t p_{i}=Rp_{i}^{'}+t pi=Rpi′+t
此处也有两种方法,一是线性而是非线性优化。
线性优化方法
先说线性优化,我们建立方程组:
m i n J = 1 2 ∑ i = 1 n ∣ ∣ p i − ( R p i ′ + t ) ∣ ∣ 2 2 minJ=\frac{1}{2}\sum\limits_{i = 1}^n||p_{i}-(Rp_{i}^{'}+t)||_{2}^2 minJ=21i=1∑n∣∣pi−(Rpi′+t)∣∣22
在上面这个式子中未知量是相机的位姿Rt,我们的直接优化项就是Rt。这个公式很容易和PnP问题中的非线性优化BA做对比,两个优化的式子很相似,但跟PnP问题类似,线性解法先解出Rt再计算空间点。
我省略求解方程其中的数学过程,否则会增加主干内容以外的内容。简要来说就是三步:
q i = p i − p q i ′ = p i ′ − p ′ q_{i}=p_{i}-p \qquad q_{i}^{'}=p_{i}^{'}-p^{'} qi=pi−pqi′=pi′−p′
上式中没下标的两个P代表P的质心,就是每个点的平均位置,第一步的意思是取出一个点,计算这个点的偏移量。
R ∗ = a r g m a x 1 2 ∑ i = 1 n ∣ ∣ q i − ( R q i ′ ) ∣ ∣ 2 2 R^{*}=argmax\frac{1}{2}\sum\limits_{i = 1}^n||q_{i}-(Rq_{i}^{'})||_{2}^2 R∗=argmax21i=1∑n∣∣qi−(Rqi′)∣∣22
第二步的意思是把所有点取出来,进行第一步计算出偏移量,然后针对每个点优化R使其满足误差最小。
t ∗ = p − R p ′ t^{*}=p-Rp^{'} t∗=p−Rp′
第三步利用刚才计算出来的R和P的质心,计算t。
从此ICP问题的线性解法说完了。数学公式推导可以参考教材,我只需要讲清楚大家在应用的时候是什么流程就行了。
非线性优化方法
与BA的思路很类似,都是求解:
ξ ∗ = a r g m i n 1 2 ∑ i = 1 n ∣ ∣ p i − e x p ( ξ ^ ) P i ∣ ∣ 2 2 \xi^*=argmin\frac{1}{2}\sum\limits_{i = 1}^n||p_{i}-exp(\hat \xi)P_{i}||_{2}^2 ξ∗=argmin21i=1∑n∣∣pi−exp(ξ^)Pi∣∣22
总结
我前端提到的这几种方法从几种已知情况下分析了如何求解相机的位姿。首先是单目两张图,这种情况下使用对极几何用常用的八点法或者五点法可以求得E。分解后得Rt。3D投影到2D情况下首先可以用类似于八点法的线性方法求解,需要六对点;BA优化方法可以同时优化空间点和位姿,P3P可以用三对点三角函数解决姿态估计。3D-3D的ICP方法可以解决的是已知3D空间中两个点匹配的情况下求解位姿,线性方法利用最小二乘法求解位姿最优值。
拆分基础slam(2)-前端视觉里程计相关推荐
- 零基础从零开始写VO视觉里程计
零基础从零开始写VO代码 课程以直播写代码讲理论为主, 提升代码编程能力和VO视觉里程计理论知识. 数学基础:微分积分.线性代数.矩阵论.统计学.概率论.最优化等 操作系统:Linux(Ubuntu) ...
- 视觉SLAM:ORB视觉里程计的简单实现(一)
ORB视觉里程计的简单实现之一 概述 一.基础视觉里程计的算法实现步骤 二.具体实现细节 1.公用 2.相机类 3.图像帧 4.系统类 5.视觉里程计类 6.其他 6.1 显示类 6.2 地图点类 6 ...
- 视觉SLAM十四讲学习笔记 第7讲 视觉里程计
第七讲 视觉里程计 概要:前端视觉里程计(Visual Odometry, VO).视觉里程计的主要任务是估算相邻图像间相机的运动,以及局部地图的样子.VO又称前端. 主要学习目标: 1.理解图像特征 ...
- SLAM前端中的视觉里程计和回环检测
1. 通常的惯例是把 VSLAM 分为前端和后端.前端为视觉里程计和回环检测,相当于是对图像数据进行关联:后端是对前端输出的结果进行优化,利用滤波或非线性优化理论,得到最优的位姿估计和全局一致性地图. ...
- 视觉SLAM十四讲学习笔记-第七讲-视觉里程计-对极几何和对极约束、本质矩阵、基础矩阵
专栏系列文章如下: 专栏汇总 视觉SLAM十四讲学习笔记-第一讲_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习笔记-第二讲-初识SLAM_goldqiu的博客-CSDN博客 视觉SLA ...
- 视觉SLAM十四讲学习笔记-第七讲-视觉里程计-特征点法和特征提取和匹配实践
专栏系列文章如下: 视觉SLAM十四讲学习笔记-第一讲_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习笔记-第二讲-初识SLAM_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习 ...
- 拆分基础Slam(1)--静态相机前端
前端 前言 单目相机及标定 单目相机模型 两种主要方法 特征点匹配方法 ORB原理 特征点匹配 光流法 直接法 特征点法的位姿计算 总结 前言 我在学习slam的过程中遇见了很多问题,边学习边记录,希 ...
- 2022最新!视觉SLAM综述(多传感器/姿态估计/动态环境/视觉里程计)
点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者丨汽车人 来源丨 自动驾驶之心 摘要 近年来,基于视觉的传感器在SLAM系统中显示出显著的性能.精 ...
- 视觉SLAM十四讲学习笔记-第七讲-视觉里程计-PnP和实践
专栏汇总 视觉SLAM十四讲学习笔记-第一讲_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习笔记-第二讲-初识SLAM_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习笔记- ...
最新文章
- 怎样用QT在windows环境通过编程卸载installShield打包的程序
- angular例子笔记
- ibtmp1文件过大
- kaggle上传数据集遇到Default slug detected, please change values before uploading
- 二分法查找(Java)
- 为Web Service添加缓存
- python基础知识-Python基础知识
- aforge java_java(一些java API)或C#(emgucv,dshownet,Aforge.NET)中的实时对象跟踪
- oracle 11g 解决临时表空间占满问题
- 当导入导出为同一个接口时,会产生什么样的“化学反应”?
- 南非认证_南非2008-与孩子和婴儿长途旅行
- python笔记(web前端 CSS)
- The view Myapp.views.welcome didn‘t return an HttpResponse object. It returned None instead.
- CSS3-04 样式 3
- 音乐及游戏爱好者的福利,小鹏P7上新网易云及阴阳师,赶快看看吧
- MFC如何调用Flash控件
- Elasticsearch之拼音搜索(十五)
- linux从入门到放弃-linux常见故障合集
- Delegate委托的使用
- 初识 Python 科学计算库之 NumPy(创建多维数组对象)