视觉SLAM十四讲-第三讲-三维空间刚体运动

合集下载

三维视觉基础介绍

三维视觉基础介绍

(e)
(f)
(g)
(h)
几种全向摄像机
鱼眼镜头
Oc O
X
M
m
m0
球面成像过程
坐标系
1、世界坐标系: X w ,Yw , Z w
2、摄像机坐标系:X c ,Yc , Zc
3、图像坐标系: u, v x, y
Xw
Zw
Ow
Yw
世界坐标系
说明:
为了校正成像畸变
用理想图像坐标系 X u ,Yu
为了校正成像畸变为了校正成像畸变用理想图像坐标系用理想图像坐标系和真实图像坐标系和真实图像坐标系分别描述畸变前后的坐标关系分别描述畸变前后的坐标关系坐标系坐标系摄像机光学成像过程的四个步骤摄像机光学成像过程的四个步骤刚体变换刚体变换透视投影透视投影畸变校正畸变校正数字化图像数字化图像世界坐标系世界坐标系摄像机坐标系摄像机坐标系真实图像坐标系真实图像坐标系数字化图像坐标系数字化图像坐标系理想图像坐标系理想图像坐标系1刚体变换公式刚体变换公式齐次坐标形式齐次坐标形式物体物体图像图像fobfob为透镜的焦距为透镜的焦距mocmoc为像距为像距naonao一般地由于一般地由于于是于是这时可这时可以将透镜成像模型近以将透镜成像模型近似地用小孔模型代替似地用小孔模型代替透视投影透视投影透镜成像原理图透镜成像原理图写成齐次坐标形式为写成齐次坐标形式为透视投影透视投影小孔成像模型小孔成像模型写成齐次坐标形式为写成齐次坐标形式为中心透视投影模型中心透视投影模型dtpositionpositiondistortiondistortionidealidealpositionpositiondrdrdr
为什么要学习射影几何?
照相机的成像过程是一个射影变换(透视 或中心射影)的过程:

《视觉SLAM十四讲》笔记(ch7)

《视觉SLAM十四讲》笔记(ch7)

《视觉SLAM⼗四讲》笔记(ch7)ch7 视觉⾥程计1本章⽬标:1.理解图像特征点的意义,并掌握在单副图像中提取出特征点及多副图像中匹配特征点的⽅法2.理解对极⼏何的原理,利⽤对极⼏何的约束,恢复出图像之间的摄像机的三维运动3.理解PNP问题,以及利⽤已知三维结构与图像的对应关系求解摄像机的三维运动4.理解ICP问题,以及利⽤点云的匹配关系求解摄像机的三维运动5.理解如何通过三⾓化获得⼆维图像上对应点的三维结构本章⽬的:基于特征点法的vo,将介绍什么是特征点,如何提取和匹配特征点,以及如何根据配对的特征点估计相机运动和场景结构,从⽽实现⼀个基本的两帧间视觉⾥程计。

特征点:⾓点、SIFT(尺度不变特征变换,Scale-Invariant Feature Transform)、SURF、、ORB(后三个是⼈⼯设计的特征点,具有更多的优点)特征点的组成:1.关键点:指特征点在图像⾥的位置2.描述⼦:通常是⼀个向量,按照某种⼈为设计的⽅式,描述了该关键点周围像素的信息。

