手机加速度传感器开发参考手册(Accelerometer)
1. 什么是加速度传感器
加速度传感器(Accelerometer,简称加速度计)用于测量设备在三个正交轴向上的比力(specific force),单位通常是 m/s²(米每二次方秒)或 g(重力加速度,1 g ≈ 9.80665 m/s²)。
它测量的是设备相对于自由落体参考系的加速度。一个最容易被忽略的事实是:静止平放在桌面上的手机,z 轴读数为 ~9.81 m/s²,因为传感器"感受"的是重力加速度;当手机自由下落时,三轴读数反而接近 0(失重)。
一句话理解:加速度计读数 = 真实运动加速度 + 重力加速度分量。要得到"用户手持晃动"的线性加速度,必须把重力分量去掉(见 §5)。
2. 核心概念与坐标系
2.1 设备坐标系(三端通用约定)
Android、iOS(Core Motion)、Web(DeviceMotion)三者的设备坐标系方向一致:
|
轴 |
方向 |
平放桌面上(屏幕朝上)读数 |
|
x |
沿屏幕向右 |
≈ 0 |
|
y |
沿屏幕向上 |
≈ 0 |
|
z |
垂直屏幕向外(朝向用户脸) |
≈ +9.81 m/s² |
⚠️ 注意:这与图形 API(如 OpenGL、UIKit 的 y 轴向下)完全不同。做横竖屏旋转或部分游戏渲染时,务必先显式旋正坐标系,否则会"上下/左右颠倒"。
2.2 两个关键量
|
量 |
含义 |
来源/获取方式 |
|
加速度(含重力) |
运动 + 重力合成 |
Android |
|
线性加速度(不含重力) |
纯运动加速度 |
Android |
|
重力加速度 |
仅重力分量 |
Android |
💡 优先使用平台提供的"线性加速度"类型(如 Android 的
TYPE_LINEAR_ACCELERATION),其内部已做传感器融合,比自己滤波更稳定。
3. 三端数据读取
3.1 Android(Kotlin)
3.2 iOS(Swift · Core Motion)
3.3 Web(JavaScript · DeviceMotion)
📌 Web 必须在安全上下文(HTTPS)下才能访问传感器;
localhost可例外用于本地调试。
4. 关键参数与选型
|
参数 |
说明 |
开发者关注点 |
|
量程 (Range) |
±2g / ±4g / ±8g / ±16g 等 |
量程越大越不易"削顶"(clipping),但分辨率越低。跌落检测用大量程,计步用小量程更灵敏。 |
|
采样率 |
常见 50–200 Hz |
越高越耗电、数据越多。计步/摇一摇 50Hz 足够;手势识别可 100Hz。 |
|
噪声密度 |
µg/√Hz |
决定低幅运动能否被分辨,影响阈值设定。 |
|
功耗 |
µA 级 |
后台/常驻监听时要控制采样率与监听时长。 |
|
坐标系 |
设备 vs 世界 |
需要"绝对方向"时用融合后的世界坐标系(见 §5),否则用设备坐标系即可。 |
⚠️ 不同机型芯片(如 Bosch / ST / InvenSense)量程、灵敏度、轴方向存在细微差异。不要硬编码阈值,建议做机型/标定自适应或提供可调参数。
5. 传感器融合(去重力 / 得姿态)
单靠加速度计无法区分"运动"与"重力"。常见组合:
|
组合 |
产出 |
用途 |
|
加速度计 + 陀螺仪 |
线性加速度、倾斜角、姿态(AHRS) |
手势、防抖、方向感知 |
|
加速度计 + 陀螺仪 + 磁力计 |
绝对航向(指南针式 yaw) |
导航、AR、地图朝向 |
|
加速度计 + 计步算法 |
步数、活动识别 |
健康、计步器 |
5.1 低通滤波去除重力(Web / iOS 自实现)
💡 平台已提供融合结果时优先用原生:Android
TYPE_LINEAR_ACCELERATION、iOSCMDeviceMotion.userAcceleration。
6. 典型应用场景
|
场景 |
思路 |
要点 |
|
摇一摇 |
含重力加速度合力超阈值且去抖 |
阈值 ~35 m/s² 起,做时间冷却避免重复触发 |
|
计步 |
峰值检测 + 周期性判定 |
优先用系统健康 API(Android STEP_COUNTER / iOS HealthKit / Core Motion |
|
横竖屏判断 |
比较 |x| 与 |y| 重力分量 |
注意系统已提供旋转事件,勿重复造轮 |
|
跌落检测 |
自由落体(≈0g)后骤增冲击 |
需大采样率与量程,注意误报(如抛掷) |
|
手势识别 |
线性加速度序列 + 模板匹配/ML |
去重力、坐标旋正、做归一化 |
|
防睡眠/活跃度 |
持续小幅加速度判定使用中 |
注意后台限制与功耗 |
6.1 摇一摇示例
7. 权限与平台限制
|
平台 |
权限/限制 |
要点 |
|
Android |
|
Android 12+ 前台读取需权限;后台采集需前台服务且声明 |
|
iOS |
|
Info.plist 必须配置用途描述;首次访问弹系统授权;用户拒绝后无法读取。 |
|
Web |
HTTPS + 用户手势授权(iOS) |
非安全上下文直接不可用;iOS 13+ 需 |
⚠️ 隐私合规:加速度数据可能间接推断用户行为/健康状态。上架前确认隐私政策覆盖,且后台采集遵循各平台最小必要原则。
8. 开发者查补清单(常见坑)
|
# |
坑 |
正确做法 |
|
1 |
以为静止时读数为 0 |
记住含重力,静止平放 z≈9.81;要线性加速度先去重力 |
|
2 |
坐标系方向弄反 |
设备坐标 x 右/y 上/z 向外;与渲染坐标(y 向下)区分 |
|
3 |
单位混淆(g vs m/s²) |
iOS Core Motion 是 g,Android/Web 多为 m/s²,统一换算 |
|
4 |
忘记解注册监听 |
onPause/onDestroy、页面卸载时 unregister/removeEventListener,否则耗电+泄漏 |
|
5 |
采样率过高 |
按需设 50Hz 足够,避免 FASTEST 常驻 |
|
6 |
iOS 13+ 未申请权限 |
在用户手势中调用 |
|
7 |
Web 用 http/非安全上下文 |
必须 HTTPS(localhost 除外);做特性检测降级 |
|
8 |
Android 12+ 后台采集无权限 |
加 |
|
9 |
在模拟器上测传感器 |
模拟器无真实传感器,用 Sensor Simulator 或真机验证 |
|
10 |
硬编码阈值 |
机型差异大,阈值参数化 + 可选标定 |
|
11 |
未做时间戳对齐 |
多传感器融合按 |
|
12 |
忽略横竖屏旋转 |
旋转后设备坐标相对世界会变,需要时用融合世界坐标 |
9. 参考与延伸
- Android:
SensorManager/Sensor/SensorEvent官方文档
- iOS:
CoreMotion框架(CMMotionManager、CMDeviceMotion)官方文档
- Web:W3C DeviceOrientation Event 规范、
DeviceMotionEventMDN
- 进阶:AHRS/卡尔曼滤波、计步与活动识别算法、传感器融合开源实现
💡 本手册为开发速查用,示例代码为最小可运行骨架,生产环境请补充错误处理、权限降级与性能/功耗控制。
- 点赞
- 收藏
- 关注作者
评论(0)