ARCore之路-技术原理(一)

版权声明:David Wang原创ARCore文章,仅供学习研究之用,不得用于任何商业目的,未经授权不得转载! https://blog.csdn.net/yolon3000/article/details/81516942

一、位置追踪

这里写图片描述

  谈到位置追踪,不得不说SLAM(simultaneous localization and mapping)即时定位与地图映射, SLAM最早由科学家Smith、Self、Cheeseman于1988年提出,SLAM 问题可以描述为:将一个机器人放入未知环境中的未知位置,是否有办法让机器人逐步描绘出此环境完全的地图,所谓完全的地图(a consistent map)是指不受障碍行进到房间可进入的每个角落。SLAM作为一种基础技术,从最早的军事用途(核潜艇海底定位就有了SLAM的雏形)到今天,已经逐步走入人们的视野。当前,在室外我们可以利用GPS、北斗等导航系统实现非常高精度的定位,甚至利用RTK的实时相位差分技术,能实现厘米的定位精度,基本上解决了室外的定位和定姿问题,但室内定位则发展则缓慢得多,为了实现室内的定位定姿,SLAM技术逐渐脱颖而出。SLAM一般处理流程包括track和map两部分。所谓的track是用来估计相机的位姿,也叫前端,而map部分(后端)则是深度的构建,通过前面的跟踪模块估计得到相机的位姿,采用三角法(triangulation)计算相应特征点的深度,然后进行当前环境map的重建,重建出的map同时为前端提供更好的姿态估计,并可以用于例如闭环检测。
  定位与重建也是AR中必须解决的问题,不解决我在哪的问题,其他就无从谈起,目前,从技术角度来看,解决室内定位与定姿主要有视觉惯性测距系统(Visual Inertial Odometry,简称 VIO),VIO 意味着可以通过软件实时追踪用户的空间位置(用户在空间上的 6自由度姿势),6 自由度是指 xyz 方向上的三维运动(移动)加上俯仰/偏转/滚动(旋转)。VIO在每帧刷新之间重新计算用户的位置,速度为每秒 30 次及以上,这些计算是并行完成两次,通过视觉(摄像)系统将现实世界中的一个点与摄像机传感器上的一帧像素相匹配,从而追踪用户的姿势。惯性导航系统(用户的加速度计和陀螺仪跟踪统称为惯性测量单元,Inertial Measurement Unit,简称IMU)也可以追踪用户的姿势。在计算完上述过程之后,,卡尔曼滤波器( Kalman Filter)结合两个系统的输出结果,决定哪一个系统提供的估测更接近用户的“真实”位置(地面实况)并通过软件更新当前位置。VIO 系统追踪用户的设备在六维空间里的移动,好比用户汽车里的里程表测量车的行驶距离一样。
  VIO 带来的最大好处是 IMU 的读数大约为 1000次每秒并且是基于加速度的(用户的移动)。航迹推算法(Dead Reckoning)用于测量 IMU 读数之间的设备移动,但这种方法推算是一种估算,就像如果我让你向前走一步,然后猜测走了多远一样,此时会用航迹推算法来估计距离。但惯导系统中的误差会随时间累积,所以 IMU 帧率越长,惯导系统从视觉系统中复位后的时间越长,追踪位置距离真实位置偏差就越多。
  视觉/光学测量使用的是摄像机来采集视觉信息,设备帧率通常为 30fps 并且依赖距离(不同的场景帧率也有所不同)。光学系统通常随着距离的增大误差也不断的增大(时间也会有轻度影响),所以用户运动得越远,误差就越大。
  惯性导航系统与视觉测量系统各有各的优势和不足。并且视觉和惯性跟踪系统是基于完全不同的测量系统,他们之间并没有相互依赖。这意味着可以盖住摄像机或者只看到一个具有很少光学特征的场景(比如白墙),而惯性系统照样可以正常工作,或者设备在完全静止的条件下,视觉系统可以呈现出一个比惯性系统更加稳定的姿态。卡尔曼滤波器不断地选择最佳姿态,从而实现稳定跟踪。当前, VIO 系统已经存在很多年并在业界广泛认可,并且在应用市场已经有相当一部分应用。
  为了获得 精确的定们,需要从两个不同的地方获得场景视图,然后对当前位置进行立体计算。我们眼睛就是这样看到的 3D 效果,一些跟踪器也因此而依赖立体相机。如果你有两台相机就很容易计算,知道它们之间的距离,而且同时捕获帧,用一个相机你可以捕捉一次画面,然后移动到下一个位置进行第二次捕捉,然后进行视差计算。使用 IMU 航位推算你可以计算两次捕获位置之间的距离然后正常进行立体计算(事实上你可以多捕获几次使计算更加准确)。为了获得度量尺度,系统同时依赖 IMU 的精确航迹推算,从 IMU 提供的加速度和时间测量中,可以向后合并以计算速度并且再次向后合并以获取画面之间的实际距离,但是困难的是从 IMU 中除去误差以获得精确的加速度测量,在设备移动的几秒钟之内,一个微小的错误每秒运行一千次,就会造成 30% 或更大程度的误差积累。
  深度相机可以通过以下几种方式帮助 VIO 系统。在低特征场景中,深度相机对提高地面实况,度量标度以及边界追踪的精度方面有很大的帮助。但是它们非常耗能,因此只有在非常低的帧率以及帧间使用深度相机和 VIO 才是有意义的,它们在户外也不会正常运行,因为来自太阳光的红外散射会过滤掉深度相机中的红外线。移动设备深度相机的拍摄范围也比较有限,这意味它们只适合在手机上的短距离范围内使用(几米的范围),另外深度相机在 BOM 成本方面也是非常昂贵的,因此 OEM 厂商避免在大容量手机上使用它们。
  立体 RGB 或鱼眼镜头都有助于看到更大范围的场景(因为立体 RGB 和鱼眼镜头具有潜在的光学特性。例如普通镜头可能只会看到白色的墙壁,但是一个鱼眼设备可以在画面中看到有图案的天花板和地毯 - Tango 和 Hololens 使用这种方法)。并且相对 VIO 而言,它们可以以更低的计算成本来获取深度信息,尽管 VIO 使用较低的 BOM 和功率也可以达到同样的精度。由于手机立体摄像头(即使是 HMD)之间的距离非常近,因此手机上深度计算的精度范围也被受到限制(相隔数厘米距离的手机相机在深度计算的误差上可以达到数米)。

