ORB-SLAM2关键点总结

[复制链接]
发表于 2026-1-24 22:38:29 | 显示全部楼层 |阅读模式
目次

1.ORB-SLAM2的总体框架是怎样的
2.ORB-SLAM2怎样举行初始化
3.ORB-SLAM2是怎样举行Tracking的
4.ORB_SLAM2怎样选取关键帧
5.ORB-SLAM2中有哪些(非线性/后端)优化的相干操纵
6.ORB-SLAM2维护了哪些图
7. ORB SLAM2中是怎样对舆图点举行筛选的?
8. ORB SLAM2中是怎样对关键帧举行剔除的?
9. ORB SLAM2中Loop Closing的详细实现流程是怎样的?
10.什么是Sim3优化
11.怎样明白视觉重投影偏差
12.简述PnP原理,实用的场景是什么?
13.关键帧的删除
14. 表明SLAM中的绑架标题
15.深度相机的RGBD传感器和深度传感器怎么做对齐
标定:
图像预处理处罚:
坐标转换:
对齐:
插值:
16.已经用激光雷达或双目相机收罗到室内的点云,怎么不通过视觉的方法,去撤除地面的信息
高度过滤:
RANSAC平面拟合:
地面分割算法:
基于法向量的分割:
17.ORB SLAM2中单目、双目和RGBD相机处理处罚有哪些差异?
17.两个相机分辨率差异,视场角差异,怎么消除影响
图像预处理处罚
多少变更
18.BA
19.三角化
 20.slam中的左扰动与右扰动
1.ORB-SLAM2的总体框架是怎样的

ORB-SLAM2一共有三个线程,分别是Tracking、Local Mapping、Loop Closing线程,,此中Tracking负责完成关键点提取,并举行帧间匹配,同时开端选取关键帧;Local Mapping线程重要举行关键点筛选和舆图点剔除,同时回环举行一个局部优化;Loop Closing线程重要举行检测。

2.ORB-SLAM2怎样举行初始化

ORB-SLAM2在举行跟踪前须要先完成初始化,初始化包罗相机初始帧位姿,新建舆图,新建关键帧等,ORB-SLAM2一共提供三种接口,分别为单目,双目,RGBD,此中单目初始化最为复杂,详细步调如下:
(1)探求匹配点:对前两帧图像提取ORB特性关键点,举行特性匹配,假如匹配点个数小于100以为匹配失败;
(2)由匹配点规复位姿:利用八点法同时盘算底子矩阵和本质矩阵,通过盘算评分比选择符合的结果来作为初始位姿
(3)创建初始舆图:根据前两帧位姿,利用三角法规复三维舆图点,创建初始如图,将这两帧都设为关键帧,并完成关键帧与关键帧,关键帧与舆图点的关联,对上述两个关键帧和舆图点举行一次全局BA,并选择舆图点深度的中位数作为单元标准1来举行舆图的尺寸初始化 
此中,单目初始化深度是根据三角化完成的,因此只有纯旋转是不敷的,还须要举行平移。
双目和RGBD初始化差异的是,初始化不须要三角化来规复深度,而是通过盘算左右目的差异得到深度和采取特定的传感器,因此只须要一个关键帧图像,不具有上面(3)中关键帧间关联和全局BA的操纵
3.ORB-SLAM2是怎样举行Tracking的

Tracking的目的是分身盘算速率和鲁棒性使适当前帧中的特性点可以跟踪匹配到上一帧,在ORB-SLAM2中一共利用了三种模子,分别是(1)活动模子;(2)关键帧模子;(3)重定位模子
(1)活动模子:假设相机活动是匀速的,根据上一帧的速率和位姿估计当前帧的位姿,然后举行跟踪匹配,也就是把舆图点再投影到当前帧举行匹配,然后就可以根据BA来举行优化了,相当于经典的PnP。假如帧与帧之间都采取暴力匹配的话,运行速率会受到很大限定,因此作者采取跟踪匹配加快了匹配过程(就是将上一帧的特性点投影到下一帧中,然后在投影点的附近地域举行搜刮)
(2)关键帧模子:和上一个关键帧匹配,采取BOW举行匹配加快
(3)重定位模子:和全部关键帧匹配,采取BOW举行匹配加快
这几个模子的利用规则是,(1)不好则利用(2),(2)不好则利用(3)        ·
在完成上述三个模子的匹配后,步调还会将局部舆图点投影到当前帧中实现一个匹配,目的是对局部舆图和局部关键帧举行更新(用于优化,以提拔速率)
4.ORB_SLAM2怎样选取关键帧

