空间音频听起来很魔法:你转头,声音的方向不跟着转,像是真有个音响立在房间某处。

能做到这件事,是因为耳机知道你的头朝哪边。AirPods 里装着一整套惯性测量单元——加速度计、陀螺仪,实时算出你的头部姿态。

那些数据是公开可读的。于是我写了个小工具,把它显示出来。

它做什么

打开 app,点「开始」,屏幕中央会出现一个 3D 人头。你怎么动,它怎么动。

五种姿态下的 3D 人头预览

从左到右:正面 · 低头 · 左转 · 歪头 · 三轴组合

顶部显示采样率和累计帧数。下面列着实时读数:

读数 含义
Pitch 俯仰 抬头 / 低头
Roll 侧倾 左右歪头
Yaw 偏航 左右转头
用户加速度 已扣掉重力,静止时接近 0
角速度 rad/s

没别的功能。它就是个窗口,让你看见耳机一直在看的东西。

一件有意思的事:偏航会漂

坐着别动,盯着 Yaw 那一栏看几分钟,你会发现它在缓慢地、单向地爬。

不是你在动,是陀螺仪在漂。

俯仰和侧倾不会,因为重力是个永远在那儿的参照物——耳机随时能拿它校准”哪边是下”。但左右转头这个方向,重力帮不上忙。手机靠磁力计(也就是指南针)解决这个问题,而 AirPods 没有磁力计。

所以偏航只能靠陀螺仪一点点累积角速度推算,误差也就一点点累积。

我做了个工具专门量它:按 ⌘D,戴着耳机静置三分钟,它会告诉你三个轴各自漂多快(°/min)。俯仰和侧倾的读数可以当对照组——如果它俩几乎不动,而偏航在持续单向爬升,那个爬升就是零偏。

⚠️ 测的时候别摘耳机。耳机一离耳,运动数据流立刻断掉。

这也是为什么要有「重设零点」这个功能(⌘K)。用着用着觉得人头朝向歪了,按一下,把当前朝向重新定义成正前方。

校准

首次使用建议跑一遍引导校准(⇧⌘K)。四步,每步都要你手动确认,程序不会自己往下走:

步骤 动作
1 坐正看向屏幕(3 秒倒计时,结束时的朝向记为零点)
2 慢慢低头看键盘
3 慢慢把头转向左边
4 把头歪向右肩

后三步只要幅度到位、保持一秒就行,屏幕上有进度条。结果会存下来,下次启动自动沿用。

按 Esc 随时可以退出。

怎么装

1
2
3
git clone https://github.com/zhangwenqiang0214/airpods-motion.git
cd airpods-motion
./build.sh

然后从访达双击 AirPodsMotion.app 启动。

⚠️ 别在终端里运行。macOS 的权限系统会把终端认作发起方,而终端没有声明运动权限,进程会被直接杀掉。这个行为挺隐蔽的——没有报错,就是启动不了。

第一次点「开始」会弹窗问「想要访问运动与健身数据」,选允许。不想给了随时可以在 系统设置 › 隐私与安全性 › 运动与健身 里撤销。

环境要求

  • macOS 14 或更新
  • 支持头部追踪的 AirPods——Pro / Max / 第三代及以后,老款没有这套传感器
  • Xcode 命令行工具(编译用)

关于数据

读到的姿态数据只在内存里。不落盘,不上传,不发给任何人。关掉 app 就没了。

这本来是句废话,但现在不说清楚好像不行。

技术

Swift + SwiftUI + SceneKit,零第三方依赖。数据来自 CoreMotion 的 CMHeadphoneMotionManager——苹果开的口子,正经 API,不是什么黑魔法。


代码在 github.com/zhangwenqiang0214/airpods-motion。

写它没什么实用目的。只是觉得,一副耳机里藏着能感知你怎么转头的东西,这件事本身值得看一眼。