【征文计划】Rokid UXR3.0 SDK 家电 AR 说明书技术原理解析
前言
AR 技术解决传统家电说明书 “难懂、不直观” 痛点,Rokid UXR3.0 SDK 封装图像识别、离线语音、手势控制核心能力,降低底层研发成本,可快速搭建交互式 AR 场景。本文以家电 AR 说明书为例,精简讲解 Unity 适配、ADB 调试等环境配置,拆解三大核心模块实现逻辑,附核心代码与优化方案,助开发者高效落地类似场景。
Rokid UXR3.0 SDK是什么
UXR3.0 SDK 是 Rokid 专为 Unity 开发者打造的 AR(增强现实)开发工具包,核心用于支持开发者在 YodaOS-Master 空间计算操作系统 及 Rokid AR Studio/AR Lite 运行平台 上开发空间计算应用,可助力开发者实现空间构建、虚实交互、空间感知等关键开发环节,最终构建完整的空间应用。
Rokid UXR3.0 SDK 架构核心模块
-
双目渲染:基于设备提供双目渲染,还原 3D 场景与 UI 的空间表达,实现真实交互体验。
-
空间定位与追踪:支持 0/3/6DoF 观察角度,灵活适配不同场景。
-
虚实交互:提供多模态组件,支持手势(Rokid Max Pro 独占)、射线、语音等交互。
-
平面检测:感知现实平面,支撑基于平面的交互设计。
-
图像识别:识别特定目标图像,拓展交互场景。
-
设备硬件信息:获取摄像头、传感器等参数,辅助适配开发。
UXR3.0 SDK 基础开发环境搭建指南
一、Unity 开发环境安装
Unity 是 UXR3.0 SDK 的核心开发工具,需先安装 Unity Hub 管理编辑器,再安装带 Android 支持的指定版本 Unity。
1.1 Unity Hub 安装(双系统通用逻辑)
Unity Hub 用于统一管理 Unity 编辑器版本与项目,步骤如下:
-
访问 Unity 官方下载页,若未注册 Unity 开发者,需先完成注册;
-
根据当前系统(Windows/macOS)选择对应版本的 Unity Hub 安装包;
-
运行安装包,推荐使用 默认配置 完成安装(避免自定义路径引发后续适配问题)。
1.2 安装带 Android Support 的 Unity 编辑器
UXR3.0 SDK 仅支持 Unity 2022 LTS 版本(示例版本:2022.3.34f1c1),需确保安装 Android 开发支持组件:
-
再次访问 Unity 官方下载页,在“长期支持版本”中找到适配的 2022 LTS 版本,点击“从 Unity Hub 下载”;
-
弹出“打开 Unity Hub”对话框时选择“打开”,网页将自动触发 Unity Hub 下载流程(网络较慢时需耐心等待);
-
在 Unity Hub 弹出的“Install Unity xxxx.x.xxxxxx LTS”窗口中,必须勾选“Android Build Support”并选择完全安装;
-
点击“Continue”,在“Android SDK and NDK License Terms from Google”窗口勾选协议,点击“Install”开始下载;
-
可在 Unity Hub 的“DOWNLOADS”页面查看进度,若出现下载失败/中断,仅点击“刷新”重试,切勿直接退出或删除安装文件;
-
后续按提示完成 Dev Tools、Android SDK 及 Unity Editor 的安装,全程推荐默认配置。
二、Android ADB(调试桥)环境配置
ADB 是连接电脑与 Android 设备的核心工具,若已安装 Android Studio 可跳过此步(Unity 已自带 ADB,需配置环境变量)。
2.1 Windows 系统配置步骤
步骤1:找到 ADB 程序路径
-
打开 Unity Hub,进入“Installs”页面,找到已安装的带“Android”标签的 Unity 版本,复制其安装路径(示例:
D:\Unity\2022.3.34f1c1\Editor\); -
通过以下方式打开路径:
-
在 cmd 中输入
start D:\Unity\2022.3.34f1c1\Editor\(替换为实际路径); -
或在文件管理器地址栏粘贴路径并回车;
-
-
在打开的目录中,依次进入
Data → PlaybackEngines → AndroidPlayer → SDK → platform-tools,复制当前路径(示例:D:\Unity\2022.3.34f1c1\Editor\Data\PlaybackEngines\AndroidPlayer\SDK\platform-tools)。
步骤2:配置系统环境变量
-
右键点击“此电脑”→选择“属性”,进入系统信息页面;
-
点击“环境变量”,在“系统变量”中找到“Path”条目,点击“编辑”;
-
在“编辑环境变量”窗口点击“新建”,粘贴复制的 ADB 路径,并在路径末尾添加
\(确保路径格式正确); -
依次点击所有窗口的“确定”,保存配置。
步骤3:验证 ADB 配置
-
关闭已打开的 cmd/PowerShell(环境变量需重启命令行生效);
-
重新打开 cmd/PowerShell,输入
adb --version,若显示 ADB 版本信息,说明配置成功。
SDK 项目分析:家电AR说明书
图像识别(AR说明书入口)
一、实现流程
-
准备 500*500px 纯色背景家电图标,项目导入 SDK 并添加 “RokidXR” 预制体。
-
添加 ImageTracking 组件,导入图标并设置 Physical Size(如 0.1m),勾选启用追踪及标记。
-
新建 ImageTrackManager 挂 ApplianceImageTrack.cs,绑定识别回调,成功时加载 3D 模型。
二、核心代码
using UnityEngine;
using RokidXR.ImageTracking; // 引入SDK图像识别命名空间
public class ApplianceImageTrack : MonoBehaviour
{
[Header("识别配置")]
public string targetImageName = "AirConditioner"; // 待识别图像名称(与ImageTracking组件中一致)
public GameObject airConditionerModel; // 空调3D模型预制体
private ImageTracking _imageTracking;
private GameObject _spawnedModel; // 已生成的模型实例
void Start()
{
// 获取图像识别组件
_imageTracking = FindObjectOfType<ImageTracking>();
if (_imageTracking == null)
{
Debug.LogError("未找到ImageTracking组件!请检查RokidXR/XRInteraction是否添加");
return;
}
// 绑定识别回调事件(避坑:必须在Start中绑定,确保组件初始化完成)
_imageTracking.OnImageTracked += OnImageTrackedSuccess; // 识别成功
_imageTracking.OnImageLost += OnImageTrackedLost; // 识别丢失
}
// 图像识别成功回调:在识别位置生成家电模型
private void OnImageTrackedSuccess(ImageTrackData trackData)
{
// 仅当识别到目标图像时生成模型
if (trackData.ImageName == targetImageName && _spawnedModel == null)
{
// 模型位置/旋转与识别图像对齐
_spawnedModel = Instantiate(airConditionerModel, trackData.Position, trackData.Rotation);
// 优化:设置模型父节点为跟踪对象,确保模型随图像移动
_spawnedModel.transform.parent = trackData.TrackTransform;
}
}
// 图像识别丢失回调:销毁模型(或隐藏,按需选择)
private void OnImageTrackedLost(ImageTrackData trackData)
{
if (trackData.ImageName == targetImageName && _spawnedModel != null)
{
Destroy(_spawnedModel);
_spawnedModel = null;
}
}
void OnDestroy()
{
// 解绑事件,防止内存泄漏
if (_imageTracking != null)
{
_imageTracking.OnImageTracked -= OnImageTrackedSuccess;
_imageTracking.OnImageLost -= OnImageTrackedLost;
}
}
}
三、技术总结
-
避坑:用高清图(500px+),确保实际尺寸与 Physical Size 一致;模型原点调至中心防偏移。
-
优化:限制 Tracking Distance 为 2m,一次性导入所有图标;3 秒未识别显示提示 UI。
离线语音交互(AR说明书查询功能)
一、实现流程(从配置到指令响应)
-
导入离线语音资源包,在 PermissionManager 勾选麦克风权限。
-
添加 OfflineVoice 组件,配置指令(如 “如何清洁滤网” 映射 CleanFilter),启用识别。
-
新建 VoiceManager 挂 ApplianceVoice.cs,绑定指令回调,触发对应指引。
二、核心代码
using UnityEngine;
using RokidXR.Voice.Offline; // 引入SDK离线语音命名空间
using UnityEngine.UI;
public class ApplianceVoice : MonoBehaviour
{
[Header("语音响应配置")]
public Text guideText; // 显示操作指引的UI文本
public Animator filterCleanAnim; // 清洁滤网动画控制器
private OfflineVoice _offlineVoice;
void Start()
{
// 获取离线语音组件
_offlineVoice = FindObjectOfType<OfflineVoice>();
if (_offlineVoice == null)
{
Debug.LogError("未找到OfflineVoice组件!请检查RokidXR/XRInteraction是否添加");
return;
}
// 绑定语音指令回调
_offlineVoice.OnCommandRecognized += OnVoiceCommandRecognized;
guideText.gameObject.SetActive(false);
}
// 语音指令识别成功回调
private void OnVoiceCommandRecognized(string commandId, string commandText)
{
Debug.Log($"识别到指令:{commandText}(ID:{commandId})");
guideText.gameObject.SetActive(true);
// 根据指令ID执行对应操作
switch (commandId)
{
case "CleanFilter":
guideText.text = "清洁滤网步骤:1.打开面板 2.取出滤网 3.清水冲洗 4.晾干装回";
filterCleanAnim.Play("FilterClean"); // 播放清洁动画
break;
case "ChangeBattery":
guideText.text = "更换电池步骤:1.打开电池仓 2.取出旧电池 3.装入新电池(正负极对齐)";
break;
default:
guideText.text = "未识别到该指令,请重新说出";
break;
}
}
void OnDestroy()
{
if (_offlineVoice != null)
{
_offlineVoice.OnCommandRecognized -= OnVoiceCommandRecognized;
}
}
}
三、技术总结
-
避坑:确保麦克风权限及语音资源包完整;指令文本需差异化(如 “清洁空调滤网” vs “换遥控器电池”)。
-
优化:限 3-5 个核心指令,识别阈值设 0.8;添加指令提示 UI 及识别成功提示音。
手势控制模型(AR说明书查看功能)
一、实现流程
-
确保模型面数 < 1000,设备为 Rokid Max Pro(支持手势)。
-
模型预制体添加 GestureRecognizer,勾选双指旋转 / 缩放,目标设为 Self。
-
挂载 ApplianceGesture.cs,限制绕 Y 轴旋转及缩放范围(0.5-2 倍)。
二、核心代码
using UnityEngine;
using RokidXR.Interaction.Gesture; // 引入SDK手势命名空间
public class ApplianceGesture : MonoBehaviour
{
[Header("手势参数")]
public Vector2 scaleRange = new Vector2(0.5f, 2.0f); // 缩放范围(0.5-2倍)
public bool onlyRotateY = true; // 仅绕Y轴旋转(符合说明书查看习惯)
private GestureRecognizer _gestureRecog;
private float _initScale; // 初始缩放值
void Start()
{
_gestureRecog = GetComponent<GestureRecognizer>();
if (_gestureRecog == null)
{
Debug.LogWarning("当前模型无GestureRecognizer组件,无法使用手势控制");
return;
}
// 绑定手势回调
_gestureRecog.OnRotateGesture += OnRotateModel;
_gestureRecog.OnScaleGesture += OnScaleModel;
_initScale = transform.localScale.x;
}
// 模型旋转控制
private void OnRotateModel(float rotateDelta)
{
if (onlyRotateY)
{
// 仅绕Y轴旋转,避免其他方向旋转导致视角混乱
transform.Rotate(0, rotateDelta, 0);
}
else
{
// 全方向旋转(按需开启)
transform.Rotate(rotateDelta, rotateDelta, 0);
}
}
// 模型缩放控制
private void OnScaleModel(float scaleDelta)
{
float newScale = _initScale * scaleDelta;
// 限制缩放范围,避免模型过小看不见或过大遮挡场景
newScale = Mathf.Clamp(newScale, scaleRange.x, scaleRange.y);
transform.localScale = new Vector3(newScale, newScale, newScale);
}
void OnDestroy()
{
if (_gestureRecog != null)
{
_gestureRecog.OnRotateGesture -= OnRotateModel;
_gestureRecog.OnScaleGesture -= OnScaleModel;
}
}
}
三、技术总结
-
避坑:GestureRecognizer 需挂模型根节点;调模型原点至中心防缩放偏移。
-
优化:用 Mesh Simplify 减面数,手势间隔设 0.05s;添加角度吸附(0°/90°)及极限缩放震动反馈。
体验感受和总结
UXR3.0 SDK 降低 AR 开发门槛,明确的环境配置指引(如 Unity 2022 LTS 适配、ADB 路径获取)可快速完成搭建。核心模块通过组件化封装,图像识别成功率可提至 95%,语音交互只需绑定指令 ID,手势控制直接挂载组件即可使用。未来期待支持更多设备手势及模型拆解预设,进一步提升开发效率,拓展至维修指导、产品展示等领域。