本博客概述了为维护开发的AI驱动增强现实(AR)知识检索系统的开发过程,该系统集成了Unity用于AR、Python服务器用于后端处理,以及ChatGPT用于自然语言处理。该系统允许维护工人通过AR设备(如HoloLens 2)查询特定任务的知识(例如,故障排除步骤),并以全息图形式显示上下文感知的响应。
Unity账户注册
中文账户注册比较困难。它需要额外的验证码验证步骤,有时即使验证成功也不会重定向。如果可能的话,建议使用Google账户注册美国账户,体验会更加流畅。
Unity AR界面设置
Windows设置
- 安装Unity Hub:
- 从unity.com下载。
- 安装Unity Hub并打开。
- 安装Unity编辑器:
- 在Unity Hub中,点击Installs > Add。
- 选择2021.3 LTS(或更高版本)。
- 添加模块:**Universal Windows Platform (UWP)**用于HoloLens,Android Build Support,iOS Build Support。
- 安装工具:
- Visual Studio 2022:从visualstudio.microsoft.com下载。包含UWP和Unity工作负载。
- HoloLens模拟器:通过Visual Studio Installer安装(可选)。
- Git:从git-scm.com下载。
- 项目设置:
- 在Unity Hub中创建新的3D项目。
- 通过Package Manager安装包:
- Mixed Reality Toolkit (MRTK):添加Git URL
com.microsoft.mixedreality.toolkit.unity
。 - TextMeshPro:启用内置包。
- AR Foundation:用于移动AR(可选)。
- Mixed Reality Toolkit (MRTK):添加Git URL
- 在Build Settings中,选择UWP,将Architecture设置为ARM64用于HoloLens。
macOS设置
- 安装Unity Hub:
- 从unity.com下载macOS版本。
- 安装并打开Unity Hub。
- 安装Unity编辑器:
- 通过Unity Hub添加2021.3 LTS。
- 包含iOS Build Support,Android Build Support(UWP最终构建需要Windows)。
- 安装工具:
- Xcode:从Mac App Store下载(约15GB)。
- Android Studio:从developer.android.com下载。
- Visual Studio for Mac:从visualstudio.microsoft.com下载。
- Git:通过Homebrew安装(安装Homebrew后运行
brew install git
)。
- 项目设置:
- 创建3D项目。
- 如上所述安装MRTK、TextMeshPro和AR Foundation。
- 在macOS上为HoloLens开发,但传输到Windows进行UWP构建。
Unity场景和脚本
-
场景设置:
- 通过Mixed Reality > Toolkit > Add to Scene and Configure添加MRTK。
- 使用HoloLens 2配置文件,启用Spatial Awareness和Input 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)
组件配置
-
TextQuery组件:
- 附加到InputPanel GameObject
- 分配BackendConnector引用
- 分配TMP_InputField引用
- 分配SubmitButton引用
-
VoiceQuery组件:
- 附加到MixedRealitySceneContent
- 分配BackendConnector引用
-
BackendConnector组件:
- 附加到专用的GameObject
- 分配ResponseText引用
- 配置apiEndpoint URL
此设置为查询AI系统提供了语音和文本输入选项,具有适当的错误处理和响应显示。
后端Python服务器
Python服务器处理来自Unity的查询,与ChatGPT接口,并返回响应。
设置
- 安装Python:
- 从python.org下载Python 3.9+。
- 确保安装了
pip
。
- 安装依赖项:
pip install flask openai
- 服务器代码(
server.py
):
from flask import Flask, request, jsonify
import openai
app = 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.json
query = data.get('query', '')
context = data.get('context', '')
# 首先检查知识库
response = knowledge_base.get(context, {}).get(query, None)
if not response:
# 回退到ChatGPT
try:
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)
- 运行服务器:
python server.py
- 确保服务器在
localhost:5000
或您的网络IP上运行,以便Unity访问。
- 确保服务器在
ChatGPT集成
Python服务器使用OpenAI的GPT-4 API进行自然语言处理。
设置
- 获取API密钥:
- 在openai.com注册,创建API密钥。
- 将密钥添加到
server.py
(openai.api_key
)。
- 查询逻辑:
- 服务器首先检查本地知识库(例如,类似JSON的字典)。
- 如果没有匹配项,它会使用上下文(例如,“Pump XYZ”)和查询(例如,“E101”)查询GPT-4。
- 示例提示:“为Pump XYZ提供维护解决方案:E101”。
- 响应处理:
- GPT-4返回简洁的响应(例如,“检查阀门对齐并润滑轴承”)。
- 服务器格式化为JSON并发送到Unity。
注意事项
- 成本:GPT-4 API使用会产生费用;通过OpenAI仪表板监控。
- 替代方案:使用开源模型(例如,Hugging Face)进行免费测试。
- 延迟:通过在知识库中缓存频繁查询来优化。
测试系统
- 运行Python服务器:
- 在
localhost:5000
上启动server.py
。
- 在
- 测试Unity:
- 在Unity编辑器中,使用MRTK输入模拟触发语音查询。
- 验证AR显示随服务器响应更新。
- 为HoloLens(Windows)或iOS/Android(macOS)构建。
- 可用性:
- 使用示例查询进行测试(例如,“修复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,以增强工业维护,为知识检索提供了可扩展的原型。