运动传感器说明文档

W3C 工作组说明,

此版本:
https://www.w3.org/TR/2017/NOTE-motion-sensors-20170830/
最新发布版本:
https://www.w3.org/TR/motion-sensors/
编辑者草案:
https://w3c.github.io/motion-sensors/
先前版本:
版本历史:
https://github.com/w3c/motion-sensors/commits/gh-pages/index.bs
反馈:
public-device-apis@w3.org 主题行写为“[motion-sensors] … 消息主题 …”(归档
问题跟踪:
GitHub
编辑者:
Kenneth Rohde ChristiansenIntel Corporation
Alexander ShalamovIntel Corporation
缺陷报告:
通过 GitHub 上的 w3c/motion-sensors 仓库

摘要

本文档是对低级和高级运动传感器的介绍, 包括它们之间的关系、内部工作原理和常见用例。文中通过示例介绍 事件过滤和传感器融合的常见情形,展示如何将其应用于遵循 Generic Sensor API 规范的传感器。

本文档状态

本节描述本文档在发布时的状态。其他文档可能会 取代本文档。当前 W3C 出版物列表以及本技术 报告的最新修订版,可在 W3C 技术报告索引中找到,地址为 https://www.w3.org/TR/。

本文档由 Device and Sensors 工作 组作为工作组说明发布。

如果你希望对本文档发表评论,请将评论发送至 public-device-apis@w3.org订阅归档)。 发送电子邮件时, 请将文本“motion-sensors”放在主题中, 最好像这样: “[motion-sensors] …评论摘要…”。 欢迎所有评论。

作为工作组说明发布并不意味着获得 W3C 会员的认可。 这是一份草案文档,可能会在任何时候被其他文档更新、替换或废弃。 除作为正在进行中的工作外,不应引用本文档。

本文档由一个根据 2004年2月5日 W3C 专利政策运作的工作组制作。 W3C 维护一个与该工作组交付物有关的 任何专利披露的公开列表; 该页面还包括披露专利的说明。 任何实际知晓某项专利且认为该专利包含必要权利要求的个人,必须 按照 W3C 专利 政策第 6 节披露相关信息。

本文档受 2017年3月1日 W3C 流程文档约束。

1. 引言

现代硬件(如手机)中有少数几种不同的运动传感器可用。

运动传感器扩展 Generic Sensor API [GENERIC-SENSOR],以暴露 一类低级和融合传感器。本文档解释这些传感器之间的关系。

低级传感器包括:

可以使用上述传感器的数据,以不同方式创建多个新的传感器。 这些通常称为融合传感器。

2. 安全和隐私考量

除了 Generic Sensor API [GENERIC-SENSOR] 中描述的内容之外, 没有特定的安全和隐私考量。

3. 低级传感器

3.1. 加速度计

原始加速度计 传感器会测量 3 个不同方向上的加速度变化, 但会受到重力影响。Accelerometer 接口定义于 [ACCELEROMETER] 规范。

加速度计传感器是一个 惯性参考系 传感器,这意味着当设备 处于自由落体时,落下方向上的加速度为 0 m/s2;而当设备平放在桌面上时, 向上方向的加速度将等于地球重力,即 g ≡ 9.8 m/s2,因为它测量的是桌子 将设备向上推的力。

加速度计单独使用时作用较小,常常参与其他融合传感器, 但它们确实也有一些用途,例如记录摇晃、步数等。

对于这类用例,开发者通常感兴趣的是线性 加速度,也就是不含重力的加速度,称为重力补偿 (参见 Linear Acceleration Sensor);或者开发者感兴趣的是 被隔离出来的重力, 以便知道重力向量(参见 Gravity Sensor),这对某些 传感器融合类型很有用,例如创建磁罗盘。

对于加速度,你通常关心较大的变化,并希望避免噪声,例如重力,因此高通滤波器可以帮助隔离线性 加速度,而低通 滤波器可以帮助隔离重力。因此,低通滤波器可用于测量 倾斜。不幸的是,任何高通滤波器低通滤波器都会引入延迟,而这种延迟可能可接受,也可能不可接受。

注意,由于加速度计报告的是加速度,你需要积分才能得到速度

v = ∫a×∂t

并再次积分才能得到位置

x = ∫v×∂t

积分会产生漂移,而二重积分会放大这种漂移:

a = g×sin(θ), x = ½×at2

因此,从加速度计得到的位置非常不精确,也不是很有用。

3.2. 陀螺仪

