关于简单的js计步功能

2,441 阅读2分钟
时间:2018.3.2 11:58

1、计步算法

关于详细的计步算法网上能找到很多的资源,这里只是简单的做了个实验性质的介绍,并不是很准确,另外也没有测试详细的兼容性。

功能:通过js获取手机上的传感器信息进行计算获得简单的步数统计。

用到了加速度传感器模块。 通过对手机的加速度传感器模块记录的值进行分析来获取用户的步数。。 计步算法主要是将每次取到加速度三个方向值的平方和开根存储起来作为基础信息。 这个基础信息如果用大概就是一个波形图,嗯取的值有一个时间差的,这样我们大概率就把模糊的数据转变成了可视化的啦

大概就是这样

然后就是取得波峰的数量来判断走了几步。 一开始的时候完全没思路,一个数组嗯可能很大的数组,怎么能够把它像人眼看到的波形图那样处理呢? 主要就是怎么通过代码表示出来自己想做的东西,让程序能够理解我想获取到的值。嗯很是纠结了很久。 经过老大的点拨,然后并不一定说需要具体的数据,因为数据的整体是波形图的趋势, 那么就有增有减,取它的趋势,增加的时候就为1减少的时候就是-1,然后在根据具体的实验判断大概率多少个1或者-1代表的是一步。 接下来就是写出来的代码啦,嗯还不是很准确,暂时先记着,以后来改。 基于mui框架 代码如下:

    var orline = [];
var nowline = null;
var sqr = 0;
var step = 0;
function counterStep(){
	var startTime = new Date().getTime();
	wid = plus.accelerometer.watchAcceleration(function(a) {
		var currTime = new Date().getTime(); //当前时间
      	var diffTime = currTime - startTime; //当前时间减最初时间,得到当前时间差
		//	console.log('监听信息:'+diffTime);
		sqr = Math.sqrt(a.xAxis * a.xAxis + a.yAxis * a.yAxis + a.zAxis * a.zAxis);
		if (nowline) { // 当存在初始值时才进行趋势判断
            if (sqr >= nowline) { // 如果获取到的计算后的加速度值 大于 上一个值
              orline.push(1); // 表明趋势增加,记录趋势值为1
              nowline = sqr; // 更新比较值
            } else if (sqr < nowline) { // 如果小于的话
              orline.push(-1) // 表明趋势减少,记录趋势值为-1
              nowline = sqr // 更新比较值
            }
        } else { // 初始值不存在时,记录当前的数据,并将当前的趋势值记录为0
            nowline = sqr;
            orline.push(0);
        }
	}, function(e){},{
		frequency: 22
	});
}

function watchPause(){
	if (orline.length > 300) {
			console.log(orline);
			var x = y = 0;
			for ( var i = 0; i < orline.length; i++) {
				if (orline[i] == 1) {
					x++;
					y=0;
					x >= 7?step++:step=step;
				} else if (orline[i] == -1) {
					x=0;
					y++;
				}
			}
			console.log(step/2);
			$('.rsib_icon_step').html(parseInt(step/2));
		}
	plus.accelerometer.clearWatch(wid);
}

参考文献

1.一种基于自适应波峰检测的MEMS计步算法