关键帧的选取标准是:
(1)间隔上一次重定位至少间隔20帧
(2)局部建图线程空闲,大概间隔上一次加入关键帧已往了20帧,防止图像重叠度太高,而且局部建图线程有空闲处理处罚新的关键帧。假如须要关键帧插入,而Local Mapping建图线程忙,则发送信号到Local Mapping建图线程,制止局部舆图优化,使得新的关键帧可以被实时处理处罚
(3)当前跟踪至少50个点,确保了跟踪定位的准确度
(4)当前帧跟踪到Local Map中参考帧的舆图点数量少于90%,确保关键帧之间有显着的视觉厘革
这里只是判断是否须要将当前帧加入到关键帧,并没有真正加入到全局舆图,由于Tracking线程的重要作用就是局部定位,而处理处罚舆图中的关键帧、舆图点,以及怎样加入、怎样删除的工作是在Local Mapping线程举行的
5.ORB-SLAM2中有哪些(非线性/后端)优化的相干操纵

一共有五种,分别是局部BA优化、全局BA优化、闭环位姿优化、全局位姿优化、单帧BA优化
(1)局部BA优化:运行在Local Mapping线程,在剔除关键帧之进步行局部舆图优化,当新的关键帧加入到convisibility graph时,作者在关键帧附近举行一次局部优化,优化目的是最小化重投影偏差

(2)全局BA优化:用于单目初始化的CreateInitialMapMonocular函数以及闭环优化的RunGlobalBundleAdjustment函数(在闭环竣事前新开一个线程,用于全剧优化)

(3)闭环位姿优化:当检测到闭环时,闭环毗连的两个关键帧的位姿须要通过SIM3/SE3优化,以使得其标准划一。优化求解两帧之间的相似变更矩阵,使得二维对应点的投影偏差小

(4)全局位姿优化:这相当于《视觉SLAM十四讲》中的Pose Graph,值得注意的是假如是单目的话这里优化的是Sim3,假如是双目大概RGBD的话这里优化的SE3,残差界说为
,ORB SLAM2中优化的对象是Essential Graph,Essential Graph指的是全部的关键帧极点,但是优化边大大淘汰,包罗spanning tree(天生树)和共视权重θ > 100 的边,以及闭环毗连边,闭环调解CorrectLoop过程中的优化。

(5)单帧BA优化:只优化当前帧pose,舆图点固定,用于LocalTracking中活动模子跟踪、参考帧跟踪、舆图跟踪TrackLocalMap、重定位,每举行过一次PnP投影操纵将舆图点投影到当前平面上之后,都会举行一次PoseOptimization位姿优化,通过BA优化重投影偏差
上面几张图把标题形貌得非常清晰,赤色的是优化的对象,灰色的是固定的对象,通过对比就能知道各个优化方法之间的区别。
6.ORB-SLAM2维护了哪些图

(1)Covisibility Graph:共视图,是一个无向有权图,该图中每个极点就是关键帧,假如两个关键帧有雷同的舆图点(即它们有共视点),就把这两个极点毗连起来,毗连边的权重就是两个关键帧共享的3D点的个数。局部BA优化依赖的就是一个局部的共视图,全局BA优化依赖的就是一个全局的共视图,总之共视图在ORB-SLAM2里用的许多。
(2)Essential Graph:为了在优化阶段减小盘算量,ORB-SLAM2作者提出了Essential Graph的概念,重要用它来举行全局位姿优化。它是共视图的子集,即Covisibity Graph的最小天生树(MST)。该图中极点是关键帧,但只毗连某个关键帧和与之拥有最多共享的舆图点的关键帧,如许可以大概毗连全部的极点,但是边会淘汰许多。
(3)Spanning Graph:天生树,是代价最小的全联通图,Essential Graph就是基于Sanning Graph天生的。
如下图所示可以观察他们的区别:

7. ORB SLAM2中是怎样对舆图点举行筛选的?

在Local Mapping线程中在举行局部BA之前会先对舆图点举行剔除,剔除规则如下:
(1)该舆图点是坏点,直接从查抄列表去掉;
(2)跟踪(匹配上)到该舆图点的平凡帧帧数(Increase Found)小于应该观测到该舆图点的平凡帧数量(25%*Increase Visible),即比值mnFound/mnVisible小于0.25,设置为坏点,并从查抄列表去掉。比值低分析如许的舆图点该舆图点虽在视野范围内,但很少被平凡帧检测到
(3)从添加该舆图点的关键帧算起,当前关键帧至少是第三个添加该舆图点的关键帧的条件下,看到该舆图点的帧数<=2(双目和RGBD模式是帧数<=3),设置为坏点,并从查抄列表去掉;因此在舆图点刚创建的阶段,要求比力严格,很容易被剔除;而且单目的要求更严格,须要三帧都看到;
(4)若从添加该舆图点的关键帧算起,一共有了大于三个关键帧,还存在列表中,则分析该舆图点是高质量的,从查抄列表中去掉。
总而言之就是太少帧看到的舆图点是坏点都要剔撤除,而看得多的则是高质量点
8. ORB SLAM2中是怎样对关键帧举行剔除的?

候选的关键帧是LocalMapping中当前处理处罚的关键帧的共视关键帧,不包罗第一帧关键帧与当前关键帧。假如一个关键帧检测到的90%的舆图点,在其他不少于三个具有雷同或更准确标准的关键帧内里都被检测到,就认定该关键帧冗余(该关键帧的存在提供的舆图点观测信息有限),并剔除。
9. ORB SLAM2中Loop Closing的详细实现流程是怎样的?

起首是通过回环检测(Bow得分)和共视关系查抄从全部关键帧中筛选出一组和当前帧有大概形成闭环的候选帧,然后利用相似求解器Sim3Solver求解出候选帧与当前帧之间的相似变更(注意这里是单目相似变更,而双目大概RGBD是刚体变更),利用相似变更找出更多的匹配舆图点,然后举行闭环位姿优化(对应5中的答复),假如优化结果较好的话就不再判断其他候选帧。然后就是闭环改正,通过就出来的相似变更对当前帧举行位姿调解而且传播到当前帧相连的关键帧,回环两侧的关键帧完成对齐,然后利用调解过的位姿更新这些相连关键帧对应的舆图点,同时在Covisibility Graph内里增长闭环边,然后举行Essential Graph的优化(即全局位姿优化),当前帧与闭环匹配帧之间的边不举行优化,末了再来一个全局BA优化即完成了Loop Closing的全部流程。
10.什么是Sim3优化

Sim3优化是单目特有的优化方式,由于单目标准具有不确定性,对于空间点坐标有如下相似变更:

于是我们创建了一个相似变更群Sim(3)

其对应的李代数如下

相比于欧式群的李代数其多了一个σ,酿成了一个七维向量,而不是六维,关联Sim(3) 和s i m ( 3 )的照旧指数映射和对数映射,指数映射为

此中

微分求导模子和扰动求导模子对其同样实用。Sim3优化实在就是Pose Graph优化,其优化目的残差是

其优化结果如下:

11.怎样明白视觉重投影偏差

对于单目视觉来说,3D点是通过两帧图像规复得到的。3D点通过相机位姿重新投影到相机平面,与其对应像素点之间的像素差被称为重投影偏差,也算是观察偏差,投影的相机平面一样寻常都是利用归一化平面。终极要优化的是重投影偏差,理想环境下像素差是0。
12.简述PnP原理,实用的场景是什么?

