LSD-SLAM笔记之SE3Tracking

LSD-SLAM的Tracking是算法框架中三大部分之一。其主要实现函数为SlamSystem::trackFrame

void SlamSystem::trackFrame(uchar* image, unsigned int frameID, bool blockUntilMapped, double timestamp)

这个函数的代码主要分为如下几个步骤实现:

  1. 构造新的图像帧:把当前图像构建为新的图像帧
  2. 更新参考帧:如果当前参考帧不是最近的关键帧,则更新参考帧
  3. 初始化位姿:把上一帧与参考帧的位姿当做初始位姿
  4. SE3求解:调用SE3Tracker计算当前帧和参考帧间的位姿变换
  5. 判断是否跟踪失败:根据跟踪的像素点个数多少以及跟踪质量来判断
  6. 关键帧筛选:通过计算得分确定是否构造新的关键帧

接下来主要介绍SE3求解关键帧筛选

1. SE3求解

LSD-SLAM在位姿估计中采用了直接法,也就是通过最小化光度误差来求解两帧图像间的位姿变化。并且采用了LM算法迭代求解。LSD-SLAM在求解两帧图像间的SE3变换主要在SE3Tracker类中进行实现。该类中有四个函数比较重要,分别为

函数SE3Tracker::trackFrame需要传入三个形参,从参考帧跟踪到当前帧,首先是两帧图像帧的实例,另外就是给定的初始位姿。对于初始位姿,LSD-SLAM中使用了上一帧和参考帧间的位姿作为当前位姿估计的初值(见上面的第3个步骤)。

SE3 SE3Tracker::trackFrame(
    TrackingReference* reference,
    Frame* frame,
    const SE3& frameToReference_initialEstimate);

SE3Tracker::trackFrame函数的主体是一个for循环,从图像金字塔的高层level-4开始遍历直到底层level-1。在循环内实现加权高斯牛顿优化算法(Weighted Gauss-Newton Optimization),其实就是增加了鲁棒函数的高斯牛顿。首先看一下SE3Tracker::trackFrame函数的代码结构,可以归纳为如下:

图像金字塔迭代level-4到level-1
Step1: 对参考帧当前层构造点云(reference->makePointCloud)
Step2: 计算变换到当前帧的残差和梯度(calcResidualAndBuffers)
Step3: 计算法方差归一化残差(calcWeightsAndResidual)
Step4: 计算雅克比向量以及A和b(calculateWarpUpdate)
Step5: 计算得到收敛的delta,并且更新SE3(inc = A.ldlt().solve(b))
重复Step2-Step5直到收敛或者达到最大迭代次数
计算下一层金字塔

接下来首先对SE3求解的算法原理做个详细的介绍。

1.1 直接法SE3图像对齐算法

1.1.1 优化模型——归一化方差的光度误差

在LSD-SLAM论文的3.3节介绍了这个对齐算法。首先给出优化模型(这里的标号与论文中的统一),论文采用了最小化归一化方差的光度误差(variance-normalized photometric error):

Ep(ξji)rp(p,ξji):σ2rp(p,ξji):=pΩDir2p(p,ξji)σ2rp(p,ξji)δ=Ii(p)Ij(ω(p,Di(p),ξji))=2σ2I+(rp(p,ξji)Di(p))2Vi(p)(12)(13)(14)

这里的 δ 为Huber-norm,表示为:
r2δ:=r22δ|r|δ2if|r|δotherwise(15)

式子中的 ξji 就是要求的两帧间的SE3变换(从 ij ,也就是参考帧到当前帧的变换),这里是用李代数的形式表示;这里的 p 是在参考帧 Ii 观测到的有深度信息( pΩDi )的 归一化图像点;函数 Di(p) 是点 p 在参考帧下的 逆深度 Vi(p) 是对应逆深度的方差;函数 ω(p,Di(p),ξji) 是3D投影变换(3D projective warp),把参考帧下 p 对应的3D点投影到当前帧的图像平面;这里的 σ2I 是图像的高斯噪声。

我们考虑,这里的归一化方差是什么意思?论文中在估计两帧间位姿变换的时候,把所有有逆深度假设的像素都用上了。但是每个逆深度的确定性不同,也就是有些逆深度比较准确,有些不准确。而准确与否则体现在逆深度的方差上了。因此在公式 (12) 中在残差上除以了方差做了归一化。在论文中考虑了两个方面的方差,一个是由逆深度估计不准确引入的,另外一个是由图像高斯噪声引起的。也即是说 (14) 式前面的是连个图像的图像高斯噪声,后面的是逆深度造成的误差。这里逆深度误差不确定性是根据下式计算得到的:

Σf=JfΣxJTf(11)

(14) 式的具体推导在代码部分讲详细说明。

论文中给出了3D投影变换 ω 的表达式,也就是论文中的公式 (3)

ω(p,Di(p),ξ)):=x/zy/z1/zwithxyz1:=expse(3)(ξ)px/dpy/d1/d1(3)

其实这个公式只是把3D点变换到单位平面上,这里有一个问题:一个是标红的 1/z 应该是 1 ,正确的写法应该是:
ω(p,Di(p),ξ))=x/
  • 10
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值