計步器軌跡算法


 聲明:非原創,侵權即刪

一、介紹

 

基於計步器的室內定位系統,計步准確是非常關鍵的一項指標,有必要提高其准確性和可靠性。現有的檢測技術,不論是硬件還是軟件,都不能滿足高精度的定位系統,尤其是在緩慢步行的情況下。特別是在一個陌生的環境,或者使用者是視力受損的人群,室內導航表現的更糟糕(譯者注:就是說室內導航軟件,用常規方法根本檢測不到用戶移動,更不提導航作用了)。

 

現有的大多數的計步器使用加速度數據,基於閾值來檢測步伐。

 

本文討論的計步器算法是基於使用陀螺儀,在室內定位中識別出人類步行狀態。本算法是由Abhayasinghe和Murray提出。本研究作為一個室內導航系統的一部分,針對的人群是視力受損的人群(譯者注:文章的3位作者可能是針對視力受損的人做室內導航軟件的)。


現有的一些計步器的性能會在“背景”一節所討論,而基於陀螺儀的計步器算法及其性能將在“步檢測算法”部分和“實驗結果”部分體現。

 

 

二、背景


Jerome 和Albright 測試了5款商業計步器,測試對象是13名視力受損的成年人和10位老人,結果發現這些商業計步器檢測精度非常差,在平地行走精度只有41%−67%,而上下樓梯的情況更糟,上樓梯為9%−28%,下樓梯為11−41%。Crouter  等人測試了10款商用電子計步器,發現這些計步器在緩慢行走時,檢測的步數都是偏少的。Garcia 等人對比了軟件計步器和硬件的計步器,觀察這兩種類型計步器在所有速度下表現都差不多,在緩慢步行速度下(58 ~ 98步/分鍾),硬件計步器精度只有20.5%±30%,軟件計步器精度更是只有10%±30%。


Waqar等人曾在一個室內定位系統,使用了基於重力加速度計和固定閾值算法的計步器作為測試。他們的統計數據顯示,在6次40步的測試中,平均准確率為86.67%,其中最低的一次准確率為82.5%,最高一次的准確率為95%,取中位數精度為85%。


Oner 等人討論也提出了基於加速度計的智能手機計步器算法 :當步行的速度超過90bps(beats per second 每秒90拍,樂曲的節拍,音樂節奏速度單位)的時候,其算法顯示出足夠的精度。但當速度低於90bps時,其精度就會下降。在步行速度為80bps時,其算法誤差大約是20%;步行速度在70bps時,誤差為60%,步行速度在60bps時誤差達到90%。


lim等人提出了在腳上安裝陀螺儀計步器,但是lim等人沒有提到他們系統的准確性。那不如讓他們使用力敏電阻器(
force sensitive resisters ,FSR )接觸腳趾和腳后跟,這樣精度肯定會更高,因為使用力敏電阻接觸身體更容易地檢測到結果(譯者注:論文作者開始吐槽了)。
Ayabe等人的統計了一些商用計步器,在爬樓梯和踏凳練習(譯者注:應該是站立,然后單腳放在凳上,之后左右換腳踏凳)中,速度80到120步/分鍾的時候,誤差為±5%。然而,速度越低,精度也越低(> 40±40%步/分鍾)。


這里討論的大多數例子都是使用重力加速度去檢測步數。但是,他們都有一個相同的問題,在緩慢的行走速度中表現不佳。低速表現不佳的主要原因是:低速行走時,重力加速度幾乎為固定值,而且加速度計反應遲緩,再加上這些算法不能采用分級的閾值(譯者注:這里應該是想引出動態閾值概念)以適應走路的步伐,這就引出了一個要求在緩慢行走時也能計算准確的計步檢測算法。

 

三、計步算法

 

A、介紹

 

論文[6]提到,陀螺儀數據可以用在室內定位軟件里的計步算法中。該文作者提出,把手機放在褲袋里,通過手機陀螺儀的單值數據(陀螺儀數據有3個值,分別為x,y,z軸數據)就可以追蹤大腿的運動,從而進行計步檢測。

 

