關於簡單的js計步功能

TrentZ發表於2018-03-02
時間:2018.3.2 11:58
複製程式碼

1、計步演算法

關於詳細的計步演算法網上能找到很多的資源,這裡只是簡單的做了個實驗性質的介紹,並不是很準確,另外也沒有測試詳細的相容性。

功能:通過js獲取手機上的感測器資訊進行計算獲得簡單的步數統計。

用到了加速度感測器模組。 通過對手機的加速度感測器模組記錄的值進行分析來獲取使用者的步數。。 計步演算法主要是將每次取到加速度三個方向值的平方和開根儲存起來作為基礎資訊。 這個基礎資訊如果用大概就是一個波形圖,嗯取的值有一個時間差的,這樣我們大概率就把模糊的資料轉變成了視覺化的啦

大概就是這樣

關於簡單的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計步演算法

相關文章