如何在手機上實現高精度及自適應多種場景的計步器算法

前言

隨着當前智能終端的普及,人們可作的事情變得愈來愈有趣,好比計步器。傳統的計步器通常是一個單獨的設備,戴在身體的某個位置,因爲必須在用戶身上增長一個設備,推廣起來有必定阻力。其實,計步器只須要一個3-軸加速度傳感器就能作到較高的記步精度,相似三星note3的計步器精度在95%以上。當前智能手機通常都含有加速度傳感器,許多人開始在手機上作計步器。惋惜目前Android市場上大多數計步器精度都不理想,經本人測試,目前最好的是三星的note3的健康夥伴,更關鍵的是三星使用了sensorhub的技術,在保持精度的同時,作到了超低功耗。
在手機上作計步器相較於傳統的計步器最大的難點在於手機使用時位置不固定,計步器要能適應不一樣放置位置和不一樣走路場景,這就要求計步器算法有很好的動態調整能力。html

計步器模型介紹

關於人走路的模型,前人[1]已經作了不少研究,再也不累贅。總結來說,人在走路時,加速度傳感器會造成一個相似正弦波形圖,所以能夠根據檢測波峯波谷記步。見下圖:android

步伐傳感器數據波形圖

算法

概述

  1. 特徵選取
  2. 濾波
  3. 基於動態閾值檢測步數
  4. 步數矯正

特徵選取

考慮到手機在不一樣放置狀況下傳感器的每一個軸會有不一樣表現,所以,取其強度特徵能夠避免該類問題,即取三軸平方和。git

濾波

濾波是一種常見的數據預處理方法,特別是手機上加速度傳感器數據存在必定的噪音,通過濾波後能獲得較平滑的數據。濾波算法有許多中,常見的有數字濾波,也能夠叫中值濾波、高斯濾波、快速傅里葉變換。本人試過幾種濾波算法後,發現採用中值濾波便可知足需求,由於算法的瓶頸並不在此。另外一個考慮是終端的計算資源有限,過多的計算將形成大量的耗電。github

簡單來說,即取一個時間窗作平滑,假設以50HZ的頻率採集加速度傳感器數值,即在Android中註冊Sensor頻率爲Fastest(不一樣手機可能會有差別)。我採用5個數據作一次平滑,即收到5個數據算一次平均值,當作當前值。固然,你能夠增長時間窗長度,可是須要考慮用戶體驗,不能延遲過久。算法

動態閾值

一般,計步器有兩種思路:一種是經過計算過零率來記步;另一種是計算極大值和極小值,判斷峯谷值來記步。兩種算法的思想相似,都須要設置閾值。爲了適應各類不一樣的位置和走路姿式,你不能簡單設一個閾值來檢測步數。第一種方法容易出現誤記,須要結合其餘方法排除在mean值附近抖動的數據。第二種方法容易出現漏檢,同時若是誤記,還會影響到後續的記步,由於在一次步伐中出現好幾個峯谷是很正常的,如何去除這些數據的影響須要良好的設計。dom

本人採用的檢測峯谷值得方法記步,但不是經過計算極大值和極小值,而是設置波峯的閾值和波谷的閾值,即當數據大於波峯閾值時,都記爲未確認峯值,保存其中最大的一個,這樣能夠避免數據在上升途中偶爾出現的抖動。同理,做用於峯谷。
檢測出峯谷以後,經過保存一個時間窗,經過裏面的峯谷個數記步。這裏更多的是工程上的設計。測試

步數矯正

基本思想是人類走路的特性,人的步伐速度在200-2000ms之間,經過記錄記步的時間戳,矯正步數。步伐間隔<200ms和>2000ms,認爲是無效步數。這部分也是目前終端計步器算法的核心,作的好的公司都有相應的矯正機制。優化

總結

計步器算法的基本思想大體如此,最終產品的表現還要不斷打磨,針對異常場景進行優化。最後,終端設備上應用不可避免的是功耗問題,若是開了計步器,你的手機用半天就沒電,估計沒人願意用。目前市場上許多低功耗計步器算法,大多以下降精度爲代價。目前看來只有三星採用高通的sensorhub方案有較好的表現。spa

參考:設計

[1] 利用3軸數字加速度計實現功能全面的計步器設計

[2] Github上的一個計步器實現代碼 改代碼直接使用效果很差

相關文章
相關標籤/搜索