加速度计

W3C 候选推荐草案,

关于本文件的更多信息
本版本:
https://www.w3.org/TR/2025/CRD-accelerometer-20250212/
最新发布版本:
https://www.w3.org/TR/accelerometer/
编辑草案:
https://w3c.github.io/accelerometer/
以往版本:
历史记录:
https://www.w3.org/standards/history/accelerometer/
反馈:
public-device-apis@w3.org 邮件标题请填写 “[accelerometer] … 消息主题 …” (邮件存档)
GitHub
实施报告:
https://www.w3.org/wiki/DAS/Implementations
测试套件:
https://github.com/web-platform-tests/wpt/tree/main/accelerometer
编辑:
Anssi Kostiainen (英特尔公司)
前编辑:
Alexander Shalamov (英特尔公司)

摘要

本规范定义了AccelerometerLinearAccelerationSensorGravitySensor 接口,用于获取承载该传感器设备的 X、Y、Z 轴上施加的 加速度信息。

本文档状态

本节描述了本文档在出版时的状态。W3C 当前出版物和此技术报告的最新修订版可在 W3C 技术报告索引 https://www.w3.org/TR/ 查找。

本文档由设备与传感器工作组,作为推荐标准轨道的候选推荐草案发布。本文件旨在成为 W3C 推荐标准。

如需就本文档发表评论,请发送至public-device-apis@w3.org订阅存档)。 发送邮件时, 请在主题中注明 “accelerometer”, 建议格式如下: “[accelerometer] …评论摘要…”。 欢迎所有意见和建议。

作为候选推荐标准发布并不意味着 W3C 及其成员的认可。候选推荐草案整合了工作组打算在后续候选推荐快照中纳入的上一版候选推荐的更改。本文为草稿,可能随时被更新、替换或废止。除“进行中”外,不应引用本文档。

进入提案推荐阶段的门槛是至少有两个独立且可互操作的用户代理完全实现本规范的所有功能,该标准通过工作组开发的测试套件中定义的用户代理测试来判断。工作组将准备一份实施报告以追踪进展。

本文档由遵循 W3C 专利政策 的小组制作。W3C 维护着一个公开专利披露列表,收录与该工作组交付物相关的专利披露信息;该页面也包括披露专利的说明。有实际了解某项专利且认为其包含必要权利要求的个人,必须根据W3C 专利政策第 6 节进行披露。

本文档受2023年11月3日 W3C流程文档管理。

本文档维护并可随时更新,部分内容为进行中工作。

1. 简介

加速度计线性加速度传感器重力传感器 API 扩展了 Generic Sensor API [GENERIC-SENSOR] 接口,用于提供设备定义的 加速度 在设备 X、Y、Z 轴本地坐标系(local coordinate system)上的测量信息。

2. 示例

let sensor = new Accelerometer();
sensor.start();

sensor.onreading = () => {
    console.log("沿 X 轴加速度: " + sensor.x);
    console.log("沿 Y 轴加速度: " + sensor.y);
    console.log("沿 Z 轴加速度: " + sensor.z);
}

sensor.onerror = event => console.log(event.error.name, event.error.message);
下例演示如何使用提供 屏幕坐标系读数的重力传感器。此代码会在 dom screen 垂直于地面且网页底部朝下时,将消息打印到控制台。
let sensor = new GravitySensor({frequency: 5, referenceFrame: "screen"});

sensor.onreading = () => {
  if (sensor.y >= 9.8) {
    console.log("网页垂直于地面。");
  }
}

sensor.start();
下例检测设备 X 轴方向上的晃动手势,无论 dom screen 的朝向如何。
const shakeThreshold = 25;

let sensor = new LinearAccelerationSensor({frequency: 60});

sensor.addEventListener('reading', () => {
  if (sensor.x > shakeThreshold) {
    console.log("检测到晃动。");
  }
});

sensor.start();

3. 用例与需求

