17 位姿追踪 · Unity 与 Meta Quest 开发

返回 00 - 项目总览与学习路线 | 下一节 18 网络传输 - TCP UDP ADB 与时间同步

为什么学这个(项目关联)

UMI 的位姿来源 = Quest 控制器 6-DOF 追踪。需要开发一个自定义 Quest 应用,把控制器位姿实时推到电脑。原文用 Unity + Meta XR SDK + UDP 实现,并用 Claude 辅助编写编辑器脚本。

知识点清单

1. Quest 追踪原理(理解特性与局限)

  • Inside-out 追踪:头显摄像头 + IMU 做 SLAM,控制器由头显光学追踪(LED 环)
  • 含义:① 控制器位姿精度依赖头显看到它 → 遮挡时靠 IMU 外推;② 世界系 = 头显开机时建立的原点(会漂移、重启会变——对 UMI 数据采集:单 episode 内一致性最重要)
  • 追踪频率高(控制器姿态可达数百 Hz),位姿快照带时间戳

2. 开发环境搭建(原文流程照抄可用)

  1. Unity Hub → 安装 Unity 6.3 LTS + Android Build Support(勾选 OpenJDK、Android SDK & NDK)
  2. 包管理器导入 Meta XR All-in-One SDK(含 Core/Interaction/Performance)
  3. 构建目标切 Android → 运行 Meta Project Setup Tool(自动修 manifest/权限/Graphics API)
  4. 开发者模式:注册 Meta 开发者账号 → Meta Horizon 手机 App 给设备开开发者模式 → USB 连电脑 → 头显内确认授权弹窗
  5. Build and Run 出 APK

3. 核心代码概念

  • OVRCameraRig:场景根,含 HMD 与控制器锚点
  • 读取控制器位姿:OVRInput.GetLocalControllerPosition/Rotation(controller)(返回相对追踪原点的位姿,四元数)
  • 或用 XR 命名空间:InputDevice.TryGetFeatureValue(CommonUsages.devicePosition/Rotation)
  • 坐标系注意:Unity 左手系 + Y-up;与 OpenCV/机器人右手系转换(x 翻转等),这是复刻时必踩的坑,先写单元测试验证

4. 数据推送(配合 18 网络传输 - TCP UDP ADB 与时间同步)

  • 方案:UDP via Wi-Fi(原文选择,理由:Mac USB 口少 + UDP 实时性好不阻塞)
  • 快照数据包:{frame_id, timestamp, controller_id, position(3f), rotation(4f), trigger/grip 按钮, 夹爪宽度?}
  • 序列化:手动字节拼包(省)或 JSON(调试友好)
  • 接收端:Python asyncio/socketserver 收包 → 解析 → 可视化

5. AI 辅助开发工作流(原文做法)

  • 用 Claude 生成 Unity 编辑器脚本(Editor Script)自动化构建设置
  • 用 Claude 读取 Unity SDK 内控制器网格与坐标系 → 复现 CAD 模型做标定可视化校验
  • 启示:把 AI 当”跨领域胶水”——Unity/CAD/Python 三界翻译

学习资源

资源用途
Unity 官方 XR 教程上手
Meta XR SDK 文档(OVRInput 页)API 速查
Meta 开发者文档 “Developer Mode”设备解锁
YUBI 项目(若开源)直接参考同类 app

实践任务

  1. 💻 环境搭建:按 5 步流程装好 Unity + SDK,真机 Build and Run 官方示例
  2. 💻 Hello Pose:场景里读控制器位姿,OnGUI 显示 xyz + 四元数
  3. 💻 数据链路:位姿 100Hz UDP 推到电脑,Python 收包打印
  4. 💻 可视化:Python 端用 Open3D/matplotlib 3D 实时画控制器轨迹,手持走”8 字”验证追踪质量
  5. ✍️ 坐标系实验:把同一个静止位姿分别用 Unity 与 OpenCV 惯例画出,写出转换矩阵并单测

掌握标准(自测)

  • 能从零独立完成”Quest app → UDP → Python 可视化”全链路
  • 能解释 inside-out 追踪的遮挡/漂移特性对数据采集的影响
  • 能处理 Unity与OpenCV 坐标系转换
  • 能说清 TCP vs UDP 在本场景的取舍理由(对应原文)

关联笔记

实践记录

(学习时在这里追加:日期 / 做了什么 / 踩坑 / 疑问)