陀螺仪感测相对于自身的角速度,因此它测量的是自身的 旋转, 使用一种称为科里奥利效应的惯性力。陀螺仪以相对较高的频率振荡来 测量这一点,因此它是最耗电的运动传感器之一。这也意味着 它们很容易受到其他振动的影响,例如同一设备上的振动(rumble)马达或扬声器。 Gyroscope 接口定义于 [GYROSCOPE] 规范。

为了从感测角 速度的陀螺仪获得旋转(角度),你需要 进行一次积分。

f ≡ frequency

∫cos(2π×ft)) = (1/(2π×f)) × sin(2π×ft)

但要注意,积分会把噪声变成漂移。正如上面所见,积分会在外面得到一个 1/f,这意味着高频(f)噪声会随积分消失,即某个频率的噪声 会降低 100 倍,但非常低的频率会被放大, 这意味着陀螺仪会随时间漂移。

因此,为了做好这一点,你需要快速完成;而如下所示,我们会乘以 ∂t,所以所报告时间差中的任何误差都会表现为上述漂移。

θn = θn-1 + ω × ∂t

其中 ω 表示角速度,θ 表示所得角度。

大多数陀螺仪传感器都会通过在硬件中应用某种漂移补偿来进行校准, 以补偿设备上相邻硬件导致的已知低频。

3.3. 磁力计

磁力计磁 场传感器,这意味着在附近没有 强磁影响的情况下,它会感测地球的磁 场,该磁场大致指向 北方,但不是真北。Magnetometer 接口定义于 [MAGNETOMETER] 规范。

如前所述,磁力计对外部影响非常敏感,例如桌面上任何 被轻微磁化的东西;它甚至还会受到设备内部其他部件的影响,尽管 设备制造商可以在一定程度上对此进行补偿。不过在实践中,这些传感器 对大多数常见用例来说工作得相当好。

只要周围被磁化的物体没有移动,磁力计 读数就足够稳定,可用于隔离如上所述的重力

磁力计是一个三轴传感器,这意味着它给出一个指向最强磁场的 3D 向量。这也意味着它不会强制特定的 设备方向才能 工作。

不过,为了判断设备是如何被握持的,你需要一个重力向量,在低通滤波的情况下, 最低限度 需要一个加速度计;如果需要更精确的读数,则还需要一个陀螺仪。 这称为倾斜补偿

磁力计最常见的用例是作为传感器融合的一部分,用于生成一个 相对于地球平面静止的 Orientation Sensor,或者一个罗盘;后者基本上是 前者加上根据地理位置对磁偏角进行修正,使其指向 真北。

4. 高级传感器

如上所述,每个传感器都有自身的问题,例如噪声和漂移,并且通常需要 使用来自不同传感器的输入进行某种补偿。换句话说,一个传感器本身可能 不是很精确,但多个传感输入的总和可以稳定得多。

不幸的是,传感器需要电力,而且传感器越多、测量频率越高, 功耗就越高。陀螺仪通常被认为比 其他传感器更耗电,因为它需要以一定频率振动才能测量角 速度

基于上述原因,始终需要考虑能够令人满意地解决任务的最小传感器集合。 由于当今许多设备可以在硬件中执行某些类型的传感器融合, 从功耗和性能角度来看,使用这些硬件能力通常最有意义。

4.1. 常见融合传感器

下面列出融合传感器以及它们通常由哪些传感器组成:

传感器类型 底层物理传感器
Relative Orientation Sensor 加速度计陀螺仪,不得使用 磁力计
Absolute Orientation Sensor 加速度计磁力计,并且(存在时)使用陀螺仪
Geomagnetic Orientation Sensor 加速度计磁力计,不得使用陀螺仪
Gravity Sensor 加速度计陀螺仪
Linear Acceleration Sensor 加速度计,并且使用 陀螺仪磁力计中的任一个

4.2. 低通和高通滤波器

如前所述,可以使用低通和高通滤波器来去除噪声 (高频或低频)。顾名思义,这些滤波器允许低频或高频通过, 因而会截断或最小化不需要频率的影响。

4.2.1. 低通滤波器

创建低通滤波器的一种常见方式是只使用 最新值的一定百分比,其余部分取自已有值。从某种意义上说,这意味着 该滤波器会记住常见值,从而平滑掉不常见值,而这些值通常 是噪声造成的。由于它使用已有值的很大比例,此 方案会在记录实际事件时引入延迟。

class LowPassFilterData {
  constructor(reading, bias) {
    Object.assign(this, { x: reading.x, y: reading.y, z: reading.z });
    this.bias = bias;
  }