用例和需求见 Motion Sensors Explainer Sensor use cases 文档。

4. 安全与隐私注意事项

通过惯性传感器(如加速度计)提供的 传感器读数, 可能被攻击者利用以发起各种安全威胁,例如键盘记录位置追踪设备指纹用户识别等。

安全界发布的研究论文,例如 [KEYSTROKEDEFENSE], 表明仅通过限制频率并不能完全消除攻击风险,反而可能极大影响有合理需求的 web 应用的可用性。

[TOUCHSIGNATURES][ACCESSORY] 研究提出, 实现应在惯性传感器使用时提供可视提示,和/或要求用户明确授权以访问传感器读数。这些缓解措施补充了 Generic Sensor API [GENERIC-SENSOR]中定义的通用缓解策略

本规范定义了 加速度计读数量化算法 (由获取最新读数值操作调用),以缓解传感器校准指纹 [SENSORID] 及依赖高精度传感器读数的攻击。数量化算法细节遵循 W3C 隐私兴趣组的建议

5. 权限策略集成

本规范采用权限策略控制特性,其关键字为 "accelerometer", 由[DEVICE-ORIENTATION]定义。

6. 模型

6.1. 加速度计

加速度计 传感器类型 关联如下数据:

扩展传感器接口

Accelerometer

传感器权限名

"accelerometer"

传感器特性名

"accelerometer"

权限撤销算法

用 "accelerometer" 调用 通用传感器权限撤销算法

默认传感器

设备的主加速度计传感器。

虚拟传感器类型

"accelerometer"

最新读数, 对于 Sensor 类型为加速度计传感器类型, 包含三个条目为 "x"、"y"、"z",其 表示设备在对应轴的加速度

加速度 是设备速度相对于时间的变化率,单位为米每二次方秒 (m/s2) [SI]

加速度 测量的参考系应为惯性系,例如设备处于自由落体状态时每个轴的加速度读数为 0 (m/s2)。

加速度 的正负号应遵循右手定则,并以本地坐标系(见下图)为准。

Accelerometer coordinate system.

6.2. 线性加速度传感器

线性加速度传感器 传感器类型 关联如下数据:

扩展传感器接口

LinearAccelerationSensor

传感器权限名

"accelerometer"

传感器特性名

"accelerometer"

权限撤销算法

用 "accelerometer" 调用 通用传感器权限撤销算法

虚拟传感器类型

"linear-acceleration"

最新读数, 对于Sensor 类型为线性加速度传感器传感器类型, 包含三个条目 为 "x"、"y"、"z",其 表示设备在对应轴的线性加速度

线性加速度 是指作用于传感器所在设备、不包含重力分量的加速度

注: 重力线性加速度 的关系详见 Motion Sensors Explainer § gravity-and-linear-acceleration

6.3. 重力传感器

重力传感器 传感器类型 关联如下数据:

扩展传感器接口

GravitySensor

传感器权限名

"accelerometer"

传感器特性名

"accelerometer"

权限撤销算法

用 "accelerometer" 调用 通用传感器权限撤销算法

虚拟传感器类型

"gravity"

最新读数 ,对于Sensor 类型为重力传感器传感器类型, 包含三个条目,其 为 "x"、"y"、"z",其 表示对应轴方向的重力加速度。

重力 是指设备加速度中阻止其速度朝向临近天体质量增加的那部分分量。较长时间处于自由落体的设备可能计算出错误的重力值。

注: 重力线性加速度 的关系详见 Motion Sensors Explainer § gravity-and-linear-acceleration

6.4. 参考系

本地坐标系表示加速度计线性加速度传感器、 以及重力传感器 读数的参考系。它可以是设备坐标系屏幕坐标系

