1. 引言
步行运动是一项普遍的,门槛低的全民健身运动,在诸多方面对人体有益,但是过多运动也会对人体产生损伤,因而有效计步显得十分重要。计步器可以记录步行的步数,在孕妇健康管理、体育教学、反映能量消耗、增强运动等方面发挥着巨大的作用。微机电系统(Micro-electro Mechanical Systems, MEMS)以体积小、重量轻、功耗低、耐用性好、价格低廉等优点广泛应用于智能手机传感器模块中。目前大多数计步算法都是围绕加速度实现的,而智能手机内置的加速度传感器能够方便获取加速度。
对于精确计步问题,很多学者已经进行了研究,涌现出了很多方法。
文献 [1] 提出多级自适应门限计步算法,先检测加速度信号中的峰值点和谷值点,接着基于获得的峰值点和谷值点,计算人物的步频特征,根据所得步频特征判断人物的运动状态,最后,针对每种运动状态,自适应分配对应的时间差阈值和动态峰谷值差值阈值,实现多级自适应。该算法的准确率能达到95%以上,但对波峰或者波谷的检测准确度要求很高。文献 [2] 提出了一种基于加速度传感器的自适应计步算法,通过对加速度传感器采集的信号数据进行一系列处理,然后利用人工免疫算法对处理后提取的特征值进行判断,确定人的运动状态,再进行计步。该算法改进了特征值提取方法,摒弃了传统的贝叶斯分类算法,采用人工免疫分类算法有效地提高了计步的准确率,但是运动状态的判定对样本数据库有较强的依赖性。
文献 [3] 设计了一种基于MPU6050加速度传感器的自适应采样计步器,该计步器通过MPU6050加速度传感器采集步态信号,运用滑动滤波算法对传感器输出的数字步态信号进行滤波与降噪处理,采用动态阀值算法对行人的跑步和走路两种状态进行自动识别,并根据人体不同的运动状态自动调整采样速率,计步精度可以达到95%以上。文献 [4] 利用MEMES-IMU多种特征值,提出了行走和跑步的两种步态检测算法。在行走状态下,采用加速度、角速度,足部着地和跨步时间的多条件约束实现零速区间检测。在跑步状态时,通过步伐探测和跨步探测的方法,并结合多条件约束,实现零速区间检测。检测精度达到99%以上,但未将行走状态与跑步状态算法统一。
针对以上算法出现的问题,本文提出了基于加速度的门限检测算法,在波谷检测算法的基础上改进和优化。算法运用卡尔曼滤波算法对传感器输出的步态信号进行滤波和降噪等预处理,然后根据状态门限阈值判定行人的运动状态,比如跑步、行走或者静止,针对不同的运动状态分别设置步频时间差阈值和峰谷值时间差阈值,满足阈值条件则计步。该算法计步精度可以达到96%以上,可以有效应用于计步器、室内定位等领域,测量不同状态下的步数,满足工程应用的需求。
2. 计步原理
步态周期可以分为支撑期和摆动期,是指行走过程中一侧足跟着地至该侧足跟再次着地时所经过的时间 [5]。
如图1所示,在一个步态周期中,人由于大腿的摆动,垂直加速度先增大后减小,前向加速度在迈步过程中增大,在提脚过程中减小。
通过Android手机的三轴加速度传感器获取手机坐标系(如图2(a)所示,x轴沿手机左右方向,y轴沿手机上下方向,z轴沿垂直于手机屏幕的方向)下的加速度数据,如图2(b)所示。加速度数据的变化可以反映出行人运动的全过程,因而基于加速度的算法实现计步是可行的。
Figure 1. The law of acceleration change during a gait cycle
图1. 一个步态周期过程中加速度变化规律
Figure 2. Acceleration changes in the mobile phone coordinate system and a gait cycle
图2. 手机坐标系和一个步态周期里加速度变化
3. 算法设计
3.1. 预处理
acc_z (z轴加速度)尽管能够反映出行人运动的加速度变化,但是单轴加速度对噪声的抗干扰能力较差,不稳定.在实际生活中,行人握持手机的姿势或者手机的摆放位置不尽相同,而且手机加速度的方向与行人行走方向并不相同。对此,大部分研究采用三轴合一加速度,如公式(1)所示:
(1)
其中acc_x表示侧向加速度,acc_y表示垂直加速度,acc_z表示前向加速度 [5]。
三轴合一的加速度结果如图3所示。
Figure 3. Three-axis combined acceleration
图3. 三轴合一加速度
3.2. 卡尔曼滤波
在数据的采集过程中,由于传感器的噪声和手机的摆动或者与衣服的摩擦,不可避免会产生错误的数据(如图4(a)所示),因此需要对采集的数据进行滤波,矫正错误的数据.本文采用卡尔曼滤波算法 [6]。
图4(b)是经过卡尔曼滤波后的波形图,从图中可以看出卡尔曼滤波模型有效地消除了伪波峰或波谷,提高了计步的准确性,同时也使得波形更加平滑,趋近于实际加速度的变化趋势。
(a) (b)
Figure 4. (a) Before Kalman filtering; (b) After Kalman filtering
图4. (a) 卡尔曼滤波前;(b) 卡尔曼滤波后
3.3. 门限检测计步算法
传统的波峰波谷计步算法由于只检测峰值或者谷值对噪声抗干扰能力较弱,当滤波过程中无法完全消除伪波峰或者伪波谷,那么就会出现多次计步的情况,降低计步的准确性。本文在传统波峰波谷计步算法上做出改进,兼顾波峰和波谷检测,同时引入波峰时间自更新,避免由于行人停留使得相邻两波峰或波谷的时间差大大超过阈值而无法计步的情况,有效提高了计步的准确性。
3.3.1. 状态门限阈值设置
行人在慢走、快走或者跑步过程中的步频是不一样的,一步所需的时间也不同,因而在计步前需要判断行人的运动状态。本文区分静止、行走和跑步这3中状态,约定静止状态state = 0,行走状态state = 1,跑步状态state = 2。为描述状态判断的过程,引入如下符号:
still_peak:静止时加速度的峰值最大阈值,即行走时加速度的峰值最小阈值;
walk_peak:行走时加速度的峰值最大阈值,即跑步时加速度的峰值最小阈值;
still_valley:行走时加速度的谷值最小阈值,即行走时加速度的谷值最大阈值;
walk_valley:行走时加速度的谷值最小阈值,即跑步时加速度的谷值最大阈值;
在8个历元的滑动窗口中取出最大值Max和最小值Min (一般重力加速度g取9.8 m/s2,满足最大值大于重力加速度,最小值小于重力加速度),状态转移方程如(2)所示:
(2)
如图5所示,行人在不同状态运动时,峰值和谷值都有明显的差别,对人行走和跑步时的数据多次采样,绘制加速度幅值分布情况图,由实验统计结果可知:行人在正常行走情况下加速度峰值幅值分布在[1.1 g, 2 g],谷值幅值分布在[0.4 g, 0.9 g]的比重达到98%以上;跑步状态下加速度峰值幅值大于2 g,谷值幅值小于0.4 g的比重达到99%以上,因此取still_peak为11.1 m/s2,walk_peak为20 m/s2,still_valley为9.3 m/s2,walk_valley为4 m/s2。
Figure 5. Acceleration waveforms in different motion states
图5. 不同运动状态下的加速度波形
状态判定函数Judge_State()的伪代码如下。
Dim state AS INTERGER
state=1
input(acc)
if acc<9.8 Then
do 状态转
Endif
if acc>9.8 Then
do 状态转移
Endif
3.3.2. 时间差门限阈值设置
通常情况下,正常人行走的频率为1~2.5 Hz,跑步时的频率不超过5 Hz,所以设置行走时的时间差门限阈值为[0.4 s, 1 s],设置跑步时的时间差门限阈值为[0.2 s, 0.5 s];记行走时相邻两波谷的时间差为delta_1,跑步时相邻两波谷的时间差为delta_2,通过检测delta_1或者delta_2是否在门限阈值范围内进行一次判断,如果小于阈值下限,表示存在伪波谷(如图6波谷2所示,波谷2中两个波谷的时间差小于阈值),如果大于阈值上限,可能行人停止行走或休息,此时需要更新前一个谷值时间,避免影响后续计步。
记相邻的波峰与波谷的时间差为delta;如图6所示,尽管波谷1达到阈值要求,但是波峰1没有达到阈值要求,在计步过程中并不能计成一步,因而需要通过delta来进行二次判断消除这种情况的伪波谷的影响。错误率与delta的关系如图8所示,当delta取值过小,会导致一步内波峰与波谷的检测时间差过小,从而忽略如慢走的步数,降低了计步准确性;当delta取值过大,会导致本次判断失效,不能消除图6中伪波谷1。根据实验数据的统计,如图7所示,当delta取0.4时,错误率最低即计步的准确率最高。
Figure 7. Relationship between step error rate and delta
图7. 计步的错误率与delta的关系
阈值判断的峰值和谷值尽管在窗口里是最值,但仍需判断是否是前后邻域的最值,窗口两侧的最值不满足要求,需要摒弃,这是第三次判断.当三次判断都满足条件时,计步并更新前一个谷值时间,进入下一轮读取,算法伪代码如下所示。
input(acc)
input(time)
do 潜在峰值和谷值获取
if峰值:
state= Judge_State(Max)
if 时间阈值判定成立 Then
do 计步
Endif
Endif
if 谷值:
state = Judge_State(Min)
if 时间阈值判定成立 Then
do 计步
Endif
Endif
4. 实验与结果分析
4.1. 实验设计
为了获取行人在运动过程中握持Android手机时的加速度,编写了一款APP读取三轴加速度的数值.选取物联网工程学院宽阔的走廊作为实验的场地(如图8所示),便于实验。
实验使用的手机是HUAWEI Honor 10,系统为Android9.0.1。实验区别静止、行走和跑步三种状态,每种状态均采用门限检测计步算法,采集三组数据,每组数据的实际步数都是100步。
4.2. 实验结果分析
经过行人运动时加速度数据的采集,预处理,滤波,计步算法等过程进行了随机测试,测试的结果如表1所示。通过门限检测算法可以有效实现计步,行走状态下的准确率可达100%,最低为93%;跑步状态下的准确率可达99%,最低为95%;静止状态下的行人可以100%识别;在实际生活应用中可以作为室内定位或者计步器的一部分,准确提供行人的步数信息。
4.3. 与传统波峰检测算法比较
文献 [7] 采用传统峰值检测实现计步,选取统一的时间窗口[0.2 s, 2 s],比较上一峰值与此峰值的时间间隔,如果处于时间窗口内,则视为有效信号。此算法对噪声的抗干扰能力较弱,只能一次性计步,计步过程中不能过长停留,否则会形成累积误差,无法计步。如图9所示,红线以上部分均达到峰值要求,计步是前3个峰值计步有效,但第三个与第四个峰值间有较长的时间间隔,且超过时间阈值,第四个峰值以及往后的峰值都是无效的。
Figure 9. Results of step counting in [7]
图9. 文献 [7] 计步结果
对于本文的算法和文献 [7] 的算法分别进行10次行走和跑步测试.将2种算法计算的总步数与实际行走的步数进行比较,可以得到如图10所示的误差比较。
由图10可知,测试10次之后,文献 [7] 传统峰值检测算法计算出的总步数与实际的步数误差较大,跑步状态下步态周期短,误差范围大于等于3%占比60%,均在5%以内。行走状态下步态周期相对变长,此时误差范围大于等于3%占比90%,大于等于5%占比60%。而本文算法测试10次,跑步状态下误差范围大于等于3%占比30%,均在5%以内。行走状态下误差范围大于等于3%占比30%,均在5%以内。由实验结果表明:本文的算法优于传统的峰值检测算法,有效地提高了计步的精度。
5. 结束语
本文讨论了基于加速度的门限检测计步算法,在传统的波峰波谷检测算法的基础上做出改进,提高了计步的准确性。本文也讨论了卡尔曼滤波原理,对原始的加速度数据进行过滤,降低了噪声的干扰。在状态判断的基础上进行三次门限检测有效对伪波峰和伪波谷起到抑制作用。实验表明本算法能够满足计步器、室内定位等方向的精度要求,在此后的工作里,我们团队将致力于滤波方法的改进,进一步提高精度,降低噪声对实验的影响。
参考文献