目录
1.相关数据展示
2.数据滤波处理及展示
3.计步功能实现
1.相关数据展示
数据为开源数据,遵守开源数据库协议(Open Database License (ODbL)),数据格式为csv文件。
数据集有多个维度(时间,la_x,la_y,la_z等),这里为了展示功能只提取了动作为走路的1000行数据,并且剔除其他维度,只保留时间,左腿三轴加速度(la_x,la_y,la_z)。
2.数据滤波处理及展示
原数据作图后效果
这里使用的是均值滤波。
准备相应库文件,第一个为了画图,第二个用来导入csv文件,第三个对数组进行操作。
定义均值滤波滑动的窗口大小,1就是原来数据,不修改。设置的window大小简单的理解是几个数据求均值,如果你定义1000个数据,window为10,第一次计算1-10数据的均值作为第一个数据,第二次计算2-11的均值作为第二个数据。
使用pandas库中的read_csv读取csv文件,并利用numpy的array转换成array数组,方便提取数据,如倒数第四行,单独提取时间,左腿三轴加速度,并使用四个数组存储。[:,0]第一个“:”提取第一维度所有数据,第二个“0”,提取第二维度索引为0的值(第一列)。二维数组,提取第一维所有数据,第二维只要第一个数据。
均值滤波代码,使用传统方法处理,直接求均值,并一个个追加到新的列表后面。
数据展示相关代码,当window为11时,画出来的图的效果如下:
对比前后可以发现效果不错。
3.计步功能实现
拿到一个需求时我们要分析如何利用已有的知识解决问题。我们的目的是计步,根据滤波图形我们可以知道,数据在周期性变化,我们可以轻松由图得知走了多少步,但是电脑不行。
为了实现功能,我们需要归纳实现方法,我们是如何直接根据图像得到结论的,之后我们还要细化得出的条件应该如何实现。
目前我能够想到的是利用图中的“峰”和“谷”来判断。首先第一步我们要找到图像的峰,我们可以联想到高中学习的极大值,利用极大值定义我们可以找到所有极大值(第一个条件)。
其次,我们找到的极大值很多,有的很矮但是我们也筛选出来了,接下来,我们要做的就是寻找高的“峰”,这里我使用的是数据最大值与最小值的差之后除以一个值作为判断阈值,而这个值我们可以调整,这里我使用的是6,也就是极大值与最大值的距离不能超过最大值与最小值的六分之一(第二个条件)。
最后根据图1(一个总图包含三个图),我们可以看到一个循环周期内两个尖峰靠的很近,但是实际上那只是一步,我们要将这种情况考虑进去,查资料可以得知目前世界顶尖短跑运动员最快步频5.42步每秒。这里我就当作最快一秒钟5Hz,即每秒最多5步,两步之间时间不能低于0.2s。(第三个条件)
总结从图中可以得出的三个条件:第一个要是极大值,第二个极大值与最大值的距离不能大于最大值与最小值的六分之一,第三个满足前面两条件的极大值之间的间隔要大于0.2s。
我们能够得出基于“峰”的判断,“谷”的判断同理。以下是根据三个条件写出的代码:
我这里是综合判断,三个加速度数据都使用,并且“峰”与“谷”都使用。由此可以得出六个供参考的步数,经过计算,得出的步数是(10,10,10,10,10,10)
由此可以看出,效果还是不错的。至于为什么三个加速度数据都使用,并且“峰”与“谷”都判断,为的就是减少误差,如果其中有异常结果,我们可以使用六个中数量最多的判断。当然,这里三个加速度都周期性变化,还是有点不合理的,通常我们走路的时候两个轴周期性变化或者一个轴周期性变化(剔除重力加速度)。这里我们就可以找一个活动轴,目前我能想到的是计算数据的方差,将方差大的作为活动轴(数据波动最大)。
并且这里我使用的是静态的数据,如果想要实现动态数据判断步数,可以利用上面的三个条件并改装一下,如设置一个时间窗口,每采集50次计算一次最大值,最小值,并设置可变的最大值最小值,这里我们也可以判断一下活动轴,根据活动轴对应的加速度数据进行计步处理。