AirPods 里藏着一个陀螺仪
空间音频听起来很魔法:你转头,声音的方向不跟着转,像是真有个音响立在房间某处。
能做到这件事,是因为耳机知道你的头朝哪边。AirPods 里装着一整套惯性测量单元——加速度计、陀螺仪,实时算出你的头部姿态。
那些数据是公开可读的。于是我写了个小工具,把它显示出来。
它做什么
打开 app,点「开始」,屏幕中央会出现一个 3D 人头。你怎么动,它怎么动。

从左到右:正面 · 低头 · 左转 · 歪头 · 三轴组合
顶部显示采样率和累计帧数。下面列着实时读数:
| 读数 | 含义 |
|---|---|
| Pitch 俯仰 | 抬头 / 低头 |
| Roll 侧倾 | 左右歪头 |
| Yaw 偏航 | 左右转头 |
| 用户加速度 | 已扣掉重力,静止时接近 0 |
| 角速度 | rad/s |
没别的功能。它就是个窗口,让你看见耳机一直在看的东西。
一件有意思的事:偏航会漂
坐着别动,盯着 Yaw 那一栏看几分钟,你会发现它在缓慢地、单向地爬。
不是你在动,是陀螺仪在漂。
俯仰和侧倾不会,因为重力是个永远在那儿的参照物——耳机随时能拿它校准”哪边是下”。但左右转头这个方向,重力帮不上忙。手机靠磁力计(也就是指南针)解决这个问题,而 AirPods 没有磁力计。
所以偏航只能靠陀螺仪一点点累积角速度推算,误差也就一点点累积。
我做了个工具专门量它:按 ⌘D,戴着耳机静置三分钟,它会告诉你三个轴各自漂多快(°/min)。俯仰和侧倾的读数可以当对照组——如果它俩几乎不动,而偏航在持续单向爬升,那个爬升就是零偏。
⚠️ 测的时候别摘耳机。耳机一离耳,运动数据流立刻断掉。
这也是为什么要有「重设零点」这个功能(⌘K)。用着用着觉得人头朝向歪了,按一下,把当前朝向重新定义成正前方。
校准
首次使用建议跑一遍引导校准(⇧⌘K)。四步,每步都要你手动确认,程序不会自己往下走:
| 步骤 | 动作 |
|---|---|
| 1 | 坐正看向屏幕(3 秒倒计时,结束时的朝向记为零点) |
| 2 | 慢慢低头看键盘 |
| 3 | 慢慢把头转向左边 |
| 4 | 把头歪向右肩 |
后三步只要幅度到位、保持一秒就行,屏幕上有进度条。结果会存下来,下次启动自动沿用。
按 Esc 随时可以退出。
怎么装
1 | git clone https://github.com/zhangwenqiang0214/airpods-motion.git |
然后从访达双击 AirPodsMotion.app 启动。
⚠️ 别在终端里运行。macOS 的权限系统会把终端认作发起方,而终端没有声明运动权限,进程会被直接杀掉。这个行为挺隐蔽的——没有报错,就是启动不了。
第一次点「开始」会弹窗问「想要访问运动与健身数据」,选允许。不想给了随时可以在 系统设置 › 隐私与安全性 › 运动与健身 里撤销。
环境要求
- macOS 14 或更新
- 支持头部追踪的 AirPods——Pro / Max / 第三代及以后,老款没有这套传感器
- Xcode 命令行工具(编译用)
关于数据
读到的姿态数据只在内存里。不落盘,不上传,不发给任何人。关掉 app 就没了。
这本来是句废话,但现在不说清楚好像不行。
技术
Swift + SwiftUI + SceneKit,零第三方依赖。数据来自 CoreMotion 的 CMHeadphoneMotionManager——苹果开的口子,正经 API,不是什么黑魔法。
代码在 github.com/zhangwenqiang0214/airpods-motion。
写它没什么实用目的。只是觉得,一副耳机里藏着能感知你怎么转头的东西,这件事本身值得看一眼。







