2016-09-16 33 views
0

我需要一種方法中利用手腕式加速度計來算個人手臂的動作,特別是微軟頻帶2與手腕式加速度計(微軟波段)

計數手臂的動作,我想算任何普通的手臂運動,在走路時擺動手臂,伸手去拿東西等等。例如,如果我伸出手,暫停一會兒,然後再放下,這將是兩臂動作。如果我不停頓地再做同樣的事情,那將是一次手臂運動。

不幸的是,我一直沒能找到任何有關這個特定問題的資源。我目前的方法正在運作,但相當不準確。這是可以做到的嗎?我能否加入一些其他傳感器來幫助完成這項工作?任何幫助將不勝感激。

回答

0

在給了我更多的自己之後,我已經解決了一個可以接受的解決方案,儘管幫助和反饋仍然受到歡迎。

它需要預先定義閾值加速度和我所謂的「跳動時間」。這兩個變量需要一些按摩來找到適當的平衡。我已經選定了以下情況:

private final long bounceTime = 750; 
private final double threshold = 0.3; 

的閾值變量定義了可以被視爲運動加速度的最小量。

bounceTime變量被用作一種去抖動閾值。這是爲了說明我注意到的一個效果,在移動你的手臂之後,在休息之前有一個非常輕微的跳動或反彈。這偶爾會被算作兩次甚至三次手臂動作。基本上,bounceTime用於排除這些正在計數的移動,您將在下面的代碼中看到。

@Override 
public void onBandAccelerometerChanged(BandAccelerometerEvent bandEvent) { 
    float x = bandEvent.getAccelerationX(); 
    float y = bandEvent.getAccelerationY(); 
    float z = bandEvent.getAccelerationZ(); 
    long time = bandEvent.getTimestamp(); 

    float sum = x + y + z; 
    if ((sum - offset > threshold || sum - offset < -threshold) 
     && bandEvent.getTimestamp() > lastActivated + bounceTime 
     && !moving) 
    { 
     lastActivated = bandEvent.getTimestamp(); 
     moving = true; 
     moveCount++; 
    } 
    else 
    { 
     moving = false; 
     offset = sum; 
    } 

我試圖得到一個近乎平坦的零讀數上的加速計,當它處於靜止狀態和總結了加速度計軸和減去offset變量。偏移量變量包含前一個加速度計和。

因此,如果當前加速度計總和減去前一個總和大於閾值或小於負閾值,則只能考慮移動手臂。如果滿足此要求並且手臂尚未移動或彈跳,則會計算移動。