  update(reading) {
    this.x = this.x * this.bias + reading.x * (1 - this.bias);
    this.y = this.y * this.bias + reading.y * (1 - this.bias);
    this.z = this.z * this.bias + reading.z * (1 - this.bias);
  }
};

const accl = new Accelerometer({ frequency: 20 });
              
// 用低通滤波器隔离重力。
const filter = new LowPassFilterData(accl, 0.8);

accl.onreading = () => {
  filter.update(accl); // 让最新值通过滤波器。
  console.log(`隔离出的重力 (${filter.x}, ${filter.y}, ${filter.z})`);
}

accl.start();

4.2.2. 高通滤波器

高通滤波器 的工作方式类似于低通 滤波器,但只允许高频通过。

这可用于消除随时间在陀螺仪 读数中累积起来的漂移。

class HighPassFilterData {
  constructor(reading, cutoffFrequency) {
    Object.assign(this, { x: reading.x, y: reading.y, z: reading.z });
    this.cutoff = cutoffFrequency;
    this.timestamp = reading.timestamp;
  }

  update(reading) {
    let dt = reading.timestamp - this.timestamp / 1000;
    this.timestamp = reading.timestamp;

    for (let i of ["x", "y", "z"]) {
      let alpha = this.cutoff / (this.cutoff + dt);
      this[i] = this[i] + alpha * (reading[i] - this[i]);
    }
  }
};

const gyro = new Gyroscope({ frequency: 20 });
              
// 用高通滤波器移除漂移。
const filter = new HighPassFilterData(gyro, 0.8);

gyro.onreading = () => {
  filter.update(gyro); // 让最新值通过滤波器。
  console.log(`稳定的陀螺仪 (${filter.x}, ${filter.y}, ${filter.z})`);
}

gyro.start();

4.3. 绝对方向传感器

如前所述,Absolute Orientation Sensor磁力计的常见用例之一,它表示相对于地球平面 静止(固定到磁场向量和重力向量)的方向传感器。AbsoluteOrientationSensor 接口定义于 [ORIENTATION-SENSOR] 规范。

绝对方向传感器可用于游戏控制,例如迷宫滚球谜题,或者 头戴式显示器,在这种场景中你希望能够旋转显示器并向所有 方向观看。

由于绝对方向传感器的参考系是静止的,它不适合作为 例如手机上驾驶游戏的控制器,因为它不允许你哪怕轻微或缓慢地移动, 而不影响你的驾驶方向。 (参见 Relative Orientation Sensor)。

Absolute Orientation Sensor 的方向向量可以按 以下方式计算:

由于加速度计是一个惯性参考系 传感器,当设备基本静止时,重力向量将指向 天空;只要设备未处于自由落体,就有足够的向量长度可将磁场 向量投影到地面平面上。

注意,这在磁极处会失败,因为磁场向量大多会指向与重力向量相反的方向,并且通常非常不可靠。

通过取磁场 向量与重力向量 之间的叉积(参见 Gravity Sensor), 我们会得到一个使用右手定则在地面平面上指向东的向量。

现在,如果我们取重力向量与 新得到的东向量之间的叉积,所得 向量将指向地球磁 场的北方方向。

下面的图示表示设备处于静止状态且 y 轴指向 北方的情况。来自磁力计的读数为 {x: 0, y: 11, z: -16},而加速度计报告 {x: 0.11, y: 0.07, z: 9.81} 加速度。uG 是表示重力的单位向量, uB 表示磁场向量,uE = uB × uG 并指向东。uN = uG × uE 指向 北方方向。

OrientationSensor fusion.

这意味着 Absolute Orientation Sensor磁力计加速度计的融合传感器,并且可能还会使用陀螺仪来更好地隔离重力(参见 Gravity Sensor)。

4.4. 地磁方向传感器

Geomagnetic Orientation Sensor 类似于 Absolute Orientation Sensor,但 不使用陀螺仪,这意味着 它耗电更少。这也意味着它 对摇晃和移动更敏感。

由于 Geomagnetic Orientation Sensor 的主要用例是创建罗盘, 或在地图应用中使用 罗盘方向,因此这并不是什么大问题,因为人们通常会在这些用例中 稳定地握持设备。

实际的航向(N、S、E、W)可以通过使用 根据当前地理位置计算出的本地磁偏角补偿来调整旋转向量而得到。

