Unity AR构建维护系统的以AI驱动增强现实知识检索系统

本博客概述了为维护开发的AI驱动增强现实(AR)知识检索系统的开发过程,该系统集成了Unity用于AR、Python服务器用于后端处理,以及ChatGPT用于自然语言处理。该系统允许维护工人通过AR设备(如HoloLens 2)查询特定任务的知识(例如,故障排除步骤),并以全息图形式显示上下文感知的响应。

Unity账户注册

中文账户注册比较困难。它需要额外的验证码验证步骤,有时即使验证成功也不会重定向。如果可能的话,建议使用Google账户注册美国账户,体验会更加流畅。

Unity AR界面设置

Windows设置

  1. 安装Unity Hub
    • 从unity.com下载。
    • 安装Unity Hub并打开。
  2. 安装Unity编辑器
    • 在Unity Hub中,点击Installs > Add
    • 选择2021.3 LTS(或更高版本)。
    • 添加模块:**Universal Windows Platform (UWP)**用于HoloLens,Android Build SupportiOS Build Support
  3. 安装工具
    • Visual Studio 2022:从visualstudio.microsoft.com下载。包含UWP和Unity工作负载。
    • HoloLens模拟器:通过Visual Studio Installer安装(可选)。
    • Git:从git-scm.com下载。
  4. 项目设置
    • 在Unity Hub中创建新的3D项目。
    • 通过Package Manager安装包:
      • Mixed Reality Toolkit (MRTK):添加Git URL com.microsoft.mixedreality.toolkit.unity
      • TextMeshPro:启用内置包。
      • AR Foundation:用于移动AR(可选)。
    • Build Settings中,选择UWP,将Architecture设置为ARM64用于HoloLens。

macOS设置

  1. 安装Unity Hub
    • 从unity.com下载macOS版本。
    • 安装并打开Unity Hub。
  2. 安装Unity编辑器
    • 通过Unity Hub添加2021.3 LTS
    • 包含iOS Build SupportAndroid Build Support(UWP最终构建需要Windows)。
  3. 安装工具
    • Xcode:从Mac App Store下载(约15GB)。
    • Android Studio:从developer.android.com下载。
    • Visual Studio for Mac:从visualstudio.microsoft.com下载。
    • Git:通过Homebrew安装(安装Homebrew后运行brew install git)。
  4. 项目设置
    • 创建3D项目。
    • 如上所述安装MRTKTextMeshProAR Foundation
    • 在macOS上为HoloLens开发,但传输到Windows进行UWP构建。