设备坐标系定义为与物理设备绑定的三维笛卡尔坐标系(x、y、z)。 对于带有显示屏的设备,设备坐标系的原点在设备显示屏中央。如果设备以默认姿态持握, Y 轴指向显示屏顶部,X 轴指向显示屏右侧,Z 轴是 X、Y 轴的向量积,指向屏幕外部、朝向用户。 设备坐标系始终稳定,不受 dom screen 朝向变化影响(见下图)。

Device coordinate system.

屏幕坐标系定义为与dom screen 绑定的三维笛卡尔坐标系(x、y、z)。屏幕坐标系的原点在 dom screen 中心。Y 轴始终指向 dom screen 顶部,X 轴指向 dom screen 右侧,Z 轴是 X、Y 轴的向量积,指向 dom screen 屏幕外部、朝向用户(见下图)。

Screen coordinate system.

设备坐标系屏幕坐标系 主要区别在于屏幕坐标系会始终跟随 dom screen 朝向变化, 即,当前朝向类型发生变化时,X 轴与 Y 轴会相对于设备变换。 而设备坐标系 总是相对于设备保持不变。

7. API

7.1. 加速度计接口

[SecureContext, Exposed=Window]
interface Accelerometer : Sensor {
  constructor(optional AccelerometerSensorOptions options = {});
  readonly attribute double? x;
  readonly attribute double? y;
  readonly attribute double? z;
};

enum AccelerometerLocalCoordinateSystem { "device", "screen" };

dictionary AccelerometerSensorOptions : SensorOptions {
  AccelerometerLocalCoordinateSystem referenceFrame = "device";
};
new Accelerometer(options) 构造步骤是以抽象操作“构造加速度计对象” 并以thisoptions为参数进行调用。

加速度计 Accelerometer 的支持选项为 “frequency” 和 “referenceFrame”。

7.1.1. Accelerometer.x

x 属性(Accelerometer接口) 返回以this和" x "为参数调用 get value from latest reading的结果。它表示 x 轴方向的加速度

7.1.2. Accelerometer.y

y 属性(Accelerometer接口) 返回以this和" y "为参数调用 get value from latest reading的结果。它表示 y 轴方向的加速度

7.1.3. Accelerometer.z

z 属性(Accelerometer接口) 返回以this和" z "为参数调用 get value from latest reading的结果。它表示 z 轴方向的加速度

7.2. 线性加速度传感器接口

[SecureContext, Exposed=Window]
interface LinearAccelerationSensor : Accelerometer {
  constructor(optional AccelerometerSensorOptions options = {});
};
new LinearAccelerationSensor(options) 构造步骤是以抽象操作“构造加速度计对象” 并以thisoptions为参数进行调用。

线性加速度传感器 LinearAccelerationSensor 的支持选项为 “frequency” 和 “referenceFrame”。

7.2.1. LinearAccelerationSensor.x

x 属性(LinearAccelerationSensor接口) 返回以this和" x "为参数调用 get value from latest reading的结果。它表示 x 轴的线性加速度

7.2.2. LinearAccelerationSensor.y

y 属性(LinearAccelerationSensor接口) 返回以this和" y "为参数调用 get value from latest reading的结果。它表示 y 轴的线性加速度

7.2.3. LinearAccelerationSensor.z

z 属性(LinearAccelerationSensor接口) 返回以this和" z "为参数调用 get value from latest reading的结果。它表示 z 轴的线性加速度

7.3. 重力传感器接口

[SecureContext, Exposed=Window]
interface GravitySensor : Accelerometer {
  constructor(optional AccelerometerSensorOptions options = {});
};
new GravitySensor(options) 构造步骤是以抽象操作“构造加速度计对象” 并以thisoptions为参数进行调用。

重力传感器 GravitySensor 的支持选项为 “frequency” 和 “referenceFrame”。

7.3.1. GravitySensor.x

x 属性(GravitySensor接口) 返回以this和" x "为参数调用 get value from latest reading的结果。它表示由重力导致的 x 轴加速度分量。

7.3.2. GravitySensor.y