相似的特征应该有相似的描述⼦(即当两个特征点的描述⼦在向量空间上的距离相近,认为这两个特征点是⼀样的)以ORB特征为代表介绍提取特征的整个过程:ORB特征:OrientedFAST关键点+BRIEF关键⼦提取ORB特征的步骤:1.提取FAST⾓点:找出图像中的“⾓点”,计算特征点的主⽅向,为后续BRIEF描述⼦增加了旋转不变特性FAST⾓点:主要检测局部像素灰度变化明显的地⽅特点:速度快缺点:1).FAST特征点数量很⼤且不确定,但是我们希望对图像提取固定数量的特征2).FAST⾓点不具有⽅向信息,并且存在尺度问题解决⽅式:1).指定要提取的⾓点数量N,对原始FAST⾓点分别计算Harris响应值,然后选取前N个具有最⼤响应值的⾓点作为最终的⾓点集合2).添加尺度和旋转的描述 尺度不变性的实现:构建图像⾦字塔,并在⾦字塔的每⼀层上检测⾓点(⾦字塔:指对图像进⾏不同层次的降采样,以获得不同分辨率的图像)特征旋转的实现:灰度质⼼法(质⼼:指以图像块灰度值作为权重的中⼼)2.计算BRIEF描述⼦:对前⼀步提取出的特征点周围图像区域进⾏扫描特点:使⽤随机选点的⽐较,速度⾮常快,由于使⽤了⼆进制表达,存储起来也⼗分⽅便,适⽤于实时的图像匹配在不同图像之间进⾏特征匹配的⽅法:1.暴⼒匹配:浮点类型的描述⼦,使⽤欧式距离度量⼆进制类型的描述⼦(⽐如本例中的BRIEF描述⼦),使⽤汉明距离度量缺点:当特征点数量很⼤时,暴⼒匹配法的运算量会变得很⼤2.快速近似最近邻(FLANN):适合匹配特征点数量极多的情况实践部分:1.OpenCV的图像特征提取、计算和匹配的过程:演⽰如何提取ORB特征并进⾏匹配代码: 1 #include <iostream>2 #include <opencv2/core/core.hpp>3 #include <opencv2/features2d/features2d.hpp>4 #include <opencv2/highgui/highgui.hpp>56using namespace std;7using namespace cv;89int main(int argc,char** argv)10 {11if(argc!=3)12 {13 cout<<"usage:feature_extraction img1 img2"<<endl;14return1;15 }1617//读取图像18 Mat img_1=imread(argv[1],CV_LOAD_IMAGE_COLOR);19 Mat img_2=imread(argv[2],CV_LOAD_IMAGE_COLOR);2021//初始化22 vector<KeyPoint> keypoints_1,keypoints_2;//关键点,指特征点在图像⾥的位置23 Mat descriptors_1,descriptors_2;//描述⼦,通常是向量24 Ptr<ORB> orb=ORB::create(500,1.2f,8,31,0,2,ORB::HARRIS_SCORE,31,20);2526//第⼀步:检测OrientFAST⾓点位置27 orb->detect(img_1,keypoints_1);28 orb->detect(img_2,keypoints_2);2930//第2步:根据⾓点位置计算BRIEF描述⼦31 orb->compute(img_1,keypoints_1,descriptors_1);32 orb->compute(img_2,keypoints_2,descriptors_2);3334 Mat outimg1;35 drawKeypoints(img_1,keypoints_1,outimg1,Scalar::all(-1),DrawMatchesFlags::DEFAULT);36 imshow("1.png的ORB特征点",outimg1);37 Mat outimg2;38 drawKeypoints(img_2,keypoints_2,outimg2,Scalar::all(-1),DrawMatchesFlags::DEFAULT);39 imshow("2.png的ORB特征点",outimg2);4041//第3步:对两幅图像中的BRIEF描述⼦进⾏匹配,使⽤Hamming距离42 vector<DMatch> matches;43//特征匹配的⽅法:暴⼒匹配44 BFMatcher matcher(NORM_HAMMING);45 matcher.match(descriptors_1,descriptors_2,matches);46// for(auto it=matches.begin();it!=matches.end();++it)47// {48// cout<<*it<<" ";49// }50// cout<<endl;5152//第4步:匹配点对筛选53 distance是min_dist5455double min_dist=10000,max_dist=0;5657//找出所有匹配之间的最⼩距离和最⼤距离,即最相似的和最不相似的和最不相似的两组点之间的距离58for(int i=0;i<descriptors_1.rows;++i)59 {60double dist=matches[i].distance;61// cout<<dist<<endl;62if(dist<min_dist) min_dist=dist;63if(dist>max_dist) max_dist=dist;64 }6566 printf("--Max dist:%f\n",max_dist);67 printf("--Min dist:%f\n",min_dist);6869//当描述⼦之间的距离⼤于两倍的最⼩距离时,即认为匹配有误70//但有时候最⼩距离会⾮常⼩,设置⼀个经验值作为下限71 vector<DMatch> good_matches;72for(int i=0;i<descriptors_1.rows;++i)73 {74if(matches[i].distance<=max(2*min_dist,30.0))75 {76 good_matches.push_back(matches[i]);77 }78 }7980//第5步:绘制匹配结果81 Mat img_match;82 Mat img_goodmatch;83 drawMatches(img_1,keypoints_1,img_2,keypoints_2,matches,img_match);84 drawMatches(img_1,keypoints_1,img_2,keypoints_2,good_matches,img_goodmatch);85 imshow("所有匹配点对",img_match);86 imshow("优化后匹配点对",img_goodmatch);87 waitKey(0);8889return0;90 }实验结果:1.png中提取到的特征点2.png中提取到的特征点匹配结果: 所有点对匹配结果 优化后的匹配点对结果(筛选依据是Hamming距离⼩于最⼩距离的两倍)结果分析:尽管在这个例⼦中利⽤⼯程经验优化筛选出正确的匹配,但并不能保证在所有其他图像中得到的匹配都是正确的,所以,在后⾯的运动估计中,还要使⽤去除误匹配的算法。

三维空间刚体运动——(1)齐次坐标与旋转矩阵

三维空间刚体运动——(1)齐次坐标与旋转矩阵

三维空间刚体运动——(1)齐次坐标与旋转矩阵⽬录:什么是齐次坐标?简单的说:齐次坐标就是在原有坐标上加上⼀个维度:使⽤齐次坐标有什么优势1、能⾮常⽅便的表达点在直线或平⾯上在2D平⾯上,⼀条直线 l 可以⽤⽅程 ax + by + c = 0 来表⽰,该直线⽤向量表⽰的话⼀般记做我们知道点p = (x, y)在直线 l 上的充分必要条件是 ax + by + c = 0如果使⽤齐次坐标的话,点p的齐次坐标就是p'=(x, y, 1)那么 ax + by + c = 0 就可以⽤两个向量的内积(点乘)来表⽰:因此,点p在直线l上的充分必要条件就是直线l 与p的齐次坐标p'的内积:是不是很⽅便呢!同理,我们知道三维空间的⼀个平⾯A可以⽤⽅程 ax + by + cz + d = 0 来表⽰,三维空间的⼀个点P=(x, y, z) 的齐次坐标 P'=(x, y, z, 1),类似的,点P在空间平⾯A上可以⽤两个向量的内积来表⽰,如下:因此,点P在平⾯A上的充分必要条件就是平⾯A 向量与P的齐次坐标P'的内积(点乘):2、⽅便表达直线与直线,平⾯与平⾯的交点先给出结论,后⾯再具体解释:结论:在齐次坐标下,可以⽤两个点 p, q 的齐次坐标叉乘结果来表达⼀条直线 l,也就是l = p x q也可以使⽤两条直线 l, m 的叉乘表⽰他们的交点 xx = l x m见下⾯⽰例图。

