sipower 发表于 2021-6-20 19:00

【跑步姿势训练鞋】No.005-姿态识别和步频计算

<p style="text-indent:24.0000pt; text-align:justify"><span style="font-size:10.5pt"><span style="font-family:Calibri"><span style="font-size:12.0000pt"><span style="font-family:宋体"><font face="宋体">上一篇介绍了</font></span></span><span style="font-size:12.0000pt"><span style="font-family:宋体"><font face="宋体">我自己设计的</font></span></span><span style="font-size:12.0000pt"><span style="font-family:宋体"><font face="宋体">传感器制作</font></span></span><span style="font-size:12.0000pt"><span style="font-family:宋体"><font face="宋体">过程</font></span></span><span style="font-size:12.0000pt"><span style="font-family:宋体"><font face="宋体">和数据初级处理</font></span></span><span style="font-size:12.0000pt"><span style="font-family:宋体"><font face="宋体">,</font></span></span><span style="font-size:12.0000pt"><span style="font-family:宋体"><font face="宋体">这一篇介绍本次作品最烧脑的部分,也是核心算法部分:</font></span></span><span style="font-size:12.0000pt"><span style="font-family:宋体"><font face="宋体">姿态识别和步频计算</font></span></span><span style="font-size:12.0000pt"><span style="font-family:宋体"><font face="宋体">。</font></span></span></span></span></p>

<p style="text-indent:24.0000pt; text-align:justify"><span style="font-size:10.5pt"><span style="font-family:Calibri"><span style="font-size:12.0000pt"><span style="font-family:宋体"><font face="宋体">首先,介绍一下设计思路。我在足底设置了</font>4个压力传感器,分别编号为:0,1,2,3的序号,如下图所示。在走路或跑步时,这四个点达到压力最大点的顺序是不一样的,而这个顺序,是代表了不同的脚部姿态的,比如内八字走路,0,1两点达到压力最大值要早于2,3两点;跑步时前脚掌先着地的就会是1,3先达到最大值,反之后脚跟先着地则0,2先达到最大值。只要算出这个顺序就能识别姿态。然后通过每个点的最大值的幅度,持续时间可以进一步分析姿态的合理程度。</span></span></span></span></p>

<p class="imagemiddle" style="text-align: center;"></p>

<p align="center" style="text-indent:24.0000pt; text-align:center"><span style="font-size:10.5pt"><span style="font-family:Calibri"><span style="font-size:12.0000pt"><span style="font-family:宋体"><font face="宋体">图</font>1,脚掌四个压力点坐标</span></span></span></span></p>

<p style="text-indent:24.0000pt; text-align:justify"><span style="font-size:10.5pt"><span style="font-family:Calibri"><span style="font-size:12.0000pt"><span style="font-family:宋体"><font face="宋体">从实采到的波形来看,整体比较有规律,到每一个波形细节又有小的波动,如下图所示。用眼睛看很容易识别最大值的位置,但是让单片机程序通过低功耗的简单算法来实现,还是有难度。</font></span></span></span></span></p>

<p class="imagemiddle" style="text-align: center;"></p>

<p align="center" style="text-indent:24.0000pt; text-align:center"><span style="font-size:10.5pt"><span style="font-family:Calibri"><span style="font-size:12.0000pt"><span style="font-family:宋体"><font face="宋体">图</font>2,采集到待分析的波形</span></span></span></span></p>

<p style="text-indent:24.0000pt; text-align:justify"><span style="font-size:10.5pt"><span style="font-family:Calibri"><span style="font-size:12.0000pt"><span style="font-family:宋体"><font face="宋体">经过反复试验,终于找到方法。测试的时候,发现总有一个通道波形比其他波形更具典型性,周期规律更明显,原因是每个人的脚掌总会有一个点是主要受力点,形态会凸显出来。我把这个通道定义为典型分析通道,做成可配置的,实际应用中可以更改。通过分析这个通道,来界定周期。我找到的另外一个规律就是我自制的这个传感器,负向波形比正向的规律性更好,后面计算均使用负向数据。</font></span></span></span></span></p>

<p style="text-indent: 24pt;"><span style="font-size:10.5pt"><span style="font-family:Calibri"><span style="font-size:12.0000pt"><span style="font-family:宋体"><font face="宋体">周期的获取方法如下:取</font>3个采样点做连续滑窗比较,判断条件一,中间点的值比前后值都小,则认为是一个极值点;判断条件二,记录连续两个极值点,判断后一个是否达到前一个的60%(这个是实测获取的,可以更改),如果达到,则认为是有效最大点,反之不能达到,则认为是干扰值,舍弃丢掉。采用这两个判断条件,在第一、二个点的时候可能是干扰值,后面的则自动能识别正确。实测准确度很高,没有漏点。计算两个极值点之间的采样点数,乘以采样时间即为每步的周期,代码如下。</span></span></span></span></p>

<p class="imagemiddle" style="text-align: center;"></p>

<p style="text-align: center;"><span style="font-size:10.5pt"><span style="font-family:Calibri"><span style="font-size:12.0000pt"><span style="font-family:宋体"><font face="宋体">图</font>3,求周期代码</span></span></span></span></p>

