Android上的冗余运动传感器?

时间:2015-09-24 13:55:04

标签: android machine-learning sensor android-sensors

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

我读了Motion sensor guide,看起来你可以从传感器获得的数据有一些冗余。例如: accelrometer 数据包含重力数据,线性加速数据显示加速,但由于重力即可。

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

编辑:(澄清问题)

我想收集最小的数据,这些数据可以让我推断出相同的东西。我正在寻找的是用户行为:用户握住手机的角度,用户使用手机时的移动方式等。

我正在寻找的答案应该包括其中具有高相关性的传感器组,这样只需要该组中的一些传感器来推断相同类型的运动\运动\旋转\加速\等..

3 个答案:

答案 0 :(得分:3)

术语" Motion"在这个问题上没有确切的含义。所以我更广泛地回答。

"一个人拿着手机的方式"只不过是手机的方向。有三个传感器分别指示手机的方向。

  1. 加速计传感器
  2. 方向传感器
  3. 旋转矢量传感器
  4. 其中只有加速度计是物理传感器,其他两个是虚拟传感器(它们没有特殊硬件,它们使用加速度计数据并以不同格式报告方向)。

    1. 不推荐使用方向传感器,因此您无法使用它。
    2. 旋转矢量传感器指示四元数中编码的方向。如果您的代码基于四元数,则使用SensorManager.getQuaternionFromVector()对传感器输出进行标准化并继续。如果您的代码基于旋转矩阵,则通过调用SensorManager.getRotationMatrixFromVector()传递传感器输出来获得旋转矩阵并继续。如果你想单独定位,可以通过调用前面获得的SensorManager.getOrientation()传递旋转矩阵来获得它。
    3. 使用加速计传感器我们可以找到方向,但推荐的方法是将其与磁场传感器输出相结合。通过传递加速度计输出和磁场传感器输出的输出来调用SensorManager.getRotationMatrix()并获得旋转矩阵。如果您的代码基于旋转矩阵,请继续。如果你想单独取向,可以通过调用先前获得的SensorManager.getOrientation()传递旋转矩阵来获得它。如果您的代码基于四元数调用SensorManager.getQuaternionFromVector(),则传递先前获得的旋转矢量(方向)。
    4. "一个人移动手机的方式" - 在这里我考虑四个动作。

      1. 位置变化(简单平移)和位置变化率(速度) - 没有传感器可以检测到它们。
      2. 速度变化率(简单加速度) - 加速度计检测到它。但它也包含重力成分。通常我们需要没有重力分量的加速度。这可以简单地按照here的解释来计算。然而,还有另一个称为线性加速的虚拟传感器为我们完成了工作。
      3. 方向改变(旋转) - 每当方向改变加速度计时,方向和旋转矢量传感器都会向我们报告(陀螺仪也报告,但在下一点解释)。如何使用此传感器获取当前方向在答案的第一部分进行了解释。
      4. 方向变化率(角速度) - 每当方向改变时,陀螺仪传感器报告。输出是三个数字,表示沿x,y和z轴的角加速度。单位是每秒弧度。
      5. 陀螺仪传感器的输出长期不准确,加速度计的输出在短期内不准确,因此将它们组合起来以获得稳定的输出。有关详细信息,请参阅this问题。

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

答案 1 :(得分:1)

你无法决定你得到了什么 - 每个传感器的数据已经被定义,你得到全部或全部。如果你仔细观察,公共API中没有一个地方可以让你询问具体的事情。

在这里引用Google's document explaining sensor types

  

加速计传感器报告设备沿3个传感器轴的加速度。测得的加速度包括物理加速度(速度变化)和重力。测量结果在sensors_event_t.acceleration的x,y和z字段中报告。

如果你看到android source,这里的结构是严格定义的,struct for acceleration contains specific fields。因此,即使你在不喜欢的领域获得0,你也无法获得任何收益。

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

因此,虽然您无法确定特定传感器的内容(例如“仅重力”或“仅Y轴加速”),但复合传感器确实为您提供了仅使用基础传感器自行计算的数据。因此,经过一些计算后,线性加速度是来自加速度计陀螺仪(或磁传感器)的数据组合。类似地,步检测器“传感器”仅使用加速度计,但会自动解释数据,只为您提供“是,某人已经迈出了一步”且具有单值1的事件。

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

有关每个传感器的更多详细信息,请参阅Android网站上的Sensor types,如果您感到好奇,也可以阅读sensors stack上的简短摘要。

答案 2 :(得分:1)

不,你不需要每个传感器。存在一些传感器以方便用户。您的线性加速度传感器的示例是一个 - 它告诉您加速度计的结果取出重力。您可以自己从原始加速度计数据中做到这一点,但这需要一些数学运算(您需要减去所有3个轴上的矢量重力)和一些技巧(您是否记得校准传感器?它可能不会读取9.8在这种情况下,如果你不在海平面,9.8可能不是你的引力。这是每个应用程序需要重复的大量工作,因此他们创建了一个软件" sensor"位于加速度计顶部并提供计算数据。应用程序在同一个应用程序中使用原始和线性加速度计,通常是其中一个,这是不寻常的。步数计数器是另一个例子,它根据加速度计数据猜测步骤是什么。您也不需要校准和未校准的陀螺仪数据。

至于你需要什么 - 没有任何线索,你不能充分说明你想做什么。虽然有一个警告 - 你说你正试图检测动作。你不能这样做。您可以检测加速度和旋转。您无法以恒定速度检测运动。如果您正在使用这些开发任何类型的应用程序,那么使用正确的术语并根据物理特性以及物理加速度计和陀螺仪的工作方式进行思考是值得的,否则您将导致自己的错误。