之所以可以这么简洁的表⽰交点是因为采⽤了齐次坐标的表⽰⽅式。

那么这是为什么呢?先介绍⼀下叉乘(也称叉积、外积)的概念:两个向量 a和b 的叉乘仅在三维空间中有定义,写作 a x ba xb 是与向量 a, b都垂直的向量,其⽅向通过右⼿定则(见下图)决定。

其模长等于以两个向量为边的平⾏四边形的⾯积(见下图)。

叉乘可以定义为:其中θ表⽰a, b的夹⾓(0°到180°之间),||a||, ||b||是向量a, b的模长n则是⼀个与向量a, b所构成的平⾯垂直的单位向量根据叉乘定义:向量⾃⾝叉乘结果为0,因为夹⾓为0。

视觉SLAM

视觉SLAM
内参,而内参在 SLAM 中通常是已知的,所以实践当中往往使
用形式更简单的 E 。
三角测量确定深度
• 在得到运动之后,下一步我们需要用相机的运动估计特征点的空间位置。在单目 SLAM 中,仅通过单张图 像无法获得像素的深度信息,我们需要通过三角测量( Triangulation )(或三角化)的方法来估计地图点
回环检测
• 回环检测,又称闭环检测( Loop Closure Detection ),主要解决位置 估计随时间漂移的问题。 • 前端提供特征点的提取和轨迹、地图的初值,而后端负责对这所有的数据
进行优化。然而,如果像 VO 那样仅考虑相邻时间上的关联,那么,之前
产生的误差将不可避免地累计到下一个时刻,使得整个 SLAM 会出现累积 误差。长期估计的结果将不可靠,或者说,我们无法构建全局一致的轨迹
用对极几何恢复出在两帧之间摄像机的运动
• 现在,假设我们从两张图像中,得到了一对配对好的特征点,像图 7-7 里显示的那样。如果我们有若 干对这样的匹配点,就可以通过这些二维图像点的对应关系,恢复出在两帧之间摄像机的运动。
• 1. 根据配对点的像素位置,求出 E 或者 F ;
• 2. 根据 E 或者 F ,求出 R, t 。由于 E 和 F 只相差了相机
视觉 SLAM
蔺志强 苏 敬
• SLAM 是 Simultaneous Lo“同时定位与地图构
建”。它是指搭载特定传感器的主体,在没有环 境先验信息的情况下,于运动过程中建立环境的 模型,同时估计自己的运动。如果这里的传感器 主要为相机,那就称为“视觉 SLAM ”。
和地图。
核心问题是如何计算图像间的相似性
• 最简单的方式就是对任意两张图像都做一遍特征匹配,根据正确匹配的数量确定哪两个图像存在关联。但 计算量大,效率低下。 • 基于里程计的几何关系( Odometry based ), • 基于外观( Appearanc e based )仅根据两张图像的相似性确定回环检测关系,这种做法摆脱了累计误差, 使回环检测模块成为 SLAM 系统中一个相对独立的模块。

手写VIO(一)概论与预备知识

手写VIO(一)概论与预备知识

⼿写VIO(⼀)概论与预备知识第⼀章 VIO概论当前市⾯上很少有系统介绍VIO系统的书⼀ VIO简介VIO(Visual-Inertial Odometry):以视觉和IMU融合的⽅法实现定位的⾥程计接下来介绍VIO使⽤到的两个信息1. IMU(Inertial MeasureMent Unit)惯性测量单元典型的6轴IMU能以较⾼频率(>= 100Hz)返回被测量物体的⾓速度和加速度IMU的缺点在于,容易收到⾃⾝温度、灵⽚、振动等因素⼲扰,通过积分直接得到的评议和旋转将产⽣漂移2. 视觉信息通过视觉定位的⽅法即视觉SLAM,主要利⽤相机采集的图⽚信息作为输⼊,采样频率较低(15-60Hz居多)定位的时候主要通过图像特征点或像素推断相机运动之所以使⽤以上两个硬件主要是由于⼆者的互补性。

3. ⼆者的互补性IMU与视觉定位的优劣势对⽐⽅案IMU视觉优势快速响应不受成像质量影响⾓速度普遍⽐较准确可估计绝对尺度不产⽣漂移直接测量旋转与平移劣势存在零偏低精度IMU积分位⼦发散⾼精度IMU价格昂贵受图像遮挡、运动物体⼲扰单⽬视觉⽆法测量尺度单⽬纯旋转运动⽆法估计快速运动时易丢失可以看出视觉与IMU之间存在⼀定的互补性质:IMU适合于计算短时间快速的运动视觉适合计算长时间慢速的运动同时,可以利⽤视觉定位信息来估计好吃IMU的零偏,减少IMU由零偏导致的发散和累积误差。

反之,IMU也可以为视觉提供快速运动的定位。

