我已经写了一个简单的活动是一个SensorEventListener
为Sensor.TYPE_ACCELEROMETER
。
在我onSensorChanged(SensorEvent event)
我只是挑值X,Y,Z
格式并将其写入到一个文件中。
加入到这个X,Y,Z
是一个标签,这个标签是特定于我正在执行活动。 所以它的X,Y,Z,label
喜欢我获得我的活动资料。 想有什么操作的数据采集之后执行的建议,从而为活动去除噪声,并获得最佳的数据。
这个数据收集的主要意图是构建利用神经网络库(NeuroPh为Android)的用户活动检测应用链接 。
只是为了好玩,我写一个计步器在几个星期前,它会已经能够检测到您所提到的三项活动。 我想提出以下意见:
- 除了
Sensor.TYPE_ACCELEROMETER
,安卓也有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的单个数值和ž不会有任何用处。 相反,你得看看向量的长度,即的sqrt(X X + Y Y + Z Z),它是独立于设备的取向。
- 你只需要,如果你喂养它到一些东西,对噪声敏感的平滑数据。 相反,我想说的是,数据是数据,如果你使用的不是对噪声敏感,因此不需要对数据进行平滑处理机制,你会得到最好的结果。 根据定义,平滑丢弃数据。 你要设计一个算法,在一端需要在嘈杂的数据,并输出在另一端的电流活动,所以不要预先判断是否有必要包括平滑作为算法的一部分
- 这里是开方从Sensor.TYPE_ ACCELEROMETER当我建立我的计步器,我记录一个图(X X + Y Y + Z Z)。 的曲线图显示了当我走了100步测得的读数。 绿线是开方(X X + Y Y + Z * Z),蓝线是一个指数加权移动平均的绿线,给了我的绿线的平均水平,而红线表示我的算法计数步骤。 我能够仅仅通过寻找最大和最小值,当绿线跨越蓝线来算的步骤。 我没有使用任何平滑或快速傅立叶变换。 根据我的经验,对于这种事情最简单的算法往往效果最好,因为虽然复杂的可能会在某些情况下工作,这是很难预测他们会如何表现在所有情况下。 和鲁棒性是任何算法:-)的一个重要特征。
这听起来像一个有趣的问题!
你绘制你的数据不受时间去一点感觉,就看你面对什么样的噪音与和帮助决定你怎么可能预先处理您的数据输入到检测?
^
|
A |
|
|
|
|_________________>
| time
|
v
我会为每个活动线路开始:
- | AX +好哦+所有的|
- | OVX + VY + 1/2 | (通过计算数据点形成的梯形的面积近似)...等
也许你可以尝试检测重力摸出手机的方向,然后转动您的向量“标准”的方向(例如,Z轴正方向=向上)。 如果你能做到这一点,那么不同的轴可以变得更有意义。 例如,步行(在口袋)将趋向于具有在水平面上,这可能会从步行(手)通过运动在垂直平面区分开的速度。
至于滤波器,如果数据显示为噪声,一个简单的起点是应用移动平均来平滑它。 这是在一般的传感器数据的常用技术:
https://en.wikipedia.org/wiki/Moving_average
此外,这个职位似乎是有关你的问题:
如何从加速度计读数去除重力因素,Android的3轴加速度计