Unity+Hololens2 HoloLens2-Unity-ResearchModeStreamer-master打开RGB相机总结

Posted banjuhuaxianduo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity+Hololens2 HoloLens2-Unity-ResearchModeStreamer-master打开RGB相机总结相关的知识,希望对你有一定的参考价值。

教程跟随这两位的博客走就行,这里主要总结一下碰到的问题
Hololens2 初入——获取彩色和深度图像数据流,并传递到程序中(不是网页浏览): link
主机端实时获取Hololens2的RGBD数据流: link

1.#include <Eigen> 问题
最好下载配一下,没试过注释能不能跑通,sln工程中pch.h包含了该文件,Eigen为线性算术的 C++ 模板库,直接百度官网下载即可,可不用编译添加环境变量后vs包含即可,同时#include <Eigen>改为
#include <Eigen\\Dense>

2.opencv问题
链接器输入中的cv附加依赖项改为自己的cv库即可,我的cv库为410版本的,可以打开没问题,在查找碰到的问题时,我甚至编译了430带扩展的release和debug版本的,结果发现我的问题和cv版本没有关系,编译完的cv有10多个G啊。

3.py连接不上的问题
TimeoutError: [WinError 10060] 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。
这种情况:
1.先看研究模式有没有打开。
2.Unity buildsetting中的几个InternetClient, InternetClientServer, PrivateNetworkClientServer, WebCam, SpatialPerception确认勾选上
我是这样的做的,还是不行,甚至因为研究模式我都给Hololens2系统更新了一遍,新系统有点bug,我的建议是不更新。
在看了git上的问题模块后,作者对TCP链接大部分做了try catch,调试的时候对输出查找VideoCameraStreamer::StartServer,发现openl instening fail所以简单看了下源码。

源码中VideoCameraStreamer主要负责UWP的StreamSocketListener模块,就这try catch触发了并且是-232323无意义代码,看了之后发现作者给错误信息转成了SocketError中枚举的异常状态。所以是一串无意义数字,简单修改后再调试得到message_catch: At least one of either InternetClientServer or PrivateNetworkClientServer ca啥啥的,这里就可以看见是InternetClient, InternetClientServer, PrivateNetworkClientServer这三个没打开,我再次确认Unity中勾选上后观看Package.appxmanifest发现了问题
这三个根本没包含进去啊喂,可能我是在原本就有工程的基础上给添加的,但是我unity也勾选了啊,不知道为啥,改成下图即可
然后我这边输出验证了下,能正常监听后py就可以直接显示了

先就这几个问题,我后续有时间会再看看源码。

HoloLens开发手记 - Unity之语音输入

对于HoloLens,语音输入是三大基本输入方式之一,广泛地运用在各种交互中。HoloLens上语音输入有三种形式,分别是:

  • 语音命令 Voice Command
  • 听写 Diction
  • 语法识别 Grammar Recognition

 

语音命令 Voice Command


 

对于做过Windows Phone或许Windows Store应用开发的人来说,语音命令是经常使用到的特性。开发者可以通过为应用设定关键词,和对应的行为,来为用户提供语音命令体验。当用户说出关键词时,预设的动作就会被调用。在HoloLens上,语音命令也是此模式。

KeywordRecognizer

命名空间UnityEngine.Windows.Speech

KeywordRecognizerPhraseRecognizedEventArgsSpeechErrorSpeechSystemStatus

 

使用方法很简单,通过注册<关键词>来初始化KeywordRecognizer实例,同时注册语音命令事件来做后续处理。

 

using UnityEngine.Windows.Speech;
using System.Collections.Generic;
using System.Linq;

public class KeywordManager : MonoBehavior
{

    KeywordRecognizer keywordRecognizer;
    Dictionary<string, System.Action> keywords = new Dictionary<string, System.Action>();

    void Start()
    {
        //初始化关键词
        keywords.Add("activate", () =>
        {
            // 想执行的行为
        });


        keywordRecognizer = new KeywordRecognizer(keywords.Keys.ToArray());
        keywordRecognizer.OnPhraseRecognized += KeywordRecognizer_OnPhraseRecognized;
        //开始识别
        keywordRecognizer.Start();
    }

    private void KeywordRecognizer_OnPhraseRecognized(PhraseRecognizedEventArgs args)
    {
        System.Action keywordAction;
        // 如果识别到关键词就调用
        if (keywords.TryGetValue(args.text, out keywordAction))
        {
            keywordAction.Invoke();
        }
    }
}

 

语法识别 Grammar Recognition


 

语法识别同Windows Store应用类似,依赖于实现设定好的SRGS文件,文件中定义了一系列语法规则用于语音识别。更多信息请阅读:https://msdn.microsoft.com/zh-cn/library/hh378349(v=office.14).aspx

GrammarRecognizer

命名空间:UnityEngine.Windows.Speech