应⽤IMU数据可以多种定位⽅案融合⾃动驾驶中通常使⽤IMU+GPS差分GPS/RTK的融合定位⽅案,形成GNSS-INS组合导航系统,打倒厘⽶组定位精度;头戴式AR/VR头盔则多使⽤视觉+IMU的VIO定位系统,形成⾼帧率定位⽅案⾥程计的后端根据信息融合的⽅式进⾏分类我们可以把视觉⾥程计分为松耦合和紧耦合两种1. 松耦合将 IMU 定位与视觉/GNSS 的位姿直接进⾏融合,融合过程对⼆者本⾝不产⽣影响,作为后处理⽅式输出。

视觉slam介绍

视觉slam介绍

• 纯视觉Ba中,不存在相机与相机/路标
与路标之间的关联
• 整个误差函数由许多个这样小的项组 成
Dxc
Dx p
第五讲 回环检测
Chapter 5: Loop detection
为消除累计误差,获得全局一致的 地图和轨迹,仅仅通过帧间数据匹配 估计运动位姿是远远不够的,需要在 全局数据中进行处理才能得到更好的 结果。在这个过程中,回环检测就发 挥了非常重要的作用。回环检测可以 有效修正运动轨迹,将累计误差消除 。
t
3.5 光流
• 对 t+dt 时刻的灰度进行Taylor展开并保留一阶项:
• 由于灰度不变,所以
• 希望求解dx/dt, dy/dt
因此 =>
x方向梯度 随时间变化 y方向梯度
w´w
最后,我们可以通过光流跟踪的特征的,用PnP、ICP 或对极几何来估计相机运动。总而言之,光流法可以加速 基于特征点的视觉里程计算法,避免计算和匹配描述子的 过程,但要求相机运动较慢(或采集频率较高)。
• 代数的解法/优化的解法
• 代数的
• DLT • P3P • EPnP/UPnP/…
• 优化的:BLT(直接线性变换)
• 设空间点 • 投影点为: • 投影关系: • 展开:
• 注意最下一行为
归一化坐标

用它消掉前两行中的s,则一个特征点
提供两个方程:
• 为求解12个未知数,需要12/2=6对点。 • 将它看成一个关于t的线性方程,求解 (超定时求最小二乘解)
Chapter 3: Visual Odometry
• 特征点:图像当中具有代表性的部分
• 可重复性 • 可区别性 • 高效 • 本地

【视觉SLAM十四讲课后作业答案】第三讲:李群与李代数

【视觉SLAM十四讲课后作业答案】第三讲:李群与李代数

第一节课习题屋卡2017年12月19日一、验证向量叉乘的李代数性质我们说向量和叉乘运算构成了李代数,现在请你验证它。

书中对李代数的定义为:李代数由⼀个集合V,⼀个数域 F 和⼀个⼀元运算[,] 组成。

如果它们满⼀以下⼀条性质,称(V,F,[,]) 为⼀个李代数,记作g二、推导SE(3) 的指数映射课上给出了SO(3) 的指数映射推导,但对于SE(3),仅介绍了结论,没有给出详细推导。

请你完成SE(3) 指数映射部分,有关左雅可⼀的详细推导。

三、伴随在SO(3) 和SE(3) 上,有⼀个东西称为伴随(Adjoint)。

下⼀请你证明SO(3) 伴随的性质。

对于SO(3),有:Rexp(p∧)RT = exp((Rp)∧).此时称Ad(R) = R。

解:四、轨迹的描绘我们通常会记录机器⼀的运动轨迹,来观察它的运动是否符合预期。

⼀部分数据集都会提供标准轨迹以供参考,如kitti、TUM-RGBD 等。

这些⼀件会有各⼀的格式,但⼀先你要理解它的内容。

记世界坐标系为W,机器⼀坐标系为C,那么机器⼀的运动可以⼀TWC 或TCW 来描述。

现在,我们希望画出机器⼀在世界当中的运动轨迹,请回答以下问题:1.事实上,TWC 的平移部分即构成了机器⼀的轨迹。

它的物理意义是什么?为何画出TWC 的平移部分就得到了机器⼀的轨迹?解:wc T 的平移部分构成机器人的轨迹,它的物理意义是机器人在现实三维空间中的坐标点。

wc T 包含平移和旋转部分 ,平移指的是机器人在空间中的运动位置,而旋转部分是指机器人在每个位置的方向状态。

2. 我为你准备了⼀个轨迹⼀件(code/trajectory.txt )。

该⼀件的每⼀⼀由若⼀个数据组成,格式为[t,tx,ty,tz,qx,qy,qz,qw],其中 t 为时间,tx,ty,tz 为 TWC 的平移部分,qx,qy,qz,qw 是四元数表⼀的 TWC 的旋转部分,qw 为四元数实部。

同时,我为你提供了画图程序 draw_trajectory.cpp ⼀件。

视觉SLAM综述

