陌上花开,清水流沙,又到了最适合出门的时候了,不知你有没有闲情逸致出去赏花赏景赏伊人呢。
春日清晨的阳光比闹钟还要管用,小满打开窗户,将蜷缩了一夜的身体尽情舒展。空气清新得好像有柠檬的清香,天空湛蓝湛蓝的。做了一些伸展运动后,小满掏出手机,打开微信运动,今天出去晨跑吧。
“Hello,这么巧啊。”在奔跑途中偶遇的男同学Stan说道。
“早上好啊。”小满精神百倍地回答。
“很少见早起跑步的女生,看起来超阳光健康”
“也没有啦,看天气很好就出来跑咯”
“恩,春暖花开,可不可以加个微信好友一起玩微信运动呢?”
“好啊,不过首先得考考你,微信是怎么计步的呢?”
“恩,这个嘛在下面给你慢慢解答吧。”
——————————————————————————————
计步器最早是由意大利的伦纳德·达芬奇酝酿的,但现存的最早的计步器是在达芬奇之后150年,即1667年制作的。
日本最早的计步器是由Gcn.naiHiraga在1755年制作的。在中世纪和近代,计步器并未被广泛使用,因为人们并不清楚它的用途。这说明机器的发明(硬件)不及找到它对人类的用途(软件)重要。

在日本,计步器已经使用了40多年,主要用于体育运动和分析记录行走步调。1965年,计步器正式进入日本商用市场,并被命名为manpo-meter(manpo的日语含义是10000步)。这是的计步器通常利用百种原理作为记步技术,利用加重的机械开关检测步伐,并带有一个简单的计数器。如果晃动这些装置,就可以听到有一个金属球来回滑动,或者一个摆钟左右摆动敲响当块。[1] 这种机械式的计步器早已淡出历史,取而代之的是电子式的计步器。
步数识别系统
步数识别系统是指运行在移动手机上,能够监视用户走了多少步的应用程序。它一般由以下3个部分构成:
传感器模块,用来采集传感器数据;
特征提取模块,处理和分析原始数据,并进行特征提取、建立模型;
步数识别模块,把所提取的特征用来识别步数。
硬件设备
重力传感器(G-Sensor)又称为加速度传感器,用来感知加速度的变化,它使用三维方向的加速度分量来表示。G-Sensor被用在很多智能设备当中,比如一些高端笔记本电脑内置了G-Sensor,在发生剧烈的拉动时(如跌落),立即启动硬盘保护,避免硬盘损害。再如Apple 的 iPhone 使用G-Sensor来感知手机屏幕的方向,当在观看视频时手机横放,屏幕自动跟着旋转,这使得用户体验大大增加。
方案实现
日常生活当中,人们使用手机一般是拿在手上,放在裤兜里,女士也经常把它放在包里。因为手机外界环境总是很复杂的,裤兜有松有紧,放在松裤兜的手机比放在紧的更容易抖动,产生的噪音也更多。为了使该算法尽可能的适用于不同的应用环境,需要对大部分的使用环境进行测试。首先,由4个人(8个或更多也可以)各自对不同手机使用环境进行数据收集,因为人们在同样的场合使用手机的习惯是不一样的。其次,对采集来的这些数据分别进行特征提取。最后,使用提取的特征模型进行识别检验。
数据采集
G-Sensor提供的数据如表1所示。

我们的算法采用的采样频率为20HZ,采样环境有:慢走、快走、跑步、骑自行车、坐的士、坐公交、坐电梯(上/下)、坐地铁、上下楼梯。其中,有走路的采集走 100 步的数据(慢走、快走等),不是走路的采集1分钟的数据。由于开始和结束的时候放置手机(放口袋、包里)会有一些波动,不是我们想要的,因此这两个时间段的数据可以删去,或不考虑。手机放在口袋,收集的原始Length字段数据,在Excel 2007上绘制波形图如图1。横轴为每个采样点的索引,纵轴为Length值大小,也就是加速度大小,值在9.8附近变化。
Length字段波形图

图 1. Length字段波形图
特征提取
由于收集的数据包含有噪声,特别是在两个动作切换之间Length字段值的波动比较大,比如慢走和上楼梯的过程。这里使用快速傅里叶变换(FFT)来处理Length字段的数据,波形图如图2。纵轴已向下平移9.8。
经过FFT处理的Length字段波形图

图 2. 经过FFT处理的Length字段波形图
我们发现上面经过FFT处理的波形表现出一定的规则,就是在一定的时间间格内总有一个波谷,我们称这个点为“踩点”(如图3中的1、2、3、4点),也就是加速度最小的时刻(脚往下踩,手机相对有一个往下“掉”的过程)。另外,图3上A点也是波谷,但这一点是一个波动点,需要排除。所以踩点还必须小于一定的值-Threshold。当脚抬起来的时候(“起点”),身体对手机的作用力会增大,加速度也增大。所以起点必须大于Threshold,大于 Threshold的都称为起点,因为我们只关心状态的变化。通常地,走路的时候步与步之间的有一定的时间间隔,走快些间隔小,走慢些间隔大。如果是跑的话,人类的极限是1秒种跑5步,也就是1步0.2秒。从起点到踩点状态变化1次就是走了1步。所以,我们建立包含如下2个要素的模型M:
1. Length满足一定阀值,比如 –Threshold < Length < Threshold
2. 两个连续踩点的时间间隔必须在Timespan (200~2000毫秒)之内
模型满足的条件

图 3. 模型满足的条件
步数识别
我们把建立的模型用来检验在坐的士环境下所采集的数据,波形图如图4.
用模型检验的士环境下的数据

图 4. 用模型检验的士环境下的数据
我们可以看到后面的一段时间是比较平稳的,前面有一些波动,这些波动导致了错误的识别,识别为走路。我们可以改进这个模型,增加一个约束条件:在监视了连续 k(比如3)个踩点后才开始计步,所以从图3上标号为4的点开始计步。这样的约束就可以把大部分的抖动给去掉。把最终的模型用来检验所采集的不同环境下的数据得到的计步结果还是比较准确的。
存在问题
如果拿着手机左右摇摆,采集的数据经过FFT 处理后的波形也符合上面的模型,但这并不是走路的状态,产生了错误的计步。直觉上认为这可以通过监视Xangle,Yangle 两个字段(在某一范围来回变化)来预防这种情况的发生。但使用 G-Sensor采集的这两个字段的数据得到的效果并不好。
总结
以上模型使用的数据只有Length字段,其它字段并没有用到。实际上,在决定只使用 Length 字段建立模型之前,有尝试使用Xangle,Yangle,并推导出Zangle(G-Sensor没有给出这个字段),使用这三个角度的状态变化来辅助判断计步。事实上这三个量的数值并不可靠,比如把手机水平放置,做左右摇摆,得到的 Xangle,Yangle 的范围变化有超过 30°的。另外,也需要尝试使用更多、更高级的G-Sensor。