类: GrammarRecognizerPhraseRecognizedEventArgsSpeechErrorSpeechSystemStatus

在你创建好SRGS文件后,将它放进StreamingAessets文件夹

 

<PROJECT_ROOT>/Assets/StreamingAssets/SRGS/myGrammar.xml

 

使用起来也很简单,代码如下:

 

public class GrammarManager : MonoBehavior
{
    private GrammarRecognizer grammarRecognizer;
    
    void Start()
    {
        //初始化
        grammarRecognizer = new GrammarRecognizer(Application.streamingDataPath + "/SRGS/myGrammar.xml");
        grammarRecognizer.OnPhraseRecognized += grammarRecognizer_OnPhraseRecognized;
        //开始识别
        grammarRecognizer.Start();
    }


    private void Grammar_OnPhraseRecognized(PhraseRecognizedEventArgs args)
    {
        SemanticMeaning[] meanings = args.semanticMeanings;
        // 执行动作
    }
}

 

听写 Diction


 

听写即语音转文字,此前我们称之为Speech to Text,同样是Windows Store应用特性之一。在HoloLens上,发挥了比其他平台更大的作用。因为HoloLens的操作特性,使用键盘操作起来十分不方便,语音则无此问题,能大大提高输入效率。

 

DictationRecognizer

命名空间: UnityEngine.Windows.Speech

: DictationRecognizerSpeechErrorSpeechSystemStatus

听写特性用于将用户语音转为文字输入,同时支持内容推断和事件注册特性。Start()和Stop()方法用于启用和禁用听写功能,在听写结束后需要调用Dispose()方法来关闭听写页面。GC会自动回收它的资源,如果不Dispose会带来额外的性能开销。

完整的使用方法如下:

 

public class DictionManager : MonoBehavior
{
    private DictationRecognizer dictationRecognizer;

    void Start()
    {
        dictationRecognizer = new DictationRecognizer();
        //注册事件
        dictationRecognizer.DictationResult += DictationRecognizer_DictationResult;

        dictationRecognizer.DictationHypothesis += DictationRecognizer_DictationHypothesis;

        dictationRecognizer.DictationComplete += DictationRecognizer_DictationComplete;

        dictationRecognizer.DictationError += DictationRecognizer_DictationError;

        //开始听写识别
        dictationRecognizer.Start();
    }

    private void DictationRecognizer_DictationResult(string text, ConfidenceLevel confidence)
    {
        // 自定义行为
    }

    private void DictationRecognizer_DictationHypothesis(string text)
    {
        // 自定义行为
    }

    private void DictationRecognizer_DictationComplete(DictationCompletionCause cause)
    {
        // 自定义行为
    }

    private void DictationRecognizer_DictationError(string error, int hresult)
    {
        // 自定义行为
    }


    void OnDestroy()
    {
        //释放资源
        dictationRecognizer.DictationResult -= DictationRecognizer_DictationResult;
        dictationRecognizer.DictationComplete -= DictationRecognizer_DictationComplete;
        dictationRecognizer.DictationHypothesis -= DictationRecognizer_DictationHypothesis;
        dictationRecognizer.DictationError -= DictationRecognizer_DictationError;
        dictationRecognizer.Dispose();
    }
}

 

注意:以下情况中,听写识别会自动触发超时行为:

  1. 如果在听写开始后第一个5秒内没听到任何声音,将会超时
  2. 如果识别到了一个结果但是之后20秒没听到任何声音,也会超时

 

同时使用以上特性


 

如果你想同时使用语音命令、语法识别和听写特性,那么一定要在完全关闭当前语音识别行为后再开始另一个识别动作。如果有多个KeywordRecognizer在运行,你可以使用如下代码一次性关闭它们:

 

PhraseRecognitionSystem.Shutdown();

 

为了从先前状态恢复所有的识别器,可以在听写识别完成后调用如下代码:

 

PhraseRecognitionSystem.Restart();

 

当然你也可以重新开始一个 KeywordRecognizer,这将会重启PhraseRecognitionSystem,达到上面的效果。

 

总结


 

Windows平台上的语音识别特性从Windows 8以来一直都很强大,但是在HoloLens上会有更大的用武之地。这是最基本的交互方式,从系统层级上提供了强大的支持,甚至和Cortana结合到了一起,非常有用。

 

 

以上是关于Unity+Hololens2 HoloLens2-Unity-ResearchModeStreamer-master打开RGB相机总结的主要内容,如果未能解决你的问题,请参考以下文章

Unity开发Hololens2—环境配置

使用 Unity 和 HoloLens2 导入 .dll

如何正确重新加载将 MRTK 用于 Hololens2 的 Unity 场景?

Unity HoloLens2 开发笔记:环境配置

如果部署在 HoloLens2 上,Unity 中的蒙面精灵和模板缓冲区是不是仅在一只眼睛上可见?

Unity开发Hololens2—环境配置和官方案例发布并部署到设备上