Unity场景和脚本

  • 场景设置

    • 通过Mixed Reality > Toolkit > Add to Scene and Configure添加MRTK。
    • 使用HoloLens 2配置文件,启用Spatial AwarenessInput System
    • 添加World Space Canvas,包含用于AI响应的TextMeshProUGUI
    • 为3D模型叠加创建空的GameObject。
    • 向画布添加TMP_InputField用于文本输入。
    • 在输入字段旁边添加Button用于提交查询。
  • 语音输入脚本VoiceQuery.cs):

    using UnityEngine;
    using Microsoft.MixedReality.Toolkit.Input;public class VoiceQuery : MonoBehaviour
    {public BackendConnector backend;public void OnSpeechKeywordRecognized(SpeechEventData eventData){backend.SendQuery(eventData.Command.Keyword, "Pump XYZ"); // 模拟上下文}
    }
    
  • 文本输入脚本TextQuery.cs):

    using UnityEngine;
    using TMPro;
    using UnityEngine.UI;public class TextQuery : MonoBehaviour
    {public BackendConnector backend;public TMP_InputField inputField;public Button submitButton;public string context = "Pump XYZ"; // 模拟上下文private void Start(){// 为按钮点击添加监听器submitButton.onClick.AddListener(SubmitQuery);// 为回车键添加监听器inputField.onSubmit.AddListener(_ => SubmitQuery());}private void SubmitQuery(){if (!string.IsNullOrEmpty(inputField.text)){backend.SendQuery(inputField.text, context);inputField.text = ""; // 发送后清除输入}}private void OnDestroy(){// 清理监听器submitButton.onClick.RemoveListener(SubmitQuery);inputField.onSubmit.RemoveListener(_ => SubmitQuery());}
    }
    
  • AR显示脚本ARDisplay.cs):

    using UnityEngine;
    using TMPro;public class ARDisplay : MonoBehaviour
    {public TextMeshProUGUI responseText;public GameObject modelPrefab;public void UpdateDisplay(string aiResponse, Vector3 position){responseText.text = aiResponse;Instantiate(modelPrefab, position, Quaternion.identity);}
    }
    
  • 后端连接器脚本BackendConnector.cs):

    using UnityEngine;
    using UnityEngine.Networking;
    using System.Collections;
    using TMPro;public class BackendConnector : MonoBehaviour
    {public TextMeshProUGUI responseText;private string apiEndpoint = "http://your-backend-url/api/query";public void SendQuery(string query, string context){StartCoroutine(SendQueryCoroutine(query, context));}private IEnumerator SendQueryCoroutine(string query, string context){// 创建请求体var requestBody = new{query = query,context = context};string jsonBody = JsonUtility.ToJson(requestBody);// 创建请求using (UnityWebRequest request = new UnityWebRequest(apiEndpoint, "POST")){byte[] bodyRaw = System.Text.Encoding.UTF8.GetBytes(jsonBody);request.uploadHandler = new UploadHandlerRaw(bodyRaw);request.downloadHandler = new DownloadHandlerBuffer();request.SetRequestHeader("Content-Type", "application/json");// 发送请求yield return request.SendWebRequest();if (request.result == UnityWebRequest.Result.Success){// 解析并显示响应var response = JsonUtility.FromJson<QueryResponse>(request.downloadHandler.text);responseText.text = response.answer;}else{responseText.text = "错误: " + request.error;}}}
    }[System.Serializable]
    public class QueryResponse
    {public string answer;
    }
    

场景层次结构设置

- MixedRealitySceneContent|- MRTK|- WorldSpaceCanvas|- ResponseText (TextMeshProUGUI)|- InputPanel|- QueryInputField (TMP_InputField)|- SubmitButton (Button)|- ModelContainer (Empty GameObject)

组件配置

  1. TextQuery组件

    • 附加到InputPanel GameObject
    • 分配BackendConnector引用
    • 分配TMP_InputField引用
    • 分配SubmitButton引用
  2. VoiceQuery组件

    • 附加到MixedRealitySceneContent
    • 分配BackendConnector引用
  3. BackendConnector组件

    • 附加到专用的GameObject
    • 分配ResponseText引用
    • 配置apiEndpoint URL

此设置为查询AI系统提供了语音和文本输入选项,具有适当的错误处理和响应显示。

后端Python服务器

Python服务器处理来自Unity的查询,与ChatGPT接口,并返回响应。

设置

  1. 安装Python
    • 从python.org下载Python 3.9+。
    • 确保安装了pip
  2. 安装依赖项
    pip install flask openai
    
  3. 服务器代码server.py):
from flask import Flask, request, jsonify
import openaiapp = Flask(__name__)
openai.api_key = "your-openai-api-key"# 模拟知识库
knowledge_base = {"Pump XYZ": {"E101": "检查阀门对齐并润滑轴承。"}
}@app.route('/api/query', methods=['POST'])
def handle_query():data = request.jsonquery = data.get('query', '')context = data.get('context', '')# 首先检查知识库response = knowledge_base.get(context, {}).get(query, None)if not response:# 回退到ChatGPTtry:chat_response = openai.Completion.create(model="gpt-4",prompt=f"为{context}提供维护解决方案:{query}",max_tokens=100)response = chat_response.choices[0].text.strip()except Exception as e:response = f"错误:{str(e)}"return jsonify(response)if __name__ == '__main__':app.run(host='0.0.0.0', port=5000)
  1. 运行服务器
    python server.py
    
    • 确保服务器在localhost:5000或您的网络IP上运行,以便Unity访问。

ChatGPT集成

Python服务器使用OpenAI的GPT-4 API进行自然语言处理。

设置

  1. 获取API密钥
    • 在openai.com注册,创建API密钥。
    • 将密钥添加到server.pyopenai.api_key)。
  2. 查询逻辑
    • 服务器首先检查本地知识库(例如,类似JSON的字典)。
    • 如果没有匹配项,它会使用上下文(例如,“Pump XYZ”)和查询(例如,“E101”)查询GPT-4。
    • 示例提示:“为Pump XYZ提供维护解决方案:E101”。
  3. 响应处理
    • GPT-4返回简洁的响应(例如,“检查阀门对齐并润滑轴承”)。
    • 服务器格式化为JSON并发送到Unity。

注意事项

  • 成本:GPT-4 API使用会产生费用;通过OpenAI仪表板监控。
  • 替代方案:使用开源模型(例如,Hugging Face)进行免费测试。
  • 延迟:通过在知识库中缓存频繁查询来优化。

