17

我写了一个简单的 Activity,它是一个SensorEventListenerfor Sensor.TYPE_ACCELEROMETER

在我onSensorChanged(SensorEvent event)中,我只是选择X,Y,Z格式的值并将它们写入文件。

添加到此X,Y,Z的是一个标签,该标签特定于我正在执行的活动。所以这是X,Y,Z,label

像这样我获得了我的活动资料。想对数据收集后执行哪些操作提出建议,以消除噪音并获得活动的最佳数据。

此数据收集的主要目的是使用神经网络库 (NeuroPh for Android) Link构建用户活动检测应用程序。

4

3 回答 3

58

只是为了好玩,几周前我写了一个计步器,它本来可以检测到你提到的三个活动。我会提出以下意见:

  1. 除此之外Sensor.TYPE_ACCELEROMETER,Android 也有Sensor.TYPE_GRAVITYSensor.TYPE_LINEAR_ACCELERATION. 如果您记录所有三个的值,那么您会注意到 TYPE_ACCELEROMETER 的值始终等于 TYPE_GRAVITY 和 TYPE_LINEAR_ACCELERATION 的值之和。该onSensorChanged(…)方法首先为您提供 TYPE_ACCELEROMETER,然后是 TYPE_GRAVITY 和 TYPE_LINEAR_ACCELERATION,这是其内部方法将加速度计读数分解为重力和非重力加速度的结果。鉴于您对活动引起的加速度感兴趣,而不是重力引起的加速度,您可能会发现 TYPE_LINEAR_ACCELERATION 更适合您的需要。
  2. 无论您使用什么传感器,您测量的 X、Y、Z 将取决于设备的方向。但是,为了检测您提到的活动,结果不能取决于例如用户是否将设备处于纵向或横向位置,或者设备是平的还是垂直的,因此 X、Y 和Z不会有任何用处。相反,您必须查看向量的长度,即与设备方向无关的sqrt(X X+Y Y+Z Z) 。
  3. 如果您将数据输入对噪声敏感的东西,您只需要平滑数据。相反,我会说数据就是数据,如果你使用对噪声不敏感的机制,你会得到最好的结果,因此不需要对数据进行平滑处理。根据定义,平滑是丢弃数据。您想设计一种算法,该算法在一端接收噪声数据并在另一端输出当前活动,因此不要预先判断是否有必要将平滑作为该算法的一部分
  4. 这是我在构建计步器时记录的 Sensor.TYPE_ACCELEROMETER的 sqrt(X X+Y Y+Z Z) 图表。这些图表显示了我步行 100 步时测量的读数。绿线是 sqrt(X X+Y Y+Z*Z),蓝线是指数加权移动平均线绿线给出了绿线的平均水平,红线显示了我的算法计数步骤。我可以通过查找最大值和最小值以及绿线与蓝线交叉的时间来计算步数。我没有使用任何平滑或快速傅立叶变换。根据我的经验,对于这类事情,最简单的算法通常效果最好,因为虽然复杂的算法在某些情况下可能有效,但很难预测它们在所有情况下的表现。鲁棒性是任何算法的重要特征:-)。

在此处输入图像描述

于 2013-05-14T09:32:20.787 回答
3

这听起来是一个有趣的问题!

您是否根据时间绘制了数据以感受它,了解您正在处理什么样的噪声,并帮助决定如何预处理数据以输入到检测器?

   ^
   |
 A |
   |
   |
   |
   |_________________>
   |     time
   |
   v

我将从每个活动的行开始:

  • |Ax + Ay + Az|
  • |Vx + Vy + Vz| (通过计算您的数据点形成的梯形面积来近似)......等

也许您可以通过尝试检测重力来计算手机的方向,然后将您的矢量旋转到“标准”方向(例如正 Z 轴 = 向上)。如果你能做到这一点,那么不同的轴可能会变得更有意义。例如,步行(在口袋里)会倾向于在水平面上有一个速度,这可能与步行(在手上)在垂直平面上的运动不同。

至于过滤器,如果数据看起来很嘈杂,一个简单的起点是应用移动平均线对其进行平滑处理。这是一般传感器数据的常用技术:

https://en.wikipedia.org/wiki/Moving_average

此外,这篇文章似乎与您的问题有关:

如何从 Android 3 轴加速度计中的加速度计读数中删除重力因子

于 2013-05-13T16:52:39.760 回答
1

我确定的事情:

  1. 数据必须按照您的需要进行预处理,在我的情况下,我只需要 3 个输入和一个输出
  2. 数据必须经过平滑(五点平滑或任何其他最适合您的技术)参考。这样噪声就会被过滤掉(虽然不是完全)。移动平均线是其中一种技术
  3. 线性化数据会很好,因为您不知道数据是如何采样的,使用插值来帮助您线性化数据
  4. 最后使用 FFT(快速傅里叶变换)从菜谱中提取菜谱,即从数据集中提取特征!
于 2013-05-14T06:42:11.280 回答