Android 加速度计分析
Posted
技术标签:
【中文标题】Android 加速度计分析【英文标题】:Android Accelerometer Profiling 【发布时间】:2013-04-29 19:38:52 【问题描述】:我编写了一个简单的 Activity,它是 SensorEventListener
的 Sensor.TYPE_ACCELEROMETER
。
在我的onSensorChanged(SensorEvent event)
中,我只需选择X,Y,Z
格式的值并将它们写入文件。
添加到此X,Y,Z
的是一个标签,该标签特定于我正在执行的活动。
所以它的X,Y,Z,label
像这样我获得了我的活动资料。想对数据收集后执行哪些操作提出建议,以消除噪音并获得活动的最佳数据。
此数据收集的主要目的是使用神经网络库 (NeuroPh for android) Link 构建用户活动检测应用程序。
【问题讨论】:
为了更好地理解上下文,您能否举一些“活动”的例子。 @MMLuqman 活动:1 ----> 行走 2 ----> 静止 3 ----> 手握 最终标签包含其中一个整数(1-3),它们是活动! 【参考方案1】:几周前我写了一个计步器只是为了好玩,它本来可以检测到你提到的三个活动。我会提出以下意见:
-
除了
Sensor.TYPE_ACCELEROMETER
,Android还有Sensor.TYPE_GRAVITY
和Sensor.TYPE_LINEAR_ACCELERATION
。如果您记录所有三个的值,那么您会注意到 TYPE_ACCELEROMETER 的值始终等于 TYPE_GRAVITY 和 TYPE_LINEAR_ACCELERATION 的值之和。 onSensorChanged(…)
方法首先为您提供 TYPE_ACCELEROMETER,然后是 TYPE_GRAVITY 和 TYPE_LINEAR_ACCELERATION,这是其将加速度计读数拆分为重力和非重力加速度的内部方法的结果。鉴于您对活动加速度感兴趣,而不是重力加速度,您可能会发现 TYPE_LINEAR_ACCELERATION 更适合您的需求。
无论您使用什么传感器,您测量的 X、Y、Z 将取决于设备的方向。但是,为了检测您提到的活动,结果不能取决于例如无论用户是在纵向还是横向位置拿着设备,或者设备是平的还是垂直的,所以 X、Y 和 Z 的单个值都没有任何用处。相反,您必须查看向量的长度,即与设备方向无关的 sqrt(XX+YY+ZZ)。
只有将数据输入对噪声敏感的数据时,才需要对其进行平滑处理。相反,我会说数据就是数据,如果你使用对噪声不敏感的机制,你会得到最好的结果,因此不需要对数据进行平滑处理。根据定义,平滑是丢弃数据。您想设计一种算法,在一端接收噪声数据并在另一端输出当前活动,因此不要预先判断是否有必要将平滑作为该算法的一部分包含在内
这是我在构建计步器时记录的 Sensor.TYPE_ACCELEROMETER 的 sqrt(XX+YY+ZZ) 图表。这些图表显示了我步行 100 步时测量的读数。绿线是 sqrt(XX+YY+Z*Z),蓝线是绿线的exponentially weighted moving average,它给出了绿线的平均水平,红线行显示我的算法计数步骤。我可以通过查找最大值和最小值以及绿线与蓝线交叉的时间来计算步数。我没有使用任何平滑或快速傅立叶变换。根据我的经验,对于这类事情,最简单的算法通常效果最好,因为虽然复杂的算法在某些情况下可能有效,但很难预测它们在所有情况下的表现。稳健性是任何算法的重要特征:-)。
【讨论】:
哇...很棒的饲料...我很惊讶:)...感谢您的回答! 但是在你的回答中让我质疑的一件事是算法如何能够仅根据一个参数 sqrt(X^2+y^2+z^2) 来决定输出活动!? @随机 步行是有规律的向上/向下,如图所示。静止是指完全没有运动偏离平均水平,而手持是指有不规则的运动不遵循步行模式。在任何情况下,如果您只测量一个传感器,并且您不希望您的结果对设备的握持方式敏感,那么 sqrt(X^2+Y^2+Z^2) 是您唯一的输入可以一起工作。要获得更多信息,您需要使用其他传感器。 嗨@Stochasticly,你能链接到你的计步器代码吗? @stanm87 抱歉,我现在没有时间在这里回答问题。仅供参考,代码相对简单,是我在 ***.com/questions/1134579/smooth-gps-data/… 中内置的。对我来说,这是代码最终看起来相对简单的情况之一,而且也很短,但是有很多情况需要考虑,最终要做到正确并非易事。每一行都需要深思熟虑!无论如何,祝你好运。【参考方案2】:这听起来是个有趣的问题!
您是否已经根据时间绘制数据以感受它,了解您正在处理什么样的噪音,并帮助决定如何预处理您的数据以输入到检测器?
^
|
A |
|
|
|
|_________________>
| time
|
v
我将从每个活动的行开始:
|Ax + Ay + Az| |Vx + Vy + Vz| (通过计算您的数据点形成的梯形面积来近似) ...等也许您可以通过尝试检测重力来计算手机的方向,然后将您的矢量旋转到“标准”方向(例如正 Z 轴 = 上)。如果你能做到这一点,那么不同的轴可能会变得更有意义。例如,步行(在口袋里)往往会在水平面上有一个速度,这可能与步行(在手上)在垂直平面上的运动不同。
对于过滤器,如果数据出现噪声,一个简单的起点是应用移动平均线对其进行平滑处理。这是一般传感器数据的常用技术:
https://en.wikipedia.org/wiki/Moving_average
另外,这篇文章似乎与您的问题有关:
How to remove Gravity factor from Accelerometer readings in Android 3-axis accelerometer
【讨论】:
【参考方案3】:我确定的事情:
-
数据必须按照您的需要进行预处理,在我的
如果我只想要 3 个输入和一个输出
数据必须是
进行平滑(五点平滑或任何其他技术
哪个最适合您)Reference。这样噪声就会被过滤掉(虽然不是完全)。 Moving Average 是其中一种技术
线性化数据会很好,因为您不知道数据是如何采样的,使用插值来帮助您线性化数据
最后使用 FFT(快速傅里叶变换)从菜谱中提取菜谱,即从数据集中提取特征!
【讨论】:
以上是关于Android 加速度计分析的主要内容,如果未能解决你的问题,请参考以下文章