答:PnP是已知n个3D点坐标和其对应的2D相机投影点坐标,求解相机位姿,此中至少须要3对点(3D-2D)可求解(平移+旋转一共6个自由度)。
此中求解方法有:DLT(直接线性变更法,至少6对点,由于旋转平移矩阵3*4个未知量),P3P(余弦定理、三角形相似),EPnP等
13.关键帧的删除

在局部建图线程,查抄到当前关键帧为冗余关键帧了(内里有90%的舆图点都被至少其他三帧观察到过,就会设置为冗余关键帧举行删除
14. 表明SLAM中的绑架标题

绑架标题就是重定位,是指呆板人在缺少之前位置信息的环境下,怎样去确定当前位姿。比方当呆板人被安置在一个已经构建好舆图的环境中,但是并不知道它在舆图中的相对位置,大概在移动过程中,由于传感器的暂时性功能故障或相机的快速移动,都导致呆板人先前的位置信息的丢失,在这种环境下怎样重新确定自己的位置。
初始化绑架可以论述为一种通常状态初始化标题,可利用蒙特卡洛估计器,即粒子滤波方法,重新分散粒子到三维位形空间内里,被里程信息和随机扰动不绝更新,初始化粒子聚集到/收敛到可表明观察结果的地域。追踪丢失状态绑架,即在绑架发生之前,体系已经生存当前状态,则可以利用除视觉传感器之外的其他的传感器作为候补丈量装备
15.深度相机的RGBD传感器和深度传感器怎么做对齐

深度相机的 RGBD 传感器和深度传感器对齐通常须要以下几个步调:
标定:

对 RGB 图像和深度图像举行标定,获取内参(焦距、主点位置)和外参(相机之间的相对位置和姿态)。可以利用标定板和 OpenCV 的相机标定工具。

图像预处理处罚:


对 RGB 图像和深度图像举行预处理处罚,比方去噪和图像增强,以进步后续对齐的正确性。

坐标转换:

将深度图像的深度值转换为三维点云(XYZ 坐标),利用内参将深度值转换为相机坐标系中的点。

对齐:


利用外参将 RGB 图像的坐标系转换到深度图像的坐标系(或反之)。可以通过以下步调实现:
将 RGB 图像的像素坐标转换为相机坐标。
利用外参(旋转清静移矩阵)将 RGB 坐标系下的点转换到深度图的坐标系中。

插值:


对齐后,大概须要利用插值方法(如双线性插值)将 RGB 图像的颜色信息映射到深度图像的每个深度点上,弥补无效的深度值地域。

16.已经用激光雷达或双目相机收罗到室内的点云,怎么不通过视觉的方法,去撤除地面的信息

去除室内点云中地面信息可以通过几种方法实现,重要依赖于点云的多少特性而不是视觉信息。以下是一些常用的方法:
高度过滤:

根据点的高度值(z 坐标),设置一个阈值来过滤地面点。通常,地面点的高度值会小于某个预设值。

RANSAC平面拟合:


利用 RANSAC 算法拟合平面模子。起首,从点云中随机选择点,迭代盘算平面参数,然后盘算与该平面的间隔,去除间隔较小的点(即地面点)。

地面分割算法:


利用基于体素的分割方法(如体素网格滤波器),将点云分别为差异的体素,然后盘算每个体素的高度,去除较低的体素。

基于法向量的分割:


盘算每个点的法向量,找到与地面法向量靠近的点。可以设置阈值,去除法向量与预设地面法向量夹角小于肯定值的点。
17.ORB SLAM2中单目、双目和RGBD相机处理处罚有哪些差异?

(1)在初始化的时间,这个地方很显着的,关于深度,单目是直接三角化,而双目和RGBD是直接用的深度图内里的深度
在Track()函数初始化阶段中有:
  1. if(mState==NOT_INITIALIZED)//未进行初始化
  2. {
  3.    if(mSensor==System::STEREO || mSensor==System::RGBD)
  4.        StereoInitialization();
  5.    else
  6.        MonocularInitialization();
  7.    mpFrameDrawer->Update(this);
  8.    if(mState!=OK)
  9.        return;
  10. }
复制代码
MonocularInitialization()函数中内里涉及到的东西许多,此中包罗分别盘算F矩阵和H矩阵以及他们的得分,并确定用哪个矩阵规复出来的变更关系举行三角化,代码太长就不贴出来了,在单目中深度的标准是初始化时使得匀称值为1确定的。
StereoInitialization();函数就相对较短了,最重要的部门是
  1. for(int i=0; i<mCurrentFrame.N;i++)
  2. {
  3.      float z = mCurrentFrame.mvDepth[i];
  4.      if(z>0)
  5.      {
  6.          cv::Mat x3D = mCurrentFrame.UnprojectStereo(i);//从相机坐标系转到世界坐标系
  7.          MapPoint* pNewMP = new MapPoint(x3D,pKFini,mpMap);//往地图里添加的是世界坐标系下的关键点,每个关键点是一个类,这个点类知道自己对应的关键帧是哪个,地图是哪个
  8.          pNewMP->AddObservation(pKFini,i);
  9.          pKFini->AddMapPoint(pNewMP,i);
  10.          pNewMP->ComputeDistinctiveDescriptors();//计算该点的描述子
  11.          pNewMP->UpdateNormalAndDepth();//计算法向量和深度 TODO:法向量是干嘛的?
  12.          mpMap->AddMapPoint(pNewMP);
  13.          mCurrentFrame.mvpMapPoints[i]=pNewMP;
  14.      }
  15. }
复制代码
可以看到是判断关键点在深度图上是否有深度,有的话就直接用深度图的值天生空间点
  1. cv::Mat Frame::UnprojectStereo(const int &i)
  2. {
  3.     const float z = mvDepth[i];
  4.     if (z > 0)
  5.     {
  6.         const float u = mvKeysUn[i].pt.x;
  7.         const float v = mvKeysUn[i].pt.y;
  8.         const float x = (u - cx) * z * invfx;
  9.         const float y = (v - cy) * z * invfy;
  10.         cv::Mat x3Dc = (cv::Mat_<float>(3, 1) << x, y, z);
  11.         return mRwc * x3Dc + mOw;
  12.     }
  13.     else
  14.         return cv::Mat();
  15. }
复制代码
(2)是在LocalMapping函数中天生新的舆图点的时间,区别和上面第1点是一样的
代码如下
  1. if(cosParallaxRays<cosParallaxStereo && cosParallaxRays>0 && (bStereo1 || bStereo2 || cosParallaxRays<0.9998))
  2. {
  3.     // Linear Triangulation Method
  4.     cv::Mat A(4,4,CV_32F);
  5.     A.row(0) = xn1.at<float>(0)*Tcw1.row(2)-Tcw1.row(0);
  6.     A.row(1) = xn1.at<float>(1)*Tcw1.row(2)-Tcw1.row(1);
  7.     A.row(2) = xn2.at<float>(0)*Tcw2.row(2)-Tcw2.row(0);
  8.     A.row(3) = xn2.at<float>(1)*Tcw2.row(2)-Tcw2.row(1);
  9.     cv::Mat w,u,vt;
  10.     cv::SVD::compute(A,w,u,vt,cv::SVD::MODIFY_A| cv::SVD::FULL_UV);
  11.     x3D = vt.row(3).t();
  12.     if(x3D.at<float>(3)==0)
  13.         continue;
  14.     // Euclidean coordinates
  15.     x3D = x3D.rowRange(0,3)/x3D.at<float>(3);
  16. }
  17. else if(bStereo1 && cosParallaxStereo1<cosParallaxStereo2)
  18. {
  19.     x3D = mpCurrentKeyFrame->UnprojectStereo(idx1);               
  20. }
  21. else if(bStereo2 && cosParallaxStereo2<cosParallaxStereo1)
  22. {
  23.     x3D = pKF2->UnprojectStereo(idx2);
  24. }
复制代码
这内里就是须要判断单目照旧双目,新的空间点从双目中哪个去规复更符合。
(3)末了就是在后端优化的时间,不管局部BA照旧全局BA照旧PnP,单目和双目(RGBD)的偏差函数是差异的,双目和你说的一样须要将偏差投到两个相机上,而且第二个相机上只有u这个方向上的偏差
代码如下:
  1. if(pKF->mvuRight[mit->second]<0)
  2. {
  3.      Eigen::Matrix<double,2,1> obs;
  4.      obs << kpUn.pt.x, kpUn.pt.y;
  5.      g2o::EdgeSE3ProjectXYZ* e = new g2o::EdgeSE3ProjectXYZ();
  6.      e->setVertex(0, dynamic_cast<g2o::OptimizableGraph::Vertex*>(optimizer.vertex(id)));
  7.      e->setVertex(1, dynamic_cast<g2o::OptimizableGraph::Vertex*>(optimizer.vertex(pKF->mnId)));
  8.      e->setMeasurement(obs);
  9.      const float &invSigma2 = pKF->mvInvLevelSigma2[kpUn.octave];
  10.      e->setInformation(Eigen::Matrix2d::Identity()*invSigma2);
  11.      if(bRobust)
  12.      {
  13.          g2o::RobustKernelHuber* rk = new g2o::RobustKernelHuber;
  14.          e->setRobustKernel(rk);
  15.          rk->setDelta(thHuber2D);
  16.      }
  17.      e->fx = pKF->fx;
  18.      e->fy = pKF->fy;
  19.      e->cx = pKF->cx;
  20.      e->cy = pKF->cy;
  21.      optimizer.addEdge(e);
  22. }
  23. else
  24. {
  25.      Eigen::Matrix<double,3,1> obs;
  26.      const float kp_ur = pKF->mvuRight[mit->second];
  27.      obs << kpUn.pt.x, kpUn.pt.y, kp_ur;
  28.      g2o::EdgeStereoSE3ProjectXYZ* e = new g2o::EdgeStereoSE3ProjectXYZ();
  29.      e->setVertex(0, dynamic_cast<g2o::OptimizableGraph::Vertex*>(optimizer.vertex(id)));
  30.      e->setVertex(1, dynamic_cast<g2o::OptimizableGraph::Vertex*>(optimizer.vertex(pKF->mnId)));
  31.      e->setMeasurement(obs);
  32.      const float &invSigma2 = pKF->mvInvLevelSigma2[kpUn.octave];
  33.      Eigen::Matrix3d Info = Eigen::Matrix3d::Identity()*invSigma2;
  34.      e->setInformation(Info);
  35.      if(bRobust)
  36.      {
  37.          g2o::RobustKernelHuber* rk = new g2o::RobustKernelHuber;
  38.          e->setRobustKernel(rk);
  39.          rk->setDelta(thHuber3D);
  40.      }
  41.      e->fx = pKF->fx;
  42.      e->fy = pKF->fy;
  43.      e->cx = pKF->cx;
  44.      e->cy = pKF->cy;
  45.      e->bf = pKF->mbf;
  46.      optimizer.addEdge(e);
  47. }
复制代码
注意到单目界说的边是EdgeSE3ProjectXYZ(),双目界说的边是EdgeStereoSE3ProjectXYZ(),此中盘算偏差的函数是差异的,分别是
  1. Vector2d EdgeSE3ProjectXYZ::cam_project(const Vector3d & trans_xyz) const{
  2.   Vector2d proj = project2d(trans_xyz);
  3.   Vector2d res;
  4.   res[0] = proj[0]*fx + cx;
  5.   res[1] = proj[1]*fy + cy;
  6.   return res;
  7. }
复制代码

  1. Vector3d EdgeStereoSE3ProjectXYZ::cam_project(const Vector3d & trans_xyz, const float &bf) const{
  2.   const float invz = 1.0f/trans_xyz[2];
  3.   Vector3d res;
  4.   res[0] = trans_xyz[0]*invz*fx + cx;
  5.   res[1] = trans_xyz[1]*invz*fy + cy;
  6.   res[2] = res[0] - bf*invz;
  7.   return res;
  8. }
复制代码
17.两个相机分辨率差异,视场角差异,怎么消除影响

图像预处理处罚



  • 缩放:根据须要,将两幅图像缩放到雷同的分辨率。这可以通过插值方法(如双线性插值、双立方插值等)实现。
  • 裁剪:根据视场角,将图像裁剪到雷同的视角。选择符合的裁剪地域,以确保告急信息不被丢失。
多少变更



  • 假如相机之间的视场角差异,大概须要对图像举行多少变更(如仿射变更或单应性变更)。
  • 通过匹配的关键点盘算变更矩阵,并应用于此中一幅图像。

相机视场角(Field of View, FOV)差异会带来几个直接影响:

  • 图像覆盖范围

    • 视场角较大的相性能捕捉更广阔的场景,而视场角较小的相机则只能捕捉较小的地域。这大概导致在对同一场景举行比力时,两个相机的图像内容有明显差异。

  • 透视结果

    • 视场角的差异会影响透视结果,较大的视场角大概导致物体看起来更小且更远,而较小的视场角则会让物体显得更近。这个透视厘革会影响物体的相对巨细和空间关系。

  • 图像扭曲

    • 较大视场角的相机(特别是鱼眼镜头)大概会产生较强的桶形或枕形畸变。这种畸变须要通过后处理处罚举行校正。

18.BA

BA是一种后端优化方法,先根据相机模子和A,B图像特性匹配好的像素坐标,求出A图像上的像素坐标对应的归一化的空间点坐标,然后根据该空间点的坐标盘算重投影到B图像上的像素坐标,重投影的像素坐标(估计值)与匹配好的B图像上的像素坐标(丈量值),不会完全重合,BA的目的就是每一个匹配好的特性点创建方程,然后联立,形成超定方程,解出最优的位姿矩阵空间点坐标。而超定方程,就是通过构建最小二乘标题求解最小化重投影偏差 来优化相机位姿和 3D 路标点的估计的。





上面的优化方程中可以得知ba优化的目的函数是在优化丈量值和重投影偏差之间的差值,这里利用的是二范数来举行优化,而且须要注意的是,BA优化既可得到优化的位姿矩阵,也可以得到空间点坐标。由于BA可以得到空间点的坐标,如许在优化过程中,一帧图像中有成万的点去优化,如许减慢了优化的服从,因此位姿图应运而生。
19.三角化

单目SLAM种,仅通过单张图像无法得到像素的深度信息,须要通过三角丈量(Triangulation)(或三角化)的方法来估计舆图点的深度。


通过最小二乘求深度


 


 20.slam中的左扰动与右扰动

slam中的左扰动和右扰动是两种差异的数学工具和方法,用于处理处罚呆板人或物体的姿态估计和优化标题。
左扰动:通常指对变更矩阵(如旋转矩阵清静移向量构成的位姿矩阵)的左侧应用微小的扰动。这种扰动反映了从当前状态到目的状态的厘革,常用于局部坐标系下的更新和优化;比方当呆板人再位置环境中移动时,可通过左扰动不绝调解自己的位置和姿态,以更好地顺应环境并构建舆图。
右扰动:指对变更矩阵的右侧应用微小的扰动。这种扰动更多用于全局坐标系下的转换和优化,当须要局部舆图归并到全局舆图时,或须要再差异坐标系之间举行转换时,常利用右扰动;在处理处罚回环检测时,通过右扰动可以有用修正累计偏差并优化位姿估计。
区别和接洽:左扰动和右扰动的重要区别就是对变更矩阵的应用位置差异,左扰动影响变更矩阵的左侧部门(即当前状态到目的状态的厘革),右扰动影响的是变更矩阵的右侧部门(即目的状态到当前状态的厘革),在局部坐标系的更新中更多利用左扰动,而全局坐标系转换则更多是右扰动。


参考链接:https://blog.csdn.net/weixin_46135347/article/details/120160599
https://www.cnblogs.com/linglingdog/p/15874424.html
https://blog.csdn.net/weixin_44580210/article/details/90760584


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表