据了解,空间定位是VR 市场中一个非常关键的技术,当今排名前列的VR硬件设备厂商(HTC/Vive和Oculus)分别采用了不同的空间定位方案。
Oculus 的 Constellation 系统红外摄像头定位
HTC/Vive、大朋VR的 灯塔激光定位系统
尽管这两种定位方式都采用了PnP解算,但都有各自的局限性和适应的场景,下文将逐一详细分析。
Oculus采用的是基于Camera的定位方案,被称为Constellation。在Oculus头盔和手柄上都布满了红外sensor,以某个固定的模式在闪烁。
通过特制的camera以一个固定的频率(Oculus CV1是60fps)拍摄,得到一组图片。系统通过这些点在图片上的二维位置,以及已知的头盔或者手柄的三维模型,反推出点在三维空间中的位置。这个过程可以进一步的细分成以下的步骤:
首先,为了确保准确的定位到头盔和手柄上的LED,PC端的Oculus Camera软件/驱动程序通过HID接口发送某个命令点亮LED,该亮度足以被Camera捕捉到,同时这些LED以某个特殊的模式闪烁。这样能确保即使有遮挡的情况下,在不同的角度下,只要有足够多的LED被拍摄到,整个的tracking系统就能正常工作,不会被环境中的其他噪声信号所影响。
然后是记录下每一个被捕捉到的LED的位置和方向。
当然,为了做好定位,Oculus camera本身并不需要LED的颜色,只需记录每个点的明暗,所以 Oculus Camera固件中记录下的的图像为 752×480像素, 像素格式为 Y8灰阶,每一幅图看起来如下:
拿到头盔上的LED在二维图片上的位置,又有头盔上Sensor的三维模型,有什么办法可以估算出这些点的三维位置?这本质上是一个Pnp解算的问题 (https://en.wikipedia.org/wiki/Perspective-n-Point):有了n个3D点的模型(就像上面提到的LED点在头盔上的3D分布), camera拍摄下来的n个2D点的集合,再加上camera本身的内部的参数,可以推算出这些点的位置坐标(X,Y,Z) 以及姿态(Yaw,Pitch,Roll)。
这个点的集合到底有多大?这是一个寻求最优解的问题,常见的做法是n>=3,也就是图片上只要拍到三个以上的LED,就能够解算出相关的姿态和位置。考虑到遮挡或者拍摄的照片不够清楚等因素,实践中看,至少要拍摄到4-5个点,整个头盔的姿态和位置才能被正确的算出,这也是为什么在Oculus的头盔上布满了很多LED点的一个重要原因。
算出来的数据有误差怎么解决?一个常见的办法是得到6DOF的数据之后,用该数据再做一次投影,产生新的2D图像,把该图像和我们开始用来计算的图像进行比较,得到一个误差函数,应用该函数来进行校准。不过这带来另外一个问题:点进行比较的时候,你怎么知道3d模型上的点,和拍摄到的二维图像上的点之间的匹配关系?如果做一一对应的全匹配计算的话,计算量太大。所以Oculus采用的办法是采用不同的闪烁模式,来快速匹配3d模型上的点和拍摄到的图像上的点。
进一步,在姿态估计的问题上面,通过光学(camera图片)得到的姿态会有误差,而这种误差主要来自于物体快速移动时捕获到的照片上的点识别的困难。为了减少这种误差,需要通过IMU信息来进行一步校准通过PnP解算得到的姿态,这就是所谓的Sensor数据融合。
从上面的描述可以看出来,基于camera的光学定位技术,安装配置比较简单,成本也比较低,但是图像处理技术较为复杂,物体移动较快时识别物体的位置有比较大的困难,同时容易受到自然光的干扰。
另外,基于Camera的定位精准度受到Camera本身分辨率的限制,比如Oculus Rift的Camera为720p,比较难以提供亚毫米级的精准定位。
最后,Camera自身能够捕捉到的照片的距离比较近,不能应用到很大的房间位置,一般都只能提供桌面级别的VR定位。当然最近Oculus提供了三个Camera的方案,试图在room scale级别和灯塔定位技术一较高下。
反之,htc,大朋等企业提供的灯塔激光定位技术,避免了Camera定位技术的高复杂度,具有定位精度高,反应速度快,可分布式处理等优势,能够允许用户在一定的空间内进行活动,对使用者来说限制小,能够适配需要走动起来的游戏,真正实现Room Scale级别的vr定位。
下面从灯塔定位的原理解释为什么在大空间的应用中灯塔激光定位是一个更好的选择。
HTC的灯塔定位系统中有两个基站,每个基站上面有两个马达,其中一个马达往水平方向扫射,另外一个朝垂直方向扫射。
基站刷新的频率是60赫兹,基站a上面的马达1首先朝水平方向扫射,8.33毫秒之后,第二个马达朝垂直方向上扫射(第二个8.33毫秒),然后基站a关闭,接着基站b重复和基站a一样的工作......
这样只要在16ms中,有足够多的sensor点同时被垂直和水平方向上的光束扫到,这些sensor点相对于基站基准面的角度能够被计算出来,而被照射到的sensor点在投影平面上的坐标也能够获得。同时,静止时这些点在空间中的坐标是已有的,可以作为参考,这样就能够计算出,当前被照的点相对于基准点的旋转和平移,进一步的得出这些点的坐标,这其实也是一个PnP问题。
进一步的,再融合IMU上获得的姿态,就能够较准确的给出头盔或者手柄的姿态和位置。
在上一步中计算出来的头盔/手柄的位置和姿态信息,通过RF传递到和PC相连的一个接收装置,该装置再通过USB接口,把数据上传到PC端的driver或者OpenVR runtime,最后上传到游戏引擎以及游戏应用中。
相比HTC的定位技术,大朋在激光定位方面做了进一步的创新,在每个基站上面加入了三个马达,从上到下编号,一号马达从垂直方向上扫描,2号马达从水平方向扫描,3号马达从垂直方向扫描。
每一个马达扫描的时间间歇是4ms,该马达在工作的时候,其他马达都处于关闭状态,基本时序如下:
基站上面的马达1首先发送同步光信号给头盔/手柄上的sensor点,sensor点清零计数器,马达1接着朝垂直方向扫射;4毫秒之后,第2个马达朝水平方向上扫射(第二个4毫秒),然后是第3个马达朝垂直方向上扫射(第3个4毫秒)。
被照射到的sensor点可以比较容易的得到被照射时的时间,以及每一个号马达开始扫描的时间。马达的转速是固定的,这样就可以得到sensor点相对于扫射平面的角度,而该角度编码后通过RF传送到PC端,再做进一步的姿态融合之后,PC端就能容易的拿到6DOF的数据。
在指定时间里增加扫描的次数,大大减少所需要的sensor数量。从实际测试中看,在大朋的最新款的E3P中,最后需要的传感器数量大概是Lighthouse的四分之一左右(Lighthouse用了几十个传感器),头盔和手柄所需要的传感器都是个位数,头盔手柄都变得更轻便。这不仅大大增加了整个定位系统的稳定性,也让sensor在头盔或手柄上的布局也更加的简单。
进一步的,由于每次扫描的时间间隔更短,所以手柄的姿态等信息能够以更快的频率(每4ms一次)传送到PC端,更及时的更新到VR游戏中。
在玩vr游戏或者应用的时候,难免会出现各种各样的遮挡,为了让用户能够在房间级别的空间中畅玩,必须要让灯塔在360度各角度方位都能够照射到头盔和手柄,大朋vr的解决方案和htc一样,也是双基站。双基站的工作时序和单基站一样,唯一的区别是,主基站工作的时候,从基站是关闭的,反之亦然。
大朋VR激光定位固有的定位稳定,需要的sensor点少这些特点,使得该定位方案能够非常好的应用到教育行业和多人联机对战中。
联机多人对战也是大朋VR定位版擅长的领域。
比如以下的场景中,只需要一到两个基站可以覆盖多台网吧电脑,大大降低成本。
综上来看,相较于红外方案,激光定位在大空间多人联机的应用上具有较明显的优势。
(来源:雷锋网)