由于该传感器使用加速度计来获得更稳定的航向,例如行走时, 旋转向量会被投影到垂直于重力向量的平面上(该重力向量是 从加速度计中隔离出来的),该平面 大致表示地面平面。这也意味着 如果你感兴趣的是重力向量的实际方向,那么应 直接使用磁力计

4.5. 相对方向传感器

在大多数传感器集线器上,重力会使用陀螺仪加速度计中隔离出来, 而线性加速度则通过从加速度计值中移除隔离出的重力来隔离。

这避免了低通和高通滤波器引入的延迟。

一种做法是使用卡尔曼滤波器或互补滤波器,这就引出了 Relative Orientation Sensor。由于互补滤波器能产生相当好的 结果,并且容易在硬件中实现,因此这是一个常见方案。

4.5.1. 互补滤波器

互补 滤波器可以看作是低通滤波器高通滤波器的结合, 用加速度计 值来补充陀螺仪值:

θn = α × (θn-1 + ω × ∂t) + (1.0 - α) × a

其中 α 是权重常数,a 是来自加速度计的加速度,ω 是来自陀螺仪角 速度,而 ∂t 是两次测量之间的时间。

α 的常见值为 0.98,这意味着 98% 的权重落在陀螺仪测量上。

使用互补滤波器手动计算以欧拉角(弧度)表示的相对方向。

陀螺仪测量角速度,因此通过乘以时间 差, 我们会得到角度变化。此变化始终是相对于当前设备 位置计算的,因此我们需要使用包含重力加速度计,将其校准 到地面平面。

来自加速度计的值不会带来关于航向(alpha,即 围绕 z 轴旋转)的信息,因此我们不会将其包含在 alpha 分量中。另一方面, 加速度计(由于 重力)会提供设备围绕 x 和 y 轴(beta 和 gamma)如何被握持的信息。

当没有运动或运动很少时,从加速度计读数获得的向量会比陀螺仪对 (alpha、beta、gamma)角的贡献更大。

由于来自稳定加速度计的值表示重力向量,而我们 不会 将 z 分量包含进 alpha,因此其结果是方向将 只跟随陀螺仪并保持 稳定。但由于航向的原点取决于 设备启动时的位置,所以这是一个设备相对方向传感器

const options = { frequency: 50 };

const accl = new Accelerometer(options);
const gyro = new Gyroscope(options);

let timestamp = null;
let alpha = beta = gamma = 0;
const bias = 0.98;

gyro.onreading = () => {
   let dt = timestamp ? (gyro.timestamp - timestamp) / 1000 : 0;
   timestamp = gyro.timestamp;

   // 通过归一化,将加速度向量视为方向向量。
   // 请记住,如果设备被翻转,该向量将只是指向
   // 另一个方向,因此我们无法仅从加速度计数据知道
   // 设备的朝向。
   const norm = Math.sqrt(accl.x ** 2 + accl.y ** 2 + accl.z ** 2);

   // 由于我们只能覆盖完整范围(2*PI rad)的一半(PI rad),所以将
   // 取值为 [-1, 1] 的单位向量乘以 PI/2,覆盖 [-PI/2, PI/2]。
   const scale = Math.PI / 2;

   alpha = alpha + gyro.z * dt;
   beta = bias * (beta + gyro.x * dt) + (1.0 - bias) * (accl.x * scale / norm);
   gamma = bias * (gamma + gyro.y * dt) + (1.0 - bias) * (accl.y * -scale / norm);

   // 对欧拉角(alpha、beta、gamma)做一些处理。
 };

 accl.start();
 gyro.start();
一个会根据设备进行调整的相对方向传感器。

从上面的示例中,我们注意到 alpha 表示初始航向 方向。我们也知道,由于该航向基于陀螺仪, 它可能会随时间漂移。

在某些情况下,你可能希望方向向你的当前位置 漂移。这对于虚拟现实环境中的控制器很有用, 在这种环境中,你希望汽车跟随控制器的航向,但你 可能会在游戏过程中移动和转身。这或多或少会像驾驶 一辆真实汽车一样工作。

修改上面的一行即可做到这一点。

const zeroBias = 0.02;
alpha = (1 - zeroBias) * (alpha + gyro.z * dt);

通过上面的做法,alpha 的 2% 由值 0 组成。因此,当设备 基本稳定握持时,航向会向 0 移动,这意味着它会被调整到 你当前的设备位置,而不是根据周围环境来定位。

此示例显示了手动融合有时可以多么有用。

4.6. 重力和线性加速度传感器