<p style="text-indent:24.0000pt; text-align:justify"><span style="font-size:10.5pt"><span style="font-family:Calibri"><span style="font-size:12.0000pt"><span style="font-family:宋体"><font face="宋体">有了这个周期,后面就好办了。第一个能获得的就是步频。用</font>1分钟除以周期就是每分钟走了多少步。第二个能获取的就是压力顺序。这个详细说一下。</span></span></span></span></p>

<p style="text-indent:24.0000pt; text-align:justify"><span style="font-size:10.5pt"><span style="font-family:Calibri"><span style="font-size:12.0000pt"><span style="font-family:宋体"><font face="宋体">原始采样频率是</font>100Hz,经过10点平均滤波后,每个采样点间隔是0.1秒,我使用一个32位变量计数滤波后的采样点序号,要是溢出需要16年还多,足够满足每次测试需要。从识别出典型通道第一个有效极值(最小值)开始,4个通道就分别不停地计算极值和出现极值的采样点序号,直到下一个典型通道的有效极值出现,将算出的数据转存,并初始化缓存,开始下一轮计算。转存的采样点序号是姿态的原始值,我需要转换成坐标点的顺序值,即为将4个数排序,排序后要得到每个数的角标顺序。此处费了不少脑细胞,最后从网上找到了解决方案。原理其实很简单,就是给数组排序前,做一个序号数组,用冒泡法对原数组排序,每一步排序,序号数组也同步跟着转换,排完后,序号数组的内容即为原数组角标序号,代码如下。</span></span></span></span></p>

<p class="imagemiddle" style="text-align: center;"></p>

<p align="center" style="text-indent:24.0000pt; text-align:center"><span style="font-size:10.5pt"><span style="font-family:Calibri"><span style="font-size:12.0000pt"><span style="font-family:宋体"><font face="宋体">图</font>4,姿态识别代码</span></span></span></span></p>

<p style="text-indent:24.0000pt; text-align:justify"><span style="font-size:10.5pt"><span style="font-family:Calibri"><span style="font-size:12.0000pt"><span style="font-family:宋体"><font face="宋体">如果直接用数组来表达姿态,操作起来太繁琐了,我对这个结果进行了抽象简化,用一个</font>16位数,用16进制方式表达,可以达到简化目的。比如姿态顺序是:0-&gt;2-&gt;3-&gt;1,就用0x0231来表达。对于连续获取的姿态序列,0-&gt;2-&gt;3-&gt;1-&gt;0-&gt;2-&gt;3-&gt;1-&gt;0-&gt;2-&gt;3-&gt;1-&gt;0,其中任意连续4个都是代表相同的姿态,所以对于姿态数值:0x0231&lt;=&gt;0x2310&lt;=&gt;0x3102&lt;=&gt;0x1023这几个是等价的,可以定义成姿态&lsquo;a&rsquo;,这样,每一个姿态,用一个字符就能表达了,在传输使用上简单很多了。</span></span></span></span></p>

<p style="text-indent:24.0000pt; text-align:justify"><span style="font-size:10.5pt"><span style="font-family:Calibri"><span style="font-size:12.0000pt"><span style="font-family:宋体"><font face="宋体">下面两张图片是实际运行后的效果,左边是实时波形,右边是计算结果。姿态识别,步频计算准确度和稳定度都还不错,基本满足实际要求。</font></span></span></span></span></p>

<p class="imagemiddle" style="text-align: center;"></p>

<p align="center" style="text-indent:24.0000pt; text-align:center"><span style="font-size:10.5pt"><span style="font-family:Calibri"><span style="font-size:12.0000pt"><span style="font-family:宋体"><font face="宋体">图</font>5,计算结果</span></span></span></span></p>

<p class="imagemiddle" style="text-align: center;"></p>

<p align="center" style="text-indent:24.0000pt; text-align:center"><span style="font-size:10.5pt"><span style="font-family:Calibri"><span style="font-size:12.0000pt"><span style="font-family:宋体"><font face="宋体">图</font>6,计算结果</span></span></span></span></p>

<p style="text-indent:24.0000pt; text-align:justify">&nbsp;</p>

<p style="text-align:justify"><span style="font-size:10.5pt"><span style="font-family:Calibri"><span style="font-size:12.0000pt"><span style="font-family:宋体"><font face="宋体">综上,本设计最难的部分就完成了,后面研究蓝牙传输和自发电等功能。</font></span></span></span></span></p>

dcexpert 发表于 2021-6-20 22:44

<p>自发电用什么方式?</p>

w494143467 发表于 2021-6-21 08:50

<p>想法非常不错,自发电这个,是将势能转换为电能嘛?好奇怎么实现。</p>

soso 发表于 2021-6-21 09:22

<p>楼主这个步态识别,跟跑步精灵有些像。不过这个自发电就厉害了,期待后续。</p>
页: [1]
查看完整版本: 【跑步姿势训练鞋】No.005-姿态识别和步频计算