主机端实时获取Hololens2的RGBD数据流
整體流程是仿照Github官方文檔和這位博主的,具體細節(jié)根據(jù)個人習(xí)慣做了修改并補充了一些說明。
0. 環(huán)境配置
Windows10
Unity 2020.3.31f1c1
VS2019
Python3.6
1. 打開Hololens的研究者模式(非常重要)
如果不打開的話,程序是無法訪問到眼鏡傳感器數(shù)據(jù)的
https://blog.csdn.net/scy261983626/article/details/108754517
2. 下載Github工程
HoloLens2-Unity-ResearchModeStreamer
下面的步驟都是基于官方文檔來的:
3. 配置VS環(huán)境
Release+ARM64
- 工程項目中Eigen庫好像沒有用到,可以注釋掉
- lib庫里放了Opencv4.X的庫,我們需要根據(jù)自己的Opencv替換
之后Build就好了,不要運行,因為輸出是dll,輸出位置在
Your Location\HoloLens2-Unity-ResearchModeStreamer\HL2RmStreamUnityPlugin\ARM64\Release\HL2RmStreamUnityPlugin\
4. 配置Unity環(huán)境
- Platform先轉(zhuǎn)換到UWP
新建文件夾和文件
- 在ARM64文件夾中放上面的
HL2RmStreamUnityPlugin.dll - 在Scripts文件夾中新建C#腳本文件,命名為:
StreamerHL2.cs
其實也不需要新建這么多的,放在一起也行。之所以這么命名也是為了和Github上保持一致。
StreamerHL2.cs中的內(nèi)容:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
using System.Runtime.InteropServices;public class StreamerHL2 : MonoBehaviour
{[DllImport("HL2RmStreamUnityPlugin", EntryPoint = "Initialize", CallingConvention = CallingConvention.StdCall)]public static extern void InitializeDll(); void Start(){InitializeDll();}void Update(){}}
-
將StreamerHL2.cs文件拖到Main camera上實現(xiàn)掛載
-
接著設(shè)置Unity 項目的兼容性,根據(jù)下圖指引,勾選
InternetClient, InternetClientServer, PrivateNetworkClientServer, WebCam, SpatialPerception5個位置
-
編譯unity工程,注意架構(gòu)選擇的是ARM64. 然后build到一個新文件夾
ps. 不需要在unity中運行工程,因為我們添加的是ARM64的動態(tài)鏈接庫,在PC端運行的話會報加載不了的錯誤。
5. 配置Unity的package文件中的兼容性
- 打開編譯好的Unity工程文件夾中的“Package.appxmanifest”文件,按照官方文檔修改3處內(nèi)容,如果嫌麻煩,可以直接我改完的代碼:
**注意:**里面的Project1是我自己取的名字,大家可以自己改。
<?xml version="1.0" encoding="utf-8"?>
<Package xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities" xmlns:mp="http://schemas.microsoft.com/appx/2014/phone/manifest" xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10" xmlns:uap2="http://schemas.microsoft.com/appx/manifest/uap/windows10/2" xmlns:uap3="http://schemas.microsoft.com/appx/manifest/uap/windows10/3" xmlns:uap4="http://schemas.microsoft.com/appx/manifest/uap/windows10/4" xmlns:iot="http://schemas.microsoft.com/appx/manifest/iot/windows10" xmlns:mobile="http://schemas.microsoft.com/appx/manifest/mobile/windows10" IgnorableNamespaces="uap uap2 uap3 uap4 mp mobile iot rescap" xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"><Identity Name="Template3D" Publisher="CN=DefaultCompany" Version="1.0.0.0" /><mp:PhoneIdentity PhoneProductId="edd907fa-2c4f-49b2-89a0-9fa371043c33" PhonePublisherId="00000000-0000-0000-0000-000000000000" /><Properties><DisplayName>Proj1</DisplayName><PublisherDisplayName>DefaultCompany</PublisherDisplayName><Logo>Assets\StoreLogo.png</Logo></Properties><Dependencies><TargetDeviceFamily Name="Windows.Universal" MinVersion="10.0.10240.0" MaxVersionTested="10.0.19041.0" /></Dependencies><Resources><Resource Language="x-generate" /></Resources><Applications><Application Id="App" Executable="$targetnametoken$.exe" EntryPoint="Template3D.App"><uap:VisualElements DisplayName="Proj1" Square150x150Logo="Assets\Square150x150Logo.png" Square44x44Logo="Assets\Square44x44Logo.png" Description="Template_3D" BackgroundColor="transparent"><uap:DefaultTile ShortName="Proj1" Wide310x150Logo="Assets\Wide310x150Logo.png" /><uap:SplashScreen Image="Assets\SplashScreen.png" BackgroundColor="#FFFFFF" /><uap:InitialRotationPreference><uap:Rotation Preference="landscape" /><uap:Rotation Preference="landscapeFlipped" /><uap:Rotation Preference="portrait" /><uap:Rotation Preference="portraitFlipped" /></uap:InitialRotationPreference></uap:VisualElements></Application></Applications><Capabilities><rescap:Capability Name="perceptionSensorsExperimental" /><Capability Name="internetClient" /><Capability Name="internetClientServer" /><Capability Name="privateNetworkClientServer" /><uap2:Capability Name="spatialPerception" /><DeviceCapability Name="webcam" /></Capabilities>
</Package>
6. 將Unity工程部署到Hololens中
請移步到我之前的博文:Hololens 2 + Unity環(huán)境配置的第8條
7. Python獲取視頻流
打開Github工程中的hololens2_simpleclient.py文件,根據(jù)自己的ip修改HOST
之后就傳輸成功啦!!!如果部署成功的話,眼鏡第一次打開你Unity的app時應(yīng)該會彈出 是否允許訪問相機之類的提醒,點擊是,眼鏡就會出現(xiàn)一個界面,里面是你Unity的場景,不用管它。然后再運行Python程序,電腦上就會出現(xiàn)兩個窗口了,眼鏡里是沒有變化的。
注意:要把電腦上的防火墻關(guān)了。
如果出現(xiàn)[winerror 10060]的問題,基本上就是沒打開研究者模式,返回第一條檢查一下。自己就是卡在這里卡了2天, 我一開始打開的方式不對
延遲問題:
Hololens傳感器的采樣頻率遠大于普通wifi傳輸?shù)念l率。這就導(dǎo)致Hololens的緩存區(qū)一直存放著大量圖像數(shù)據(jù),表現(xiàn)出來就是PC端這邊滯后特點。
Hololens的深度傳感器在短流模式下的采樣頻率大約在30Hz-45Hz之間,Wifi連接只能達到<5Hz。
滯后的時間大約為T*37/n,其中T為程序運行時長,n為你自己PC的Socket接收頻率
即程序運行的時間越長,滯后性越長。
8. 解決實時視頻流傳輸
https://blog.csdn.net/scy261983626/article/details/116381193
修改HL2RmStreamUnityPlugin.sln工程
降低HL往PC端發(fā)送數(shù)據(jù)的頻率,即并不是把每一幀采集的圖像數(shù)據(jù)都傳輸?shù)絇C端。
HL2RmStreamUnityPlugin.cpp文件中:
co_await m_pVideoFrameProcessor->InitializeAsync(m_pVideoFrameStreamer);->co_await m_pVideoFrameProcessor->InitializeAsync(m_pVideoFrameStreamer, 2000000);auto processor = std::make_shared<ResearchModeFrameProcessor>( m_pAHATSensor, camConsentGiven, &camAccessCheck, 0, m_pAHATStreamer);->auto processor = std::make_shared<ResearchModeFrameProcessor>( m_pAHATSensor, camConsentGiven, &camAccessCheck, 2000000, m_pAHATStreamer);
(這里的 2000000是200ms的意思,程序里面采用CPU時間單位,即百納秒,1ms = 10^4百納秒)
ResearchModeFrameStreamer.cpp文件中:
因為眼鏡數(shù)據(jù)輸出的順序和python的numpy轉(zhuǎn)換的順序剛好是反的,所以原工程接收到數(shù)據(jù)是有問題的。
總結(jié)
以上是生活随笔為你收集整理的主机端实时获取Hololens2的RGBD数据流的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VS生成dll和lib库文件
- 下一篇: HC-05与HC-06的AT指令的区别