测试系统

  1. 运行Python服务器
    • localhost:5000上启动server.py
  2. 测试Unity
    • 在Unity编辑器中,使用MRTK输入模拟触发语音查询。
    • 验证AR显示随服务器响应更新。
    • 为HoloLens(Windows)或iOS/Android(macOS)构建。
  3. 可用性
    • 使用示例查询进行测试(例如,“修复Pump XYZ E101”)。
    • 检查响应准确性和AR叠加定位。

挑战和解决方案

  • 延迟:使用边缘计算或本地模型获得更快的AI响应。
  • HoloLens构建:macOS需要Windows进行UWP;使用VM或双启动。
  • 知识库:预填充综合手册以减少API调用。

参考文献

  • Xu, F., et al. (2024). Augmented reality for maintenance tasks with ChatGPT for automated text-to-action. Journal of Construction Engineering and Management.
  • Nagy, A., et al. (2023). AI-powered interfaces for extended reality to support remote maintenance. IEEE/ACM CCGridW.

该系统结合了Unity的AR功能、Python后端和ChatGPT的AI,以增强工业维护,为知识检索提供了可扩展的原型。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/912213.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/912213.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java面向对象核心:方法值传递与封装机制精讲

文章目录 Java面向对象编程核心笔记一、方法值传递机制1. 基本数据类型传递2. 引用数据类型传递值传递总结 二、面向对象核心概念1. 类与对象关系2. 类定义规范3. 对象创建与使用 三、封装机制详解1. 封装三大要素2. 封装示例&#xff08;GirlFriend类&#xff09;3. 测试类4. …

【Actix Web】构建高性能 Rust API:Actix Web 最佳实践与进阶指南

目录 一、高性能 API 架构设计1.1 系统架构图1.2 核心组件 二、项目初始化与配置2.1 创建项目2.2 添加依赖 (Cargo.toml)2.3 配置文件 (config/default.toml) 三、核心模块实现3.1 应用状态管理 (src/state.rs)3.2 数据模型定义 (src/models.rs) 四、认证与授权系统4.1 JWT 认证…

vue项目中纯前端实现导出pdf文件,不需要后端处理。

在 Vue 项目中&#xff0c;纯前端实现导出 PDF 文件是完全可行的。通常可以借助一些 JavaScript 库来将 HTML 内容或 DOM 元素转换为 PDF 并下载&#xff0c;无需后端参与。 下面介绍几种常用的方案和实现方法&#xff1a; 推荐方案&#xff1a;使用 html2canvas jsPDF 安装…

c++虚拟内存

常见的内存困惑 当你编写C程序时&#xff0c;是否遇到过&#xff1a; vector申请200MB内存&#xff0c;但系统显示只占用20MB&#xff1f;程序在低配机器上崩溃&#xff0c;报出std::bad_alloc但内存显示充裕&#xff1f;遍历数组时特定位置耗时突然增加&#xff1f;相同代码…

领域驱动设计(DDD)【22】之限定建模技术

文章目录 一 限定初识二 限定识别三 限定实现 一 限定初识 一个 员工 可以拥有多份 工作经验&#xff0c;而各个 工作经验 的 时间段 不能相互重叠。可以得出一个推论&#xff1a;对于一个 员工 而言&#xff0c;每个 时间段 只能有一条 工作经验。 UML中第二种表述方式&…

