如何开发HoloLens 2远程视频空间标注

HoloLens 2上有一款微软出品的远程服务应用叫Dynamics 365 Remote Assist,想必大部分用户及开发者看过相关的宣传视频,它通过前方员工佩戴HoloLens与后台专家视频通话实现关键任务的远程协助。这套方案中一个比较大的亮点就是远程空间标注,它是实现远程精准指导的核心之一。但是Remote Assist尚未落地中国,国内的很多用户还无法直接使用,所以今天我就围绕这个话题,简单谈下如何开发远程协助标注功能。首先,让我们来看一下Dynamics 365 Remote Assist 官方视频的几个经典画面 :

专家端使用RemoteAssist进行远程标注指导
HoloLens端根据专家的标注及指导完成操作

该方案通过搭建音视频通讯,传输包含HoloLens空间矩阵信息的视频数据,经过HoloLens与Unity空间矩阵转换及2D标注到3D空间的转换实现远程空间标注。接下来,我将对音视频通讯和空间标注部分进行展开讲解。

一、音视频通讯方案

1. 基于原生的WebRTC进行开发微软官方Github已经提供了一个MixedReality-WebRTC的工程,这个对于熟悉WebRTC的开发者可以尝试,是否可以采用市场上成熟的第三方音视频SDK呢?目前主流的音视频SDK主要适配的是PC、Web、Android、IOS,针对HoloLens设备的UWP平台几乎没有,短期内各大厂家可能还不会适配UWP,WebRTC的方案需要适配所需要的各个平台,开发难度较高、工作量较大、周期长、成本高。

MixedReality-WebRTC链接:https://github.com/microsoft/MixedReality-WebRTC

2. 使用Unity进行开发Unity对HoloLens一直有很好的支持,使用微软官方发布的MRTK2工具,能够快速完成原型的搭建,由于Unity较好的跨平台特性,可以轻松的将项目部署到HoloLens和移动设备上,下面我将使用MRTK2和Unity音视频插件实现HoloLens远程协助功能,这是本案例所使用到的GitHub工程。

通过HoloLens API获取HoloLens的全息混合视频画面,在HoloCaptureManager上可以设置HoloLens的设备类型、分辨率、帧率、是否开启全息混合、全息画面的透明度、是否发送相机矩阵数据。

通过全息混合视频可以让专家端能够确认标注是正确的,标注有误时可以清除重新标注。但全息混合视频也存在一个小问题,眼睛通过HoloLens看到的虚实画面和获取的全息混合画面有微小的位置偏差,近距离时比较明显,这个问题有待官方更新底层接口。

GitHub MRTK链接:https://github.com/microsoft/MixedRealityToolkit-Unity

本文相关的工程链接:https://github.com/ShanguUncle/UnityChatHololens

获取HoloLens混合视频
专家端对HoloLens混合视频画面进行标注

参考文档:https://docs.microsoft.com/en-us/windows/mixed-reality/locatable-camera-in-unity

二、HoloLens空间标注的几个关键点

1. 获取HoloLens相机空间矩阵数据

通过TryGetCameraToWorldMatrixAPI获取VideoCaptureSample的相机矩阵和投射矩阵数据,这两个矩阵数据存储了HoloLens当前相机的方向和位置,再将HoloLens空间矩阵转换到Unity空间矩阵。

相机矩阵转换示意图

参考文档:https://docs.microsoft.com/en-us/windows/mixed-reality/unity-xrdevice-advanced

2.二维标注到三维空间的位置转换

右图:HoloLens相机空间投射示意,左图:根据标注数据计算出的空间标注

HoloLens每一帧的视频数据都包含了空间矩阵数据,专家端在二维画面标注后确定了标注的形状(i)、中心点(X1,Y1)、长宽(L1、W1)数据,然后发送到HoloLens端,通过空间矩阵数据计算出标注时间点的相机位置C1以及视频画面的四个投射点(P1、P2、P3、P4),通过(X1,Y1)数据可以按比例计算出投射面标注点位置C2及长宽(L2、W2),通过Ray由标注时间点相机位置 C1C2发射线碰撞检测出空间中的实际的标注点位置C3,长宽尺寸可以通过C1、C2、C3和 (L2、W2)按距离比例计算出在空间中的尺寸(L3、W3),最终计算出的标注数据(C3、L3、W3)生成相应的标注实例(i),标注的方向可以朝向C1或者现在的相机位置。

射线检测需要开启HoloLens的空间感知(Spatial Awareness)功能,设置较高的扫描精度以提高碰撞精度,如果没有检测到碰撞点说明该点空间网格未扫描,可以设置个固定距离确定C3,比如1~2m,或者提示扫描该空间。

这个方案可以实现Remote Assist远程协助的部分功能,但还是会存在一些不足,所以尚不能称为一个完整的解决方案。

(文章转载自公众号:微软HoloLens;作者:谷世杰)