视觉SLAM综述
研究团队网站:(系统代码已开源)
通过基于光束平差法 ( Bundle Adjustment,BA) 的图优化理论估计相机的 位姿和地图点坐标,大大 提高了 SLAM 的精度。
目前,基于关键帧的VSLAM成为主流算法。最具代表性的有 两种: 一种是 LSD-SLAM [6] ,属于半稠密的单目的 VSLAM; 一 种是 ORB-SLAM [7,8] ,属于稀疏的 VSLAM。
3、稠密VSLAM
为了降低稠密地图的计算量,Engel J[12,13]提出了半稠 密地图(semi-direct visual odometry,SVO),通过结 合关键点的思想和直接配准的方法,大大降低了计算复 杂度。目前最先进的SVO就是Engel J等提出的LSDSLAM[13],已经能在CPU上实现了实时性。
什么是SLAM?
SLAM问题可以描述为: 机器人在未知环境中从一个未知 位置开始移动,在移动过程中根据位置估计和地图进行 自身定位,同时在自身定位的基础上建造增量式地图, 实现机器人的自主定位和导航。
(1)定位(localization):机器人必须知道自己在环境中位 置。 (2)建图(mapping):机器人必须记录环境中特征的位置 (如果知道自己的位置)
后端图优化流程
2.3 后端优化

2.4 建图
在经典的VSLAM模型中,所谓的建图,即找到所有路标 点,这些路标点的集合即是最终的地图,一旦确定了路 标点的位置,即可以说完成了建图。地图类型分为栅格 地图,拓扑地图,特征地图和混合地图。根据建图需求 不同,可以将建图用途分为两类:
定位:把地图下来,机器人下次开机后仍然能在地图上 定位,不需要再次建模,此类地图,稀疏地图即可完成。
1.2 地图的稠密程度

视觉slam十四讲课后习题ch3-7

视觉slam十四讲课后习题ch3-7

视觉slam⼗四讲课后习题ch3-7题⽬回顾:设有⼩萝⼘⼀号和⼩萝⼘⼆号位于世界坐标系中,⼩萝⼘⼀号的位姿为:q1=[0.35,0.2,0.3,0.1],t2=[0.3,0.1,0.1]^T (q的第⼀项为实部。

请你把q归⼀化后在进⾏计算)。

这⾥的q和t的表达的是Tcw,也就是世界到相机的变换关系。

⼩萝⼘⼆号的位姿为q2=[-0.5,0.4,-0.1,0.2],t=[-0.1,0.5,0.3]^T.现在,⼩萝⼘⼀号看到某个点在⾃⾝的坐标系下,坐标为p=[0.5,0,0.2]^T ,求该向量在⼩萝⼘⼆号坐标系下的坐标,请编程实现此事。

解:pw:某个点在世界坐标系下的坐标T_1w :表⽰世界坐标系到⼩萝⼘⼀号坐标系的变换关系T_2w:表⽰世界坐标系到⼩萝⼘⼆号坐标系的变换关系P2 :表⽰该点在⼩萝⼘⼆号坐标系下的坐标(即为所求)单位四元数到旋转矩阵R的变化关系可参考书上55页。

之后变换矩阵T=[R t][0 1]由变换关系可列出下⾯的式⼦:p = T_1w * Pw 可解出来pwp2=T_2W*pW 带⼊上式解出来的Pw即可求出来p2具体代码实现如下:1 #include<iostream>2 #include<Eigen/Core>34//包含⼏何模块5 #include<Eigen/Geometry>6using namespace std;78int main(int argc,char **argv)9 {10/*变量定义*/11 Eigen::Quaterniond Q1(0.2,0.3,0.1,0.35); //四元数的表⽰(w ,x,y,z)12 Eigen::Quaterniond Q2(0.4,-0.1,0.2,-0.5);13 Eigen::Vector3d t1(0.3,0.1,0.1);14 Eigen::Vector3d t2(-0.1,0.5,0.3);15 Eigen::Vector3d p(0.5,0,0.2); //在⼀号⼩萝⼘下的坐标16 Eigen::Vector3d pw ; //世界坐标17 Eigen::Vector3d p2; //求在⼆号⼩萝⼘的坐标 p21819/*欧⽒变换矩阵使⽤Eigen::Isometry */20 Eigen::Isometry3d T_1w = Eigen::Isometry3d::Identity();21 Eigen::Isometry3d T_2w = Eigen::Isometry3d::Identity();2223/*归⼀化*/24 Q1.normalize();25 Q2.normalize();2627/*输出归⼀化参数*/28// cout<<"Q1 is "<<Q1.x()<<endl<<Q1.y()<< endl <<Q1.z()<< endl<<Q1.w()<<endl;29// cout<<"Q2 is "<<Q2.x()<<endl<<Q2.y()<< endl <<Q2.z()<< endl<<Q2.w()<<endl;3031 cout<<"after normalize; "<< endl << Q2.coeffs()<<endl;3233/*设置变换矩阵的参数*/34 T_1w.rotate(Q1);35 T_1w.pretranslate(t1);36 T_2w.rotate(Q2);37 T_2w.pretranslate(t2);3839/* p = T1w * pw 求解pw*/40 pw = T_1w.inverse() * p;4142/* p2 = T_2w * pw 求解p2*/43 p2 = T_2w * pw;4445/*输出在⼩萝⼘⼆号下的该点坐标*/46 cout<<"该点在⼩萝⼘⼆号下的坐标为: "<<p2.transpose()<<endl;4748return0;49 }欢迎⼤家关注我的微信公众号「佛系师兄」,⾥⾯有关于 Ceres 以及 OpenCV 库的⼀些⽂章。

计算机视觉技术中的视觉SLAM方法

计算机视觉技术中的视觉SLAM方法

