Hololens2初入——解决HL真机到PC图像传输的实时性问题

Hololens2初入——解决HL真机到PC图像传输的实时性问题

引言

在我的博客Hololens2 初入——获取彩色和深度图像数据流,并传递到程序中(不是网页浏览)中介绍了如何通过无线传输的方式,将HoloLens2中的前景彩色图像和深度图像传输到PC端,并通过python的脚本进行接收。
这部分功能的实现来自一个大佬github工程。但是在之前,一直存在着图像传输延时性太高的问题。经过几番折腾,我终于找到了问题的原因,并在issue讨论中基本解决了这个问题。下面将详细介绍下问题的产生原因和解决的方案。

正文

  • 滞后性的原因
    HL主机中传感器的采样频率远大于普通wifi传输的频率。这就导致HL的服务端的缓存区一直存放着大量图像数据,则随着Socket的连接时间越长,累计的越多。
    表现出来就是PC端这边滞后特点,即程序运行的时间越长,滞后性越长。
    HL真机的深度传感器在短流模式下的采样频率大约在30Hz-45Hz之间。
    普通的Wifi连接只能达到1-3Hz(测试过),而我的Yoga14s的wifi6可以达到10-15Hz。

PS 这个滞后性的特点大家可以自己测试一下,滞后的时间大约为T*37/n,其中T为程序运行时长,n为你自己PC的Socket接收频率。

解决方案

因为我们的程序都是发布在HL里面进行测试的,所以无法直观的debug,导致作者和其他人一直无法知道其中的原因。
而我们既然知道了这个问题的原因所在,那么解决起来就比较容易了。大体上就是两种思路
一、降低HL往PC端发送数据的频率,即并不是把每一帧采集的图像数据都传输到PC端。
二、增大wifi的通讯带宽,提升接收频率。思路一在软件上即可实现,而思路二需要加硬件设施,或者将TCP的传输方式改为UDP。

具体方案

思路一:

  1. 打开原本的工程,找到以下文件,并在第60行左右找到以下代码,并按图示更改,将第一个传输参数改为2000000。这边更改的是彩色图像的传输频率。
    (这里的 2000000是200ms的意思,程序里面采用CPU时间单位,即百纳秒,1ms = 10^4百纳秒)
    在这里插入图片描述在这里插入图片描述

  2. 然后找到134行按照下面图示更改,这边更改的是深度图像的传输频率,同样改为5Hz
    在这里插入图片描述
    思路二:
    因为我的笔记本的WIfi6可以满足Socket的接收速度要求,在采用思路了一的方案后,基本上可以达到实时的接收的效果。但是我们接收到的图片一般都是要做深度学习处理,我的笔记本电脑的显卡并不能满足这方面的要求。因此还是需要解决如何在台式机上也实现实时传输的问题。
    下面是我对三种硬件的测试结果

  3. 普通无线网卡 1-2Hz

  4. 5G频段,1200MB 的wifi6模块 USB接口 5Hz-10Hz

  5. 1200MB路由 +高速网线 5Hz左右

  6. PCI-E 5G频段 3200MB 10-15Hz左右
    我最后选择的是PCI-E 5G频段的这一个,虽然我们设置底层的传输速率为5Hz,但是上位机的接收频率不是固定的,是波动的。同时在Python里面跑一些深度学习算法的话,也会影响接收的速率。
    PCI-E 5G的这个硬件在某东上有,不做广告就不说具体的型号了。

示例动图

给一个两个图像满足实时性的动图
在这里插入图片描述

原工程的一个小问题

找到原工程的Streamer.cpp文件,找到以下的代码,将两行代码的顺序更换一下。 因为这个数据推入的顺序和python的numpy转换的顺序刚好是反的,所以原工程接收到数据是有问题的。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/scy261983626/article/details/116381193