设为首页收藏本站
楼主: 科蚪之家
收起左侧

【科技教学】SLAM的前世今生,未完待续。。。已完结

  [复制链接]
回帖奖励 60 金币 回复本帖可获得 5 金币奖励! 每人限 2 次
  • TA的每日心情
    开心
    2017-11-22 10:43
  • 签到天数: 30 天

    [LV.5]常住居民I

     楼主| 发表于 2017-9-19 14:22:14 | 显示全部楼层
    关于Kinect数据
      要打败敌人,首先要了解你的武器。不错,我们先介绍一下Kinect。众所周知这是一款深度相机,你或许还听说过别的牌子,但Kinect的价格便宜,测量范围在3m-12m之间,精度约3cm,较适合于小萝卜这样的室内机器人。它采到的图像是这个样子的(从左往右依次为rgb图,深度图与点云图):


    281101374082023.jpg



      Kinect的一大优势在于能比较廉价地获得每个像素的深度值,不管是从时间上还是从经济上来说。OK,有了这些信息,小萝卜事实上可以知道它采集到的图片中,每一个点的3d位置。只要我们事先标定了Kinect,或者采用出厂的标定值。
      我们把坐标系设成这个样子,这也是openCV中采用的默认坐标系。



    281101523452119.png


      o’-uv是图片坐标系,o-xyz是Kinect的坐标系。假设图片中的点为(u,v),对应的三维点位置在(x,y,z),那么它们之间的转换关系是这样的:



    281102277677973.png


      左侧的s为尺度因子,表示从相机光心出去的射线都会落在成像平面的同一个点上。如果我们不知道该点的距离,那么s就是一个自由变量。但在RGB-D相机中,我们在Depth图中知道了这个距离,它的读数dep(u,v)与真实距离相差一个倍数。如果也记作s,那么:  


    281102357209336.png

      后一个公式给出了计算三维点的方法。先从深度图中读取深度数据(Kinect给的是16位无符号整数),除掉z方向的缩放因子,这样你就把一个整数变到了以米为单位的数据。然后,x,y用上面的公式算出。一点都不难,就是一个中心点位置和一个焦距而已。f代表焦距,c代表中心。如果你没有自己标定你的Kinect,也可以采用默认的值:s=5000, cx = 320, cy=240, fx=fy=525。实际值会有一点偏差,但不会太大。

  • TA的每日心情
    开心
    8 小时前
  • 签到天数: 1026 天

    [LV.10]以坛为家III

    发表于 2017-9-19 15:10:13 来自手机 | 显示全部楼层

    回帖奖励 +5 金币

    这种高科技技术分析涨知识
  • TA的每日心情
    开心
    2017-11-22 10:43
  • 签到天数: 30 天

    [LV.5]常住居民I

     楼主| 发表于 2017-9-20 09:11:37 | 显示全部楼层
    定位问题
      知道了Kinect中每个点的位置后,接下来我们要做的,就是根据两帧图像间的差别计算小萝卜的位移。比如下面两张图,后一张是在前一张之后1秒采集到的:
        281102542054751.jpg
      你肯定可以看出,小萝卜往右转过了一定的角度。但究竟转过多少度呢?这就要靠计算机来求解了。这个问题称为相机相对姿态估计,经典的算法是ICP(Iterative Closest Point,迭代最近点)。这个算法要求知道这两个图像间的一组匹配点,说的通俗点,就是左边图像哪些点和右边是一样的。你当然看见那块黑白相间的板子同时出现在两张图像中。在小萝卜看来,这里牵涉到两个简单的问题:特征点的提取和匹配。
      如果你熟悉计算机视觉,那你应该听说过SIFT, SURF之类的特征。不错,要解决定位问题,首先要得到两张图像的一个匹配。匹配的基础是图像的特征,下图就是SIFT提取的关键点与匹配结果:
    281104007981229.png   
    281104219556359.png
      对实现代码感兴趣的同学请Google“opencv 匹配”即可,在openCV的教程上也有很明白的例子。上面的例子可以看出,我们找到了一些匹配,但其中有些是对的(基本平等的匹配线),有些是错的。这是由于图像中存在周期性出现的纹理(黑白块),所以容易搞错。但这并不是问题,在接下来的处理中我们会将这些影响消去。
      得到了一组匹配点后,我们就可以计算两个图像间的转换关系,也叫PnP问题。它的模型是这样的:
    281104432672303.png
      R为相机的姿态,C为相机的标定矩阵。R是不断运动的,而C则是随着相机做死的。ICP的模型稍有不同,但原理上也是计算相机的姿态矩阵。原则上,只要有四组匹配点,就可以算这个矩阵。你可以调用openCV的SolvePnPRANSAC函数或者PCL的ICP算法来求解。openCV提供的算法是RANSAC(Random Sample Consensus,随机采样一致性)架构,可以剔除错误匹配。所以代码实际运行时,可以很好地找到匹配点。以下是一个结果的示例。
    281105007677315.png
      上面两张图转过了16.63度,位移几乎没有。
      有同学会说,那只要不断匹配下去,定位问题不就解决了吗?表面上看来,的确是这样的,只要我们引入一个关键帧的结构(发现位移超过一个固定值时,定义成一个关键帧)。然后,把新的图像与关键帧比较就行了。至于建图,就是把这些关键帧的点云拼起来,看着还有模有样,煞有介事的:
    281105230804133.png
    1-200帧的匹配结果
      然而,如果事情真这么简单,SLAM理论就不用那么多人研究三十多年了(它是从上世纪90年代开始研究的)(上面讲的那些东西简直随便哪里找个小硕士就能做出来……)。那么,问题难在什么地方呢?

  • TA的每日心情
    开心
    昨天 00:27
  • 签到天数: 454 天

    [LV.9]以坛为家II

    发表于 2017-9-20 09:20:43 | 显示全部楼层
    感觉好复杂
  • TA的每日心情
    开心
    2018-5-16 09:47
  • 签到天数: 347 天

    [LV.8]以坛为家I

    发表于 2017-9-23 16:52:55 | 显示全部楼层

    回帖奖励 +5 金币

    前世今生啊

    本版积分规则

    快速回复 返回顶部 返回列表