二、视觉校准

这里写图片描述

  为了使软件能够精确地知道摄像机传感器上的像素是否能够与现实世界中的点相匹配,摄像机系统需要精确地校准。这儿有两种类型的校准:
  几何校准:使用相机的针孔模型来校正镜头的视野和镜筒效果等。基本上由于镜头的形状所有的图像都会产生变形,大多数软件开发人员可以在没有 OEM(Original Equipment Manufacturer,原始设备制造商) 输入的情况下使用棋盘格和基本公开的相机规格进行几何校正。
  光度校准:这里涉及到很多东西,通常要求 OEM 厂商参与。因为光度校准涉及到图像传感器本身的细节特征以及内部透镜所有的涂层等,光度校准一般用于处理色彩和强度的映射。例如,正在拍摄遥远星星的望远镜连接的摄像机需要知道传感器上一个像素光强度的轻微变化是否确实是星星还是仅仅来源于传感器或透镜中的像差。光度校准对于 AR 跟踪器的好处是提高了传感器上的像素和真实世界中的点的匹配度,因此视觉跟踪具有更强的鲁棒性以及更少的错误。

三、惯性校准

  当我们在思考 IMU 时,记住 IMU 是用来测量加速度而不是距离或速度的,这点很重要,距离是时间的二次方,IMU 读取错误造成的计算结果会随着时间的推移快速积累,校准和建模的目标就是确保距离测量足够精确。理想情况下,在使用IMU时可以使摄像机是有足够长的时间来弥补由于用户覆盖镜头或者场景中发生其他事情所造成数帧跟踪的丢失。使用 IMU 测量距离被称为航迹推算,这是一种估测,但是通过对 IMU 的行为进行建模,找出产生错误的所有方式,然后通过编写过滤器来减少这些错误,可以使这个估测更加精确。想象一下如果你被要求向前走一步,然后猜测你走了几米这样的场景,仅凭一步然后去估算会有很大的误差,但是如果你重复走上千步,那么对你每步的估测与你行走距离的估测最终会变得非常准确,这基本上就是 IMU 校准和建模的原理。
  在 IMU 中会有很多错误来源。假设一个机器臂通常用于以完全相同的方式重复地移动设备,来自其 IMU 的输出会一直被捕获和过滤,直到 IMU 的输出能够和机器臂的实况移动十分精确地匹配,这就是一种校准与建模的过程,Google 和微软甚至将它们的设备发送到太空微重力环境中以便消除额外的错误。要想获得真正的精确度会比它听起来要更难,对于设备产商而言,他们必须在它所有组合的全部设备中解决这些问题。