《P6492 [COCI 2010/2011 #6] STEP》

题目描述 给定一个长度为 n 的字符序列 a&#xff0c;初始时序列中全部都是字符 L。 有 q 次修改&#xff0c;每次给定一个 x&#xff0c;若 ax​ 为 L&#xff0c;则将 ax​ 修改成 R&#xff0c;否则将 ax​ 修改成 L。 对于一个只含字符 L&#xff0c;R 的字符串 s&#…

macOS,切换 space 失效,向右切换space(move right a space) 失效

背景 准确来讲&#xff0c;遇到的问题是向右切换space&#xff08;move right a space) 失效&#xff0c;并向左是成功的。 在键盘-快捷键-调度中心中&#xff0c;所有的快捷键均可用&#xff0c;但是“向右移动一个空间”总是失效。 已经检查过不是快捷键冲突的问题&#x…

网飞猫官网入口 - 免费高清影视平台,Netflix一站观看

网飞猫是一个专注于提供丰富影视资源的在线平台&#xff0c;涵盖国内外热门电影、电视剧、动漫、综艺等多种类型。它不仅整合了Netflix的独家内容&#xff0c;还提供了大量高清、蓝光画质的影视作品&#xff0c;支持多语言字幕&#xff0c;满足不同用户的观影需求。网飞猫的界面…

Hyper-v-中的FnOs--飞牛Nas虚拟磁盘扩容(不清除数据)

在Hyper-v下的飞牛Nas要怎么在不删除原有虚拟磁盘数据的情况下扩容呢 OK下面开始教学&#xff08;适用于Basic模式的虚拟磁盘扩容&#xff0c;Linear没试过&#xff09; 先关闭飞牛Nas系统 找到飞牛Nas虚拟机&#xff0c;在设置下SCSI控制器找到要扩容的虚拟磁盘&#xff0c; 点…

掌握 MySQL 的基石:全面解读数据类型及其影响

前言 上篇文章小编讲述了关于MySQL表的DDL操作&#xff0c;在那里我多次使用了MySQL的数据类型&#xff0c;但是我并没有去讲述MySQL的数据类型&#xff0c;想必各位读者已经很好奇MySQL的数据类型都有什么了&#xff0c;今天这篇文章我将会详细的去讲述MySQL的数据类型&#x…

buildadmin 如何制作自己的插件

官方文档指引 提示&#xff1a;若不计划发布到应用市场&#xff0c;可省略图片等非必要功能 参考文档&#xff1a;https://doc.buildadmin.com/senior/module/basicInfo.html 目录 官方文档指引开发说明模块开发流程模块包结构示例安装开发工具 总结 开发说明 目标&#xff…

【数据标注师】关键点标注

目录 一、 **关键点标注的四大核心原则**二、 **五阶能力培养体系**▶ **阶段1&#xff1a;基础认知筑基&#xff08;1-2周&#xff09;**▶ **阶段2&#xff1a;复杂场景处理技能▶ **阶段3&#xff1a;三维空间标注&#xff08;进阶&#xff09;**▶ **阶段4&#xff1a;效率…

创建网站的基本步骤?如何建设自己的网站?

创建网站是一个系统化的过程&#xff0c;涵盖规划、设计、开发、测试和发布等多个阶段。以下是详细步骤及关键工具推荐&#xff1a; 一、规划阶段&#xff1a;明确目标与内容 定义目标 1、确定网站目的&#xff08;展示信息、销售、博客、服务等&#xff09;。 2、分析目标…

FreeSWITCH配置文件解析(2) dialplan 拨号计划中xml 的action解析

在 FreeSWITCH 的拨号计划&#xff08;Dialplan&#xff09;中&#xff0c;使用 XML 配置。其中&#xff0c;<action> 标签用于指定要执行的操作。这些操作通常是应用程序&#xff08;applications&#xff09;或设置变量等。下面列出常见的 <action> 类型及其含义…

MCPA2APPT:基于 A2A+MCP+ADK 的多智能体流式并发高质量 PPT 智能生成系统

&#x1f680; MCPA2APPT / MultiAgentPPT 集成 A2A MCP ADK 架构的智能化演示文稿生成系统&#xff0c;支持多智能体协作与流式并发&#xff0c;实时生成高质量 PPT 内容。 &#x1f9e0; 项目简介 MultiAgentPPT&#xff08;又名 MCPA2APPT&#xff09;采用 A2A&#xff…

Maven 多模块项目调试与问题排查总结

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…

debian国内安装docker

先升级apt和安装依赖包 apt update apt upgrade apt install curl vim wget gnupg dpkg apt-transport-https lsb-release ca-certificates添加存储库的GPG密钥&#xff08;阿里云&#xff09; curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/debian/gpg | sudo gpg…

vue网页中的一个天气组件使用高德api

今天写了一个天气组件效果如下&#xff1a; 实现代码如下&#xff1a; <template><div><span click"getLocation" style"cursor: pointer"><span style"color:white;">{{ weatherInfo.area }}</span></span&g…

5 手写卷积函数

5 手写卷积函数 背景介绍滑动窗口的方式代码问题 矩阵乘法的方式原理代码结果 效果对比对比代码日志结果 一些思考 背景 从现在开始各种手写篇章&#xff0c;先从最经典的卷积开始 介绍 对于卷积层的具体操作&#xff0c;我这里就不在具体说卷积具体是什么东西了。 对于手写…

vue3+element-plus,实现两个表格同步滚动

需求&#xff1a;现在需要两个表格&#xff0c;为了方便对比左右的数据&#xff0c;需要其中一边的表格滚动时&#xff0c;另一边的表格也跟着一起滚动&#xff0c;并且保持滚动位置的一致性。具体如下图所示。 实现步骤&#xff1a; 确保两个表格的宽度一致&#xff1a;如果两…