计算机视觉技术中的视觉SLAM方法计算机视觉技术中的视觉SLAM(Simultaneous Localization and Mapping)是一种重要的技术手段,用于实现机器或无人系统在未知环境中的自主定位和建图。

视觉SLAM方法通过分析场景中的图像或视频流,提取出关键的视觉特征,并通过特征匹配、视觉里程计、重建和优化等步骤,实现对环境的定位和地图的构建。

视觉SLAM方法有着广泛的应用,如无人飞行器、自动驾驶汽车、增强现实等领域。

在这些应用中,视觉SLAM能够帮助机器或系统在未知环境中实现自主导航和场景理解,提高其感知能力和操作能力。

视觉SLAM方法主要可以分为稀疏SLAM和稠密SLAM两大类。

稀疏SLAM方法采用基于特征的方法,即通过提取场景中的显著特征点或关键帧进行定位和建图。

典型的算法有基于滤波的扩展卡尔曼滤波(EKF-SLAM)和基于优化的非线性后端优化(BA)等方法。

扩展卡尔曼滤波是最早提出并应用于SLAM问题的方法之一。

它基于线性化的状态空间模型,通过滤波器进行状态估计和地图更新,但在处理大规模、复杂环境时存在计算效率低和不稳定的问题。

非线性后端优化方法是基于图优化理论的方法,通过最小化误差函数对状态和地图进行联合优化,可以得到更准确的定位和地图。

典型的算法有基于因子图的优化(GTSAM)和基于位姿图的优化(Pose Graph Optimization)等方法。

稠密SLAM方法则采用光流法或深度学习方法,通过计算相邻帧之间的像素位移或深度信息,实现对环境的精确建模。

典型的算法有基于基础矩阵的方法(例如,八点法、五点法)和基于深度学习的全局优化方法(例如,地图拼接网络、深度光度法)等。

八点法是基础矩阵计算中最简单常见的算法之一,通过至少通过八对对应点对计算出两帧之间的基础矩阵,从而实现相机运动的估计和地图的重建。

八点法基于线性方程组的求解,具有计算效率高的优势,但对输入数据质量和数量有一定要求。

刚体在三维空间的旋转(关于旋转矩阵、DCM、旋转向量、四元数、欧拉角)

刚体在三维空间的旋转(关于旋转矩阵、DCM、旋转向量、四元数、欧拉角)

刚体在三维空间的旋转(关于旋转矩阵、DCM、旋转向量、四元数、欧拉角)最近学习了一些关于三维空间旋转相关的知识,借此梳理一下备忘。

三维空间的旋转(3D Rotation)是一个很神奇的东东:如果对某个刚体在三维空间进行任意次的旋转,只要旋转中心保持不变,无论多少次的旋转都可以用绕三维空间中某一个轴的一次旋转来表示。

表示三维空间的旋转有多种互相等价的方式,常见的有旋转矩阵、DCM、旋转向量、四元数、欧拉角等。

本篇文章主要梳理一下这些表示方式及相互转换的方法。

1. 欧拉角(Euler Angle)最直观的表示方式是绕刚体自身的X、Y、Z三个轴分别进行旋转某个角度,这就是所谓的欧拉角(Euler Angle)表示方式。

Euler Angle需要注意的是,欧拉角的表示方式里,yaw、pitch、roll的顺序对旋转的结果是有影响的。

给定一组欧拉角角度值,比如yaw=45度,pitch=30度,roll=60度,按照yaw-pitch-roll的顺序旋转和按照yaw-roll-pitch的顺序旋转,最终刚体的朝向是不同的!换言之,若刚体需要按照两种不同的旋转顺序旋转到相同的朝向,所需要的欧拉角角度值则是不同的!另外需要注意的是,在欧拉角的表示方式里,三个旋转轴一般是随着刚体在运动,即wikipedia中所谓的intrinsic rotation,见下图动画所示(图来自wikipedia)。

相对应的另一种表示方式是,三个旋转轴是固定的,不随刚体旋转而旋转,即extrinsic rotation,这种表示方式在计算机视觉中不是很常用。

欧拉角的表示方式比较直观,但是有几个缺点:(1) 欧拉角的表示方式不唯一。

给定某个起始朝向和目标朝向,即使给定yaw、pitch、roll的顺序,也可以通过不同的yaw/pitch/roll的角度组合来表示所需的旋转。

比如,同样的yaw-pitch-roll顺序,(0,90,0)和(90,90,90)会将刚体转到相同的位置。

视觉SLAM十四讲——对极约束求解相机运动(2D-2D)

视觉SLAM十四讲——对极约束求解相机运动(2D-2D)

视觉SLAM⼗四讲——对极约束求解相机运动(2D-2D)主要内容1. 对极约束 ⼏何意义是,P,三者共⾯,对极约束同时包含了平移和旋转。

基础矩阵: 本质矩阵: 对极约束表⽰: 其中,分别表⽰为相机坐标系下归⼀化的平⾯坐标2. 本质矩阵的特点(3×3) 1)E在不同尺度下是等价的 2) 内在性质:奇异值必定是的形式 3)由于平移+旋转,共有6个⾃由度,但因为尺度等价性,E实际上有5个⾃由度3 本质矩阵求解——⼋点法 1) E的内在性质是⼀种⾮线性性质,在求解线性⽅程时会带来⿇烦,因此不会⽤5对点来求解。