四、3D重建

这里写图片描述

  3D 重建(3D Reconstruction,在 Hololens 术语中叫空间映射或在 Tango 术语中叫深度感知)。3D 重建系统能够找出场景中真实物体的形状和结构,并且允许虚拟事物之间相互碰撞以及隐藏在真实世界的后面,如上图所示,要将虚拟物体隐藏在真实物体之后,那么前提就必须要对真实物体进行识别与重建。3D重建目前来看还有很多难点需要克服,当前很多AR Demos 都没有支持 3D 重建,因此 AR 中的虚拟内容看起来仅仅是在镜头中现实物体的前面移动而已。3D 重建通过从场景中捕获密集的点云(使用深度相机或者RGB相机),然后将其转换为网格,并将隐形网格传递给3D引擎(连同真实世界的坐标),之后将真实世界网格精准地放置在相机所捕获的场景上,重建后虚拟事物就可以与现实世界互动。

  三维重建的步骤
  (1) 图像获取:在进行图像处理之前,先要用摄像机获取三维物体的二维图像。光照条件、相机的几何特性等对后续的图像处理会造成很大的影响。
  (2)摄像机标定:通过摄像机标定来建立有效的成像模型,求解出摄像机的内外参数,这样就可以结合图像的匹配结果得到空间中的三维点坐标,从而达到进行三维重建的目的。
  (3)特征提取:特征主要包括特征点、特征线和区域。大多数情况下都是以特征点为匹配基元,特征点以何种形式提取与用何种匹配策略紧密联系。因此在进行特征点的提取时需要先确定用哪种匹配方法。特征点提取算法可以总结为:基于方向导数的方法,基于图像亮度对比关系的方法,基于数学形态学的方法三种。
  (4)立体匹配:立体匹配是指根据所提取的特征来建立图像对之间的一种对应关系,也就是将同一物理空间点在两幅不同图像中的成像点进行一一对应起来。在进行匹配时要注意场景中一些因素的干扰,比如光照条件、噪声干扰、景物几何形状畸变、表面物理特性以及摄像机机特性等诸多变化因素。
  (5)三维重建:有了比较精确的匹配结果,结合摄像机标定的内外参数,就可以恢复出三维场景信息。由于三维重建精度受匹配精度,摄像机的内外参数误差等因素的影响,只有重建前各个环节的精度高,误差小,这样才能设计出一个比较精确的立体视觉系统。

参考文献

1、Why is ARKit better than the alternatives https://medium.com/6d-ai/why-is-arkit-better-than-the-alternatives-af8871889d6a
2、百度百科 https://baike.baidu.com/item/%E4%B8%89%E7%BB%B4%E9%87%8D%E5%BB%BA/9475819

猜你喜欢

转载自blog.csdn.net/yolon3000/article/details/81516942