我需要一種方法中利用手腕式加速度計來算個人手臂的動作,特別是微軟頻帶2與手腕式加速度計(微軟波段)
計數手臂的動作,我想算任何普通的手臂運動,在走路時擺動手臂,伸手去拿東西等等。例如,如果我伸出手,暫停一會兒,然後再放下,這將是兩臂動作。如果我不停頓地再做同樣的事情,那將是一次手臂運動。
不幸的是,我一直沒能找到任何有關這個特定問題的資源。我目前的方法正在運作,但相當不準確。這是可以做到的嗎?我能否加入一些其他傳感器來幫助完成這項工作?任何幫助將不勝感激。
我需要一種方法中利用手腕式加速度計來算個人手臂的動作,特別是微軟頻帶2與手腕式加速度計(微軟波段)
計數手臂的動作,我想算任何普通的手臂運動,在走路時擺動手臂,伸手去拿東西等等。例如,如果我伸出手,暫停一會兒,然後再放下,這將是兩臂動作。如果我不停頓地再做同樣的事情,那將是一次手臂運動。
不幸的是,我一直沒能找到任何有關這個特定問題的資源。我目前的方法正在運作,但相當不準確。這是可以做到的嗎?我能否加入一些其他傳感器來幫助完成這項工作?任何幫助將不勝感激。
在給了我更多的自己之後,我已經解決了一個可以接受的解決方案,儘管幫助和反饋仍然受到歡迎。
它需要預先定義閾值加速度和我所謂的「跳動時間」。這兩個變量需要一些按摩來找到適當的平衡。我已經選定了以下情況:
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變量。偏移量變量包含前一個加速度計和。
因此,如果當前加速度計總和減去前一個總和大於閾值或小於負閾值,則只能考慮移動手臂。如果滿足此要求並且手臂尚未移動或彈跳,則會計算移動。