Hololens 中的坐标系分析及所需的知识体系

By | 2017年12月29日

关于 Hololens 中全息物体在现实空间中的定位,是微软在 Kinect 的基础上的一个坐标系统。
根据 Hololens 与 Unity 3D 开发的过程,发现 Unity 3D 中的具有两个坐标系统,一个是绝对(世界)坐标,一个为相对(局部)坐标。绝对世界坐标可以理解为 Hololens 中的人体头部到全息物体之间的坐标系统。基本上在 Unity 3D 中设置绝对坐标的话,我们利用两者开发的全息物体就会随着人体的头部的位置变化而变化,即 Hololens 中使用的是人体相对坐标系统,形成的是动态空间域(dynamic spatial volume),这个坐标是以用户的身体为原点,随着用户的移动而移动。但是当用户是不动的状态时,只是头部移动的话,此时 Hololens 会绘制出当前视野内的场景,此时场景中的物体相对用户的身体是不变的。

  • dynamic spatial volume 是每一帧的 spatial mapping
    都要传给 HoloLens,不过它传的区域限制在视觉中心(view
    frustum)内的用户身体周围的一小撮数据,所以它用的是空间锚点(spatial anchor)。
  • static volume 只有当当前场景改变的时候才会改变相应的 mesh
    ,因为这里的物体都是固定在空间里的,所以它用的是静态参考框架(Stationary frame of reference)。

静态参考框架(Stationary frame of reference)

虚拟物体和真实物体都共用这一个坐标系。它们的单位都是『米』。这是一种1:1的现实世界尺度(real-world scale),会极大地增加真实感。你在现实世界中放置一个全息物体,你出去后再回来它还在那里,所以这个物体是处于现实世界的坐标系中。无论你戴着设备在已经 spatial mapping 的空间里跑着跳着,现实空间中的物体始终保持稳定。这就是静态参考框架(Stationary frame of reference)。

空间锚点(spatial anchor)

使用 Hololens 的过程中,我们发现刚打开 Hololens 时,会出现空间绘制 spatial mapping 的过程,对你周围的空间进行 mesh 映射。你用 gaze 在已经 spatial mapping 的空间里扫视,这时你的 gaze 和 spatial anchor 把全息的物体放在那里,无论你站着跑着跳着,它都稳稳地放置在那里。(一般来说,你通过 gaze 移动物体,当将物体放置在那里时,你 gaze 的射线和 spatial mapping 所形成的 cursor,正是物体所在位置的 spatial anchor)。这个功能被 HoloLens 称为 World-locked。空间锚点正是计算机视觉中的 mark points(图像配准中概念)。

浅谈如何进行 Hololens 的开发

HoloLens 拥有有四台摄像头,左右两边各两台。通过对这四台摄像头的实时画面进行分析,HoloLens 可覆盖的水平视角和垂直视角都达到 120 度。也就是说它采用的是立体视觉 / Stereo Vision 技术来获取类似下图的深度图 / depth map。
这里写图片描述
立体视觉是计算机视觉学科的一个子学科,专注于从两个摄像头的图像数据中得到真实场景中的物体离摄像头的距离。示意图如下
这里写图片描述

  • 立体视觉可以通过 OpenCv 来实现
    –摄像头校正,undistortion
    –图像对齐,rectification
    –左右图像匹配
    –通过重映射函数
    对于 Hololens 的深度图,由于 Hololens 的视界中的场景一直在变化,所以应该是利用多张深度图用于构建三维场景。

HoloLens 如何从多张深度图重建三维场景

  1. SLAM 有很多实现的方式,有一个开源的 http://pointclouds.org/实现了很多深度图的处理和匹配算法,可以认为是三维版本的 OpenCV。
  2. 微软围绕着 Kinect 的深度图数据发明了 Kinect Fushion 算法,并发表了两篇论文:
    KinectFusion: Real-time 3D Reconstruction and Interaction Using a Moving Depth Camera KinectFusion: Real-Time Dense Surface Mapping and Tracking。

Kinect Fushion,通过在室内移动 Kinect 设备,获取不同角度的深度图,实时迭代,对不同对深度图进行累积,计算出精确的房间以及房间内物体的三维模型。这里写图片描述

它分四个阶段:

  • 深度图格式转换,转化后的深度的单位是米,用浮点数保存。并计算顶点坐标和表面的法向量。
  • 计算世界坐标系下的相机姿态(包含位置和朝向),通过迭代的对齐算法跟踪这两个值,这样系统总是知道当前的相机与最初的姿态相比变了多少。
  • 第三阶段将姿态已知情况下的深度数据融合到单个三维乐高空间里,你也可以叫它为 MineCraft 空间,因为这个空间的基本元素不是三角形,而是方格子。演示视频中频频出现 MineCraft 场景估计也和这个阶段有关。
  • 基于Raycasting 的三维渲染,Raycasting 需要从当前的相机位置发出射线,与三维空间求交集。乐高空间特别适合 Raycasting,可以用八叉树来加速射线的求交运算。Raycasting、Raytracing 以及 Rasterization 是三种常见的渲染方式,这里就不展开了。
  • 在 HoloLens 的应用中我们运行到第三步,即获取三维乐高模型就可以了,第四步并不是必需的。因为 HoloLens 的屏幕是透明的,不需要再把房屋的模型渲染一遍,而是在Hololens 开机的初始阶段就通过 spatial mapping 将我们周围的环境进行了渲染。
【转自:CSDN,作者:MicleonZheng】

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注