y 属性(GravitySensor接口) 返回以this和" y "为参数调用 get value from latest reading的结果。它表示由重力导致的 y 轴加速度分量。

7.3.3. GravitySensor.z

z 属性(GravitySensor接口) 返回以this和" z "为参数调用 get value from latest reading的结果。它表示由重力导致的 z 轴加速度分量。

8. 抽象操作

8.1. 构造加速度计对象

输入

objectAccelerometerLinearAccelerationSensorGravitySensor 对象。

optionsAccelerometerSensorOptions 对象。

  1. allowed为调用 检查传感器权限策略特性 ,参数为object传感器类型

  2. 如果allowed为 false:

    1. 抛出 SecurityError DOMException

  3. objectoptions为参数调用 初始化传感器对象

  4. 如果options.referenceFrame 为 "screen":

    1. object本地坐标系设为 屏幕坐标系

  5. 否则,将object本地坐标系定义为 设备坐标系

8.2. 加速度计读数量化算法

加速度计传感器类型定义了如下 读数数量化算法

输入

reading传感器读数

输出

传感器读数

  1. quantizedReadingreading

  2. 如果quantizedReading["x"]不为 null,则设置 quantizedReading["x"]为最接近的 0.1 m/s2

  3. 如果quantizedReading["y"]不为 null,则设置 quantizedReading["y"]为最接近的 0.1 m/s2

  4. 如果quantizedReading["z"]不为 null,则设置 quantizedReading["z"]为最接近的 0.1 m/s2

  5. 返回quantizedReading

9. 自动化

本节通过提供加速度计专用的虚拟传感器元数据,扩展了Generic Sensor API § 9 Automation。本规范使用的部分虚拟传感器类型[DEVICE-ORIENTATION] 中定义。

9.1. 加速度计自动化

加速度计虚拟传感器类型及其在按类型虚拟传感器元数据 映射 中的对应条目定义见 Device Orientation and Motion § automation

9.2. 线性加速度计自动化

线性加速度虚拟传感器类型及其在按类型虚拟传感器元数据 映射 中的对应条目定义见 Device Orientation and Motion § automation

9.3. 重力自动化

按类型虚拟传感器元数据 映射 必须包含如下条目

"gravity"

一个虚拟传感器元数据,其读数解析算法解析 xyz 读数

10. 致谢

Tobie Langel 在 Generic Sensor API 上的贡献。

W3C 隐私利益小组和 Paul Jensen 对传感器校准指纹特征防护方案的建议与讨论。

一致性

文档约定

一致性要求以描述性断言和 RFC 2119 术语组合表示。规范性部分中 “MUST”“MUST NOT”“REQUIRED”“SHALL”“SHALL NOT”“SHOULD”“SHOULD NOT”“RECOMMENDED”“MAY”“OPTIONAL” 等关键词, 其含义按照 RFC 2119 描述理解。但为了可读性,这些词在本规范中并不都是全大写。

除非明确标记为非规范性内容、示例和注释,否则本规范所有文本均为规范性内容。 [RFC2119]

本规范中的示例以“例如”引出,或以 class="example" 标示,区别于规范正文,例如:

这是一个信息性示例。

信息性注释以“注”引出,并以 class="note" 标示,区别于规范正文,例如:

注,这是一个信息性说明。

一致性算法

作为算法说明部分(如“去除所有前导空格字符”或“返回 false 并中止这些步骤”等)的强制性表述,应结合所用关键词(“必须”、“应当”、“可以”等)理解。

作为算法或具体步骤的一致性要求只要最终结果等同即可,以任何形式实现皆可。尤其本规范中的算法旨在便于理解,而非性能最优。建议实现者自行优化。

索引

本规范定义的术语

外部引用定义术语

参考文献

规范性引用

