专栏名称: 泡泡机器人SLAM
SLAM的最新资讯,干货内容。
目录
相关文章推荐
51好读  ›  专栏  ›  泡泡机器人SLAM

【泡泡机器人原创专栏】PTAM跟踪过程中的旋转预测方法与跟踪失败后的重定位

泡泡机器人SLAM  · 公众号  · 机器人  · 2017-02-17 07:52

正文

各位“泡芙”大家好,这次给大家带来的是PTAM中跟踪过程的旋转预测方法与跟踪失败后如何重定位的介绍。


PTAM是一个很有年代的 SLAM Tracker。这里只选择了一个小点,就是PTAM是如何在跟踪过程中应对摄像头旋转的 ?


此预测方法的效果视频:



视频中演示的就是基于PTAM旋转预测思路的跟踪效果。每一帧跟踪算法所用的时间小于0.3毫秒,可以说非常快。 (PC平台 i5 CPU)


BTW   视频演示的全部代码已经上传到github。其中跟踪算法代码约80行左右。




PTAM在进行跟踪的每一帧都会首先调用一个CalcSBIRotation的方法,最开始读PTAM代码我总是很疑惑这个方法的作用。最后发现这个方法会计算一下当前帧相对于上一帧的Rotation。也就是旋转角度。计算完毕后再根据这个旋转角度进行调整,然后使用基于SSD的跟踪算法。因为预先计算了Rotation,当然SSD的结果也就会更加准确。当用户旋转摄像头的时候也就更加不容易丢失跟踪目标。


此方法的输入输出可以简单描述如下:

输入1 :图像1。(基准图片,缩放后的灰度图,分辨率40x30)

输入2 :图像2。(当前图片,缩放后的灰度图,分辨率40x30)

输出 : 图像2 相对于 图像1 的 变换矩阵(Pose Mat)



如上图所示,图像1也就是基准图片为左上角那片灰色图。不过真实大小是灰色区域面积的1/9(因为太小所以放大后显示的)。而图像2就是上图大图缩放后的灰度图。基于输出的Pose矩阵计算出白色的线框,它标识了基准图片的位置。


此方法采用的跟踪算法为 ESM 跟踪算法。跟踪算法可以分为很多类别,本方法是基于一张完整图的灰度信息进行计算。计算的理论依据可以查阅相关论文(论文见附录)。在此并不针对算法的理论进行分析,由于理论薄弱,算法推导部分我也没有完全理解,如果有对这个算法理解深入的还希望给予帮助和指导。


该算法的数学模型为


PTAM对此算法的实现基于CVD,TooN等库。我使用OpenCV重写此算法,重写后的算法关键步骤如下:



//基于传入的Pose 多次迭代
    for(int i = 0; i 
        //用上次的结果Pose,对图片变换。
        cv::warpAffine(...);
       
        //准备数学模型需要的参数,记录变换后图片和基准图片的差异程度
        cv::Vec3f v3Accum   //JT We
        cv::Vec6f v6Triangle(0, 0, 0, 0, 0, 0); //JT J
                 
        //利用参数,根据数学模型解方程.
        cv::Mat update; //∆p
        cv::solve(m3, v3Accum, update);
       
        //基于方程结果构建差异矩阵 3x3
        cv::Mat updateMat = cv::Mat::zeros(3, 3, CV_32F);

        //用差异矩阵 更新 Pose矩阵 进一步提高准确度 最终Pose矩阵为2x3
        Pose = Pose * updateMat;
       
    }

    //返回Pose



完整算法:

https://github.com/meiroo/ComputerCoil/blob/master/ThumbTracker/ThumbTracker.cpp


需要注意的是,重写后的算法相对于PTAM的算法有部分修改,也简化了一些。具体效果可以参考上面的视频,可以看到此方法有如下特点:


另外,上面视频同时演示了当跟踪失败,丢失目标后。当相机回到目标位置时候,还能重新定位pose。相机在不同位置时,也可以跟踪不同的目标。这是PTAM跟踪丢失后,重定位到关键帧的方法。



这张图上来恐怕没有人看不懂所谓的跟踪失败后重新定位是什么意思了。


资料来源 : Some techniques for agile visual tracking and SLAM


左上:跟踪失败后,当前摄像头采集的图片。


右上:resize 到 40x30


左下:blur


右下:从PTAM已经添加的关键帧中,寻找一个最匹配的。


如何从已有的图像中,寻找一个和当前图最匹配的图像呢?这就涉及到如何计算两个图像的匹配程度了,而直接对比像素信息是最直白的做法,在OpenCV中实现也只需要一行:



cv::norm(image1, image2, cv::NORM_L2SQR);



利用这个最直白的办法,PTAM可以做到从已有的关键帧中选择一个和当前图最相似的。然后利用上一篇文章中提到的 ESM 跟踪方法(输入两张缩略图,计算两张图的transform),可以估测出当前图相对于关键帧大概的旋转变化,这样由于既存的关键帧都记录了相应的位置等信息,也就能完成当前采集图的重定位,从而可以继续进入跟踪状态。


源代码链接:

https://github.com/meiroo/ComputerCoil


论文附录(Google即可以下载):



【版权声明】泡泡机器人SLAM的所有文章全部由泡泡机器人的成员花费大量心血制作而成的原创内容,希望大家珍惜我们的劳动成果,转载请务必注明出自【泡泡机器人SLAM】微信公众号,否则侵权必究!同时,我们也欢迎各位转载到自己的朋友圈,让更多的人能进入到SLAM这个领域中,让我们共同为推进中国的SLAM事业而努力!

【注】商业转载请联系刘富强([email protected])进行授权。普通个人转载,请保留版权声明,并且在文章下方放上“泡泡机器人SLAM”微信公

众账号的二维码即可。

【编辑】王琛