手机加速度传感器开发参考手册(Accelerometer)

举报
暮山紫 发表于 2026/10/15 09:46:18 2026/10/15
【摘要】 1. 什么是加速度传感器加速度传感器(Accelerometer,简称加速度计)用于测量设备在三个正交轴向上的比力(specific force),单位通常是 m/s²(米每二次方秒)或 g(重力加速度,1 g ≈ 9.80665 m/s²)。它测量的是设备相对于自由落体参考系的加速度。一个最容易被忽略的事实是:静止平放在桌面上的手机,z 轴读数为 ~9.81 m/s²,因为传感器"感受"的...

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 TYPE_ACCELEROMETER;Web accelerationIncludingGravity;iOS 需用重力加速度合成或自行滤波

线性加速度(不含重力)

纯运动加速度

Android TYPE_LINEAR_ACCELERATION;Web acceleration;iOS 无直接类型,需低通滤波去除重力

重力加速度

仅重力分量

Android TYPE_GRAVITY;Web 需自行低通估算;iOS 无单独类型

💡 优先使用平台提供的"线性加速度"类型(如 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、iOS CMDeviceMotion.userAcceleration。


6. 典型应用场景

场景

思路

要点

摇一摇

含重力加速度合力超阈值且去抖

阈值 ~35 m/s² 起,做时间冷却避免重复触发

计步

峰值检测 + 周期性判定

优先用系统健康 API(Android STEP_COUNTER / iOS HealthKit / Core Motion CMPedometer)

横竖屏判断

比较 |x| 与 |y| 重力分量

注意系统已提供旋转事件,勿重复造轮

跌落检测

自由落体(≈0g)后骤增冲击

需大采样率与量程,注意误报(如抛掷)

手势识别

线性加速度序列 + 模板匹配/ML

去重力、坐标旋正、做归一化

防睡眠/活跃度

持续小幅加速度判定使用中

注意后台限制与功耗

6.1 摇一摇示例


7. 权限与平台限制

平台

权限/限制

要点

Android

BODY_SENSORS(API 31+)

Android 12+ 前台读取需权限;后台采集需前台服务且声明 foregroundServiceType;10+ 起后台限制趋严。

iOS

NSMotionUsageDescription

Info.plist 必须配置用途描述;首次访问弹系统授权;用户拒绝后无法读取。

Web

HTTPS + 用户手势授权(iOS)

非安全上下文直接不可用;iOS 13+ 需 requestPermission() 且由点击等手势触发。

⚠️ 隐私合规:加速度数据可能间接推断用户行为/健康状态。上架前确认隐私政策覆盖,且后台采集遵循各平台最小必要原则。


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+ 未申请权限

在用户手势中调用 requestPermission(),并配置 Info.plist 描述

7

Web 用 http/非安全上下文

必须 HTTPS(localhost 除外);做特性检测降级

8

Android 12+ 后台采集无权限

加 BODY_SENSORS + 前台服务类型声明

9

在模拟器上测传感器

模拟器无真实传感器,用 Sensor Simulator 或真机验证

10

硬编码阈值

机型差异大,阈值参数化 + 可选标定

11

未做时间戳对齐

多传感器融合按 event.timestamp 对齐,勿用系统当前时间

12

忽略横竖屏旋转

旋转后设备坐标相对世界会变,需要时用融合世界坐标


9. 参考与延伸

  • Android:SensorManager / Sensor / SensorEvent 官方文档
  • iOS:CoreMotion 框架(CMMotionManager、CMDeviceMotion)官方文档
  • Web:W3C DeviceOrientation Event 规范、DeviceMotionEvent MDN
  • 进阶:AHRS/卡尔曼滤波、计步与活动识别算法、传感器融合开源实现

💡 本手册为开发速查用,示例代码为最小可运行骨架,生产环境请补充错误处理、权限降级与性能/功耗控制。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。