B、陀螺儀數據與大腿運動之間的關系


一個步態周期的測量方法是從邁出一步腳后跟觸地,到相同的腳后跟下一步的接觸。在邁出一步觸地時,大腿向前邁出的距離是最大的,比其他方向的距離都要大。圖1顯示了使用陀螺儀x軸數據去記錄大腿的運動波形,該圖形已經使用了低通濾波降噪(使用的是6階巴特沃斯低通濾波,截止頻率微5Hz)。觸地點和步態周期都在圖1進行了標記。當大腿靜止時,通過融合加速度計和羅盤數據,可以計算出初始位置。對於這種狀態的計算,陀螺儀的靜態數值將會被計算平均值所去除。

 

可以清楚的看出,裝有手機的那一條腿在觸地時,在經過濾波后的陀螺儀讀數接近於0的,而且斜率是負。


因此,濾波后的陀螺儀讀數從一個負斜率通過零點再上穿零點為一個步態周期。

 

 

 

圖1 走在平坦地面,大腿運動方向圖形(實線),經過濾波的陀螺儀x軸圖形(虛線)

 

同時也觀察到當走樓梯和走斜坡時候,腳觸地的圖形和陀螺儀濾波后負斜率過零點的圖形相符。顯而易見,經過濾波后的陀螺儀數據結合過零點檢測法,就可以檢測出步態周期,即使是走樓梯或走斜面。以上所有的結論,都是基於手機垂直地放着大腿褲袋里所得出的,包括腳的運動波形和陀螺儀x軸波形。因此,實際上只要處理陀螺儀x軸即可。

 


C、數據預處理

 

陀螺儀x軸數據使用截止頻率為3Hz的六階巴特沃斯低通濾波器來濾波降噪,再使用過零點檢測法去檢測步數。之所以選擇3Hz截止頻率,是因為人類快走時平均范圍是每秒2.5步[10]。截止頻率越低,對平滑波形效果越好,把在零點附近的毛刺過濾到最小,又能清晰地顯示步態周期的波形。

 

D、過零點檢測


使用簡單的波形經過2個零點的檢測法,可以簡化算法。一只腳向前走或者並攏,形成的波形都能通過正、負2個零點。因此,過零點的總數,就是人走的步數。

 

E、規避誤差

 

如圖1的紅圈所示,從一段腳觸地到離開,過濾后的陀螺儀信號以一個負斜率過零,但仍可能在短時間內以正斜率過零。這就會造成誤差。然而,因為這一小段只是在一個步態周期占到0-10%時間,完全可以用一個超時機制來避免這種不必要的過零點。一旦一個過零點被成功確認,那么,過零檢測器就設認為100毫秒內,不允許有下一個過零點,這樣就避免了多余的零點。為什么選用100毫秒?首先,選用前15%的步態周期時間,足夠避免前10%的過零點引入誤差。而一個緩慢的步態周期是每秒1.5步,因此15%時間約為100毫秒。100ms這個時間比在每秒3步這種快速的步態周期延遲了30%,因此它是不會干擾到快速行走情況下的過零檢測。

 

F、驗證過零檢測

在步伐檢測中,我們在每一次的過零檢測之后,還要使用一種閾值去驗證是否符合步伐判斷條件。如圖1所示,陀螺儀讀數在每一次過零點之后都會達到峰值。然而,在紅圈里有一個波峰,該波峰相對其他波峰的讀數來說,明顯要小很多,而且它並不對應大腿的擺動,因此這個波峰是要消除的。

本算法包含一個校准模式,用戶以最慢的速度去行走,算法就能夠調校出最小偏差的陀螺儀信號。當檢測到一個過零點,本算法檢測該過零點接下來的一個波峰,還檢測該波峰是否大於閾值。當波峰大於閾值,步數就會加1。

 

G、計步算法

 

檢測算法的流程步驟,見圖2。要指出的是,本算法對正負斜率過零點都會檢測,而且在每次檢測后對應切換波峰波谷閾值。然而,切換波峰波谷並不是表示會減少波形的復雜性。

 

 

