【跑步姿势训练鞋】No.005-姿态识别和步频计算
[复制链接]
上一篇介绍了我自己设计的传感器制作过程和数据初级处理,这一篇介绍本次作品最烧脑的部分,也是核心算法部分:姿态识别和步频计算。
首先,介绍一下设计思路。我在足底设置了4个压力传感器,分别编号为:0,1,2,3的序号,如下图所示。在走路或跑步时,这四个点达到压力最大点的顺序是不一样的,而这个顺序,是代表了不同的脚部姿态的,比如内八字走路,0,1两点达到压力最大值要早于2,3两点;跑步时前脚掌先着地的就会是1,3先达到最大值,反之后脚跟先着地则0,2先达到最大值。只要算出这个顺序就能识别姿态。然后通过每个点的最大值的幅度,持续时间可以进一步分析姿态的合理程度。
图1,脚掌四个压力点坐标
从实采到的波形来看,整体比较有规律,到每一个波形细节又有小的波动,如下图所示。用眼睛看很容易识别最大值的位置,但是让单片机程序通过低功耗的简单算法来实现,还是有难度。
图2,采集到待分析的波形
经过反复试验,终于找到方法。测试的时候,发现总有一个通道波形比其他波形更具典型性,周期规律更明显,原因是每个人的脚掌总会有一个点是主要受力点,形态会凸显出来。我把这个通道定义为典型分析通道,做成可配置的,实际应用中可以更改。通过分析这个通道,来界定周期。我找到的另外一个规律就是我自制的这个传感器,负向波形比正向的规律性更好,后面计算均使用负向数据。
周期的获取方法如下:取3个采样点做连续滑窗比较,判断条件一,中间点的值比前后值都小,则认为是一个极值点;判断条件二,记录连续两个极值点,判断后一个是否达到前一个的60%(这个是实测获取的,可以更改),如果达到,则认为是有效最大点,反之不能达到,则认为是干扰值,舍弃丢掉。采用这两个判断条件,在第一、二个点的时候可能是干扰值,后面的则自动能识别正确。实测准确度很高,没有漏点。计算两个极值点之间的采样点数,乘以采样时间即为每步的周期,代码如下。
图3,求周期代码
有了这个周期,后面就好办了。第一个能获得的就是步频。用1分钟除以周期就是每分钟走了多少步。第二个能获取的就是压力顺序。这个详细说一下。
原始采样频率是100Hz,经过10点平均滤波后,每个采样点间隔是0.1秒,我使用一个32位变量计数滤波后的采样点序号,要是溢出需要16年还多,足够满足每次测试需要。从识别出典型通道第一个有效极值(最小值)开始,4个通道就分别不停地计算极值和出现极值的采样点序号,直到下一个典型通道的有效极值出现,将算出的数据转存,并初始化缓存,开始下一轮计算。转存的采样点序号是姿态的原始值,我需要转换成坐标点的顺序值,即为将4个数排序,排序后要得到每个数的角标顺序。此处费了不少脑细胞,最后从网上找到了解决方案。原理其实很简单,就是给数组排序前,做一个序号数组,用冒泡法对原数组排序,每一步排序,序号数组也同步跟着转换,排完后,序号数组的内容即为原数组角标序号,代码如下。
图4,姿态识别代码
如果直接用数组来表达姿态,操作起来太繁琐了,我对这个结果进行了抽象简化,用一个16位数,用16进制方式表达,可以达到简化目的。比如姿态顺序是:0->2->3->1,就用0x0231来表达。对于连续获取的姿态序列,0->2->3->1->0->2->3->1->0->2->3->1->0,其中任意连续4个都是代表相同的姿态,所以对于姿态数值:0x0231<=>0x2310<=>0x3102<=>0x1023这几个是等价的,可以定义成姿态‘a’,这样,每一个姿态,用一个字符就能表达了,在传输使用上简单很多了。
下面两张图片是实际运行后的效果,左边是实时波形,右边是计算结果。姿态识别,步频计算准确度和稳定度都还不错,基本满足实际要求。
图5,计算结果
图6,计算结果
综上,本设计最难的部分就完成了,后面研究蓝牙传输和自发电等功能。
|