[DEVICE-ORIENTATION]
Reilly Grant; Marcos Caceres. Device Orientation and Motion. URL: https://w3c.github.io/deviceorientation/
[GENERIC-SENSOR]
Rick Waldron. Generic Sensor API. URL: https://w3c.github.io/sensors/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra Standard. Living Standard. URL: https://infra.spec.whatwg.org/
[PERMISSIONS]
Marcos Caceres; Mike Taylor. Permissions. URL: https://w3c.github.io/permissions/
[PERMISSIONS-POLICY-1]
Ian Clelland. Permissions Policy. URL: https://w3c.github.io/webappsec-permissions-policy/
[RFC2119]
S. Bradner. Key words for use in RFCs to Indicate Requirement Levels. March 1997. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119
[SCREEN-ORIENTATION]
Marcos Caceres. Screen Orientation. URL: https://w3c.github.io/screen-orientation/
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL Standard. Living Standard. URL: https://webidl.spec.whatwg.org/

资料性引用

[ACCESSORY]
Owusu, Emmanuel, et al. ACCessory: password inference using accelerometers on smartphones. 2012. Informational. URL: https://dl.acm.org/citation.cfm?id=2162095
[KEYSTROKEDEFENSE]
Song, Yihang, et al. Two novel defenses against motion-based keystroke inference attacks. 2014. Informational. URL: https://arxiv.org/abs/1410.7746
[MOTION-SENSORS]
Kenneth Christiansen; Alexander Shalamov. Motion Sensors Explainer. URL: https://w3c.github.io/motion-sensors/
[SENSORID]
Zhang, Jiexin; Beresford, Alastair R.; Sheret, Ian. SensorID: Sensor Calibration Fingerprinting for Smartphones. 2019. URL: https://doi.org/10.1109/SP.2019.00072
[SI]
SI Brochure: The International System of Units (SI), 8th edition. 2014. 8th Edition. URL: http://www.bipm.org/en/publications/si-brochure/
[TOUCHSIGNATURES]
Mehrnezhad, Maryam, et al. Touchsignatures: identification of user touch actions and pins based on mobile sensor data via javascript. 2016. Informational. URL: https://arxiv.org/abs/1602.04115

IDL 索引

[SecureContext, Exposed=Window]
interface Accelerometer : Sensor {
  constructor(optional AccelerometerSensorOptions options = {});
  readonly attribute double? x;
  readonly attribute double? y;
  readonly attribute double? z;
};

enum AccelerometerLocalCoordinateSystem { "device", "screen" };

dictionary AccelerometerSensorOptions : SensorOptions {
  AccelerometerLocalCoordinateSystem referenceFrame = "device";
};

[SecureContext, Exposed=Window]
interface LinearAccelerationSensor : Accelerometer {
  constructor(optional AccelerometerSensorOptions options = {});
};

[SecureContext, Exposed=Window]
interface GravitySensor : Accelerometer {
  constructor(optional AccelerometerSensorOptions options = {});
};

MDN

Accelerometer/Accelerometer

In only one current engine.

FirefoxNoneSafariNoneChrome67+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

Accelerometer/x

In only one current engine.

FirefoxNoneSafariNoneChrome67+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

Accelerometer/y

In only one current engine.

FirefoxNoneSafariNoneChrome67+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

Accelerometer/z

In only one current engine.

FirefoxNoneSafariNoneChrome67+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

Accelerometer

In only one current engine.

FirefoxNoneSafariNoneChrome67+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

GravitySensor/GravitySensor

In only one current engine.

FirefoxNoneSafariNoneChrome91+
Opera?Edge91+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

GravitySensor

In only one current engine.

FirefoxNoneSafariNoneChrome91+
Opera?Edge91+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

LinearAccelerationSensor/LinearAccelerationSensor

In only one current engine.

FirefoxNoneSafariNoneChrome67+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

LinearAccelerationSensor

In only one current engine.

FirefoxNoneSafariNoneChrome67+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

Headers/Feature-Policy/accelerometer

In only one current engine.

FirefoxNoneSafariNoneChrome67+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?