2)未知数共有9个,只考虑尺度等价性,所以⽤8对2D-2D点来求解,线性变换的⽅法。

3)求解矩阵后,进⾏奇异值分解分(SVD),得到运动信息 4)分解的时候,会有4中情况,选取⼀个点进⾏求解,检测该点在两个相机下的深度信息,选取两个正的深度。

5)线性⽅程解可能不满⾜E的内在性质,将求解出来的矩阵投影到E所在的流形上。

4 单应矩阵H 定义与旋转,平移及平⾯的参数有关。

1) ⾃由度为8的单应矩阵可以通过4对匹配点进⾏计算(注意,这些特征点不能有三点共线的情况) 2)求解⽅法:直接线性变换法,对其进⾏分解得到运动信息,分解⽅法有数值法和解析法 4组解,(根据计算点的深度以及平⾯的法向量信息选取合理的解) 3)意义 3.1)描述了两个平⾯之间的映射关系,若所有特征点落在同⼀平⾯,则可以通过H估计运动, 具体应⽤在⽆⼈机携带俯视相机或扫地机器⼈的顶视相机中。

3.2)当特征点共⾯或者相机发⽣纯旋转时,基础矩阵⾃由度下降,H可以估计纯旋转的运动信息。

5. 在实际应⽤,为避免退化现象造成的影响,会同时估计F和H,选择其中重投影误差⽐较⼩的那个作为最终运动的估计结果。

6. 对极⼏何2D-2D的特点 1)尺度不确定性 t归⼀化相当于固定了尺度信息,成为单⽬SLAM的初始化,后⾯的轨迹和地图以此单位进⾏计算。

视觉SLAM:从理论到实践李群与李代数

视觉SLAM:从理论到实践李群与李代数

• 至此,说明了 SO(3) 与 so(3) 的对应关系。
3. 指数映射和对数映射
• se(3)到SE(3)的指数映射:
其中J为雅可比矩阵(留作习题)
3. 指数映射和对数映射
4. 李代数求导与扰动模型
4. 求导与扰动模型
• SLAM的定位即位姿估计
• 但李群无加法:
导数无从定义
• 解决办法:
• 同理,SE(3)亦有李代数se(3):
• 上尖尖^ 不再是反对称矩阵,但仍保留记法:
李括号:
2. 李群与李代数
• 习题部分请你验证se(3)和so(3)的李代数性质 • 注:
• 不同书籍对se(3)的平前的。
• 把李代数理解成向量形式或矩阵形式都是可以的。向量形式更加自然一些。
• 直观写法(以左乘为例)
• 在李群上左乘小量时,李代数上的加法相差左雅可比的逆
• 反之
• 李代数上进行小量加法时,相当于李群上左(右)乘一个带左(右)雅可比的量
• SE(3)比SO(3)更复杂: 这里不展开花体雅可比
4. 求导与扰动模型
• 通过BCH线性近似,可以定义李代数上的导数 • 考虑一个基本问题:旋转后的点关于旋转的导数
2. 李群与李代数
• 李代数:与李群对应的一种结构,位于向量空间。
• 通常记作小写的so(3)和se(3)。书中以哥特体突出显示。 • 事实上是李群单位元处的正切空间。
• 下面从旋转矩阵引出李代数 • 考虑任意旋转矩阵R,满足
2. 李群与李代数
• 令R随时间变化(连续运动),有: • 两侧对时间求导:
2. 李群与李代数
• 该式说明,对任意t,都可以找到一个R和一个 ������ 的对应关系 • 该关系称为指数映射(Exponential Map) • 这里的 ������ 称为SO(3)对应的李代数:so(3) • 问题:
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

17
3.2 实践部分:EIGEN
18
3.3 旋转向量、欧拉角
19 第三讲 三维空间刚体运动
• 除了旋转矩阵之外的旋转表示 • 三维旋转:三自由度,用 ������3 向量表示
• 方向为旋转轴、长度为转过的角度
• 称为角轴(Angle-Axis)或旋转向量(Rotation Vector)
������ = ������������
• 于是:
������21 = ������1−21 = ������1������2
• 进一步,三个坐标系亦有:
������3 = ������32������2 = ������32������21������1 = ������31������1
13 第三讲 三维空间刚体运动
• 加上平移: • 两个坐标系的刚体运动可以由 ������, ������ 完全描述。
10 第三讲 三维空间刚体运动
• 旋转
• 设某坐标系
发生了一次旋转,变成了
• 对于某个固定的向量 (向量不随坐标系旋转),它的坐标怎么变化?
• 坐标关系:
11 第三讲 三维空间刚体运动
• 左乘
,得:
12 第三讲 三维空间刚体运动
• 中间的矩阵 ������ 称为旋转矩阵 • 根据定义可以验证:
14 第三讲 三维空间刚体运动
• 齐次坐标与变换矩阵 • 用旋转+平移方式有一点不便之处,比如发生了两次变换: • 这时: • 叠加起来过于复杂
15 第三讲 三维空间刚体运动
• 改变形式,写成:
•记
���෤��� =
������ 1
• 那么多次变换就可写成:
• 这种用四个数表达三维向量的做法称 为齐次坐标
• 旋转矩阵转轴角
• 角度:
• 轴:
21 第三讲 三维空间刚体运动
• 欧拉角(Euler Angles)
• 将旋转分解为三次不同轴上 的转动,以便理解
• 例如:按 Z-Y-X 顺序转动 • 轴可以是定轴或动轴,顺序
亦可不同,因此存在许多种 定义方式不同的欧拉角
• 常见的有 yaw-pitch-roll (偏航-俯仰-滚转)角等等。
4
3.1 点、向量和坐标系,旋转矩阵
5 第三讲 三维空间刚体运动
• 点存在于三维空间之中 • 点和点可以组成向量 • 点本身由原点指向它的向量所描述
• 向量
• 带指向性的箭头 • 可以进行加法、减法等运算
6 第三讲 三维空间刚体运动
• 定义坐标系后,向量可以由 R3 坐标表示
• 坐标系:由三个正交的轴组成
23 第三讲 三维空间刚体运动
• 由于万向锁,欧拉角不适于插值和迭代,往往只用于人机交互中。 • 可以证明,用三个实数来表达三维旋转时,会不可避免地碰到奇异性问题。 • SLAM 程序中很少直接使用欧拉角表达姿态
24
3.4 四元数
25 第三讲 三维空间刚体运动
• 四元数(Quaternion)
视觉SLAM十四讲
从理论到实践
高翔 清华大学 2016年冬
2
第三讲 三维空间刚体运动
Chapter 3: 3D Space Rigid Body Motion
3 第三讲 三维空间刚体运动
• 本讲目标
• 理解三维空间的刚体运动描述方式:旋转矩阵、变换矩阵、四元数和欧拉角。 • 掌握Eigen库的矩阵、几何模块使用方法。
• 一个点的世界坐标为 ������������,机器人坐标 系下为 ������������ ,那么满足关系:
������������ = ������������������������������
• 反之亦然
• 在实际编程中,可使用 ������������������ 或 ������������������ 来 描述机器人的位姿。
• R是一个正交矩阵; • R的行列式为+1。
• 满足这两个性质的矩阵称为旋转矩阵
• Special Orthogonal Group 特殊正交群
• 旋转矩阵描述了两个坐标的变换关系
• 比如:
������1 = ������12������2
• 反之:
������2 = ������21������1
1. 绕物体的Z轴旋转,得到偏航角yaw; 2. 绕旋转之后的Y轴旋转,得到俯仰角pitch; 3. 绕旋转之后的X轴旋转,得到滚转角roll。
22 第三讲 三维空间刚体运动
• 万向锁(Gimbal Lock)
• ZYX顺序中,若Pitch为正负90度,则第三次旋转和第一次绕同一个轴,使得系统丢失 了一个自由度——存在奇异性问题
20 第三讲 三维空间刚体运动
• 角轴与旋转矩阵的不同
• 旋转矩阵:九个量,有正交性约束 和行列式值约束
• 角轴:三个量,没有约束
• 注意它们只是表达方式的不同,但表 达的东西可以是同一个
• 角轴也就是第四章要介绍的李代数
• 转换关系
• 轴角转旋转矩阵:罗德里格斯 公式(Rodrigues's Formula )
• 引入齐次坐标后,旋转和平移可以放 入同一个矩阵,称为变换矩阵
• 称为特殊欧氏群(Special Euclidean Group)
16 第三讲 三维空间刚体运动
• 类似的,可定义反向的变换:
• 例子
• 在SLAM中,通常定义世界坐标系 ������������ 与机器人坐标系 ������������
1. 将 ������ 的坐标用四元数表示(虚四元数): 2. 旋转之后的关系为:
可以验证这货也是虚四元数
• 四元数相比于角轴、欧拉角的优势:紧凑、无奇异性
29
3.5 *相似、仿射、射影变换(略)
30
3.6 实践部分:EIGEN几何模块
31
3.表达二维平面的旋转
• 四元数有三个虚部,可以表达三维空间中的旋转:
• 虚部之间的关系:
自己和自己的运算像复数 自己和别人的运算像叉乘
26 第三讲 三维空间刚体运动
• 和复数一样,单位四元数可以表达三维空间的一次旋转 • 四元数的一些运算和性质:
加减法 乘法
共轭 模长

乘法
数乘 点乘
27 第三讲 三维空间刚体运动
• 四元数和角轴的关系
• 角轴到四元数: • 四元数到角轴:
• 类似可知四元数亦可转换为旋转矩阵、欧拉角
28 第三讲 三维空间刚体运动
• 如何用四元数旋转一个空间点? • 设点 ������ 经过一次以 ������ 表示的旋转后,得到了 ������′ ,它们关系如何表示?
• 在SLAM中:
• 固定的世界坐标系和移动的机器人坐标系 • 机器人坐标系随着机器人运动而改变,每个时刻都有新的坐标系
9 第三讲 三维空间刚体运动
• 两个不同的坐标系 • 如何描述左侧到右侧的变化? • 直观看来由两个部分组成:
• 原点间的平移 • 三个轴的旋转
• 平移是一个向量 • 旋转是什么?
• 构成线性空间的一组基 • 左手系和右手系
7 第三讲 三维空间刚体运动
• 向量的运算可以由坐标运算来表达 • 加减法 • 内积 • 外积
这个定义 之后还要用
8 第三讲 三维空间刚体运动
• 目前为止都很平凡 • 但是有一个基本问题:
坐标系之间是如何变化的?
• 进而:
如何计算同一个向量在不同坐标系里的坐标?
相关文档
最新文档