android 上的冗余运动传感器?

Redundant motion sensors on android?

我正在开发一种工具,可以接收运动传感器数据并将其发送到机器学习算法,最终将推断出不同类型的运动。

我读了 Motion sensor guide,您从传感器获得的数据似乎有些冗余。例如:加速度计数据包含重力数据,线性加速度数据显示加速度 由于重力 没有加速度。

所以我的问题是:我真的需要所有传感器来获得所有形式的运动还是我可以放弃其中的一些?

编辑:(澄清问题)

我想收集最少的数据来推断出同样的事情。我正在寻找的是用户行为:用户握住 phone 的角度、用户在使用 phone 时的移动方式等。

我正在寻找的答案应该包括内部具有高度相关性的传感器组,这样只有这组传感器中的一些传感器需要推断出相同类型的 motion\movement\rotation\acceleration\etc..

您无法决定获得什么 - 每个传感器的数据都已定义,您要么获得全部,要么一无所获。如果你仔细看,public API 中没有一个地方可以让你询问具体的事情。

为了支持这一点,请引用 Google's document explaining sensor types:

An accelerometer sensor reports the acceleration of the device along the 3 sensor axes. The measured acceleration includes both the physical acceleration (change of velocity) and the gravity. The measurement is reported in the x, y and z fields of sensors_event_t.acceleration.

如果你看成android source, the structs here are strictly defined, and struct for acceleration contains specific fields。因此,即使您在不喜欢的领域获得 0,您也不会获得任何收益。

但您指的是两件事 - 基本传感器,大致相当于设备上的物理传感器,以及 复合传感器,它结合了来自各种物理传感器的读数以获得更有用的数据。

因此,虽然您无法决定从特定传感器(例如 "only gravity" 或 "only acceleration in Y axis")获得什么,复合传感器确实会为您提供仅使用基础传感器即可自行计算的数据.所以线性加速度是来自加速度计陀螺仪(或磁传感器的数据的组合), 经过一些计算。类似地,step detector "sensor" 仅使用加速度计,但会自动解释数据以仅向您提供一个 "yes, someone has made a step" 具有单个值 1 的事件。

如果您将原始运动数据提供给某些算法,我猜您正在寻找的是基本传感器。也就是说,我相信您仍然可以安全地注册所有传感器(包括基本传感器和复合传感器),这些传感器组合起来可以为您提供所需的所有数据(也许更多),而不会对电池产生有意义的影响。

有关每个传感器的更多详细信息,请参阅 Sensor types on Android website, and if you're curious, you can read up short summary on sensors stack

不,您不需要每个传感器。一些传感器的存在是为了方便用户。你的线性加速度传感器的例子是一个 - 它告诉你加速度计的结果,其中没有重力。你可以自己从原始加速度计数据中做到这一点,但这需要一些数学知识(你需要减去所有 3 个轴上的矢量重力)和一些专业知识(你记得校准传感器吗?它可能不是 9.8静止。就此而言,如果你不在海平面上,9.8 可能不是你的重力)。每个应用程序都需要重复执行大量工作,因此他们创建了一个软件 "sensor",它位于加速度计之上并提供计算数据。一个应用程序在同一个应用程序中使用原始和线性加速度计是不寻常的,通常是一个或另一个。计步器是另一个例子,它根据加速度计数据猜测一步是多少。您也不希望校准和未校准的陀螺仪数据。

至于你需要什么 - 没有线索,你对你想做的事情说得不够多。不过有一个警告 - 你说你正在尝试检测运动。你不能那样做。您可以检测加速度和旋转。您无法以恒定速度检测运动。如果您正在使用这些开发任何类型的应用程序,那么使用正确的术语并从物理学的角度思考以及物理加速度计和陀螺仪的工作原理是值得的,否则您将导致自己出现错误。

问题中的"Motion"一词没有确切的含义。所以我回答的比较笼统。

"The way one holds his phone" 只不过是 phone.There 的方向是三个传感器,它们分别告诉 phone.

的方向
  1. 加速度传感器
  2. 方位传感器
  3. 旋转矢量传感器

其中只有加速度计是物理传感器,另外两个是虚拟传感器(它们没有特殊的硬件,它们使用加速度计数据并以不同格式报告方向)。

  1. 方向传感器已弃用,因此您不能使用它。
  2. 旋转矢量传感器告诉四元数编码的方向。如果您的代码基于四元数,则使用 SensorManager.getQuaternionFromVector() and continue. If your code is based on rotation matrix then obtain rotation matrix by calling SensorManager.getRotationMatrixFromVector() passing sensor output and continue. If you want the orientation alone get it by calling SensorManager.getOrientation() 之前获得的传递旋转矩阵对传感器输出进行归一化。
  3. 使用加速度计传感器我们可以找到方向,但推荐的方法是将其与磁场传感器输出结合起来。通过传递先前获得的旋转矢量(方向)来调用 SensorManager.getRotationMatrix() by passing the output of accelerometer output and magnetic field sensor output and get the rotation matrix. If your code is based on rotation matrix, just continue. If you want the orientation alone get it by calling SensorManager.getOrientation() passing rotation matrix obtained in previously. If your code is based on quaternion call SensorManager.getQuaternionFromVector()

"The way one moves his phone" - 这里我考虑四个议案。

  1. 位置变化(简单翻译)和位置变化率(速度)- 没有传感器检测到它们。
  2. 速度变化率(简单加速度)- 加速度计检测到它。但它也包含重力分量。通常我们需要没有重力分量的加速度。这可以简单地按照解释 here 进行计算。然而,还有另一个名为线性加速度的虚拟传感器可以为我们完成这项工作。
  3. 方向改变(旋转)- 每当方向改变时,加速度计、方向和旋转矢量传感器都会向我们报告(陀螺仪也会报告,但在下一点进行解释)。答案的第一部分解释了如何使用此传感器获取当前方向。
  4. 方向变化率(Angular 速度)- 每当方向发生变化时,陀螺仪传感器都会报告。输出是三个数字,表示沿 x、y 和 z 轴的 angular 加速度。单位是弧度每秒。

陀螺仪传感器的长期输出不准确,加速度计的短期输出不准确,因此将它们结合起来以获得稳定的输出。有关详细信息,请参阅 this 问题。

现在很明显陀螺仪和加速度计是最低要求的。然而,使用范围广泛的传感器可以最大限度地减少我们的工作。