上面使用的互补 滤波器非常擅长隔离重力,因此大多数传感器 集线器会使用陀螺仪加速度计中隔离出重力,而线性 加速度则通过从加速度计值中移除隔离出的重力来隔离。

这也意味着大多数传感器集线器暴露的 Linear Acceleration SensorGravity Sensor 很可能都是融合传感器。

也可以使用磁力计线性加速度传感器中移除重力, 因为磁场向量或多或少是稳定的。

LinearAccelerationSensor 接口GravitySensor 接口定义于 [ACCELEROMETER] 规范。

注意,由于重力会随 运动频率而变化,即在自由落体中沿下落方向为 0, 你可以想象,如果你试图检测摇晃,线性 加速度会相当不精确, 因此请记住这一点。

4.7. 用例和要求

高级运动传感器用例可能会要求准确的传感器读数、高 硬件传感器工作采样率,以及适合特定应用的读数交付率。

运动传感器可用于各种高级用例,例如:

使用运动传感器的游戏或 UI 应用的一般要求是每个渲染帧都有一个新的 传感器读数。在这种情况下,更高的采样率会降低延迟, 从而改善用户体验。

在虚拟现实 HMD 跟踪的情况下,传感器可能以非常高的采样率 运行(最高可达数 kHz),并通过在 75-120Hz 的刷新率下为每个渲染帧 提供最新传感器读数来最小化运动到光子的延迟。

室内导航或非实时视频(图像)稳定应用可以从 以高采样率(80-100Hz)收集高精度传感器读数中受益,这样数据 处理算法就有足够的样本来提供准确结果。

索引

本规范定义的术语

由引用定义的术语

参考文献

规范性参考文献

[ACCELEROMETER]
Anssi Kostiainen; Alexander Shalamov. 加速度计. URL: https://www.w3.org/TR/accelerometer/
[GENERIC-SENSOR]
Rick Waldron; et al. Generic Sensor API. URL: https://www.w3.org/TR/generic-sensor/
[GYROSCOPE]
Anssi Kostiainen; Mikhail Pozdnyakov. 陀螺仪. URL: https://www.w3.org/TR/gyroscope/
[MAGNETOMETER]
Anssi Kostiainen; Rijubrata Bhaumik. 磁力计. URL: https://www.w3.org/TR/magnetometer/
[ORIENTATION-SENSOR]
Mikhail Pozdnyakov; Alexander Shalamov; Kenneth Rohde Christiansen; Anssi Kostiainen. 方向传感器. URL: https://www.w3.org/TR/orientation-sensor/

资料性参考文献

[3DSCANNING]
Grivon, Daniel, Enrico Vezzetti, and Maria Grazia Violante. 用于 3D 扫描应用的创新低成本 MARG 传感器对齐和 畸变补偿方法开发. 2013. 资料性。URL:http://porto.polito.it/2511714/
[HMDTRACKING]
LaValle, Steven M., et al.. Oculus Rift 的头部 跟踪. 2014. 资料性。URL:http://msl.cs.illinois.edu/~lavalle/papers/LavYerKatAnt14.pdf
[INDOORNAV]
Shala, Ubejd, and Angel Rodriguez. 在 android 设备中使用传感器融合的 室内定位. 2011. 资料性。URL:http://www.diva-portal.org/smash/record.jsf?pid=diva2%3A475619&dswid=9050
[IPIN]
Gallagher, Thomas, et al.. 面向盲人和视障人士的基于传感器融合的 室内定位系统. 2012. 资料性。 URL:http://ieeexplore.ieee.org/abstract/document/6418882/
[MEMSGESTURES]
Xu, Ruize, Shengli Zhou, and Wen J. Li. 基于 MEMS 加速度计的非特定用户手势识别. 2012. 资料性。URL:http://ieeexplore.ieee.org/abstract/document/6009159/
[PHYSMON]
Yang, Che-Chang, and Yeh-Liang Hsu. 基于加速度测量的可穿戴身体活动监测运动检测器综述. 2010. 资料性。 URL:http://www.mdpi.com/1424-8220/10/8/7772/html
[ROLLSTABILIZER]
Karpenko, Alexandre, et al.. 使用陀螺仪进行数字视频稳定 和卷帘快门校正. 2011. 资料性。URL:http://movement.stanford.edu/papers/stabilization/karpenko_gyro.pdf
[VIDEOSTABILIZER]
Hanning, Gustav, et al.. 使用惯性测量传感器稳定手机视频. 2011. 资料性。URL:http://ieeexplore.ieee.org/abstract/document/6130215/