圖2 計步算法流程圖

 

H、本算法的實現

 

本算法是由iPhone 4S來進行數據采集,並通過matlab仿真器進行驗證。需要指出的是,本算法會把手機放進、取出褲袋等動作計算為步數。因為蘋果軟件許可里,不允許使用一些手機特性,例如使用環境光傳感器去檢測手機是否進入了褲袋,當確認手機進入了口袋,計步器才開始計步;當手機離開褲袋,計步器停止計步。當按下開始按鈕,程序可以設置一個時限,讓用戶把手機放進褲袋。當時限一到,計步算法自動啟動。而當用戶拿出手機,算法可以從總步數里減少點步數,以修正為真實的步數。

 

四、實驗結果

 

MATLAB仿真結果表明,針對原有的數據統計,本算法計算的步數准確率為100%。本算法是在五種不同的真實活動場景中進行測試:平地,上樓梯,下樓梯,上坡和下坡。有5男5女共10名志願者參與。他們被要求把手機垂直在褲袋里,並進行的活動。試驗分兩個階段進行:第一階段用正常速度行走,第二階段用五種不同的步行速度(50,75,100,125和150步/分鍾)進行。每個階段每個步驟都有真實的數據記錄。

 

表一顯示在普通速度下不同活動場景的樣本結果。這組試驗表明,本算法在每個活動場景都達到95%以上的精度。

表1 

 

表二顯示了實際步數,計算步數,以及在所有試驗的精度。可以看出,本算法在下樓梯時的平均准確度最低,但仍為94.55%。最低准確度為上下樓梯,但仍有90.91%。另外,在平地中行走的最低准確度為96%,最大為100%。本算法在斜坡上的准確度大於95%,下斜坡平均准確度為98.18%,上斜坡為平均准確度為97.17%。

 

表2

 

第二組實驗是在平地和上樓梯中進行。在自願者被要求用五種速度去走:50,75,100,125和150步/分鍾。表3顯示,在平地走的平均准確率最小75步/分鍾的速度,但仍為94.59%,而平均准確率仍高達97.89%。值得注意的時,速度最慢的50步/分鍾測試中,最小准確率都有96%。而所有步行速度的平均准確率都大於96%。

表3

表2顯示,每次測試步數在11步的情況下,上下樓梯的最小准確率為90.91%。雖然這是整組實驗中最低的,但是在表3看出,上樓梯平均精度最低也有96.36%,速度在75和125步/分鍾。下樓梯時,最低的平均准確率為95.45%,速度為50和125的步/分鍾。

 

五、討論與展望

為毛我們測試上下樓的只走了11步呢?因為我們的樓梯就這么一個(-_-!!!)。就是因為這個原因,搞到我們的實驗數據在上下樓梯很難看啊,引入了差一步就差了10%的誤差。樓梯級數多點准確率肯定會比現在高。雖然檢測結果會比真實步數少,但是真正情況中,沒人會在下到樓梯盡頭時,將手機拿出褲袋,因此上述錯誤是不用發生的。(譯者注:這是啥邏輯?!我看不懂這個意思)另外,一些軟件條例也限制我們不能檢測手機是否在褲袋,導致我們的准確率沒辦法達到100%。
下一步,本算法會應用到其他平台,以觀察本算法的真實表現。在本文中,本算法是假設手機必須垂直地放在較緊的褲袋里。作者正在優化本算法,使得手機可以適應各個方向,考慮結合陀螺儀其他軸,編寫朝向修正算法。但是,把手機放在比較緊的褲袋里固定起來,是保證本算法准確的關鍵。

 六、代碼實現

//首先傳入SensorEvent數據
synchronized private void calc_step(SensorEvent event) {
average = (float) Math.sqrt(Math.pow(event.values[0], 2)
+ Math.pow(event.values[1], 2) + Math.pow(event.values[2], 2));
detectorNewStep(average);
}

