【征文计划】Rokid UXR3.0 SDK 家电 AR 说明书技术原理解析

78 阅读8分钟

【征文计划】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 运行平台 上开发空间计算应用,可助力开发者实现空间构建、虚实交互、空间感知等关键开发环节,最终构建完整的空间应用。

image

Rokid UXR3.0 SDK 架构核心模块

  1. 双目渲染:基于设备提供双目渲染,还原 3D 场景与 UI 的空间表达,实现真实交互体验。

  2. 空间定位与追踪:支持 0/3/6DoF 观察角度,灵活适配不同场景。

  3. 虚实交互:提供多模态组件,支持手势(Rokid Max Pro 独占)、射线、语音等交互。

  4. 平面检测:感知现实平面,支撑基于平面的交互设计。

  5. 图像识别:识别特定目标图像,拓展交互场景。

  6. 设备硬件信息:获取摄像头、传感器等参数,辅助适配开发。

image

UXR3.0 SDK 基础开发环境搭建指南

一、Unity 开发环境安装

Unity 是 UXR3.0 SDK 的核心开发工具,需先安装 Unity Hub 管理编辑器,再安装带 Android 支持的指定版本 Unity。

1.1 Unity Hub 安装(双系统通用逻辑)

Unity Hub 用于统一管理 Unity 编辑器版本与项目,步骤如下:

  1. 访问 Unity 官方下载页,若未注册 Unity 开发者,需先完成注册;

  2. 根据当前系统(Windows/macOS)选择对应版本的 Unity Hub 安装包;

  3. 运行安装包,推荐使用 默认配置 完成安装(避免自定义路径引发后续适配问题)。

image

1.2 安装带 Android Support 的 Unity 编辑器

UXR3.0 SDK 仅支持 Unity 2022 LTS 版本(示例版本:2022.3.34f1c1),需确保安装 Android 开发支持组件:

  1. 再次访问 Unity 官方下载页,在“长期支持版本”中找到适配的 2022 LTS 版本,点击“从 Unity Hub 下载”;

  2. 弹出“打开 Unity Hub”对话框时选择“打开”,网页将自动触发 Unity Hub 下载流程(网络较慢时需耐心等待);

  3. 在 Unity Hub 弹出的“Install Unity xxxx.x.xxxxxx LTS”窗口中,必须勾选“Android Build Support”并选择完全安装

  4. 点击“Continue”,在“Android SDK and NDK License Terms from Google”窗口勾选协议,点击“Install”开始下载;

  5. 可在 Unity Hub 的“DOWNLOADS”页面查看进度,若出现下载失败/中断,仅点击“刷新”重试,切勿直接退出或删除安装文件

  6. 后续按提示完成 Dev Tools、Android SDK 及 Unity Editor 的安装,全程推荐默认配置。

image

二、Android ADB(调试桥)环境配置

ADB 是连接电脑与 Android 设备的核心工具,若已安装 Android Studio 可跳过此步(Unity 已自带 ADB,需配置环境变量)。

2.1 Windows 系统配置步骤

步骤1:找到 ADB 程序路径
  1. 打开 Unity Hub,进入“Installs”页面,找到已安装的带“Android”标签的 Unity 版本,复制其安装路径(示例:D:\Unity\2022.3.34f1c1\Editor\);

  2. 通过以下方式打开路径:

    1. 在 cmd 中输入 start D:\Unity\2022.3.34f1c1\Editor\(替换为实际路径);

    2. 或在文件管理器地址栏粘贴路径并回车;

  3. 在打开的目录中,依次进入 Data → PlaybackEngines → AndroidPlayer → SDK → platform-tools,复制当前路径(示例:D:\Unity\2022.3.34f1c1\Editor\Data\PlaybackEngines\AndroidPlayer\SDK\platform-tools)。

image

步骤2:配置系统环境变量
  1. 右键点击“此电脑”→选择“属性”,进入系统信息页面;

  2. 点击“环境变量”,在“系统变量”中找到“Path”条目,点击“编辑”;

  3. 在“编辑环境变量”窗口点击“新建”,粘贴复制的 ADB 路径,并在路径末尾添加 \(确保路径格式正确);

  4. 依次点击所有窗口的“确定”,保存配置。

步骤3:验证 ADB 配置
  1. 关闭已打开的 cmd/PowerShell(环境变量需重启命令行生效);

  2. 重新打开 cmd/PowerShell,输入 adb --version,若显示 ADB 版本信息,说明配置成功。

SDK 项目分析:家电AR说明书

图像识别(AR说明书入口)

一、实现流程

  1. 准备 500*500px 纯色背景家电图标,项目导入 SDK 并添加 “RokidXR” 预制体。

  2. 添加 ImageTracking 组件,导入图标并设置 Physical Size(如 0.1m),勾选启用追踪及标记。

  3. 新建 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说明书查询功能)

一、实现流程(从配置到指令响应)

  1. 导入离线语音资源包,在 PermissionManager 勾选麦克风权限。

  2. 添加 OfflineVoice 组件,配置指令(如 “如何清洁滤网” 映射 CleanFilter),启用识别。

  3. 新建 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说明书查看功能)

一、实现流程

  1. 确保模型面数 < 1000,设备为 Rokid Max Pro(支持手势)。

  2. 模型预制体添加 GestureRecognizer,勾选双指旋转 / 缩放,目标设为 Self。

  3. 挂载 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,手势控制直接挂载组件即可使用。未来期待支持更多设备手势及模型拆解预设,进一步提升开发效率,拓展至维修指导、产品展示等领域。