/*
* 檢測步子,並開始計步
* 1.傳入sersor中的數據
* 2.如果檢測到了波峰,並且符合時間差以及閾值的條件,則判定為1步
* 3.符合時間差條件,波峰波谷差值大於initialValue,則將該差值納入閾值的計算中
* */
public void detectorNewStep(float values) {
if (gravityOld == 0) {
gravityOld = values;
} else {
if (DetectorPeak(values, gravityOld)) {
timeOfLastPeak = timeOfThisPeak;
timeOfNow = System.currentTimeMillis();

if (timeOfNow - timeOfLastPeak >= 200
&& (peakOfWave - valleyOfWave >= ThreadValue) && (timeOfNow - timeOfLastPeak) <= 2000) {
timeOfThisPeak = timeOfNow;
//更新界面的處理,不涉及到算法
preStep();
}
if (timeOfNow - timeOfLastPeak >= 200
&& (peakOfWave - valleyOfWave >= initialValue)) {
timeOfThisPeak = timeOfNow;
ThreadValue = Peak_Valley_Thread(peakOfWave - valleyOfWave);
}
}
}
gravityOld = values;
}



/*
* 檢測波峰
* 以下四個條件判斷為波峰:
* 1.目前點為下降的趨勢:isDirectionUp為false
* 2.之前的點為上升的趨勢:lastStatus為true
* 3.到波峰為止,持續上升大於等於2次
* 4.波峰值大於1.2g,小於2g
* 記錄波谷值
* 1.觀察波形圖,可以發現在出現步子的地方,波谷的下一個就是波峰,有比較明顯的特征以及差值
* 2.所以要記錄每次的波谷值,為了和下次的波峰做對比
* */
public boolean DetectorPeak(float newValue, float oldValue) {
lastStatus = isDirectionUp;
if (newValue >= oldValue) {
isDirectionUp = true;
continueUpCount++;
} else {
continueUpFormerCount = continueUpCount;
continueUpCount = 0;
isDirectionUp = false;
}

// Log.v(TAG, "oldValue:" + oldValue);
if (!isDirectionUp && lastStatus
&& (continueUpFormerCount >= 2 && (oldValue >= minValue && oldValue < maxValue))) {
peakOfWave = oldValue;
return true;
} else if (!lastStatus && isDirectionUp) {
valleyOfWave = oldValue;
return false;
} else {
return false;
}
}

/*
* 閾值的計算
* 1.通過波峰波谷的差值計算閾值
* 2.記錄4個值,存入tempValue[]數組中
* 3.在將數組傳入函數averageValue中計算閾值
* */
public float Peak_Valley_Thread(float value) {
float tempThread = ThreadValue;
if (tempCount < valueNum) {
tempValue[tempCount] = value;
tempCount++;
} else {
tempThread = averageValue(tempValue, valueNum);
for (int i = 1; i < valueNum; i++) {
tempValue[i - 1] = tempValue[i];
}
tempValue[valueNum - 1] = value;
}
return tempThread;

}

/*
* 梯度化閾值
* 1.計算數組的均值
* 2.通過均值將閾值梯度化在一個范圍里
* */
public float averageValue(float value[], int n) {
float ave = 0;
for (int i = 0; i < n; i++) {
ave += value[i];
}
ave = ave / valueNum;
if (ave >= 8) {
Log.v(TAG, "超過8");
ave = (float) 4.3;
} else if (ave >= 7 && ave < 8) {
Log.v(TAG, "7-8");
ave = (float) 3.3;
} else if (ave >= 4 && ave < 7) {
Log.v(TAG, "4-7");
ave = (float) 2.3;
} else if (ave >= 3 && ave < 4) {
Log.v(TAG, "3-4");
ave = (float) 2.0;
} else {
ave = (float) 1.7;
}
return ave;
}


六、結論

 

本文提出了一種智能手機基於單點陀螺計步器為視力障礙人群提供室內定位系統而發展出來的一個功能部分。通過測試不同的活動和不同的步行速度,該算法能得到滿意的結果,即使在非常緩慢的步行速度,步數檢測仍具有非常高的精度。不管是平地還是斜坡、樓梯,基於陀螺儀的計步器都能容易用作室內定位系統和導航系統的精准計步功能。

 



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM